@vigilbase/cli 0.1.4 → 0.2.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 (142) hide show
  1. package/CLOUDFLARE.md +2 -0
  2. package/COMMANDS.md +43 -6
  3. package/LOCAL.md +731 -0
  4. package/README.md +58 -6
  5. package/dist/auth/device-auth.d.ts.map +1 -1
  6. package/dist/auth/device-auth.js +7 -3
  7. package/dist/auth/device-auth.js.map +1 -1
  8. package/dist/auth/index.d.ts +3 -0
  9. package/dist/auth/index.d.ts.map +1 -1
  10. package/dist/auth/index.js +2 -0
  11. package/dist/auth/index.js.map +1 -1
  12. package/dist/auth/provider.d.ts +18 -0
  13. package/dist/auth/provider.d.ts.map +1 -0
  14. package/dist/auth/provider.js +62 -0
  15. package/dist/auth/provider.js.map +1 -0
  16. package/dist/auth/refresh.d.ts +10 -0
  17. package/dist/auth/refresh.d.ts.map +1 -0
  18. package/dist/auth/refresh.js +143 -0
  19. package/dist/auth/refresh.js.map +1 -0
  20. package/dist/auth/store.d.ts +27 -2
  21. package/dist/auth/store.d.ts.map +1 -1
  22. package/dist/auth/store.js +23 -8
  23. package/dist/auth/store.js.map +1 -1
  24. package/dist/auth/token-metadata.d.ts +10 -0
  25. package/dist/auth/token-metadata.d.ts.map +1 -0
  26. package/dist/auth/token-metadata.js +22 -0
  27. package/dist/auth/token-metadata.js.map +1 -0
  28. package/dist/auth/types.d.ts +8 -1
  29. package/dist/auth/types.d.ts.map +1 -1
  30. package/dist/cli.d.ts.map +1 -1
  31. package/dist/cli.js +40 -9
  32. package/dist/cli.js.map +1 -1
  33. package/dist/commands/auth.d.ts.map +1 -1
  34. package/dist/commands/auth.js +20 -8
  35. package/dist/commands/auth.js.map +1 -1
  36. package/dist/commands/helpers.d.ts +15 -0
  37. package/dist/commands/helpers.d.ts.map +1 -1
  38. package/dist/commands/helpers.js +2 -2
  39. package/dist/commands/helpers.js.map +1 -1
  40. package/dist/commands/index.d.ts +3 -1
  41. package/dist/commands/index.d.ts.map +1 -1
  42. package/dist/commands/index.js +6 -1
  43. package/dist/commands/index.js.map +1 -1
  44. package/dist/commands/local.d.ts +30 -0
  45. package/dist/commands/local.d.ts.map +1 -0
  46. package/dist/commands/local.js +1520 -0
  47. package/dist/commands/local.js.map +1 -0
  48. package/dist/commands/public-tools.d.ts.map +1 -1
  49. package/dist/commands/public-tools.js +8 -4
  50. package/dist/commands/public-tools.js.map +1 -1
  51. package/dist/index.d.ts +2 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/lib/config.d.ts +16 -1
  56. package/dist/lib/config.d.ts.map +1 -1
  57. package/dist/lib/config.js +36 -4
  58. package/dist/lib/config.js.map +1 -1
  59. package/dist/lib/format.d.ts.map +1 -1
  60. package/dist/lib/format.js +9 -0
  61. package/dist/lib/format.js.map +1 -1
  62. package/dist/lib/help.d.ts +1 -1
  63. package/dist/lib/help.d.ts.map +1 -1
  64. package/dist/lib/help.js +9 -0
  65. package/dist/lib/help.js.map +1 -1
  66. package/dist/lib/network.d.ts.map +1 -1
  67. package/dist/lib/network.js +2 -1
  68. package/dist/lib/network.js.map +1 -1
  69. package/dist/lib/one-client.d.ts +3 -2
  70. package/dist/lib/one-client.d.ts.map +1 -1
  71. package/dist/lib/one-client.js +46 -2
  72. package/dist/lib/one-client.js.map +1 -1
  73. package/dist/lib/security-client.d.ts +1 -1
  74. package/dist/lib/tui.d.ts +309 -0
  75. package/dist/lib/tui.d.ts.map +1 -0
  76. package/dist/lib/tui.js +847 -0
  77. package/dist/lib/tui.js.map +1 -0
  78. package/dist/local/cloudflare-checkup/cf/allowlist.d.ts +95 -0
  79. package/dist/local/cloudflare-checkup/cf/allowlist.d.ts.map +1 -0
  80. package/dist/local/cloudflare-checkup/cf/allowlist.js +184 -0
  81. package/dist/local/cloudflare-checkup/cf/allowlist.js.map +1 -0
  82. package/dist/local/cloudflare-checkup/cf/auth-lifecycle.d.ts +113 -0
  83. package/dist/local/cloudflare-checkup/cf/auth-lifecycle.d.ts.map +1 -0
  84. package/dist/local/cloudflare-checkup/cf/auth-lifecycle.js +313 -0
  85. package/dist/local/cloudflare-checkup/cf/auth-lifecycle.js.map +1 -0
  86. package/dist/local/cloudflare-checkup/cf/child-env.d.ts +32 -0
  87. package/dist/local/cloudflare-checkup/cf/child-env.d.ts.map +1 -0
  88. package/dist/local/cloudflare-checkup/cf/child-env.js +81 -0
  89. package/dist/local/cloudflare-checkup/cf/child-env.js.map +1 -0
  90. package/dist/local/cloudflare-checkup/cf/install.d.ts +106 -0
  91. package/dist/local/cloudflare-checkup/cf/install.d.ts.map +1 -0
  92. package/dist/local/cloudflare-checkup/cf/install.js +309 -0
  93. package/dist/local/cloudflare-checkup/cf/install.js.map +1 -0
  94. package/dist/local/cloudflare-checkup/cf/locate.d.ts +44 -0
  95. package/dist/local/cloudflare-checkup/cf/locate.d.ts.map +1 -0
  96. package/dist/local/cloudflare-checkup/cf/locate.js +228 -0
  97. package/dist/local/cloudflare-checkup/cf/locate.js.map +1 -0
  98. package/dist/local/cloudflare-checkup/cf/run-cf.d.ts +89 -0
  99. package/dist/local/cloudflare-checkup/cf/run-cf.d.ts.map +1 -0
  100. package/dist/local/cloudflare-checkup/cf/run-cf.js +275 -0
  101. package/dist/local/cloudflare-checkup/cf/run-cf.js.map +1 -0
  102. package/dist/local/cloudflare-checkup/collector.d.ts +48 -0
  103. package/dist/local/cloudflare-checkup/collector.d.ts.map +1 -0
  104. package/dist/local/cloudflare-checkup/collector.js +296 -0
  105. package/dist/local/cloudflare-checkup/collector.js.map +1 -0
  106. package/dist/local/cloudflare-checkup/contract.d.ts +2793 -0
  107. package/dist/local/cloudflare-checkup/contract.d.ts.map +1 -0
  108. package/dist/local/cloudflare-checkup/contract.js +1614 -0
  109. package/dist/local/cloudflare-checkup/contract.js.map +1 -0
  110. package/dist/local/cloudflare-checkup/email-verification.d.ts +125 -0
  111. package/dist/local/cloudflare-checkup/email-verification.d.ts.map +1 -0
  112. package/dist/local/cloudflare-checkup/email-verification.js +212 -0
  113. package/dist/local/cloudflare-checkup/email-verification.js.map +1 -0
  114. package/dist/local/cloudflare-checkup/errors.d.ts +28 -0
  115. package/dist/local/cloudflare-checkup/errors.d.ts.map +1 -0
  116. package/dist/local/cloudflare-checkup/errors.js +99 -0
  117. package/dist/local/cloudflare-checkup/errors.js.map +1 -0
  118. package/dist/local/cloudflare-checkup/output.d.ts +24 -0
  119. package/dist/local/cloudflare-checkup/output.d.ts.map +1 -0
  120. package/dist/local/cloudflare-checkup/output.js +89 -0
  121. package/dist/local/cloudflare-checkup/output.js.map +1 -0
  122. package/dist/local/cloudflare-checkup/prompts.d.ts +41 -0
  123. package/dist/local/cloudflare-checkup/prompts.d.ts.map +1 -0
  124. package/dist/local/cloudflare-checkup/prompts.js +140 -0
  125. package/dist/local/cloudflare-checkup/prompts.js.map +1 -0
  126. package/dist/local/cloudflare-checkup/rate-budget.d.ts +42 -0
  127. package/dist/local/cloudflare-checkup/rate-budget.d.ts.map +1 -0
  128. package/dist/local/cloudflare-checkup/rate-budget.js +80 -0
  129. package/dist/local/cloudflare-checkup/rate-budget.js.map +1 -0
  130. package/dist/local/cloudflare-checkup/snapshot-file.d.ts +53 -0
  131. package/dist/local/cloudflare-checkup/snapshot-file.d.ts.map +1 -0
  132. package/dist/local/cloudflare-checkup/snapshot-file.js +186 -0
  133. package/dist/local/cloudflare-checkup/snapshot-file.js.map +1 -0
  134. package/dist/local/cloudflare-checkup/submit-client.d.ts +98 -0
  135. package/dist/local/cloudflare-checkup/submit-client.d.ts.map +1 -0
  136. package/dist/local/cloudflare-checkup/submit-client.js +349 -0
  137. package/dist/local/cloudflare-checkup/submit-client.js.map +1 -0
  138. package/dist/local/cloudflare-checkup/terminal-ui.d.ts +171 -0
  139. package/dist/local/cloudflare-checkup/terminal-ui.d.ts.map +1 -0
  140. package/dist/local/cloudflare-checkup/terminal-ui.js +404 -0
  141. package/dist/local/cloudflare-checkup/terminal-ui.js.map +1 -0
  142. package/package.json +8 -4
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Collecting a Cloudflare account through cf (spec §F5, §D3).
3
+ *
4
+ * Every read goes through the frozen allowlist and the shared scheduler (four
5
+ * workers, the request budget, auth pauses and retries). Each response is
6
+ * projected immediately by the vendored contract and the raw text discarded.
7
+ * Lists are paged with `--page N` until an empty page, because cf strips
8
+ * `result_info`: a final page and a server-clamped page look the same.
9
+ */
10
+ import { ACCOUNT_KINDS, CloudflareCheckupSnapshotV1Schema, NOT_COLLECTABLE_ZONE_KINDS, NOT_COLLECTED_RESULT, PROJECTORS, SNAPSHOT_LIMITS, ZONE_SETTING_IDS, ZONE_SINGLE_KINDS, assembleSnapshot, collectionFailedResult, httpErrorResult, projectAccount, projectZones, projectionToResult, serializeSnapshot, } from './contract.js';
11
+ import { ENV_TOKEN_PERMISSION_HINT, LocalCheckupError } from './errors.js';
12
+ import { snapshotParseError } from './snapshot-file.js';
13
+ import { TEMPLATES, buildArgv } from './cf/allowlist.js';
14
+ import { authRequiredError } from './cf/auth-lifecycle.js';
15
+ import { RULESET_STDOUT_CAP_BYTES, parseCfJson } from './cf/run-cf.js';
16
+ export const WORKER_COUNT = 4;
17
+ /** Assumed ruleset details per zone for the up-front request estimate. */
18
+ const ESTIMATED_RULESETS_PER_ZONE = 6;
19
+ const failed = (detail, failure) => ({ ok: false, result: collectionFailedResult(detail), ...(failure ? { failure } : {}) });
20
+ function failureResult(failure) {
21
+ switch (failure.kind) {
22
+ case 'http':
23
+ return failure.status >= 400 && failure.status <= 599
24
+ ? { ok: false, result: httpErrorResult(failure.status), failure }
25
+ : failed('cf_error', failure);
26
+ case 'timeout': return failed('timeout', failure);
27
+ case 'output_too_large': return failed('output_too_large', failure);
28
+ case 'command_unavailable': return failed('command_unavailable', failure);
29
+ default: return failed('cf_error', failure);
30
+ }
31
+ }
32
+ function availabilityKey(id, settingId) {
33
+ return id === 'zone_setting' && settingId ? `zone_setting:${settingId}` : id;
34
+ }
35
+ /** Fetch one read: a single call, a one-call list, or every page of a paged list. */
36
+ async function fetchRaw(env, id, ids, options = {}) {
37
+ if (env.unavailable.has(availabilityKey(id, ids.settingId)))
38
+ return failed('command_unavailable');
39
+ const spec = TEMPLATES[id];
40
+ const callOptions = {
41
+ ...(ids.accountId !== undefined && id !== 'account_selection' ? { accountId: ids.accountId } : {}),
42
+ ...(id === 'zone_ruleset' ? { stdoutCapBytes: RULESET_STDOUT_CAP_BYTES } : {}),
43
+ };
44
+ const once = async (page) => {
45
+ const outcome = await env.scheduler.call(buildArgv(id, page === undefined ? ids : { ...ids, page }, env.auth), callOptions);
46
+ if (!outcome.ok)
47
+ return failureResult(outcome.failure);
48
+ const parsed = parseCfJson(outcome.stdout, spec.output);
49
+ return parsed.ok ? { ok: true, raw: parsed.value } : failed('invalid_output');
50
+ };
51
+ if (spec.paging.kind === 'single')
52
+ return once();
53
+ if (spec.paging.kind === 'one_call') {
54
+ const outcome = await once();
55
+ // The cursor is not printed, so a full page may hide more rulesets.
56
+ if (outcome.ok && outcome.raw.length >= SNAPSHOT_LIMITS.rulesetListTruncationAt)
57
+ return failed('possibly_truncated');
58
+ return outcome;
59
+ }
60
+ const items = [];
61
+ let previousFirst;
62
+ for (let page = 1;; page++) {
63
+ const outcome = await once(page);
64
+ if (!outcome.ok)
65
+ return outcome;
66
+ const pageItems = outcome.raw;
67
+ if (pageItems.length === 0)
68
+ return { ok: true, raw: items };
69
+ if (page > spec.paging.maxPages)
70
+ return failed('page_limit');
71
+ const first = JSON.stringify(pageItems[0]);
72
+ // cf ignoring --page would repeat the first page forever.
73
+ if (page > 1 && first === previousFirst)
74
+ return failed('invalid_output');
75
+ previousFirst = first;
76
+ items.push(...pageItems);
77
+ if (options.maxItems !== undefined && items.length > options.maxItems) {
78
+ return { ok: false, result: collectionFailedResult('output_too_large'), tooManyItems: true };
79
+ }
80
+ }
81
+ }
82
+ function isAuthFailure(failure) {
83
+ return failure?.kind === 'auth' || (failure?.kind === 'http' && failure.status === 401);
84
+ }
85
+ /** Abort errors for reads that must succeed (account selection, account, zones). */
86
+ function criticalError(env, outcome, what) {
87
+ if (isAuthFailure(outcome.failure))
88
+ return authRequiredError(env.auth.authMode);
89
+ if (outcome.result.reason === 'collection_failed' && outcome.result.detail === 'command_unavailable') {
90
+ return new LocalCheckupError('CF_ALLOWLIST_MISMATCH', `This cf release cannot run the ${what} command the checkup needs.`);
91
+ }
92
+ if (outcome.failure?.kind === 'http' && outcome.failure.status === 403) {
93
+ return new LocalCheckupError('CF_PERMISSION_DENIED', `Cloudflare denied the ${what} read (HTTP 403).`, { status: 403, ...(env.auth.authMode === 'env' ? { hint: ENV_TOKEN_PERMISSION_HINT } : {}) });
94
+ }
95
+ const status = outcome.failure?.kind === 'http' ? outcome.failure.status : undefined;
96
+ return new LocalCheckupError('CF_ERROR', `cf could not read the ${what}${status ? ` (HTTP ${status})` : outcome.result.reason === 'collection_failed' ? ` (${outcome.result.detail})` : ''}.`, status ? { status } : {});
97
+ }
98
+ /** `accounts list --per-page 50 --page N` until an empty page. */
99
+ export async function listAccounts(env) {
100
+ const outcome = await fetchRaw(env, 'account_selection', {});
101
+ if (!outcome.ok)
102
+ throw criticalError(env, outcome, 'account list');
103
+ const accounts = [];
104
+ for (const item of outcome.raw) {
105
+ if (!item || typeof item !== 'object')
106
+ continue;
107
+ const { id, name } = item;
108
+ if (typeof id !== 'string' || !/^[0-9a-f]{32}$/i.test(id))
109
+ continue;
110
+ accounts.push({ id: id.toLowerCase(), name: typeof name === 'string' ? name.slice(0, 256) : '' });
111
+ }
112
+ return accounts;
113
+ }
114
+ /** Requests for N zones: about 19 + extra pages + N × (33 + rulesets per zone). */
115
+ export function estimateRequests(zoneCount, rulesetsPerZone = ESTIMATED_RULESETS_PER_ZONE) {
116
+ return 19 + zoneCount * (33 + rulesetsPerZone);
117
+ }
118
+ /** A worker pool whose tasks may enqueue more tasks (ruleset details). */
119
+ async function runTasks(seed, concurrency, onError) {
120
+ const queue = [];
121
+ let active = 0;
122
+ let error = null;
123
+ let notify = () => undefined;
124
+ let changed = new Promise((resolve) => { notify = resolve; });
125
+ const signal = () => {
126
+ const resolve = notify;
127
+ changed = new Promise((next) => { notify = next; });
128
+ resolve();
129
+ };
130
+ const enqueue = (task, options) => {
131
+ if (options?.front)
132
+ queue.unshift(task);
133
+ else
134
+ queue.push(task);
135
+ signal();
136
+ };
137
+ seed(enqueue);
138
+ const worker = async () => {
139
+ for (;;) {
140
+ if (error)
141
+ return;
142
+ const task = queue.shift();
143
+ if (!task) {
144
+ if (active === 0)
145
+ return;
146
+ await changed;
147
+ continue;
148
+ }
149
+ active++;
150
+ try {
151
+ await task(enqueue);
152
+ }
153
+ catch (caught) {
154
+ if (!error) {
155
+ error = caught;
156
+ onError(caught);
157
+ }
158
+ }
159
+ finally {
160
+ active--;
161
+ signal();
162
+ }
163
+ }
164
+ };
165
+ await Promise.all(Array.from({ length: concurrency }, () => worker()));
166
+ if (error)
167
+ throw error;
168
+ }
169
+ /**
170
+ * Collect every snapshot entry for one account. Aborts (no file) when the
171
+ * account read fails other than 400/403/404, when the zone list fails, when it
172
+ * holds more than 100 zones, or when the account is invisible and has no zones.
173
+ */
174
+ export async function collectAccount(env, accountId, hooks = {}) {
175
+ const entries = [];
176
+ const ids = { accountId };
177
+ const account = await fetchRaw(env, 'account', ids);
178
+ if (account.ok) {
179
+ const projected = projectAccount(account.raw);
180
+ if (!projected.ok)
181
+ throw new LocalCheckupError('CF_ERROR', 'cf returned account details the checkup cannot read.');
182
+ if (projected.data.id !== accountId)
183
+ throw new LocalCheckupError('CF_ERROR', 'cf returned a different Cloudflare account than requested.');
184
+ entries.push({ kind: 'account', result: { ok: true, data: projected.data } });
185
+ }
186
+ else if (account.result.reason === 'http_error' && [400, 403, 404].includes(account.result.status)) {
187
+ // The scanner tolerates these (runInitPhase); 401 is never recorded.
188
+ entries.push({ kind: 'account', result: account.result });
189
+ }
190
+ else {
191
+ throw criticalError(env, account, 'account');
192
+ }
193
+ const zonesRaw = await fetchRaw(env, 'zones', ids, { maxItems: SNAPSHOT_LIMITS.maxZones });
194
+ if (!zonesRaw.ok) {
195
+ if (zonesRaw.tooManyItems) {
196
+ throw new LocalCheckupError('ACCOUNT_TOO_LARGE', `This account has more than ${SNAPSHOT_LIMITS.maxZones} zones; use the browser token mode.`);
197
+ }
198
+ throw criticalError(env, zonesRaw, 'zone list');
199
+ }
200
+ const zonesProjected = projectZones(zonesRaw.raw);
201
+ if (!zonesProjected.ok)
202
+ throw new LocalCheckupError('CF_ERROR', 'cf returned a zone list the checkup cannot read.');
203
+ const zones = zonesProjected.data;
204
+ if (zones.some((zone) => zone.account.id !== accountId))
205
+ throw new LocalCheckupError('CF_ERROR', 'cf returned zones from a different account.');
206
+ if (!entries[0].result.ok && zones.length === 0) {
207
+ throw new LocalCheckupError('ACCOUNT_NOT_VISIBLE', 'Cloudflare does not show this account or any of its zones to the signed-in cf user.');
208
+ }
209
+ entries.push({ kind: 'zones', result: { ok: true, data: zones } });
210
+ hooks.onZones?.(zones);
211
+ const zoneTasksLeft = new Map(zones.map((zone) => [zone.id, 0]));
212
+ let zonesDone = 0;
213
+ const report = () => env.onProgress?.({ zonesDone, zonesTotal: zones.length, requests: env.scheduler.invocations });
214
+ const finishZoneTask = (zoneId) => {
215
+ const left = (zoneTasksLeft.get(zoneId) ?? 1) - 1;
216
+ zoneTasksLeft.set(zoneId, left);
217
+ if (left === 0)
218
+ zonesDone++;
219
+ report();
220
+ };
221
+ const projectInto = async (kind, taskIds) => {
222
+ const outcome = await fetchRaw(env, kind, taskIds);
223
+ if (!outcome.ok)
224
+ return outcome.result;
225
+ const project = PROJECTORS[kind];
226
+ return projectionToResult(project(outcome.raw));
227
+ };
228
+ await runTasks((enqueue) => {
229
+ for (const kind of ACCOUNT_KINDS) {
230
+ if (kind === 'account' || kind === 'zones')
231
+ continue;
232
+ enqueue(async () => {
233
+ entries.push({ kind, result: await projectInto(kind, ids) });
234
+ report();
235
+ });
236
+ }
237
+ for (const zone of zones) {
238
+ const zoneIds = { accountId, zoneId: zone.id };
239
+ zoneTasksLeft.set(zone.id, ZONE_SETTING_IDS.length + ZONE_SINGLE_KINDS.length);
240
+ for (const settingId of ZONE_SETTING_IDS) {
241
+ enqueue(async () => {
242
+ entries.push({ kind: 'zone_setting', zoneId: zone.id, settingId, result: await projectInto('zone_setting', { ...zoneIds, settingId }) });
243
+ finishZoneTask(zone.id);
244
+ });
245
+ }
246
+ for (const kind of ZONE_SINGLE_KINDS) {
247
+ enqueue(async (more) => {
248
+ const result = await projectInto(kind, zoneIds);
249
+ entries.push({ kind, zoneId: zone.id, result });
250
+ if (kind === 'zone_rulesets' && result.ok) {
251
+ const rulesetIds = [...new Set(result.data.map((head) => head.id))];
252
+ zoneTasksLeft.set(zone.id, (zoneTasksLeft.get(zone.id) ?? 0) + rulesetIds.length);
253
+ for (const rulesetId of rulesetIds) {
254
+ more(async () => {
255
+ entries.push(await collectRulesetDetail(env, zoneIds, rulesetId));
256
+ finishZoneTask(zone.id);
257
+ }, { front: true });
258
+ }
259
+ }
260
+ finishZoneTask(zone.id);
261
+ });
262
+ }
263
+ for (const kind of NOT_COLLECTABLE_ZONE_KINDS)
264
+ entries.push({ kind, zoneId: zone.id, result: NOT_COLLECTED_RESULT });
265
+ }
266
+ }, env.concurrency ?? WORKER_COUNT, (error) => env.scheduler.abort(error instanceof Error ? error : new Error(String(error))));
267
+ env.scheduler.throwIfAborted();
268
+ return entries;
269
+ }
270
+ /** A ruleset detail keeps its projected rules; `assembleSnapshot` applies the failed-detail collector rule. */
271
+ async function collectRulesetDetail(env, ids, rulesetId) {
272
+ const outcome = await fetchRaw(env, 'zone_ruleset', { ...ids, rulesetId });
273
+ const base = { kind: 'zone_ruleset', zoneId: ids.zoneId, rulesetId };
274
+ if (!outcome.ok)
275
+ return { ...base, result: outcome.result };
276
+ const projected = PROJECTORS.zone_ruleset(outcome.raw);
277
+ if (!projected.ok)
278
+ return { ...base, result: collectionFailedResult(projected.detail) };
279
+ // A detail whose ID differs from the listed head cannot be attributed.
280
+ if (projected.data.id !== rulesetId)
281
+ return { ...base, result: collectionFailedResult('invalid_output') };
282
+ return { ...base, result: { ok: true, data: projected.data } };
283
+ }
284
+ /** Assemble, validate and serialise; the returned text is exactly what is written and uploaded. */
285
+ export function buildSnapshot(accountId, collector, entries) {
286
+ const assembled = assembleSnapshot({ accountId, collector, entries });
287
+ const parsed = CloudflareCheckupSnapshotV1Schema.safeParse(assembled);
288
+ if (!parsed.success)
289
+ throw snapshotParseError(parsed.error.issues);
290
+ const text = serializeSnapshot(parsed.data);
291
+ if (Buffer.byteLength(text) > SNAPSHOT_LIMITS.maxBytes) {
292
+ throw new LocalCheckupError('SNAPSHOT_TOO_LARGE', 'The collected snapshot is larger than the 8 MiB contract limit; no file was written.');
293
+ }
294
+ return { snapshot: parsed.data, text };
295
+ }
296
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/local/cloudflare-checkup/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,aAAa,EACb,iCAAiC,EACjC,0BAA0B,EAC1B,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GAWlB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAuD,MAAM,mBAAmB,CAAA;AAC7G,OAAO,EAAE,iBAAiB,EAAwC,MAAM,wBAAwB,CAAA;AAChG,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAA;AAC7B,0EAA0E;AAC1E,MAAM,2BAA2B,GAAG,CAAC,CAAA;AAmBrC,MAAM,MAAM,GAAG,CAAC,MAA+B,EAAE,OAAuB,EAAgB,EAAE,CACxF,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AAE1F,SAAS,aAAa,CAAC,OAAsB;IAC3C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;gBACnD,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;gBACjE,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACjD,KAAK,kBAAkB,CAAC,CAAC,OAAO,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;QACnE,KAAK,qBAAqB,CAAC,CAAC,OAAO,MAAM,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAA;QACzE,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAc,EAAE,SAAyB;IAChE,OAAO,EAAE,KAAK,cAAc,IAAI,SAAS,CAAC,CAAC,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9E,CAAC;AAED,qFAAqF;AACrF,KAAK,UAAU,QAAQ,CAAC,GAAe,EAAE,EAAc,EAAE,GAAgB,EAAE,UAAiC,EAAE;IAC5G,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACjG,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,WAAW,GAAG;QAClB,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,KAAK,mBAAmB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAA;IACD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAa,EAAyB,EAAE;QAC1D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAA;QAC3H,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACvD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAC/E,CAAC,CAAA;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,EAAE,CAAA;IAChD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,EAAE,CAAA;QAC5B,oEAAoE;QACpE,IAAI,OAAO,CAAC,EAAE,IAAK,OAAO,CAAC,GAAiB,CAAC,MAAM,IAAI,eAAe,CAAC,uBAAuB;YAAE,OAAO,MAAM,CAAC,oBAAoB,CAAC,CAAA;QACnI,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,KAAK,GAAc,EAAE,CAAA;IAC3B,IAAI,aAAiC,CAAA;IACrC,KAAK,IAAI,IAAI,GAAG,CAAC,GAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,OAAO,CAAA;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAgB,CAAA;QAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;QAC3D,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC,CAAA;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,0DAA0D;QAC1D,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,aAAa;YAAE,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAA;QACxE,aAAa,GAAG,KAAK,CAAA;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAA;QAC9F,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAkC;IACvD,OAAO,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA;AACzF,CAAC;AAED,oFAAoF;AACpF,SAAS,aAAa,CAAC,GAAe,EAAE,OAAqC,EAAE,IAAY;IACzF,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/E,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;QACrG,OAAO,IAAI,iBAAiB,CAAC,uBAAuB,EAAE,kCAAkC,IAAI,6BAA6B,CAAC,CAAA;IAC5H,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvE,OAAO,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,yBAAyB,IAAI,mBAAmB,EACnG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACjG,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IACpF,OAAO,IAAI,iBAAiB,CAAC,UAAU,EAAE,yBAAyB,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAC3L,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAC7B,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAe;IAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAA;IAC5D,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAqB,EAAE,CAAA;IACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,GAAgB,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAQ;QAC/C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAwC,CAAA;QAC7D,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,SAAQ;QACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACnG,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,eAAe,GAAG,2BAA2B;IAC/F,OAAO,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,GAAG,eAAe,CAAC,CAAA;AAChD,CAAC;AAKD,0EAA0E;AAC1E,KAAK,UAAU,QAAQ,CAAC,IAAgC,EAAE,WAAmB,EAAE,OAAiC;IAC9G,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,KAAK,GAAY,IAAI,CAAA;IACzB,IAAI,MAAM,GAAe,GAAG,EAAE,CAAC,SAAS,CAAA;IACxC,IAAI,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,CAAA;QACtB,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAA,CAAC,CAAC,CAAC,CAAA;QACxD,OAAO,EAAE,CAAA;IACX,CAAC,CAAA;IACD,MAAM,OAAO,GAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;QACzC,IAAI,OAAO,EAAE,KAAK;YAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,MAAM,EAAE,CAAA;IACV,CAAC,CAAA;IACD,IAAI,CAAC,OAAO,CAAC,CAAA;IACb,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,SAAS,CAAC;YACR,IAAI,KAAK;gBAAE,OAAM;YACjB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,MAAM,KAAK,CAAC;oBAAE,OAAM;gBACxB,MAAM,OAAO,CAAA;gBACb,SAAQ;YACV,CAAC;YACD,MAAM,EAAE,CAAA;YACR,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,KAAK,GAAG,MAAM,CAAA;oBACd,OAAO,CAAC,MAAM,CAAC,CAAA;gBACjB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAA;gBACR,MAAM,EAAE,CAAA;YACV,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACtE,IAAI,KAAK;QAAE,MAAM,KAAK,CAAA;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAe,EACf,SAAiB,EACjB,QAA4D,EAAE;IAE9D,MAAM,OAAO,GAAqB,EAAE,CAAA;IACpC,MAAM,GAAG,GAAG,EAAE,SAAS,EAAE,CAAA;IAEzB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;IACnD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,CAAC,SAAS,CAAC,EAAE;YAAE,MAAM,IAAI,iBAAiB,CAAC,UAAU,EAAE,sDAAsD,CAAC,CAAA;QAClH,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS;YAAE,MAAM,IAAI,iBAAiB,CAAC,UAAU,EAAE,4DAA4D,CAAC,CAAA;QAC1I,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC/E,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrG,qEAAqE;QACrE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC1F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,iBAAiB,CAAC,mBAAmB,EAAE,8BAA8B,eAAe,CAAC,QAAQ,qCAAqC,CAAC,CAAA;QAC/I,CAAC;QACD,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IACjD,CAAC;IACD,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACjD,IAAI,CAAC,cAAc,CAAC,EAAE;QAAE,MAAM,IAAI,iBAAiB,CAAC,UAAU,EAAE,kDAAkD,CAAC,CAAA;IACnH,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAA;IACjC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,UAAU,EAAE,6CAA6C,CAAC,CAAA;IAC/I,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,qFAAqF,CAAC,CAAA;IAC3I,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IAClE,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;IAEtB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IACnH,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACjD,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC/B,IAAI,IAAI,KAAK,CAAC;YAAE,SAAS,EAAE,CAAA;QAC3B,MAAM,EAAE,CAAA;IACV,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,KAAK,EAAE,IAAqF,EAAE,OAAoB,EAAE,EAAE;QACxI,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,OAAO,OAAO,CAAC,MAAM,CAAA;QACtC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAgD,CAAA;QAC/E,OAAO,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,CAAC,CAAA;IAED,MAAM,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE;QACzB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO;gBAAE,SAAQ;YACpD,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,EAAoB,CAAC,CAAA;gBAC9E,MAAM,EAAE,CAAA;YACV,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAA;YAC9C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;YAC9E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;gBACzC,OAAO,CAAC,KAAK,IAAI,EAAE;oBACjB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC,cAAc,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,EAAoB,CAAC,CAAA;oBAC1J,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACzB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;oBACrB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;oBAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAoB,CAAC,CAAA;oBACjE,IAAI,IAAI,KAAK,eAAe,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;wBAC1C,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAE,MAAM,CAAC,IAA8B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;wBAC9F,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;wBACjF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;4BACnC,IAAI,CAAC,KAAK,IAAI,EAAE;gCACd,OAAO,CAAC,IAAI,CAAC,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;gCACjE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;4BACzB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;wBACrB,CAAC;oBACH,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACzB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,0BAA0B;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAA;QACtH,CAAC;IACH,CAAC,EAAE,GAAG,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAE9H,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,CAAA;IAC9B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,+GAA+G;AAC/G,KAAK,UAAU,oBAAoB,CAAC,GAAe,EAAE,GAA0C,EAAE,SAAiB;IAChH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;IAC1E,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,cAAuB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAA;IAC7E,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;IAC3D,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACtD,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,sBAAsB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAA;IACvF,uEAAuE;IACvE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,EAAE,CAAA;IACzG,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAA;AAChE,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,SAA4B,EAAE,OAAkC;IAC/G,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,iCAAiC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACrE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAClE,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,sFAAsF,CAAC,CAAA;IAC3I,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;AACxC,CAAC"}