@12ui/design 0.2.14 → 0.2.16

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 (108) hide show
  1. package/README.md +21 -1
  2. package/dist/bounded-concurrency.d.ts +13 -0
  3. package/dist/bounded-concurrency.d.ts.map +1 -0
  4. package/dist/bounded-concurrency.js +43 -0
  5. package/dist/bounded-concurrency.js.map +1 -0
  6. package/dist/branch-downloads.d.ts +10 -0
  7. package/dist/branch-downloads.d.ts.map +1 -1
  8. package/dist/branch-downloads.js +20 -0
  9. package/dist/branch-downloads.js.map +1 -1
  10. package/dist/branch-execution.d.ts +7 -0
  11. package/dist/branch-execution.d.ts.map +1 -1
  12. package/dist/branch-execution.js +175 -38
  13. package/dist/branch-execution.js.map +1 -1
  14. package/dist/branch-materialize.d.ts +23 -12
  15. package/dist/branch-materialize.d.ts.map +1 -1
  16. package/dist/branch-materialize.js +55 -38
  17. package/dist/branch-materialize.js.map +1 -1
  18. package/dist/branch-page-conversion.d.ts +109 -5
  19. package/dist/branch-page-conversion.d.ts.map +1 -1
  20. package/dist/branch-page-conversion.js +375 -179
  21. package/dist/branch-page-conversion.js.map +1 -1
  22. package/dist/branch-progress.d.ts +24 -0
  23. package/dist/branch-progress.d.ts.map +1 -1
  24. package/dist/branch-progress.js +35 -6
  25. package/dist/branch-progress.js.map +1 -1
  26. package/dist/branch-run-record.d.ts +14 -0
  27. package/dist/branch-run-record.d.ts.map +1 -1
  28. package/dist/branch-run-record.js.map +1 -1
  29. package/dist/branch-status.d.ts.map +1 -1
  30. package/dist/branch-status.js +3 -0
  31. package/dist/branch-status.js.map +1 -1
  32. package/dist/cli-arguments.d.ts.map +1 -1
  33. package/dist/cli-arguments.js +1 -0
  34. package/dist/cli-arguments.js.map +1 -1
  35. package/dist/cli-branch-command.d.ts +10 -1
  36. package/dist/cli-branch-command.d.ts.map +1 -1
  37. package/dist/cli-branch-command.js +60 -11
  38. package/dist/cli-branch-command.js.map +1 -1
  39. package/dist/cli-capabilities.d.ts +35 -2
  40. package/dist/cli-capabilities.d.ts.map +1 -1
  41. package/dist/cli-capabilities.js +38 -1
  42. package/dist/cli-capabilities.js.map +1 -1
  43. package/dist/cli-draft-command.d.ts +2 -0
  44. package/dist/cli-draft-command.d.ts.map +1 -1
  45. package/dist/cli-draft-command.js +22 -4
  46. package/dist/cli-draft-command.js.map +1 -1
  47. package/dist/cli-package-command.d.ts +13 -0
  48. package/dist/cli-package-command.d.ts.map +1 -1
  49. package/dist/cli-package-command.js +35 -8
  50. package/dist/cli-package-command.js.map +1 -1
  51. package/dist/cli-progress.d.ts +81 -5
  52. package/dist/cli-progress.d.ts.map +1 -1
  53. package/dist/cli-progress.js +108 -5
  54. package/dist/cli-progress.js.map +1 -1
  55. package/dist/cli-skill-command.d.ts.map +1 -1
  56. package/dist/cli-skill-command.js +27 -12
  57. package/dist/cli-skill-command.js.map +1 -1
  58. package/dist/cli.js +20 -10
  59. package/dist/cli.js.map +1 -1
  60. package/dist/conversion-receipt-store.d.ts +75 -0
  61. package/dist/conversion-receipt-store.d.ts.map +1 -0
  62. package/dist/conversion-receipt-store.js +143 -0
  63. package/dist/conversion-receipt-store.js.map +1 -0
  64. package/dist/conversion-receipt.d.ts +223 -0
  65. package/dist/conversion-receipt.d.ts.map +1 -0
  66. package/dist/conversion-receipt.js +352 -0
  67. package/dist/conversion-receipt.js.map +1 -0
  68. package/dist/draft-adoption.d.ts +48 -0
  69. package/dist/draft-adoption.d.ts.map +1 -0
  70. package/dist/draft-adoption.js +237 -0
  71. package/dist/draft-adoption.js.map +1 -0
  72. package/dist/draft-run.d.ts +10 -0
  73. package/dist/draft-run.d.ts.map +1 -1
  74. package/dist/draft-run.js +16 -4
  75. package/dist/draft-run.js.map +1 -1
  76. package/dist/index.d.ts +1 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +1 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  81. package/dist/legacy-skill-catalog.js +65 -0
  82. package/dist/legacy-skill-catalog.js.map +1 -1
  83. package/dist/package-client.d.ts +28 -0
  84. package/dist/package-client.d.ts.map +1 -1
  85. package/dist/package-client.js +21 -1
  86. package/dist/package-client.js.map +1 -1
  87. package/dist/package-source-refusal.d.ts +17 -0
  88. package/dist/package-source-refusal.d.ts.map +1 -0
  89. package/dist/package-source-refusal.js +61 -0
  90. package/dist/package-source-refusal.js.map +1 -0
  91. package/dist/package-submission.d.ts +43 -1
  92. package/dist/package-submission.d.ts.map +1 -1
  93. package/dist/package-submission.js +32 -7
  94. package/dist/package-submission.js.map +1 -1
  95. package/dist/skill-clients.d.ts +39 -0
  96. package/dist/skill-clients.d.ts.map +1 -0
  97. package/dist/skill-clients.js +156 -0
  98. package/dist/skill-clients.js.map +1 -0
  99. package/dist/skill-installer.d.ts +2 -3
  100. package/dist/skill-installer.d.ts.map +1 -1
  101. package/dist/skill-installer.js +9 -101
  102. package/dist/skill-installer.js.map +1 -1
  103. package/package.json +1 -1
  104. package/skills/design/SKILL.md +6 -3
  105. package/skills/design-branch/SKILL.md +6 -5
  106. package/skills/design-convert/SKILL.md +3 -3
  107. package/skills/design-draft/SKILL.md +3 -3
  108. package/skills/design-search/SKILL.md +3 -3
@@ -1,206 +1,402 @@
1
- import { readFile } from 'node:fs/promises';
2
1
  import { branchPackageKey } from './branch-identity.js';
2
+ import { BRANCH_PAGE_CONCURRENCY_DEFAULT } from './cli-progress.js';
3
+ import { createConcurrencyLimiter } from './bounded-concurrency.js';
4
+ import { readBranchScreenBytes } from './branch-downloads.js';
5
+ import { findReusableConversionId, } from './conversion-receipt.js';
3
6
  import { normalizePageViewports, } from './branch-viewport-normalization.js';
7
+ import { isSourceConversionRefusal, sourceConversionRefusalViewportId, } from './package-source-refusal.js';
4
8
  import { submitConversionPackage, } from './package-submission.js';
5
9
  export const WINNER_VIEWPORT_ID = 'winner';
6
- const readScreenBytes = async (screen) => (new Uint8Array(await readFile(screen.path)));
10
+ export const DEFAULT_PACKAGE_MODEL = 'standard';
7
11
  const orderedViewports = (plan, page) => plan.screens
8
12
  .filter((screen) => page.slots.includes(screen.slot))
9
13
  .sort((left, right) => left.viewportOrdinal - right.viewportOrdinal)
10
14
  .map((screen) => ({ slot: screen.slot, ordinal: screen.viewportOrdinal }));
11
- export const convertBranchPages = async (args) => {
12
- const conversions = new Map();
13
- for (const page of args.plan.pages) {
14
- const planned = orderedViewports(args.plan, page);
15
- const missing = planned.filter((viewport) => !args.screens.has(viewport.slot));
16
- if (missing.length > 0) {
17
- conversions.set(page.id, {
18
- status: 'skipped',
19
- reason: `Page ${page.id} is missing screen(s) ${missing.map((entry) => entry.slot).join(', ')},`
20
- + ' so its viewports do not stack into a whole page. The screens that did land are on'
21
- + ' disk; redraw the gap and re-run with --resume before converting this page.',
22
- });
23
- continue;
24
- }
25
- // Collect the page's pixels first, tagging which side declares the width.
26
- const sources = [];
27
- if (page.startsFromWinner) {
28
- if (!args.winner) {
29
- conversions.set(page.id, {
30
- status: 'skipped',
31
- reason: `Page ${page.id} starts from the approved screen, whose bytes are not available`
32
- + ' locally, so viewport 1 of the page is missing.',
33
- });
34
- continue;
35
- }
36
- const bytes = await readScreenBytes(args.winner);
37
- sources.push({
38
- ordinal: 1,
39
- path: args.winner.path,
40
- input: {
41
- id: WINNER_VIEWPORT_ID,
42
- bytes,
43
- mediaType: 'image/png',
44
- width: args.winner.width,
45
- height: args.winner.height,
46
- // The winner came from somewhere else; it is the side that moves.
47
- canonical: false,
48
- },
49
- });
50
- }
51
- for (const viewport of planned) {
52
- const screen = args.screens.get(viewport.slot);
53
- sources.push({
15
+ /**
16
+ * The reuse claim, gated on proof rather than on intent.
17
+ *
18
+ * A normalized winner is no longer the bytes any earlier conversion was
19
+ * admitted with, so a declared `--source-conversion-id` would assert a digest
20
+ * the server will disprove and turn a convertible page into a failed one. A
21
+ * receipt is keyed on the bytes actually submitted, so it survives
22
+ * normalization — the same approved design reconciled to the same server canvas
23
+ * produces the same bytes — and it is only honoured on an exact digest match.
24
+ */
25
+ export const winnerReuseConversionId = async (args) => {
26
+ if (args.settings.sourceConversionId && !args.normalized)
27
+ return args.settings.sourceConversionId;
28
+ return await findReusableConversionId({
29
+ receipts: args.receipts,
30
+ sha256: args.submittedSha256,
31
+ model: args.model,
32
+ boughtBy: args.runId,
33
+ ...(args.store ? { store: args.store } : {}),
34
+ });
35
+ };
36
+ /**
37
+ * The same page, with the attachment the server just disproved dropped.
38
+ *
39
+ * A reuse claim is proved against durable evidence BEFORE the package row
40
+ * exists, so its refusal costs nothing and leaves nothing behind: the identical
41
+ * request without the attachment is a first admission, not a second one. The
42
+ * page's key is derived from the run, the page, and the ordered digests of the
43
+ * bytes being submitted (`branchPackageKey`) — never from the attachment — so
44
+ * the retry replays under the SAME key and the reuse stays what it always was:
45
+ * an optimisation over bytes the page is carrying anyway.
46
+ *
47
+ * Null when the failure is not that refusal, or names no attachment this page
48
+ * actually sent. Then there is nothing a retry would change, and the page
49
+ * settles failed exactly as it did before.
50
+ */
51
+ const withoutRefusedAttachment = (viewports, error,
52
+ /** The submitted digest per viewport, and the model the page declared. */
53
+ key) => {
54
+ if (!isSourceConversionRefusal(error))
55
+ return null;
56
+ const attached = viewports.filter((viewport) => viewport.sourceConversionId);
57
+ const named = sourceConversionRefusalViewportId(error);
58
+ const refused = named === null
59
+ ? attached
60
+ : attached.filter((viewport) => viewport.id === named);
61
+ // A refusal naming a viewport that carried no attachment is a contract this
62
+ // client does not recognise; dropping every attachment is then the only
63
+ // reading that can still be right.
64
+ const dropped = refused.length > 0 ? refused : attached;
65
+ if (dropped.length === 0)
66
+ return null;
67
+ const dropping = new Set(dropped.map((viewport) => viewport.id));
68
+ return {
69
+ viewports: viewports.map((viewport) => (dropping.has(viewport.id)
70
+ // Rebuilt without the claim, and with the bytes it was always carrying.
71
+ ? {
72
+ id: viewport.id,
54
73
  ordinal: viewport.ordinal,
55
- path: screen.path,
56
- input: {
57
- id: viewport.slot,
58
- bytes: await readScreenBytes(screen),
59
- mediaType: 'image/png',
60
- width: screen.width,
61
- height: screen.height,
62
- // Drawn by the server on the run's fixed canvas: this is the width.
63
- canonical: true,
64
- },
65
- });
66
- }
67
- let normalization;
68
- try {
69
- normalization = await normalizePageViewports(sources.map((entry) => entry.input));
70
- }
71
- catch (error) {
72
- conversions.set(page.id, {
73
- status: 'failed',
74
- output: args.settings.output,
75
- error: error instanceof Error ? error.message : String(error),
76
- });
77
- continue;
78
- }
79
- const normalizedById = new Map(normalization.viewports.map((entry) => [entry.id, entry]));
80
- const viewports = sources.map((entry) => {
81
- const resolved = normalizedById.get(entry.input.id);
82
- // A normalized winner is no longer the bytes any earlier conversion was
83
- // admitted with, so the reuse claim would be false. Buy it instead of
84
- // asserting a digest the server will disprove.
85
- const reuse = entry.input.id === WINNER_VIEWPORT_ID
86
- && args.settings.sourceConversionId
87
- && !resolved.normalized;
74
+ imagePath: viewport.imagePath,
75
+ bytes: viewport.bytes,
76
+ mediaType: viewport.mediaType,
77
+ }
78
+ : viewport)),
79
+ disproven: dropped.map((viewport) => ({
80
+ viewportId: viewport.id,
81
+ conversionId: viewport.sourceConversionId,
82
+ detail: error.message,
83
+ sha256: key.sha256(viewport.id),
84
+ model: key.model,
85
+ })),
86
+ };
87
+ };
88
+ export const convertBranchPage = async (args) => {
89
+ const { page } = args;
90
+ const planned = orderedViewports(args.plan, page);
91
+ const missing = planned.filter((viewport) => !args.screens.has(viewport.slot));
92
+ if (missing.length > 0) {
93
+ return {
94
+ status: 'skipped',
95
+ reason: `Page ${page.id} is missing screen(s) ${missing.map((entry) => entry.slot).join(', ')},`
96
+ + ' so its viewports do not stack into a whole page. The screens that did land are on'
97
+ + ' disk; redraw the gap and re-run with --resume before converting this page.',
98
+ };
99
+ }
100
+ // Collect the page's pixels first, tagging which side declares the width.
101
+ const sources = [];
102
+ if (page.startsFromWinner) {
103
+ if (!args.winner) {
88
104
  return {
89
- id: entry.input.id,
90
- ordinal: entry.ordinal,
91
- imagePath: entry.path,
92
- bytes: resolved.bytes,
93
- mediaType: resolved.mediaType,
94
- ...(reuse ? { sourceConversionId: args.settings.sourceConversionId } : {}),
95
- };
96
- });
97
- if (viewports.length === 0) {
98
- conversions.set(page.id, {
99
105
  status: 'skipped',
100
- reason: `Page ${page.id} has no viewport to convert.`,
101
- });
102
- continue;
103
- }
104
- if (viewports.length === 1 && page.startsFromWinner) {
105
- conversions.set(page.id, {
106
- status: 'skipped',
107
- reason: 'The approved screen already is the whole page — the server planned no'
108
- + ' continuations for it. Convert it on its own with'
109
- + ' `12ui convert <winner> --output layerdoc --export html`.',
110
- });
111
- continue;
106
+ reason: `Page ${page.id} starts from the approved screen, whose bytes are not available`
107
+ + ' locally, so viewport 1 of the page is missing.',
108
+ };
112
109
  }
113
- const input = {
114
- id: page.id,
115
- ordinal: page.index,
116
- kind: page.kind,
117
- ...(page.title ? { title: page.title } : {}),
118
- ...(page.purpose ? { purpose: page.purpose } : {}),
119
- viewports,
110
+ sources.push({
111
+ ordinal: 1,
112
+ path: args.winner.path,
113
+ input: {
114
+ id: WINNER_VIEWPORT_ID,
115
+ bytes: await readBranchScreenBytes(args.winner),
116
+ mediaType: 'image/png',
117
+ width: args.winner.width,
118
+ height: args.winner.height,
119
+ // The winner came from somewhere else; it is the side that moves.
120
+ canonical: false,
121
+ },
122
+ });
123
+ }
124
+ for (const viewport of planned) {
125
+ const screen = args.screens.get(viewport.slot);
126
+ sources.push({
127
+ ordinal: viewport.ordinal,
128
+ path: screen.path,
129
+ input: {
130
+ id: viewport.slot,
131
+ bytes: await readBranchScreenBytes(screen),
132
+ mediaType: 'image/png',
133
+ width: screen.width,
134
+ height: screen.height,
135
+ // Drawn by the server on the run's fixed canvas: this is the width.
136
+ canonical: true,
137
+ },
138
+ });
139
+ }
140
+ const model = args.settings.model ?? DEFAULT_PACKAGE_MODEL;
141
+ let normalization;
142
+ try {
143
+ normalization = await normalizePageViewports(sources.map((entry) => entry.input));
144
+ }
145
+ catch (error) {
146
+ return {
147
+ status: 'failed',
148
+ output: args.settings.output,
149
+ error: error instanceof Error ? error.message : String(error),
120
150
  };
121
- // Keyed on the bytes actually submitted, so a retry after normalization
122
- // replays the same package instead of buying the page again.
123
- const idempotencyKey = branchPackageKey({
151
+ }
152
+ const normalizedById = new Map(normalization.viewports.map((entry) => [entry.id, entry]));
153
+ const submittedWinner = normalizedById.get(WINNER_VIEWPORT_ID);
154
+ // The winner's reuse is the one claim that reads the user's receipt store,
155
+ // and it can only be asked once the bytes it is about to submit are known.
156
+ const winnerReuse = submittedWinner
157
+ ? await winnerReuseConversionId({
158
+ settings: args.settings,
159
+ submittedSha256: submittedWinner.sha256,
160
+ normalized: submittedWinner.normalized,
161
+ receipts: args.winnerReceipts ?? [],
124
162
  runId: args.plan.runId,
125
- pageIndex: page.index,
126
- viewportSha256s: viewports.map((viewport) => normalizedById.get(viewport.id).sha256),
163
+ model,
164
+ ...(args.receiptStore ? { store: args.receiptStore } : {}),
165
+ })
166
+ : undefined;
167
+ const viewports = sources.map((entry) => {
168
+ const resolved = normalizedById.get(entry.input.id);
169
+ const reuse = entry.input.id === WINNER_VIEWPORT_ID ? winnerReuse : undefined;
170
+ return {
171
+ id: entry.input.id,
172
+ ordinal: entry.ordinal,
173
+ imagePath: entry.path,
174
+ bytes: resolved.bytes,
175
+ mediaType: resolved.mediaType,
176
+ ...(reuse ? { sourceConversionId: reuse } : {}),
177
+ };
178
+ });
179
+ if (viewports.length === 0) {
180
+ return { status: 'skipped', reason: `Page ${page.id} has no viewport to convert.` };
181
+ }
182
+ if (viewports.length === 1 && page.startsFromWinner) {
183
+ return {
184
+ status: 'skipped',
185
+ reason: 'The approved screen already is the whole page — the server planned no'
186
+ + ' continuations for it. Convert it on its own with'
187
+ + ' `12ui convert <winner> --output layerdoc --export html`.',
188
+ };
189
+ }
190
+ // The page's identity. Its viewports travel per submission instead, because a
191
+ // disproven attachment changes them and nothing else about the page.
192
+ const input = {
193
+ id: page.id,
194
+ ordinal: page.index,
195
+ kind: page.kind,
196
+ ...(page.title ? { title: page.title } : {}),
197
+ ...(page.purpose ? { purpose: page.purpose } : {}),
198
+ };
199
+ // Keyed on the bytes actually submitted, so a retry after normalization
200
+ // replays the same package instead of buying the page again.
201
+ const idempotencyKey = branchPackageKey({
202
+ runId: args.plan.runId,
203
+ pageIndex: page.index,
204
+ viewportSha256s: viewports.map((viewport) => normalizedById.get(viewport.id).sha256),
205
+ output: args.settings.output,
206
+ ...(args.settings.model ? { model: args.settings.model } : {}),
207
+ ...(args.settings.responsiveQuality
208
+ ? { responsiveQuality: args.settings.responsiveQuality }
209
+ : {}),
210
+ });
211
+ const normalizedRecord = normalization.viewports
212
+ .filter((viewport) => viewport.normalized)
213
+ .map((viewport) => ({
214
+ id: viewport.id,
215
+ fromWidth: viewport.original.width,
216
+ fromHeight: viewport.original.height,
217
+ fromSha256: viewport.original.sha256,
218
+ toWidth: viewport.width,
219
+ toHeight: viewport.height,
220
+ toSha256: viewport.sha256,
221
+ }));
222
+ const normalizationRecord = {
223
+ ...(normalization.canonicalWidth === null
224
+ ? {}
225
+ : { canonicalWidth: normalization.canonicalWidth }),
226
+ ...(normalizedRecord.length > 0 ? { normalizedViewports: normalizedRecord } : {}),
227
+ };
228
+ const disproven = [];
229
+ const disproofRecord = () => (disproven.length > 0 ? { disprovenReuse: disproven } : {});
230
+ // The reconciliation is a fact about what was submitted, so it belongs in
231
+ // the record whether or not the submission was accepted — a failed page
232
+ // is exactly when an operator needs to know what the bytes were.
233
+ const failedPage = (error) => ({
234
+ status: 'failed',
235
+ idempotencyKey,
236
+ output: args.settings.output,
237
+ ...normalizationRecord,
238
+ ...disproofRecord(),
239
+ error: error instanceof Error ? error.message : String(error),
240
+ });
241
+ // Whether a package row exists yet. An attachment is proved at admission,
242
+ // before anything durable is created, so only a failure with no admitted
243
+ // package can be that refusal — and only then can the same key carry a
244
+ // different body without being a `409 idempotency_conflict`.
245
+ let admitted = false;
246
+ const submit = async (submitted) => await submitConversionPackage({
247
+ client: args.client,
248
+ outDir: args.pagesDirectory,
249
+ submission: {
127
250
  output: args.settings.output,
128
251
  ...(args.settings.model ? { model: args.settings.model } : {}),
129
252
  ...(args.settings.responsiveQuality
130
253
  ? { responsiveQuality: args.settings.responsiveQuality }
131
254
  : {}),
255
+ pages: [{ ...input, viewports: [...submitted] }],
256
+ idempotencyKey,
257
+ },
258
+ onSubmitted: () => { admitted = true; },
259
+ ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }),
260
+ ...(args.onProgress ? { onProgress: args.onProgress } : {}),
261
+ ...(args.signal ? { signal: args.signal } : {}),
262
+ });
263
+ let result;
264
+ try {
265
+ result = await submit(viewports);
266
+ }
267
+ catch (error) {
268
+ // A disproven reuse costs one retry of the same page, never the page: its
269
+ // other screens are already paid for by the time anything could refuse it.
270
+ const retry = admitted ? null : withoutRefusedAttachment(viewports, error, {
271
+ // Every viewport was built from the normalization, so its submitted
272
+ // digest is always known; the fallback only keeps an impossible miss from
273
+ // throwing inside the retry path, and names no record to withdraw.
274
+ sha256: (viewportId) => normalizedById.get(viewportId)?.sha256 ?? '',
275
+ model,
132
276
  });
133
- const normalizedRecord = normalization.viewports
134
- .filter((viewport) => viewport.normalized)
135
- .map((viewport) => ({
136
- id: viewport.id,
137
- fromWidth: viewport.original.width,
138
- fromHeight: viewport.original.height,
139
- fromSha256: viewport.original.sha256,
140
- toWidth: viewport.width,
141
- toHeight: viewport.height,
142
- toSha256: viewport.sha256,
143
- }));
144
- const normalizationRecord = {
145
- ...(normalization.canonicalWidth === null
146
- ? {}
147
- : { canonicalWidth: normalization.canonicalWidth }),
148
- ...(normalizedRecord.length > 0 ? { normalizedViewports: normalizedRecord } : {}),
149
- };
277
+ if (!retry)
278
+ return failedPage(error);
279
+ disproven.push(...retry.disproven);
280
+ for (const entry of retry.disproven)
281
+ args.onReuseDisproven?.(entry);
150
282
  try {
151
- const result = await submitConversionPackage({
152
- client: args.client,
153
- outDir: args.pagesDirectory,
154
- submission: {
155
- output: args.settings.output,
156
- ...(args.settings.model ? { model: args.settings.model } : {}),
157
- ...(args.settings.responsiveQuality
158
- ? { responsiveQuality: args.settings.responsiveQuality }
283
+ result = await submit(retry.viewports);
284
+ }
285
+ catch (retryError) {
286
+ return failedPage(retryError);
287
+ }
288
+ }
289
+ const converted = result.pages[0];
290
+ const winnerChild = converted?.viewports?.find((viewport) => (viewport.id === WINNER_VIEWPORT_ID
291
+ && viewport.status === 'succeeded'
292
+ && viewport.conversionId));
293
+ if (winnerChild?.conversionId && result.expiresAt) {
294
+ args.onWinnerConversion?.({
295
+ sha256: normalizedById.get(WINNER_VIEWPORT_ID).sha256,
296
+ conversionId: winnerChild.conversionId,
297
+ // What the server says it ran, not what this page asked for. A receipt is
298
+ // only honoured when its model matches the next package's, so recording
299
+ // the request would claim a model the conversion may not have run.
300
+ model: result.model ?? model,
301
+ expiresAt: result.expiresAt,
302
+ });
303
+ }
304
+ return converted?.status === 'succeeded'
305
+ ? {
306
+ status: 'succeeded',
307
+ packageId: result.packageId,
308
+ idempotencyKey,
309
+ output: args.settings.output,
310
+ ...normalizationRecord,
311
+ ...disproofRecord(),
312
+ ...(converted.conversionId ? { conversionId: converted.conversionId } : {}),
313
+ ...(converted.outFile ? { outFile: converted.outFile } : {}),
314
+ ...(converted.sha256 ? { sha256: converted.sha256 } : {}),
315
+ ...(converted.bytes === undefined ? {} : { bytes: converted.bytes }),
316
+ }
317
+ : {
318
+ status: 'failed',
319
+ packageId: result.packageId,
320
+ idempotencyKey,
321
+ output: args.settings.output,
322
+ ...normalizationRecord,
323
+ ...disproofRecord(),
324
+ error: converted?.error ?? `Package ${result.packageId} produced no page.`,
325
+ };
326
+ };
327
+ /**
328
+ * Every page settles, whatever happens to any one of them. A page whose own
329
+ * bytes could not even be delivered is recorded as a failed conversion rather
330
+ * than thrown: a throw would abandon the sibling packages already running,
331
+ * which are paid work whose results would then never reach the sentinel.
332
+ */
333
+ const settlePageConversion = async (args) => {
334
+ try {
335
+ return await convertBranchPage(args);
336
+ }
337
+ catch (error) {
338
+ return {
339
+ status: 'failed',
340
+ output: args.settings.output,
341
+ error: error instanceof Error ? error.message : String(error),
342
+ };
343
+ }
344
+ };
345
+ /**
346
+ * The one owner of "which pages are converting, and how many at once".
347
+ *
348
+ * Pages are handed in as they become eligible rather than all at the end, so a
349
+ * page whose screens landed in the first wave is already converting while the
350
+ * rest of the run is still generating. `prepare` runs inside the page's own
351
+ * slot, which is what keeps a delivery for a page that has not started from
352
+ * competing with the packages that are already paid for.
353
+ */
354
+ export const createBranchPageConversions = (args) => {
355
+ const limiter = createConcurrencyLimiter(args.concurrency ?? BRANCH_PAGE_CONCURRENCY_DEFAULT);
356
+ const conversions = new Map();
357
+ const enqueued = new Map();
358
+ return {
359
+ start: (plan, page) => {
360
+ if (enqueued.has(page.id))
361
+ return;
362
+ enqueued.set(page.id, limiter(async () => {
363
+ const prepared = await args.prepare(page, plan);
364
+ conversions.set(page.id, await settlePageConversion({
365
+ client: args.client,
366
+ plan,
367
+ page,
368
+ screens: prepared.screens,
369
+ settings: args.settings,
370
+ pagesDirectory: args.pagesDirectory,
371
+ ...(prepared.winner ? { winner: prepared.winner } : {}),
372
+ ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }),
373
+ ...(args.winnerReceipts ? { winnerReceipts: args.winnerReceipts } : {}),
374
+ ...(args.receiptStore ? { receiptStore: args.receiptStore } : {}),
375
+ ...(args.onProgress
376
+ ? { onProgress: (event) => args.onProgress(page.id, event) }
159
377
  : {}),
160
- pages: [input],
161
- idempotencyKey,
162
- },
163
- ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }),
164
- ...(args.onProgress
165
- ? { onProgress: (event) => args.onProgress(page.id, event) }
166
- : {}),
167
- ...(args.signal ? { signal: args.signal } : {}),
168
- });
169
- const converted = result.pages[0];
170
- conversions.set(page.id, converted?.status === 'succeeded'
171
- ? {
172
- status: 'succeeded',
173
- packageId: result.packageId,
174
- idempotencyKey,
175
- output: args.settings.output,
176
- ...normalizationRecord,
177
- ...(converted.conversionId ? { conversionId: converted.conversionId } : {}),
178
- ...(converted.outFile ? { outFile: converted.outFile } : {}),
179
- ...(converted.sha256 ? { sha256: converted.sha256 } : {}),
180
- ...(converted.bytes === undefined ? {} : { bytes: converted.bytes }),
181
- }
182
- : {
378
+ ...(args.onWinnerConversion ? { onWinnerConversion: args.onWinnerConversion } : {}),
379
+ ...(args.onReuseDisproven ? { onReuseDisproven: args.onReuseDisproven } : {}),
380
+ ...(args.signal ? { signal: args.signal } : {}),
381
+ }));
382
+ }).catch((error) => {
383
+ conversions.set(page.id, {
183
384
  status: 'failed',
184
- packageId: result.packageId,
185
- idempotencyKey,
186
385
  output: args.settings.output,
187
- ...normalizationRecord,
188
- error: converted?.error ?? `Package ${result.packageId} produced no page.`,
386
+ error: error instanceof Error ? error.message : String(error),
189
387
  });
190
- }
191
- catch (error) {
192
- // The reconciliation is a fact about what was submitted, so it belongs in
193
- // the record whether or not the submission was accepted a failed page
194
- // is exactly when an operator needs to know what the bytes were.
195
- conversions.set(page.id, {
196
- status: 'failed',
197
- idempotencyKey,
198
- output: args.settings.output,
199
- ...normalizationRecord,
200
- error: error instanceof Error ? error.message : String(error),
201
- });
202
- }
203
- }
204
- return conversions;
388
+ }));
389
+ },
390
+ settled: async () => {
391
+ // Draining can itself enqueue: a page becomes eligible while an earlier
392
+ // one is still in flight. Keep draining until nothing new arrived.
393
+ let counted = -1;
394
+ while (enqueued.size !== counted) {
395
+ counted = enqueued.size;
396
+ await Promise.all([...enqueued.values()]);
397
+ }
398
+ return conversions;
399
+ },
400
+ };
205
401
  };
206
402
  //# sourceMappingURL=branch-page-conversion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"branch-page-conversion.js","sourceRoot":"","sources":["../src/branch-page-conversion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"branch-page-conversion.js","sourceRoot":"","sources":["../src/branch-page-conversion.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAA+B,MAAM,uBAAuB,CAAC;AAG3F,OAAO,EACL,wBAAwB,GAEzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,sBAAsB,GAGvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,uBAAuB,GAKxB,MAAM,yBAAyB,CAAC;AA6BjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AA0DhD,MAAM,gBAAgB,GAAG,CACvB,IAA0B,EAC1B,IAAuB,EACc,EAAE,CAAC,IAAI,CAAC,OAAO;KACnD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KACpD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;KACnE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AAE7E;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,IAQ7C,EAA+B,EAAE;IAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAClG,OAAO,MAAM,wBAAwB,CAAC;QACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,eAAe;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,KAAK;QACpB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,wBAAwB,GAAG,CAC/B,SAA0C,EAC1C,KAAc;AACd,0EAA0E;AAC1E,GAA8D,EACkB,EAAE;IAClF,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI;QAC5B,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IACzD,4EAA4E;IAC5E,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/D,wEAAwE;YACxE,CAAC,CAAC;gBACA,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;aAC9B;YACD,CAAC,CAAC,QAAQ,CAAC,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpC,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,YAAY,EAAE,QAAQ,CAAC,kBAAmB;YAC1C,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,IAA8B,EACL,EAAE;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,QAAQ,IAAI,CAAC,EAAE,yBAAyB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;kBAC5F,oFAAoF;kBACpF,6EAA6E;SAClF,CAAC;IACJ,CAAC;IACD,0EAA0E;IAC1E,MAAM,OAAO,GAA8D,EAAE,CAAC;IAC9E,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,QAAQ,IAAI,CAAC,EAAE,iEAAiE;sBACpF,iDAAiD;aACtD,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,EAAE;gBACL,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,MAAM,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC/C,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,kEAAkE;gBAClE,SAAS,EAAE,KAAK;aACjB;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE;gBACL,EAAE,EAAE,QAAQ,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC;gBAC1C,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,oEAAoE;gBACpE,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,qBAAqB,CAAC;IAC3D,IAAI,aAAgC,CAAC;IACrC,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/D,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,eAAe;QACjC,CAAC,CAAC,MAAM,uBAAuB,CAAC;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,eAAe,EAAE,eAAe,CAAC,MAAM;YACvC,UAAU,EAAE,eAAe,CAAC,UAAU;YACtC,QAAQ,EAAE,IAAI,CAAC,cAAc,IAAI,EAAE;YACnC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,KAAK;YACL,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC;QACF,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,SAAS,GAA2B,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAE,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,IAAI,CAAC,EAAE,8BAA8B,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,uEAAuE;kBAC3E,mDAAmD;kBACnD,2DAA2D;SAChE,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,qEAAqE;IACrE,MAAM,KAAK,GAAwC;QACjD,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,OAAO,EAAE,IAAI,CAAC,KAAK;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;IACF,wEAAwE;IACxE,6DAA6D;IAC7D,MAAM,cAAc,GAAG,gBAAgB,CAAC;QACtC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACtB,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,eAAe,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAE,CAAC,MAAM,CAAC;QACrF,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;QAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB;YACjC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;YACxD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS;SAC7C,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;SACzC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,SAAS,EAAE,QAAQ,CAAC,QAAS,CAAC,KAAK;QACnC,UAAU,EAAE,QAAQ,CAAC,QAAS,CAAC,MAAM;QACrC,UAAU,EAAE,QAAQ,CAAC,QAAS,CAAC,MAAM;QACrC,OAAO,EAAE,QAAQ,CAAC,KAAK;QACvB,QAAQ,EAAE,QAAQ,CAAC,MAAM;QACzB,QAAQ,EAAE,QAAQ,CAAC,MAAM;KAC1B,CAAC,CAAC,CAAC;IACN,MAAM,mBAAmB,GAAG;QAC1B,GAAG,CAAC,aAAa,CAAC,cAAc,KAAK,IAAI;YACvC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,cAAc,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;QACrD,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAC;IACF,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,GAA+C,EAAE,CAAC,CACvE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAC1D,CAAC;IACF,0EAA0E;IAC1E,wEAAwE;IACxE,iEAAiE;IACjE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAkB,EAAE,CAAC,CAAC;QACtD,MAAM,EAAE,QAAQ;QAChB,cAAc;QACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;QAC5B,GAAG,mBAAmB;QACtB,GAAG,cAAc,EAAE;QACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAC9D,CAAC,CAAC;IACH,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,6DAA6D;IAC7D,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,MAAM,GAAG,KAAK,EAClB,SAA0C,EACR,EAAE,CAAC,MAAM,uBAAuB,CAAC;QACnE,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,cAAc;QAC3B,UAAU,EAAE;YACV,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB;gBACjC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;gBACxD,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;YAChD,cAAc;SACf;QACD,WAAW,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAC;IAEH,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,EAAE,KAAK,EAAE;YACzE,oEAAoE;YACpE,0EAA0E;YAC1E,mEAAmE;YACnE,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,EAAE;YACpE,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,KAAK;YAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,SAAS;YAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3D,QAAQ,CAAC,EAAE,KAAK,kBAAkB;WAC/B,QAAQ,CAAC,MAAM,KAAK,WAAW;WAC/B,QAAQ,CAAC,YAAY,CACzB,CAAC,CAAC;IACH,IAAI,WAAW,EAAE,YAAY,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAE,CAAC,MAAM;YACtD,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,0EAA0E;YAC1E,wEAAwE;YACxE,mEAAmE;YACnE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;YAC5B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,EAAE,MAAM,KAAK,WAAW;QACtC,CAAC,CAAC;YACA,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,cAAc;YACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,GAAG,mBAAmB;YACtB,GAAG,cAAc,EAAE;YACnB,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;SACrE;QACD,CAAC,CAAC;YACA,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,cAAc;YACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,GAAG,mBAAmB;YACtB,GAAG,cAAc,EAAE;YACnB,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,WAAW,MAAM,CAAC,SAAS,oBAAoB;SAC3E,CAAC;AACN,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,KAAK,EAChC,IAA8B,EACL,EAAE;IAC3B,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAeF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,IAa3C,EAA4B,EAAE;IAC7B,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,IAAI,+BAA+B,CAAC,CAAC;IAC9F,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,OAAO;QACL,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACpB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,OAAO;YAClC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;gBACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAChD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,oBAAoB,CAAC;oBAClD,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI;oBACJ,IAAI;oBACJ,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,GAAG,CAAC,IAAI,CAAC,UAAU;wBACjB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE;wBACnF,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnF,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7E,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD,CAAC,CAAC,CAAC;YACN,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC1B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;oBACvB,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;oBAC5B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,wEAAwE;YACxE,mEAAmE;YACnE,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;YACjB,OAAO,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;gBACxB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}