@analyticscli/growth-engineer 0.1.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/config.d.ts +1663 -0
  4. package/dist/config.js +266 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +1188 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/runtime/export-analytics-summary.d.mts +2 -0
  10. package/dist/runtime/export-analytics-summary.mjs +303 -0
  11. package/dist/runtime/export-analytics-summary.mjs.map +1 -0
  12. package/dist/runtime/export-asc-summary.d.mts +2 -0
  13. package/dist/runtime/export-asc-summary.mjs +376 -0
  14. package/dist/runtime/export-asc-summary.mjs.map +1 -0
  15. package/dist/runtime/export-revenuecat-summary.d.mts +2 -0
  16. package/dist/runtime/export-revenuecat-summary.mjs +176 -0
  17. package/dist/runtime/export-revenuecat-summary.mjs.map +1 -0
  18. package/dist/runtime/export-sentry-summary.d.mts +2 -0
  19. package/dist/runtime/export-sentry-summary.mjs +352 -0
  20. package/dist/runtime/export-sentry-summary.mjs.map +1 -0
  21. package/dist/runtime/openclaw-exporters-lib.d.mts +101 -0
  22. package/dist/runtime/openclaw-exporters-lib.mjs +1276 -0
  23. package/dist/runtime/openclaw-exporters-lib.mjs.map +1 -0
  24. package/dist/runtime/openclaw-feedback-api.d.mts +2 -0
  25. package/dist/runtime/openclaw-feedback-api.mjs +255 -0
  26. package/dist/runtime/openclaw-feedback-api.mjs.map +1 -0
  27. package/dist/runtime/openclaw-growth-charts.py +154 -0
  28. package/dist/runtime/openclaw-growth-engineer.d.mts +2 -0
  29. package/dist/runtime/openclaw-growth-engineer.mjs +1258 -0
  30. package/dist/runtime/openclaw-growth-engineer.mjs.map +1 -0
  31. package/dist/runtime/openclaw-growth-env.d.mts +9 -0
  32. package/dist/runtime/openclaw-growth-env.mjs +125 -0
  33. package/dist/runtime/openclaw-growth-env.mjs.map +1 -0
  34. package/dist/runtime/openclaw-growth-preflight.d.mts +2 -0
  35. package/dist/runtime/openclaw-growth-preflight.mjs +1111 -0
  36. package/dist/runtime/openclaw-growth-preflight.mjs.map +1 -0
  37. package/dist/runtime/openclaw-growth-runner.d.mts +2 -0
  38. package/dist/runtime/openclaw-growth-runner.mjs +1302 -0
  39. package/dist/runtime/openclaw-growth-runner.mjs.map +1 -0
  40. package/dist/runtime/openclaw-growth-shared.d.mts +33 -0
  41. package/dist/runtime/openclaw-growth-shared.mjs +208 -0
  42. package/dist/runtime/openclaw-growth-shared.mjs.map +1 -0
  43. package/dist/runtime/openclaw-growth-start.d.mts +2 -0
  44. package/dist/runtime/openclaw-growth-start.mjs +1575 -0
  45. package/dist/runtime/openclaw-growth-start.mjs.map +1 -0
  46. package/dist/runtime/openclaw-growth-status.d.mts +2 -0
  47. package/dist/runtime/openclaw-growth-status.mjs +387 -0
  48. package/dist/runtime/openclaw-growth-status.mjs.map +1 -0
  49. package/dist/runtime/openclaw-growth-wizard.d.mts +2 -0
  50. package/dist/runtime/openclaw-growth-wizard.mjs +3519 -0
  51. package/dist/runtime/openclaw-growth-wizard.mjs.map +1 -0
  52. package/dist/shell.d.ts +17 -0
  53. package/dist/shell.js +40 -0
  54. package/dist/shell.js.map +1 -0
  55. package/package.json +38 -0
  56. package/templates/analytics_summary.example.json +40 -0
  57. package/templates/config.example.json +197 -0
  58. package/templates/feedback_summary.example.json +37 -0
  59. package/templates/revenuecat_summary.example.json +25 -0
  60. package/templates/sentry_summary.example.json +23 -0
@@ -0,0 +1,352 @@
1
+ #!/usr/bin/env node
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { writeJsonOutput, buildSentrySummary } from './openclaw-exporters-lib.mjs';
5
+ const DEFAULT_BASE_URL = 'https://sentry.io';
6
+ const DEFAULT_CONFIG_PATH = 'data/openclaw-growth-engineer/config.json';
7
+ function printHelpAndExit(exitCode, reason = null) {
8
+ if (reason) {
9
+ process.stderr.write(`${reason}\n\n`);
10
+ }
11
+ process.stdout.write(`
12
+ Export Sentry Summary
13
+
14
+ Builds an OpenClaw-compatible crash/stability summary JSON from the Sentry API.
15
+
16
+ Usage:
17
+ node scripts/export-sentry-summary.mjs [options]
18
+
19
+ Options:
20
+ --org <slug> Sentry organization slug (default: SENTRY_ORG)
21
+ --project <slug> Sentry project slug (default: SENTRY_PROJECT)
22
+ --environment <name> Sentry environment filter (default: SENTRY_ENVIRONMENT or production)
23
+ --last <duration> Sentry statsPeriod, e.g. 24h, 7d, 30d (default: 7d)
24
+ --query <query> Issue search query (default: is:unresolved)
25
+ --limit <n> Max Sentry issues to fetch, capped at 50 (default: 20)
26
+ --max-signals <n> Max normalized signals/issues to emit (default: 5)
27
+ --base-url <url> Sentry base URL for self-hosted instances (default: SENTRY_BASE_URL or ${DEFAULT_BASE_URL})
28
+ --config <file> OpenClaw config with sources.sentry.accounts[] (default: ${DEFAULT_CONFIG_PATH} when present)
29
+ --accounts-file <file> JSON file containing an accounts[] array or array
30
+ --out <file> Write JSON to file instead of stdout
31
+ --help, -h Show help
32
+ `);
33
+ process.exit(exitCode);
34
+ }
35
+ function parseArgs(argv) {
36
+ const args = {
37
+ org: String(process.env.SENTRY_ORG || '').trim(),
38
+ project: String(process.env.SENTRY_PROJECT || '').trim(),
39
+ environment: String(process.env.SENTRY_ENVIRONMENT || 'production').trim(),
40
+ last: '7d',
41
+ query: 'is:unresolved',
42
+ limit: 20,
43
+ maxSignals: 5,
44
+ baseUrl: String(process.env.SENTRY_BASE_URL || DEFAULT_BASE_URL).trim(),
45
+ config: '',
46
+ accountsFile: '',
47
+ out: '',
48
+ };
49
+ for (let index = 0; index < argv.length; index += 1) {
50
+ const token = argv[index];
51
+ const next = argv[index + 1];
52
+ if (token === '--') {
53
+ continue;
54
+ }
55
+ else if (token === '--org') {
56
+ args.org = String(next || '').trim();
57
+ index += 1;
58
+ }
59
+ else if (token === '--project') {
60
+ args.project = String(next || '').trim();
61
+ index += 1;
62
+ }
63
+ else if (token === '--environment') {
64
+ args.environment = String(next || '').trim();
65
+ index += 1;
66
+ }
67
+ else if (token === '--last') {
68
+ args.last = String(next || args.last).trim();
69
+ index += 1;
70
+ }
71
+ else if (token === '--query') {
72
+ args.query = String(next || '').trim();
73
+ index += 1;
74
+ }
75
+ else if (token === '--limit') {
76
+ args.limit = normalizeInteger(next, '--limit', 1, 50);
77
+ index += 1;
78
+ }
79
+ else if (token === '--max-signals') {
80
+ args.maxSignals = normalizeInteger(next, '--max-signals', 1, 20);
81
+ index += 1;
82
+ }
83
+ else if (token === '--base-url') {
84
+ args.baseUrl = String(next || '').trim();
85
+ index += 1;
86
+ }
87
+ else if (token === '--config') {
88
+ args.config = String(next || '').trim();
89
+ index += 1;
90
+ }
91
+ else if (token === '--accounts-file') {
92
+ args.accountsFile = String(next || '').trim();
93
+ index += 1;
94
+ }
95
+ else if (token === '--out') {
96
+ args.out = String(next || '').trim();
97
+ index += 1;
98
+ }
99
+ else if (token === '--help' || token === '-h') {
100
+ printHelpAndExit(0);
101
+ }
102
+ else {
103
+ printHelpAndExit(1, `Unknown argument: ${token}`);
104
+ }
105
+ }
106
+ return args;
107
+ }
108
+ async function readJsonIfPresent(filePath, required = false) {
109
+ const normalized = String(filePath || '').trim();
110
+ if (!normalized)
111
+ return null;
112
+ try {
113
+ return JSON.parse(await fs.readFile(path.resolve(normalized), 'utf8'));
114
+ }
115
+ catch (error) {
116
+ if (!required && error && typeof error === 'object' && error.code === 'ENOENT')
117
+ return null;
118
+ throw error;
119
+ }
120
+ }
121
+ function normalizeArray(value) {
122
+ if (Array.isArray(value))
123
+ return value;
124
+ if (Array.isArray(value?.accounts))
125
+ return value.accounts;
126
+ return [];
127
+ }
128
+ function normalizeProjectEntries(account) {
129
+ const projects = Array.isArray(account?.projects) ? account.projects : account?.project ? [account.project] : [];
130
+ return projects
131
+ .map((entry) => (typeof entry === 'string' ? { project: entry } : entry))
132
+ .filter((entry) => entry && typeof entry === 'object' && String(entry.project || entry.slug || '').trim())
133
+ .map((entry) => ({
134
+ project: String(entry.project || entry.slug || '').trim(),
135
+ org: String(entry.org || entry.organization || account.org || account.organization || '').trim(),
136
+ environment: String(entry.environment || account.environment || process.env.SENTRY_ENVIRONMENT || 'production').trim(),
137
+ last: String(entry.last || account.last || '').trim(),
138
+ query: String(entry.query || account.query || '').trim(),
139
+ limit: entry.limit || account.limit,
140
+ }));
141
+ }
142
+ function normalizeAccountConfigs(rawAccounts, args) {
143
+ return rawAccounts.flatMap((account, index) => {
144
+ if (!account || typeof account !== 'object')
145
+ return [];
146
+ const id = String(account.id || account.key || account.label || `sentry_${index + 1}`).trim();
147
+ const baseUrl = String(account.baseUrl || account.base_url || account.url || args.baseUrl || DEFAULT_BASE_URL).trim();
148
+ const tokenEnv = String(account.tokenEnv || account.token_env || account.secretEnv || 'SENTRY_AUTH_TOKEN').trim();
149
+ const projectEntries = normalizeProjectEntries(account);
150
+ if (projectEntries.length > 0) {
151
+ return projectEntries.map((projectEntry) => ({
152
+ ...projectEntry,
153
+ id: `${id}_${projectEntry.project}`.replace(/[^a-zA-Z0-9._-]+/g, '_'),
154
+ accountId: id,
155
+ label: String(account.label || account.name || id).trim(),
156
+ baseUrl,
157
+ tokenEnv,
158
+ maxSignals: args.maxSignals,
159
+ }));
160
+ }
161
+ const org = String(account.org || account.organization || args.org || '').trim();
162
+ if (!org)
163
+ return [];
164
+ return [{
165
+ id: id.replace(/[^a-zA-Z0-9._-]+/g, '_'),
166
+ accountId: id,
167
+ label: String(account.label || account.name || id).trim(),
168
+ baseUrl,
169
+ tokenEnv,
170
+ org,
171
+ project: '',
172
+ environment: String(account.environment || args.environment || process.env.SENTRY_ENVIRONMENT || 'production').trim(),
173
+ last: String(account.last || args.last || '').trim(),
174
+ query: String(account.query || args.query || '').trim(),
175
+ limit: account.limit || args.limit,
176
+ maxSignals: args.maxSignals,
177
+ }];
178
+ });
179
+ }
180
+ async function expandDiscoveredProjects(account, token) {
181
+ if (String(account.project || '').trim())
182
+ return [account];
183
+ const org = requireValue(account.org, 'SENTRY_ORG');
184
+ const url = buildUrl(account.baseUrl || DEFAULT_BASE_URL, `/api/0/organizations/${encodeURIComponent(org)}/projects/`, {
185
+ per_page: 100,
186
+ });
187
+ const payload = await sentryFetchList(url, token);
188
+ const projects = apiListItems(payload)
189
+ .map((project) => String(project?.slug || project?.name || '').trim())
190
+ .filter(Boolean);
191
+ const uniqueProjects = [...new Set(projects)];
192
+ if (uniqueProjects.length === 0) {
193
+ throw new Error(`No Sentry projects are visible for org ${org}. Check token scopes org:read/project:read/event:read and org access.`);
194
+ }
195
+ return uniqueProjects.map((project) => ({
196
+ ...account,
197
+ project,
198
+ id: `${account.accountId || account.id}_${project}`.replace(/[^a-zA-Z0-9._-]+/g, '_'),
199
+ }));
200
+ }
201
+ async function loadConfiguredAccounts(args) {
202
+ const accountPayload = args.accountsFile ? await readJsonIfPresent(args.accountsFile, true) : null;
203
+ const accountsFromFile = normalizeArray(accountPayload);
204
+ if (accountsFromFile.length > 0)
205
+ return normalizeAccountConfigs(accountsFromFile, args);
206
+ const configPath = args.config || DEFAULT_CONFIG_PATH;
207
+ const config = await readJsonIfPresent(configPath, Boolean(args.config));
208
+ const accountsFromConfig = normalizeArray(config?.sources?.sentry);
209
+ if (accountsFromConfig.length > 0)
210
+ return normalizeAccountConfigs(accountsFromConfig, args);
211
+ const singleAccount = {
212
+ id: 'sentry',
213
+ label: 'Sentry',
214
+ baseUrl: args.baseUrl,
215
+ tokenEnv: 'SENTRY_AUTH_TOKEN',
216
+ org: args.org,
217
+ project: args.project,
218
+ environment: args.environment,
219
+ last: args.last,
220
+ query: args.query,
221
+ limit: args.limit,
222
+ };
223
+ return normalizeProjectEntries(singleAccount).length > 0 ? normalizeAccountConfigs([singleAccount], args) : [];
224
+ }
225
+ function normalizeInteger(value, label, min, max) {
226
+ const parsed = Number.parseInt(String(value || ''), 10);
227
+ if (!Number.isFinite(parsed) || parsed < min || parsed > max) {
228
+ printHelpAndExit(1, `${label} must be an integer between ${min} and ${max}`);
229
+ }
230
+ return parsed;
231
+ }
232
+ function requireValue(value, label) {
233
+ const normalized = String(value || '').trim();
234
+ if (!normalized) {
235
+ throw new Error(`${label} is required. Set it in the Sentry connector wizard or pass the flag explicitly.`);
236
+ }
237
+ return normalized;
238
+ }
239
+ function buildUrl(baseUrl, pathname, params) {
240
+ const url = new URL(pathname, `${baseUrl.replace(/\/$/, '')}/`);
241
+ for (const [key, value] of Object.entries(params)) {
242
+ if (value === undefined || value === null || value === '')
243
+ continue;
244
+ url.searchParams.set(key, String(value));
245
+ }
246
+ return url;
247
+ }
248
+ function apiListItems(payload) {
249
+ if (Array.isArray(payload))
250
+ return payload;
251
+ if (!payload || typeof payload !== 'object')
252
+ return [];
253
+ if (Array.isArray(payload.results))
254
+ return payload.results;
255
+ if (Array.isArray(payload.data))
256
+ return payload.data;
257
+ if (Array.isArray(payload.projects))
258
+ return payload.projects;
259
+ return [];
260
+ }
261
+ async function sentryFetchJson(url, token) {
262
+ const response = await fetch(url, {
263
+ method: 'GET',
264
+ headers: {
265
+ Accept: 'application/json',
266
+ Authorization: `Bearer ${token}`,
267
+ 'User-Agent': 'openclaw-growth-sentry-exporter',
268
+ },
269
+ });
270
+ const body = await response.text();
271
+ if (!response.ok) {
272
+ throw new Error(`Sentry API ${response.status}: ${body.slice(0, 500) || 'request failed'}`);
273
+ }
274
+ return body ? JSON.parse(body) : null;
275
+ }
276
+ async function sentryFetchList(url, token) {
277
+ const items = [];
278
+ let nextUrl = url;
279
+ for (let page = 0; nextUrl && page < 10; page += 1) {
280
+ const payload = await sentryFetchJson(nextUrl, token);
281
+ items.push(...apiListItems(payload));
282
+ const next = payload && typeof payload === 'object' ? payload.next : null;
283
+ nextUrl = typeof next === 'string' && next.trim() ? new URL(next, `${nextUrl.origin}/`) : null;
284
+ }
285
+ return items;
286
+ }
287
+ function redactString(value) {
288
+ return String(value || '')
289
+ .replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, '[REDACTED_EMAIL]')
290
+ .replace(/\b(?:\d{1,3}\.){3}\d{1,3}\b/g, '[REDACTED_IP]');
291
+ }
292
+ function redactData(value) {
293
+ if (typeof value === 'string')
294
+ return redactString(value);
295
+ if (Array.isArray(value))
296
+ return value.map((entry) => redactData(entry));
297
+ if (value && typeof value === 'object') {
298
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
299
+ key,
300
+ ['email', 'ip', 'ip_address'].includes(key.toLowerCase()) ? '[REDACTED]' : redactData(entry),
301
+ ]));
302
+ }
303
+ return value;
304
+ }
305
+ async function listIssues(account, token) {
306
+ const org = encodeURIComponent(requireValue(account.org, 'SENTRY_ORG'));
307
+ const project = encodeURIComponent(requireValue(account.project, 'SENTRY_PROJECT'));
308
+ const url = buildUrl(account.baseUrl || DEFAULT_BASE_URL, `/api/0/projects/${org}/${project}/issues/`, {
309
+ statsPeriod: account.last,
310
+ environment: account.environment,
311
+ query: account.query,
312
+ per_page: account.limit,
313
+ });
314
+ const payload = await sentryFetchJson(url, token);
315
+ return Array.isArray(payload) ? payload : [];
316
+ }
317
+ async function main() {
318
+ const args = parseArgs(process.argv.slice(2));
319
+ const configuredAccounts = await loadConfiguredAccounts(args);
320
+ if (configuredAccounts.length === 0) {
321
+ throw new Error(`No Sentry account configured. Set SENTRY_AUTH_TOKEN plus SENTRY_ORG, pass --org, or add sources.sentry.accounts[] in ${args.config || DEFAULT_CONFIG_PATH}.`);
322
+ }
323
+ const accounts = [];
324
+ for (const account of configuredAccounts) {
325
+ const token = requireValue(process.env[account.tokenEnv], account.tokenEnv);
326
+ accounts.push(...await expandDiscoveredProjects(account, token));
327
+ }
328
+ const summaries = [];
329
+ for (const account of accounts) {
330
+ const token = requireValue(process.env[account.tokenEnv], account.tokenEnv);
331
+ const issuesPayload = redactData(await listIssues(account, token));
332
+ summaries.push({
333
+ id: account.id,
334
+ label: account.label,
335
+ org: account.org,
336
+ project: account.project,
337
+ environment: account.environment,
338
+ last: account.last || args.last,
339
+ issuesPayload,
340
+ maxSignals: args.maxSignals,
341
+ });
342
+ }
343
+ const summary = summaries.length === 1
344
+ ? buildSentrySummary(summaries[0])
345
+ : buildSentrySummary({ accounts: summaries, last: args.last, maxSignals: args.maxSignals });
346
+ await writeJsonOutput(args.out, summary);
347
+ }
348
+ main().catch((error) => {
349
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
350
+ process.exitCode = 1;
351
+ });
352
+ //# sourceMappingURL=export-sentry-summary.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-sentry-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-sentry-summary.mts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAC7C,MAAM,mBAAmB,GAAG,2CAA2C,CAAC;AAExE,SAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;kGAgB2E,gBAAgB;oFAC9B,mBAAmB;;;;CAItG,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,IAAI;IACrB,MAAM,IAAI,GAAG;QACX,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAChD,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACxD,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC,CAAC,IAAI,EAAE;QAC1E,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,EAAE;QACT,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE;QACvE,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,GAAG,EAAE,EAAE;KACR,CAAC;IAEF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACjE,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,iBAAiB,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChD,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,CAAC,EAAE,qBAAqB,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAa,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrG,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAK;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC1D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAO;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjH,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACxE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACzG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACzD,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAChG,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC,CAAC,IAAI,EAAE;QACtH,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACrD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACxD,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;KACpC,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAW,EAAE,IAAI;IAChD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,IAAI,UAAU,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;QACtH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;QAClH,MAAM,cAAc,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC3C,GAAG,YAAY;gBACf,EAAE,EAAE,GAAG,EAAE,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;gBACrE,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACzD,OAAO;gBACP,QAAQ;gBACR,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC,CAAC,CAAC;QACN,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC;gBACN,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;gBACxC,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACzD,OAAO;gBACP,QAAQ;gBACR,GAAG;gBACH,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC,CAAC,IAAI,EAAE;gBACrH,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACpD,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBACvD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;gBAClC,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,OAAO,EAAE,KAAK;IACpD,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,gBAAgB,EAAE,wBAAwB,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE;QACrH,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC;SACnC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACrE,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,uEAAuE,CAAC,CAAC;IACxI,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,GAAG,OAAO;QACV,OAAO;QACP,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;KACtF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAI;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,MAAM,gBAAgB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,uBAAuB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAExF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,mBAAmB,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACnE,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,uBAAuB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAE5F,MAAM,aAAa,GAAG;QACpB,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,mBAAmB;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;IACF,OAAO,uBAAuB,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC7D,gBAAgB,CAAC,CAAC,EAAE,GAAG,KAAK,+BAA+B,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAK,EAAE,KAAK;IAChC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kFAAkF,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QACpE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,OAAO;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC7D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAG,EAAE,KAAK;IACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,YAAY,EAAE,iCAAiC;SAChD;KACF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAG,EAAE,KAAK;IACvC,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAK;IACzB,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACvB,OAAO,CAAC,iDAAiD,EAAE,kBAAkB,CAAC;SAC9E,OAAO,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,KAAK;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YAC1C,GAAG;YACH,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;SAC7F,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAO,EAAE,KAAK;IACtC,MAAM,GAAG,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,gBAAgB,EAAE,mBAAmB,GAAG,IAAI,OAAO,UAAU,EAAE;QACrG,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,KAAK;KACxB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,wHAAwH,IAAI,CAAC,MAAM,IAAI,mBAAmB,GAAG,CAC9J,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5E,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;YAC/B,aAAa;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GACX,SAAS,CAAC,MAAM,KAAK,CAAC;QACpB,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChG,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,101 @@
1
+ export declare function buildAnalyticsSummary(input: any): {
2
+ project: string;
3
+ window: string;
4
+ signals: any[];
5
+ meta: {
6
+ generatedAt: string;
7
+ source: string;
8
+ starters: number;
9
+ paywallReachedUsers: number;
10
+ retentionCohortSize: number;
11
+ retentionReliability: string;
12
+ retentionStableIdentityShare: number;
13
+ };
14
+ };
15
+ export declare function buildAscSummary(input: any): {
16
+ project: string;
17
+ window: string;
18
+ signals: any[];
19
+ meta: {
20
+ generatedAt: string;
21
+ source: string;
22
+ appId: string;
23
+ ratingCount: any;
24
+ feedbackTextCount: number;
25
+ analyticsWindow: any;
26
+ analyticsAvailability: string;
27
+ analyticsWarnings: any;
28
+ analytics: {
29
+ units: {
30
+ total: number;
31
+ previousTotal: number;
32
+ percentChange: number;
33
+ };
34
+ redownloads: {
35
+ total: number;
36
+ previousTotal: number;
37
+ percentChange: number;
38
+ };
39
+ conversionRate: {
40
+ total: number;
41
+ previousTotal: number;
42
+ percentChange: number;
43
+ };
44
+ crashRate: {
45
+ total: number;
46
+ previousTotal: number;
47
+ percentChange: number;
48
+ nonZeroDays: any;
49
+ };
50
+ totalCrashes: any;
51
+ crashBreakdown: any;
52
+ sourceBreakdown: any;
53
+ overviewMetricCatalog: any[];
54
+ };
55
+ };
56
+ };
57
+ export declare function buildRevenueCatSummary(input: any): {
58
+ project: string;
59
+ window: string;
60
+ signals: any[];
61
+ meta: {
62
+ generatedAt: string;
63
+ source: string;
64
+ projectId: string;
65
+ projectName: string;
66
+ appsCount: any;
67
+ productsCount: any;
68
+ offeringsCount: any;
69
+ entitlementsCount: any;
70
+ metricsCount: any;
71
+ warnings: any;
72
+ };
73
+ };
74
+ export declare function buildSentrySummary(input: any): {
75
+ project: string;
76
+ window: string;
77
+ issues: any;
78
+ signals: any;
79
+ meta: {
80
+ generatedAt: string;
81
+ source: string;
82
+ multiAccount: boolean;
83
+ accountCount: any;
84
+ accounts: any;
85
+ issuesReturned: any;
86
+ };
87
+ } | {
88
+ project: string;
89
+ window: string;
90
+ issues: any;
91
+ signals: any;
92
+ meta: {
93
+ generatedAt: string;
94
+ source: string;
95
+ org: string;
96
+ project: string;
97
+ environment: string;
98
+ issuesReturned: any;
99
+ };
100
+ };
101
+ export declare function writeJsonOutput(outPath: any, payload: any): Promise<string>;