@grepr/cli 1.6.30-551accf → 1.6.42-91f3e80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/build/dist/commands/backfill-command.d.ts +17 -0
  2. package/build/dist/commands/backfill-command.d.ts.map +1 -0
  3. package/build/dist/commands/backfill-command.js +115 -0
  4. package/build/dist/commands/backfill-command.js.map +1 -0
  5. package/build/dist/commands/job-draft-command.js +5 -6
  6. package/build/dist/commands/job-draft-command.js.map +1 -1
  7. package/build/dist/commands/query-command.d.ts +4 -18
  8. package/build/dist/commands/query-command.d.ts.map +1 -1
  9. package/build/dist/commands/query-command.js +5 -49
  10. package/build/dist/commands/query-command.js.map +1 -1
  11. package/build/dist/commands/sql-validate-command.d.ts +7 -0
  12. package/build/dist/commands/sql-validate-command.d.ts.map +1 -0
  13. package/build/dist/commands/sql-validate-command.js +29 -0
  14. package/build/dist/commands/sql-validate-command.js.map +1 -0
  15. package/build/dist/grepr.d.ts +1 -1
  16. package/build/dist/grepr.d.ts.map +1 -1
  17. package/build/dist/grepr.js +6 -0
  18. package/build/dist/grepr.js.map +1 -1
  19. package/build/dist/lib/backfill-grepr-link.d.ts +9 -0
  20. package/build/dist/lib/backfill-grepr-link.d.ts.map +1 -0
  21. package/build/dist/lib/backfill-grepr-link.js +31 -0
  22. package/build/dist/lib/backfill-grepr-link.js.map +1 -0
  23. package/build/dist/lib/backfill-vendor-links.d.ts +15 -0
  24. package/build/dist/lib/backfill-vendor-links.d.ts.map +1 -0
  25. package/build/dist/lib/backfill-vendor-links.js +181 -0
  26. package/build/dist/lib/backfill-vendor-links.js.map +1 -0
  27. package/build/dist/lib/backfill-vendors.d.ts +45 -0
  28. package/build/dist/lib/backfill-vendors.d.ts.map +1 -0
  29. package/build/dist/lib/backfill-vendors.js +43 -0
  30. package/build/dist/lib/backfill-vendors.js.map +1 -0
  31. package/build/dist/lib/backfill.d.ts +51 -0
  32. package/build/dist/lib/backfill.d.ts.map +1 -0
  33. package/build/dist/lib/backfill.js +343 -0
  34. package/build/dist/lib/backfill.js.map +1 -0
  35. package/build/dist/lib/grepr-api-client.d.ts +2 -1
  36. package/build/dist/lib/grepr-api-client.d.ts.map +1 -1
  37. package/build/dist/lib/grepr-api-client.js +13 -0
  38. package/build/dist/lib/grepr-api-client.js.map +1 -1
  39. package/build/dist/lib/job-patch.d.ts +34 -2
  40. package/build/dist/lib/job-patch.d.ts.map +1 -1
  41. package/build/dist/lib/job-patch.js +257 -60
  42. package/build/dist/lib/job-patch.js.map +1 -1
  43. package/build/dist/lib/job-plan.d.ts.map +1 -1
  44. package/build/dist/lib/job-plan.js +8 -8
  45. package/build/dist/lib/job-plan.js.map +1 -1
  46. package/build/dist/lib/query-predicate.d.ts +28 -0
  47. package/build/dist/lib/query-predicate.d.ts.map +1 -0
  48. package/build/dist/lib/query-predicate.js +66 -0
  49. package/build/dist/lib/query-predicate.js.map +1 -0
  50. package/build/dist/lib/time-utils.d.ts +25 -0
  51. package/build/dist/lib/time-utils.d.ts.map +1 -1
  52. package/build/dist/lib/time-utils.js +71 -0
  53. package/build/dist/lib/time-utils.js.map +1 -1
  54. package/build/dist/lib/transformers-embeddings.d.ts.map +1 -1
  55. package/build/dist/lib/transformers-embeddings.js +14 -1
  56. package/build/dist/lib/transformers-embeddings.js.map +1 -1
  57. package/build/dist/openapi/openApiTypes.d.ts +438 -18
  58. package/build/dist/openapi/openApiTypes.d.ts.map +1 -1
  59. package/build/dist/openapi/openApiTypes.js +19 -1
  60. package/build/dist/openapi/openApiTypes.js.map +1 -1
  61. package/build/dist/types.d.ts +3 -7
  62. package/build/dist/types.d.ts.map +1 -1
  63. package/build/dist/types.js +1 -1
  64. package/build/dist/types.js.map +1 -1
  65. package/package.json +15 -16
@@ -0,0 +1,181 @@
1
+ import { DatadogLogSinkType, LogsBackfillFlinkSourceType, NewRelicLogSinkType, OtlpLogSinkType, ReadDatadogType, ReadNewRelicType, ReadOtlpType, ReadSplunkType, ReadSumoType, SplunkLogSinkType, SumoLogSinkType } from '../openapi/openApiTypes.js';
2
+ import { findBackfillVendor, isBackfillLogSink, isSupportedBackfillIntegrationType } from './backfill-vendors.js';
3
+ const DATADOG_REGIONAL_SITE_PREFIX_RE = /^(us|eu|ap)\d+\./;
4
+ /** CLI-local because the frontend link builders depend on browser-only sink classes. */
5
+ export function buildBackfillVendorLinks(job, integrations) {
6
+ const source = job.jobGraph.vertices.find(isLogsBackfillSource);
7
+ if (!source?.start || !source?.end) {
8
+ return [];
9
+ }
10
+ const integrationsById = new Map(integrations.map(integration => [integration.id, integration]));
11
+ return job.jobGraph.vertices
12
+ .filter(isBackfillLogSink)
13
+ .map((sink) => {
14
+ const integration = integrationsById.get(sink.integrationId);
15
+ if (!integration || !isSupportedBackfillIntegrationType(integration.type)) {
16
+ return null;
17
+ }
18
+ const vendor = findBackfillVendor(integration.type, sink.type);
19
+ if (!vendor) {
20
+ return null;
21
+ }
22
+ const url = buildVendorUrl(integration, sink, source.start, source.end);
23
+ if (!url) {
24
+ return null;
25
+ }
26
+ return {
27
+ integrationId: integration.id,
28
+ integrationName: integration.name,
29
+ vendorType: integration.type,
30
+ label: `View in ${vendor.vendorName}`,
31
+ url
32
+ };
33
+ })
34
+ .filter((link) => link !== null);
35
+ }
36
+ function isLogsBackfillSource(vertex) {
37
+ return vertex.type === LogsBackfillFlinkSourceType.logs_backfill_iceberg_table_source;
38
+ }
39
+ function buildVendorUrl(integration, sink, start, end) {
40
+ switch (sink.type) {
41
+ case DatadogLogSinkType.datadog_log_sink:
42
+ return integration.type === ReadDatadogType.datadog
43
+ ? buildDatadogUrl(integration, sink, start, end)
44
+ : null;
45
+ case SplunkLogSinkType.splunk_log_sink:
46
+ return integration.type === ReadSplunkType.splunk
47
+ ? buildSplunkUrl(integration, sink, start, end)
48
+ : null;
49
+ case NewRelicLogSinkType.newrelic_log_sink:
50
+ return integration.type === ReadNewRelicType.newrelic
51
+ ? buildNewRelicUrl(integration, sink, start, end)
52
+ : null;
53
+ case SumoLogSinkType.sumologic_log_sink:
54
+ return integration.type === ReadSumoType.sumo
55
+ ? buildSumoUrl(sink, start, end)
56
+ : null;
57
+ case OtlpLogSinkType.otlp_log_sink:
58
+ return integration.type === ReadOtlpType.otlp
59
+ ? buildOtlpUrl(integration, sink, start, end)
60
+ : null;
61
+ }
62
+ }
63
+ function buildDatadogUrl(integration, sink, start, end) {
64
+ const params = new URLSearchParams();
65
+ params.set('from_ts', Date.parse(start).toString());
66
+ params.set('to_ts', Date.parse(end).toString());
67
+ params.set('live', 'false');
68
+ params.append('query', tagsToDatadogQuery(sink.additionalTags ?? []));
69
+ return `${getDatadogLogsUrl(integration.payload?.site)}?${params.toString()}`;
70
+ }
71
+ function getDatadogLogsUrl(site) {
72
+ if (!site) {
73
+ return 'https://app.datadoghq.com/logs';
74
+ }
75
+ if (site.includes('localhost') || site.includes('svc.cluster.local')) {
76
+ return `http://${site}/logs`;
77
+ }
78
+ const baseUrl = DATADOG_REGIONAL_SITE_PREFIX_RE.test(site)
79
+ ? `https://${site}`
80
+ : `https://app.${site}`;
81
+ return `${baseUrl}/logs`;
82
+ }
83
+ function tagsToDatadogQuery(tags) {
84
+ const queryTags = {};
85
+ tags.forEach(tag => {
86
+ const separatorIndex = tag.indexOf(':');
87
+ const key = tag.slice(0, separatorIndex);
88
+ const values = tag.slice(separatorIndex + 1).split(',');
89
+ values.forEach(value => {
90
+ if (queryTags[key]) {
91
+ queryTags[key].push(value);
92
+ }
93
+ else {
94
+ queryTags[key] = [value];
95
+ }
96
+ });
97
+ });
98
+ return Object.entries(queryTags)
99
+ .map(([key, values]) => `${key}:(${values.map(value => `"${value.toLowerCase()}"`).join(' OR ')})`)
100
+ .join(' ');
101
+ }
102
+ function buildSplunkUrl(integration, sink, start, end) {
103
+ const host = integration.payload?.splunkHost || integration.payload?.webHost;
104
+ if (!host) {
105
+ return null;
106
+ }
107
+ let port = integration.payload?.webPort;
108
+ if (!port) {
109
+ port = integration.payload?.secure ? '443' : '8000';
110
+ }
111
+ const protocol = port === '443' ? 'https' : 'http';
112
+ const params = new URLSearchParams();
113
+ params.set('earliest', Math.floor(Date.parse(start) / 1000).toString());
114
+ params.set('latest', (Math.floor(Date.parse(end)) / 1000).toString());
115
+ params.set('q', tagsToSplunkQuery(sink.additionalTags ?? []));
116
+ return `${protocol}://${host}:${port}/app/search/search?${params.toString()}`;
117
+ }
118
+ function tagsToSplunkQuery(tags) {
119
+ const queryTags = {};
120
+ tags.forEach(tag => {
121
+ const normalizedTag = tag.replace(':', '=');
122
+ const separatorIndex = normalizedTag.indexOf('=');
123
+ const key = normalizedTag.slice(0, separatorIndex);
124
+ queryTags[key] = normalizedTag.slice(separatorIndex + 1)
125
+ .split(',')
126
+ .map(value => value.trim());
127
+ });
128
+ const splunkQueryTags = Object.entries(queryTags)
129
+ .map(([key, values]) => `${key}=${values.join(',')}`)
130
+ .join(' ');
131
+ return `search ${splunkQueryTags}`;
132
+ }
133
+ function buildNewRelicUrl(integration, sink, start, end) {
134
+ const params = new URLSearchParams();
135
+ if (integration.payload?.accountId) {
136
+ params.set('platform[accountId]', integration.payload.accountId);
137
+ }
138
+ params.set('launcher', attributesToNewRelicLauncher(sink.additionalAttributes ?? {}, start, end));
139
+ return `https://one.newrelic.com/launcher/logger.log-launcher?${params.toString()}`;
140
+ }
141
+ function attributesToNewRelicLauncher(attributes, start, end) {
142
+ const query = Object.entries(attributes)
143
+ .map(([key, value]) => `${key}:"${value}"`)
144
+ .join(' ');
145
+ const launcherConfig = {
146
+ isEntitled: true,
147
+ query,
148
+ eventTypes: ['Log_Logging'],
149
+ timeRange: {
150
+ begin_time: new Date(start).getTime(),
151
+ end_time: new Date(end).getTime()
152
+ }
153
+ };
154
+ return Buffer.from(JSON.stringify(launcherConfig), 'utf8').toString('base64');
155
+ }
156
+ function buildSumoUrl(sink, start, end) {
157
+ const startTimestamp = new Date(start).getTime();
158
+ const endTimestamp = new Date(end).getTime();
159
+ return `https://service.sumologic.com/ui/index.html#section/search/@${startTimestamp},${endTimestamp}@${attributesToSumoQuery(sink.additionalAttributes ?? {})}`;
160
+ }
161
+ function buildOtlpUrl(integration, sink, start, end) {
162
+ const baseUrl = integration.payload?.logsEndpoint || integration.payload?.endpoint;
163
+ if (!baseUrl) {
164
+ return null;
165
+ }
166
+ const startTimestamp = new Date(start).getTime();
167
+ const endTimestamp = new Date(end).getTime();
168
+ return `${baseUrl}/@${startTimestamp},${endTimestamp}@${attributesToOtlpQuery(sink.additionalAttributes ?? {})}`;
169
+ }
170
+ function attributesToSumoQuery(attributes) {
171
+ const whereClause = Object.entries(attributes)
172
+ .map(([key, value]) => `${key}="${value}"`)
173
+ .join(' and ');
174
+ return encodeURIComponent(`_source=?? | where ${whereClause}`);
175
+ }
176
+ function attributesToOtlpQuery(attributes) {
177
+ return encodeURIComponent(Object.entries(attributes)
178
+ .map(([key, value]) => `${key}=${value}`)
179
+ .join(' '));
180
+ }
181
+ //# sourceMappingURL=backfill-vendor-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-vendor-links.js","sourceRoot":"","sources":["../../../src/main/typescript/lib/backfill-vendor-links.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EAUhB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kCAAkC,EAGnC,MAAM,uBAAuB,CAAC;AAY/B,MAAM,+BAA+B,GAAG,kBAAkB,CAAC;AAE3D,wFAAwF;AACxF,MAAM,UAAU,wBAAwB,CACtC,GAAgB,EAChB,YAAmC;IAEnC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ;SACzB,MAAM,CAAC,iBAAiB,CAAC;SACzB,GAAG,CAAC,CAAC,IAAI,EAA6B,EAAE;QACvC,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7D,IAAI,CAAC,WAAW,IAAI,CAAC,kCAAkC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,aAAa,EAAE,WAAW,CAAC,EAAE;YAC7B,eAAe,EAAE,WAAW,CAAC,IAAI;YACjC,UAAU,EAAE,WAAW,CAAC,IAAI;YAC5B,KAAK,EAAE,WAAW,MAAM,CAAC,UAAU,EAAE;YACrC,GAAG;SACJ,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAA8B,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,OAAO,MAAM,CAAC,IAAI,KAAK,2BAA2B,CAAC,kCAAkC,CAAC;AACxF,CAAC;AAED,SAAS,cAAc,CACrB,WAAgC,EAChC,IAAqB,EACrB,KAAa,EACb,GAAW;IAEX,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,kBAAkB,CAAC,gBAAgB;YACtC,OAAO,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,OAAO;gBACjD,CAAC,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;gBAChD,CAAC,CAAC,IAAI,CAAC;QACX,KAAK,iBAAiB,CAAC,eAAe;YACpC,OAAO,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,MAAM;gBAC/C,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC;QACX,KAAK,mBAAmB,CAAC,iBAAiB;YACxC,OAAO,WAAW,CAAC,IAAI,KAAK,gBAAgB,CAAC,QAAQ;gBACnD,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;gBACjD,CAAC,CAAC,IAAI,CAAC;QACX,KAAK,eAAe,CAAC,kBAAkB;YACrC,OAAO,WAAW,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI;gBAC3C,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;gBAChC,CAAC,CAAC,IAAI,CAAC;QACX,KAAK,eAAe,CAAC,aAAa;YAChC,OAAO,WAAW,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI;gBAC3C,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;gBAC7C,CAAC,CAAC,IAAI,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,WAAoE,EACpE,IAA0B,EAC1B,KAAa,EACb,GAAW;IAEX,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,IAAI,OAAO,CAAC;IAC/B,CAAC;IACD,MAAM,OAAO,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;QACxD,CAAC,CAAC,WAAW,IAAI,EAAE;QACnB,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC;IAC1B,OAAO,GAAG,OAAO,OAAO,CAAC;AAC3B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAc;IACxC,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;SAClG,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,WAAmE,EACnE,IAAyB,EACzB,KAAa,EACb,GAAW;IAEX,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;IAC7E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;IACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,GAAG,QAAQ,MAAM,IAAI,IAAI,IAAI,sBAAsB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACnD,SAAS,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;aACrD,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;SACpD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,UAAU,eAAe,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CACvB,WAAqE,EACrE,IAA2B,EAC3B,KAAa,EACb,GAAW;IAEX,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,4BAA4B,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAClG,OAAO,yDAAyD,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,4BAA4B,CACnC,UAAkC,EAClC,KAAa,EACb,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SACrC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;SAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,cAAc,GAAG;QACrB,UAAU,EAAE,IAAI;QAChB,KAAK;QACL,UAAU,EAAE,CAAC,aAAa,CAAC;QAC3B,SAAS,EAAE;YACT,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE;SAClC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,YAAY,CACnB,IAAuB,EACvB,KAAa,EACb,GAAW;IAEX,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,OAAO,+DAA+D,cAAc,IAAI,YAAY,IAAI,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;AACnK,CAAC;AAED,SAAS,YAAY,CACnB,WAAiE,EACjE,IAAuB,EACvB,KAAa,EACb,GAAW;IAEX,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,YAAY,IAAI,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,OAAO,GAAG,OAAO,KAAK,cAAc,IAAI,YAAY,IAAI,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkC;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;SAC1C,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,OAAO,kBAAkB,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkC;IAC/D,OAAO,kBAAkB,CACvB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;SACxC,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { DatadogLogSinkType, NewRelicLogSinkType, OtlpLogSinkType, ReadDatadogType, ReadNewRelicType, ReadOtlpType, ReadSplunkType, ReadSumoType, SplunkLogSinkType, SumoLogSinkType, type SchemaOperation } from '../openapi/openApiTypes.js';
2
+ import type { IntegrationReadType } from '../types.js';
3
+ interface BackfillVendorDescriptor {
4
+ integrationType: IntegrationReadType['type'];
5
+ sinkType: SchemaOperation['type'];
6
+ vendorName: string;
7
+ maxBackfillAgeHours?: number;
8
+ }
9
+ declare const BACKFILL_VENDORS: ({
10
+ integrationType: ReadDatadogType;
11
+ sinkType: DatadogLogSinkType;
12
+ vendorName: string;
13
+ maxBackfillAgeHours: number;
14
+ } | {
15
+ integrationType: ReadSplunkType;
16
+ sinkType: SplunkLogSinkType;
17
+ vendorName: string;
18
+ maxBackfillAgeHours?: undefined;
19
+ } | {
20
+ integrationType: ReadNewRelicType;
21
+ sinkType: NewRelicLogSinkType;
22
+ vendorName: string;
23
+ maxBackfillAgeHours: number;
24
+ } | {
25
+ integrationType: ReadSumoType;
26
+ sinkType: SumoLogSinkType;
27
+ vendorName: string;
28
+ maxBackfillAgeHours?: undefined;
29
+ } | {
30
+ integrationType: ReadOtlpType;
31
+ sinkType: OtlpLogSinkType;
32
+ vendorName: string;
33
+ maxBackfillAgeHours?: undefined;
34
+ })[];
35
+ export type BackfillIntegrationType = typeof BACKFILL_VENDORS[number]['integrationType'];
36
+ export type BackfillLogSinkType = typeof BACKFILL_VENDORS[number]['sinkType'];
37
+ export type BackfillLogSink = Extract<SchemaOperation, {
38
+ type: BackfillLogSinkType;
39
+ }>;
40
+ export declare function findBackfillVendor(integrationType: IntegrationReadType['type'], sinkType: SchemaOperation['type']): BackfillVendorDescriptor | undefined;
41
+ export declare function findBackfillVendorByIntegrationType(integrationType: IntegrationReadType['type']): BackfillVendorDescriptor | undefined;
42
+ export declare function isSupportedBackfillIntegrationType(type: IntegrationReadType['type']): type is BackfillIntegrationType;
43
+ export declare function isBackfillLogSink(vertex: SchemaOperation): vertex is BackfillLogSink;
44
+ export {};
45
+ //# sourceMappingURL=backfill-vendors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-vendors.d.ts","sourceRoot":"","sources":["../../../src/main/typescript/lib/backfill-vendors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,UAAU,wBAAwB;IAChC,eAAe,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;IA4ByB,CAAC;AAEhD,MAAM,MAAM,uBAAuB,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AACzF,MAAM,MAAM,mBAAmB,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;AAC9E,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAC;AAEtF,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAC5C,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,GAChC,wBAAwB,GAAG,SAAS,CAItC;AAED,wBAAgB,mCAAmC,CACjD,eAAe,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAC3C,wBAAwB,GAAG,SAAS,CAEtC;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAChC,IAAI,IAAI,uBAAuB,CAEjC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,IAAI,eAAe,CAEpF"}
@@ -0,0 +1,43 @@
1
+ import { DatadogLogSinkType, NewRelicLogSinkType, OtlpLogSinkType, ReadDatadogType, ReadNewRelicType, ReadOtlpType, ReadSplunkType, ReadSumoType, SplunkLogSinkType, SumoLogSinkType } from '../openapi/openApiTypes.js';
2
+ const BACKFILL_VENDORS = [
3
+ {
4
+ integrationType: ReadDatadogType.datadog,
5
+ sinkType: DatadogLogSinkType.datadog_log_sink,
6
+ vendorName: 'Datadog',
7
+ maxBackfillAgeHours: 18
8
+ },
9
+ {
10
+ integrationType: ReadSplunkType.splunk,
11
+ sinkType: SplunkLogSinkType.splunk_log_sink,
12
+ vendorName: 'Splunk'
13
+ },
14
+ {
15
+ integrationType: ReadNewRelicType.newrelic,
16
+ sinkType: NewRelicLogSinkType.newrelic_log_sink,
17
+ vendorName: 'New Relic',
18
+ maxBackfillAgeHours: 48
19
+ },
20
+ {
21
+ integrationType: ReadSumoType.sumo,
22
+ sinkType: SumoLogSinkType.sumologic_log_sink,
23
+ vendorName: 'Sumo Logic'
24
+ },
25
+ {
26
+ integrationType: ReadOtlpType.otlp,
27
+ sinkType: OtlpLogSinkType.otlp_log_sink,
28
+ vendorName: 'Open Telemetry'
29
+ }
30
+ ];
31
+ export function findBackfillVendor(integrationType, sinkType) {
32
+ return BACKFILL_VENDORS.find(vendor => vendor.integrationType === integrationType && vendor.sinkType === sinkType);
33
+ }
34
+ export function findBackfillVendorByIntegrationType(integrationType) {
35
+ return BACKFILL_VENDORS.find(vendor => vendor.integrationType === integrationType);
36
+ }
37
+ export function isSupportedBackfillIntegrationType(type) {
38
+ return BACKFILL_VENDORS.some(vendor => vendor.integrationType === type);
39
+ }
40
+ export function isBackfillLogSink(vertex) {
41
+ return BACKFILL_VENDORS.some(vendor => vendor.sinkType === vertex.type);
42
+ }
43
+ //# sourceMappingURL=backfill-vendors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-vendors.js","sourceRoot":"","sources":["../../../src/main/typescript/lib/backfill-vendors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EAEhB,MAAM,4BAA4B,CAAC;AAUpC,MAAM,gBAAgB,GAAG;IACvB;QACE,eAAe,EAAE,eAAe,CAAC,OAAO;QACxC,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB;QAC7C,UAAU,EAAE,SAAS;QACrB,mBAAmB,EAAE,EAAE;KACxB;IACD;QACE,eAAe,EAAE,cAAc,CAAC,MAAM;QACtC,QAAQ,EAAE,iBAAiB,CAAC,eAAe;QAC3C,UAAU,EAAE,QAAQ;KACrB;IACD;QACE,eAAe,EAAE,gBAAgB,CAAC,QAAQ;QAC1C,QAAQ,EAAE,mBAAmB,CAAC,iBAAiB;QAC/C,UAAU,EAAE,WAAW;QACvB,mBAAmB,EAAE,EAAE;KACxB;IACD;QACE,eAAe,EAAE,YAAY,CAAC,IAAI;QAClC,QAAQ,EAAE,eAAe,CAAC,kBAAkB;QAC5C,UAAU,EAAE,YAAY;KACzB;IACD;QACE,eAAe,EAAE,YAAY,CAAC,IAAI;QAClC,QAAQ,EAAE,eAAe,CAAC,aAAa;QACvC,UAAU,EAAE,gBAAgB;KAC7B;CAC4C,CAAC;AAMhD,MAAM,UAAU,kBAAkB,CAChC,eAA4C,EAC5C,QAAiC;IAEjC,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACpC,MAAM,CAAC,eAAe,KAAK,eAAe,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,eAA4C;IAE5C,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,KAAK,eAAe,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,IAAiC;IAEjC,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { type SchemaCreateJob, type SchemaDatasetRead, type SchemaReadJob } from '../openapi/openApiTypes.js';
2
+ import type { IntegrationReadType } from '../types.js';
3
+ import type { LanguageQueryType } from './query-predicate.js';
4
+ export interface BackfillCommandInputs {
5
+ jobId?: string;
6
+ datasetId?: string;
7
+ datasetName?: string;
8
+ sinkIds?: string[];
9
+ start?: string;
10
+ end?: string;
11
+ query?: string;
12
+ queryType?: LanguageQueryType;
13
+ limit?: number;
14
+ tags?: string[];
15
+ }
16
+ export interface BackfillApiClient {
17
+ getJob(id: string, version?: number, resolved?: boolean): Promise<SchemaReadJob | undefined>;
18
+ listDatasets(): Promise<SchemaDatasetRead[] | undefined>;
19
+ getDataset(id: string): Promise<SchemaDatasetRead | undefined>;
20
+ getIntegrationById(id: string): Promise<IntegrationReadType | null>;
21
+ createAsyncJob(job: SchemaCreateJob): Promise<SchemaReadJob | undefined>;
22
+ }
23
+ interface BackfillJobInputs {
24
+ datasetId: string;
25
+ teamIds: string[];
26
+ sinks: IntegrationReadType[];
27
+ }
28
+ interface SkippedBackfillSink {
29
+ sink: IntegrationReadType;
30
+ reason: string;
31
+ }
32
+ interface BackfillResolvedInputs extends BackfillJobInputs {
33
+ skippedSinks: SkippedBackfillSink[];
34
+ }
35
+ /**
36
+ * Validates the mutually exclusive backfill modes and shared command bounds
37
+ * before any API lookups or job graph construction happens.
38
+ */
39
+ export declare function validateBackfillInputs(options: BackfillCommandInputs): void;
40
+ /**
41
+ * Resolves CLI references into the concrete raw logs dataset and vendor log
42
+ * sinks that the backfill job should read from and replay to.
43
+ */
44
+ export declare function resolveBackfillInputs(options: BackfillCommandInputs, apiClient: BackfillApiClient, now?: Date): Promise<BackfillResolvedInputs>;
45
+ /**
46
+ * Builds the asynchronous batch job graph used for manual logs backfills,
47
+ * including per-sink duplicate-delivery filters and vendor dedup sinks.
48
+ */
49
+ export declare function buildBackfillJob(options: BackfillCommandInputs, resolved: BackfillJobInputs, now?: Date): SchemaCreateJob;
50
+ export {};
51
+ //# sourceMappingURL=backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../../src/main/typescript/lib/backfill.ts"],"names":[],"mappings":"AAAA,OAAO,EAmBL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAItB,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAc9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAC7F,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,GAAG,SAAS,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAC/D,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACpE,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;CAC1E;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,sBAAuB,SAAQ,iBAAiB;IACxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAyB3E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,iBAAiB,EAC5B,GAAG,OAAa,GACf,OAAO,CAAC,sBAAsB,CAAC,CAmBjC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,OAAa,GACf,eAAe,CA2DjB"}