@algomotion/spec 0.0.0-stage → 1.0.0-alpha.1

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 (97) hide show
  1. package/LICENSE +675 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/common.d.ts +136 -0
  4. package/dist/common.d.ts.map +1 -0
  5. package/dist/common.js +181 -0
  6. package/dist/common.js.map +1 -0
  7. package/dist/errors.d.ts +71 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +43 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +10 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +10 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/json-schema.d.ts +3 -0
  16. package/dist/json-schema.d.ts.map +1 -0
  17. package/dist/json-schema.js +16 -0
  18. package/dist/json-schema.js.map +1 -0
  19. package/dist/kinds/array.d.ts +171 -0
  20. package/dist/kinds/array.d.ts.map +1 -0
  21. package/dist/kinds/array.js +179 -0
  22. package/dist/kinds/array.js.map +1 -0
  23. package/dist/kinds/btree.d.ts +190 -0
  24. package/dist/kinds/btree.d.ts.map +1 -0
  25. package/dist/kinds/btree.js +274 -0
  26. package/dist/kinds/btree.js.map +1 -0
  27. package/dist/kinds/graph.d.ts +227 -0
  28. package/dist/kinds/graph.d.ts.map +1 -0
  29. package/dist/kinds/graph.js +229 -0
  30. package/dist/kinds/graph.js.map +1 -0
  31. package/dist/kinds/hash-table.d.ts +108 -0
  32. package/dist/kinds/hash-table.d.ts.map +1 -0
  33. package/dist/kinds/hash-table.js +133 -0
  34. package/dist/kinds/hash-table.js.map +1 -0
  35. package/dist/kinds/index.d.ts +98 -0
  36. package/dist/kinds/index.d.ts.map +1 -0
  37. package/dist/kinds/index.js +53 -0
  38. package/dist/kinds/index.js.map +1 -0
  39. package/dist/kinds/kind.d.ts +73 -0
  40. package/dist/kinds/kind.d.ts.map +1 -0
  41. package/dist/kinds/kind.js +4 -0
  42. package/dist/kinds/kind.js.map +1 -0
  43. package/dist/kinds/linear.d.ts +24 -0
  44. package/dist/kinds/linear.d.ts.map +1 -0
  45. package/dist/kinds/linear.js +26 -0
  46. package/dist/kinds/linear.js.map +1 -0
  47. package/dist/kinds/linked-list.d.ts +132 -0
  48. package/dist/kinds/linked-list.d.ts.map +1 -0
  49. package/dist/kinds/linked-list.js +95 -0
  50. package/dist/kinds/linked-list.js.map +1 -0
  51. package/dist/kinds/plane.d.ts +190 -0
  52. package/dist/kinds/plane.d.ts.map +1 -0
  53. package/dist/kinds/plane.js +206 -0
  54. package/dist/kinds/plane.js.map +1 -0
  55. package/dist/kinds/priority-queue.d.ts +120 -0
  56. package/dist/kinds/priority-queue.d.ts.map +1 -0
  57. package/dist/kinds/priority-queue.js +108 -0
  58. package/dist/kinds/priority-queue.js.map +1 -0
  59. package/dist/kinds/queue.d.ts +94 -0
  60. package/dist/kinds/queue.d.ts.map +1 -0
  61. package/dist/kinds/queue.js +59 -0
  62. package/dist/kinds/queue.js.map +1 -0
  63. package/dist/kinds/stack.d.ts +70 -0
  64. package/dist/kinds/stack.d.ts.map +1 -0
  65. package/dist/kinds/stack.js +50 -0
  66. package/dist/kinds/stack.js.map +1 -0
  67. package/dist/kinds/table.d.ts +65 -0
  68. package/dist/kinds/table.d.ts.map +1 -0
  69. package/dist/kinds/table.js +116 -0
  70. package/dist/kinds/table.js.map +1 -0
  71. package/dist/kinds/tree.d.ts +272 -0
  72. package/dist/kinds/tree.d.ts.map +1 -0
  73. package/dist/kinds/tree.js +380 -0
  74. package/dist/kinds/tree.js.map +1 -0
  75. package/dist/parse.d.ts +26 -0
  76. package/dist/parse.d.ts.map +1 -0
  77. package/dist/parse.js +380 -0
  78. package/dist/parse.js.map +1 -0
  79. package/dist/result.d.ts +16 -0
  80. package/dist/result.d.ts.map +1 -0
  81. package/dist/result.js +3 -0
  82. package/dist/result.js.map +1 -0
  83. package/dist/share.d.ts +68 -0
  84. package/dist/share.d.ts.map +1 -0
  85. package/dist/share.js +319 -0
  86. package/dist/share.js.map +1 -0
  87. package/dist/version.d.ts +108 -0
  88. package/dist/version.d.ts.map +1 -0
  89. package/dist/version.js +167 -0
  90. package/dist/version.js.map +1 -0
  91. package/dist/visualization.d.ts +3591 -0
  92. package/dist/visualization.d.ts.map +1 -0
  93. package/dist/visualization.js +131 -0
  94. package/dist/visualization.js.map +1 -0
  95. package/package.json +45 -4
  96. package/schema/visualization.schema.json +5717 -0
  97. package/README.md +0 -3
package/dist/share.js ADDED
@@ -0,0 +1,319 @@
1
+ import { err, ok } from "./result.js";
2
+ /** The version of the link format that this code writes and reads. */
3
+ export const SHARE_LINK_VERSION = 1;
4
+ export const SHARE_LIMITS = {
5
+ /** The longest link a writer makes. */
6
+ linkLength: 16_384,
7
+ /** The longest fragment a reader takes: Chrome's longest URL. */
8
+ fragmentLength: 2_097_152,
9
+ /** The most bytes a document may inflate to (ADR 0041). */
10
+ documentBytes: 4 * 1024 * 1024,
11
+ /** The longest `alg`, `frame` or `theme`. */
12
+ textLength: 200,
13
+ /** The longest `in` (ADR 0041). */
14
+ inputLength: 65_536,
15
+ };
16
+ // --- Writing ------------------------------------------------------------------
17
+ /** The fragment of a link, without its `#`. */
18
+ export function shareFragment(content) {
19
+ return fragmentWithin(content, Infinity);
20
+ }
21
+ /**
22
+ * The fragment, made only while it can stay within `room` characters: a
23
+ * document stops compressing once its compressed form cannot fit, so one
24
+ * far too large for a link costs little.
25
+ */
26
+ async function fragmentWithin(content, room) {
27
+ const pairs = [['v', String(SHARE_LINK_VERSION)]];
28
+ if ('document' in content) {
29
+ // JSON.stringify gives undefined for undefined or a function, and
30
+ // throws for a BigInt or a cycle.
31
+ let json;
32
+ try {
33
+ json = JSON.stringify(content.document);
34
+ }
35
+ catch (e) {
36
+ return fail('INVALID_LINK', '$.doc', `The document is not JSON${reason(e)}`);
37
+ }
38
+ if (json === undefined)
39
+ return fail('INVALID_LINK', '$.doc', 'The document is not JSON');
40
+ // "v=1&doc=" and base64url's four characters for every three bytes.
41
+ const maxBytes = Math.floor(((room - 8) * 3) / 4);
42
+ const packed = await deflate(json, maxBytes);
43
+ if (!packed.ok)
44
+ return packed;
45
+ if (packed.value === undefined)
46
+ return tooLong();
47
+ pairs.push(['doc', packed.value]);
48
+ }
49
+ else {
50
+ pairs.push(['alg', content.algorithm]);
51
+ if (content.input !== undefined)
52
+ pairs.push(['in', content.input]);
53
+ }
54
+ if (content.frame !== undefined && String(content.frame) !== '0')
55
+ pairs.push(['frame', String(content.frame)]);
56
+ if (content.theme !== undefined)
57
+ pairs.push(['theme', content.theme]);
58
+ const parts = [];
59
+ for (const [key, value] of pairs) {
60
+ try {
61
+ parts.push(`${key}=${key === 'doc' ? value : encodeURIComponent(value)}`);
62
+ }
63
+ catch {
64
+ return fail('INVALID_LINK', `$.${key}`, `\`${key}\` holds a lone surrogate, which has no UTF-8 form`);
65
+ }
66
+ }
67
+ return ok(parts.join('&'));
68
+ }
69
+ /** A whole link: the page's address, then the fragment. */
70
+ export async function shareLink(base, content) {
71
+ const page = checkShareBase(base);
72
+ if (!page.ok)
73
+ return page;
74
+ const fragment = await fragmentWithin(content, SHARE_LIMITS.linkLength - page.value.length - 1);
75
+ if (!fragment.ok)
76
+ return fragment;
77
+ const link = `${page.value}#${fragment.value}`;
78
+ return link.length > SHARE_LIMITS.linkLength ? tooLong() : ok(link);
79
+ }
80
+ const tooLong = () => fail('LINK_TOO_LARGE', '$', `The link would be longer than ${thousands(SHARE_LIMITS.linkLength)} characters, the limit for share links`, 'Share the document as a file instead, or a recipe and its input, whose link carries only the input.');
81
+ /**
82
+ * Checks the address of a share page: an absolute `http:` or `https:`
83
+ * URL without a fragment, such as `https://example.org/play/`.
84
+ */
85
+ export function checkShareBase(base) {
86
+ const hint = 'Give the address of the share page, such as https://example.org/play/.';
87
+ if (/[\u0000-\u001f\u007f]/.test(base))
88
+ return fail('INVALID_LINK', '$', "The share page's address must not contain control characters", hint);
89
+ const scheme = /^([A-Za-z][A-Za-z0-9+.-]*):/.exec(base)?.[1];
90
+ if (scheme !== undefined && !/^https?$/i.test(scheme))
91
+ return fail('INVALID_LINK', '$', `The share page's address must be an http: or https: URL, not ${scheme}:`, hint);
92
+ if (!/^https?:\/\/[^/?#\s]+/i.test(base))
93
+ return fail('INVALID_LINK', '$', `The share page's address must be an absolute URL, not ${quote(base)}`, hint);
94
+ if (/\s/.test(base))
95
+ return fail('INVALID_LINK', '$', "The share page's address must not contain spaces", hint);
96
+ if (base.includes('\\'))
97
+ return fail('INVALID_LINK', '$', "The share page's address must not contain a backslash, which browsers read as /", hint);
98
+ if (/^https?:\/\/[^/?#]*@/i.test(base))
99
+ return fail('INVALID_LINK', '$', "The share page's address must not hold a user name or password", hint);
100
+ if (base.includes('#'))
101
+ return fail('INVALID_LINK', '$', "The share page's address must not have a fragment: the link's content goes there", hint);
102
+ return ok(base);
103
+ }
104
+ // --- Reading ------------------------------------------------------------------
105
+ const CONTENT_KEYS = ['v', 'doc', 'alg', 'in', 'frame', 'theme'];
106
+ /**
107
+ * Reads a fragment, with or without its `#`: the content it carries, or
108
+ * undefined for an empty fragment. Keys it does not know are ignored.
109
+ */
110
+ export async function readShareFragment(fragment) {
111
+ const text = fragment.startsWith('#') ? fragment.slice(1) : fragment;
112
+ if (text === '')
113
+ return ok(undefined);
114
+ if (text.length > SHARE_LIMITS.fragmentLength)
115
+ return fail('LINK_TOO_LARGE', '$', `The link is ${thousands(text.length)} characters long; a share page reads links of up to ${thousands(SHARE_LIMITS.fragmentLength)}`);
116
+ const pairs = readPairs(text);
117
+ if (!pairs.ok)
118
+ return pairs;
119
+ const get = (key) => pairs.value.get(key);
120
+ const version = checkVersion(get('v'));
121
+ if (!version.ok)
122
+ return version;
123
+ for (const key of ['alg', 'frame', 'theme']) {
124
+ const value = get(key);
125
+ if (value !== undefined && value.length > SHARE_LIMITS.textLength)
126
+ return fail('INVALID_LINK', `$.${key}`, `\`${key}\` is longer than ${SHARE_LIMITS.textLength} characters`);
127
+ }
128
+ const [doc, algorithm, input] = [get('doc'), get('alg'), get('in')];
129
+ const view = {
130
+ ...(get('frame') === undefined ? {} : { frame: get('frame') }),
131
+ ...(get('theme') === undefined ? {} : { theme: get('theme') }),
132
+ };
133
+ if (doc !== undefined && algorithm !== undefined)
134
+ return fail('INVALID_LINK', '$', 'The link names both a document (`doc`) and an algorithm (`alg`); a link carries one of them');
135
+ if (doc !== undefined) {
136
+ if (input !== undefined)
137
+ return fail('INVALID_LINK', '$.in', '`in` is an algorithm’s input, but the link carries a document, not an algorithm (`alg`)');
138
+ const document = await inflate(doc);
139
+ return document.ok ? ok({ document: document.value, ...view }) : document;
140
+ }
141
+ if (algorithm === undefined)
142
+ return fail('INVALID_LINK', '$', 'The link names neither a document (`doc`) nor an algorithm (`alg`)', 'A share link carries #v=1&doc=… or #v=1&alg=…&in=….');
143
+ if (algorithm === '')
144
+ return fail('INVALID_LINK', '$.alg', '`alg` is empty: name an algorithm');
145
+ if (input !== undefined && input.length > SHARE_LIMITS.inputLength)
146
+ return fail('LINK_TOO_LARGE', '$.in', `\`in\` is ${thousands(input.length)} characters long; a share page reads inputs of up to ${thousands(SHARE_LIMITS.inputLength)}`);
147
+ return ok({
148
+ algorithm,
149
+ ...(input === undefined ? {} : { input }),
150
+ ...view,
151
+ });
152
+ }
153
+ /**
154
+ * The fragment's known keys and their values, decoded. A pair whose key
155
+ * is unknown is skipped before its value is decoded, bare or not, so a
156
+ * newer link's extra keys never stop an older reader (ADR 0041).
157
+ */
158
+ function readPairs(text) {
159
+ const pairs = new Map();
160
+ for (const pair of text.split('&')) {
161
+ if (pair === '')
162
+ continue;
163
+ const at = pair.indexOf('=');
164
+ const key = decodeKey(at < 0 ? pair : pair.slice(0, at));
165
+ if (key === undefined)
166
+ continue;
167
+ if (at < 0)
168
+ return fail('INVALID_LINK', '$', `Expected key=value in the link, not ${quote(pair)}`);
169
+ let value;
170
+ try {
171
+ value = decodeURIComponent(pair.slice(at + 1));
172
+ }
173
+ catch {
174
+ return fail('INVALID_LINK', `$.${key}`, `\`${key}\` has malformed percent-encoding`);
175
+ }
176
+ if (pairs.has(key))
177
+ return fail('INVALID_LINK', `$.${key}`, `\`${key}\` is given twice in the link`);
178
+ pairs.set(key, value);
179
+ }
180
+ return ok(pairs);
181
+ }
182
+ /** A known key, decoded; undefined for any other. */
183
+ function decodeKey(raw) {
184
+ try {
185
+ const key = decodeURIComponent(raw);
186
+ return isKey(key) ? key : undefined;
187
+ }
188
+ catch {
189
+ return undefined;
190
+ }
191
+ }
192
+ const isKey = (key) => CONTENT_KEYS.includes(key);
193
+ function checkVersion(v) {
194
+ const hint = 'A share link starts with v=1, such as #v=1&alg=dijkstra&in=A-B%204.';
195
+ if (v === undefined)
196
+ return fail('INVALID_LINK', '$.v', 'The link has no version (`v`)', hint);
197
+ if (!/^[1-9][0-9]{0,8}$/.test(v))
198
+ return fail('INVALID_LINK', '$.v', `The link's version (\`v\`) must be a whole number, not ${quote(v)}`, hint);
199
+ if (Number(v) > SHARE_LINK_VERSION)
200
+ return fail('INVALID_LINK', '$.v', `The link was made by a newer algomotion (link format ${v}); this page reads format ${SHARE_LINK_VERSION}`, 'Open the link with a newer algomotion share page.');
201
+ return ok(undefined);
202
+ }
203
+ const web = globalThis;
204
+ const noStreams = () => fail('INVALID_LINK', '$.doc', 'This JavaScript runtime cannot compress or inflate documents: it has no CompressionStream');
205
+ /** base64url of the compressed JSON; undefined past `maxBytes`. */
206
+ async function deflate(json, maxBytes) {
207
+ if (!web.CompressionStream || !web.TextEncoder)
208
+ return noStreams();
209
+ const bytes = new web.TextEncoder().encode(json);
210
+ const packed = await pipe(new web.CompressionStream('deflate-raw'), bytes, maxBytes);
211
+ return ok(packed === undefined ? undefined : toBase64url(packed));
212
+ }
213
+ async function inflate(payload) {
214
+ if (payload === '')
215
+ return fail('INVALID_LINK', '$.doc', '`doc` is empty: it holds no document');
216
+ if (!/^[A-Za-z0-9_-]*$/.test(payload) || payload.length % 4 === 1)
217
+ return fail('INVALID_LINK', '$.doc', '`doc` is not base64url text: it has a character other than A–Z, a–z, 0–9, "-" and "_", or one too many', 'Copy the whole link: a link cut short or changed by hand no longer holds its document.');
218
+ if (!web.DecompressionStream || !web.TextDecoder)
219
+ return noStreams();
220
+ let bytes;
221
+ try {
222
+ bytes = await pipe(new web.DecompressionStream('deflate-raw'), fromBase64url(payload), SHARE_LIMITS.documentBytes);
223
+ }
224
+ catch (e) {
225
+ return fail('INVALID_LINK', '$.doc', `\`doc\` is not a document compressed with raw DEFLATE${reason(e)}`, 'Copy the whole link: a link cut short or changed by hand no longer holds its document.');
226
+ }
227
+ if (bytes === undefined)
228
+ return fail('LINK_TOO_LARGE', '$.doc', `\`doc\` inflates to more than ${SHARE_LIMITS.documentBytes / 1024 / 1024} MiB, the most a share page reads`);
229
+ let json;
230
+ try {
231
+ json = new web.TextDecoder('utf-8', { fatal: true }).decode(bytes);
232
+ }
233
+ catch {
234
+ return fail('INVALID_LINK', '$.doc', '`doc` does not inflate to UTF-8 text');
235
+ }
236
+ try {
237
+ return ok(JSON.parse(json));
238
+ }
239
+ catch (e) {
240
+ return fail('INVALID_LINK', '$.doc', `\`doc\` does not hold JSON${reason(e)}`);
241
+ }
242
+ }
243
+ /**
244
+ * Runs bytes through a compression stream; undefined once the output
245
+ * passes `limit`, which stops the stream there.
246
+ */
247
+ async function pipe(stream, bytes, limit = Infinity) {
248
+ const writer = stream.writable.getWriter();
249
+ const reader = stream.readable.getReader();
250
+ // The reader reports a failure; the writer's own rejection is the same.
251
+ writer
252
+ .write(bytes)
253
+ .then(() => writer.close())
254
+ .catch(() => undefined);
255
+ const chunks = [];
256
+ let total = 0;
257
+ for (;;) {
258
+ const { done, value } = await reader.read();
259
+ if (done || value === undefined)
260
+ break;
261
+ total += value.byteLength;
262
+ if (total > limit) {
263
+ await reader.cancel().catch(() => undefined);
264
+ return undefined;
265
+ }
266
+ chunks.push(value);
267
+ }
268
+ const out = new Uint8Array(total);
269
+ let at = 0;
270
+ for (const chunk of chunks) {
271
+ out.set(chunk, at);
272
+ at += chunk.byteLength;
273
+ }
274
+ return out;
275
+ }
276
+ const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
277
+ /** base64url (RFC 4648, section 5) without padding. */
278
+ function toBase64url(bytes) {
279
+ const out = [];
280
+ for (let i = 0; i < bytes.length; i += 3) {
281
+ const n = (bytes[i] << 16) | ((bytes[i + 1] ?? 0) << 8) | (bytes[i + 2] ?? 0);
282
+ // One byte makes two characters, two make three, three make four.
283
+ const chars = Math.min(bytes.length - i, 3) + 1;
284
+ for (let k = 0; k < chars; k++)
285
+ out.push(ALPHABET[(n >> (18 - 6 * k)) & 63]);
286
+ }
287
+ return out.join('');
288
+ }
289
+ /** Decodes base64url text already checked to use only its alphabet. */
290
+ function fromBase64url(text) {
291
+ const out = new Uint8Array(Math.floor((text.length * 3) / 4));
292
+ let buffer = 0;
293
+ let bits = 0;
294
+ let at = 0;
295
+ for (let i = 0; i < text.length; i++) {
296
+ buffer = ((buffer << 6) | ALPHABET.indexOf(text[i])) & 0xffffff;
297
+ bits += 6;
298
+ if (bits >= 8) {
299
+ bits -= 8;
300
+ out[at++] = (buffer >> bits) & 0xff;
301
+ }
302
+ }
303
+ return out;
304
+ }
305
+ // --- Helpers -----------------------------------------------------------------
306
+ function fail(code, path, message, hint) {
307
+ return err([
308
+ { code, path, message, ...(hint === undefined ? {} : { hint }) },
309
+ ]);
310
+ }
311
+ /** ": why", from an error, or nothing when it gives no reason. */
312
+ function reason(e) {
313
+ const text = e instanceof Error ? e.message : String(e);
314
+ return text.trim() === '' ? '' : `: ${text}`;
315
+ }
316
+ /** 16384 as "16,384", without Intl, which the Typst plugin lacks. */
317
+ const thousands = (n) => String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
318
+ const quote = (text) => JSON.stringify(text.length > 40 ? `${text.slice(0, 40)}…` : text);
319
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.js","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;AAEnD,sEAAsE;AACtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,uCAAuC;IACvC,UAAU,EAAE,MAAM;IAClB,iEAAiE;IACjE,cAAc,EAAE,SAAS;IACzB,2DAA2D;IAC3D,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAC9B,6CAA6C;IAC7C,UAAU,EAAE,GAAG;IACf,mCAAmC;IACnC,WAAW,EAAE,MAAM;CACX,CAAC;AA8BX,iFAAiF;AAEjF,+CAA+C;AAC/C,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAC3B,OAAqB,EACrB,IAAY;IAEZ,MAAM,KAAK,GAAuB,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;QAC1B,kEAAkE;QAClE,kCAAkC;QAClC,IAAI,IAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CACT,cAAc,EACd,OAAO,EACP,2BAA2B,MAAM,CAAC,CAAC,CAAC,EAAE,CACvC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,KAAK,SAAS;YACpB,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;QACnE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,OAAO,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG;QAC9D,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CACT,cAAc,EACd,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,oDAAoD,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAAqB;IAErB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,OAAO,EACP,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAChD,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,IAAI,CACF,gBAAgB,EAChB,GAAG,EACH,iCAAiC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,wCAAwC,EAC3G,qGAAqG,CACtG,CAAC;AAEJ;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAY;IAEZ,MAAM,IAAI,GACR,wEAAwE,CAAC;IAC3E,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,8DAA8D,EAC9D,IAAI,CACL,CAAC;IACJ,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QACnD,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,gEAAgE,MAAM,GAAG,EACzE,IAAI,CACL,CAAC;IACJ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,yDAAyD,KAAK,CAAC,IAAI,CAAC,EAAE,EACtE,IAAI,CACL,CAAC;IACJ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,kDAAkD,EAClD,IAAI,CACL,CAAC;IACJ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,iFAAiF,EACjF,IAAI,CACL,CAAC;IACJ,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,gEAAgE,EAChE,IAAI,CACL,CAAC;IACJ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,kFAAkF,EAClF,IAAI,CACL,CAAC;IACJ,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AAEjF,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAG1E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,cAAc;QAC3C,OAAO,IAAI,CACT,gBAAgB,EAChB,GAAG,EACH,eAAe,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,uDAAuD,SAAS,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CACrI,CAAC;IAEJ,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU;YAC/D,OAAO,IAAI,CACT,cAAc,EACd,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,qBAAqB,YAAY,CAAC,UAAU,aAAa,CAClE,CAAC;IACN,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG;QACX,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAE,EAAE,CAAC;QAC/D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAE,EAAE,CAAC;KAChE,CAAC;IACF,IAAI,GAAG,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;QAC9C,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,6FAA6F,CAC9F,CAAC;IACJ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,IAAI,CACT,cAAc,EACd,MAAM,EACN,yFAAyF,CAC1F,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5E,CAAC;IACD,IAAI,SAAS,KAAK,SAAS;QACzB,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,oEAAoE,EACpE,qDAAqD,CACtD,CAAC;IACJ,IAAI,SAAS,KAAK,EAAE;QAClB,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,mCAAmC,CAAC,CAAC;IAC5E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,WAAW;QAChE,OAAO,IAAI,CACT,gBAAgB,EAChB,MAAM,EACN,aAAa,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,wDAAwD,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAClI,CAAC;IACJ,OAAO,EAAE,CAAC;QACR,SAAS;QACT,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,IAAI;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAChB,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAe,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,IAAI,EAAE,GAAG,CAAC;YACR,OAAO,IAAI,CACT,cAAc,EACd,GAAG,EACH,uCAAuC,KAAK,CAAC,IAAI,CAAC,EAAE,CACrD,CAAC;QACJ,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CACT,cAAc,EACd,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,mCAAmC,CAC5C,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,CACT,cAAc,EACd,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,+BAA+B,CACxC,CAAC;QACJ,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,qDAAqD;AACrD,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,GAAW,EAAc,EAAE,CACvC,YAAkC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAEpD,SAAS,YAAY,CACnB,CAAqB;IAErB,MAAM,IAAI,GACR,qEAAqE,CAAC;IACxE,IAAI,CAAC,KAAK,SAAS;QACjB,OAAO,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC;IAC5E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CACT,cAAc,EACd,KAAK,EACL,0DAA0D,KAAK,CAAC,CAAC,CAAC,EAAE,EACpE,IAAI,CACL,CAAC;IACJ,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,kBAAkB;QAChC,OAAO,IAAI,CACT,cAAc,EACd,KAAK,EACL,wDAAwD,CAAC,6BAA6B,kBAAkB,EAAE,EAC1G,mDAAmD,CACpD,CAAC;IACJ,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC;AA8BD,MAAM,GAAG,GAAG,UAAqB,CAAC;AAElC,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,IAAI,CACF,cAAc,EACd,OAAO,EACP,2FAA2F,CAC5F,CAAC;AAEJ,mEAAmE;AACnE,KAAK,UAAU,OAAO,CACpB,IAAY,EACZ,QAAgB;IAEhB,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,SAAS,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,IAAI,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,EACxC,KAAK,EACL,QAAQ,CACT,CAAC;IACF,OAAO,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,IAAI,OAAO,KAAK,EAAE;QAChB,OAAO,IAAI,CACT,cAAc,EACd,OAAO,EACP,sCAAsC,CACvC,CAAC;IACJ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAC/D,OAAO,IAAI,CACT,cAAc,EACd,OAAO,EACP,wGAAwG,EACxG,wFAAwF,CACzF,CAAC;IACJ,IAAI,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,SAAS,EAAE,CAAC;IACrE,IAAI,KAA6B,CAAC;IAClC,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,IAAI,CAChB,IAAI,GAAG,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAC1C,aAAa,CAAC,OAAO,CAAC,EACtB,YAAY,CAAC,aAAa,CAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CACT,cAAc,EACd,OAAO,EACP,wDAAwD,MAAM,CAAC,CAAC,CAAC,EAAE,EACnE,wFAAwF,CACzF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,KAAK,SAAS;QACrB,OAAO,IAAI,CACT,gBAAgB,EAChB,OAAO,EACP,iCAAiC,YAAY,CAAC,aAAa,GAAG,IAAI,GAAG,IAAI,mCAAmC,CAC7G,CAAC;IACJ,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CACT,cAAc,EACd,OAAO,EACP,sCAAsC,CACvC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CACT,cAAc,EACd,OAAO,EACP,6BAA6B,MAAM,CAAC,CAAC,CAAC,EAAE,CACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,IAAI,CACjB,MAAkB,EAClB,KAAiB,EACjB,KAAK,GAAG,QAAQ;IAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC3C,wEAAwE;IACxE,MAAM;SACH,KAAK,CAAC,KAAK,CAAC;SACZ,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;SAC1B,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM;QACvC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;YAClB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnB,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,QAAQ,GACZ,kEAAkE,CAAC;AAErE,uDAAuD;AACvD,SAAS,WAAW,CAAC,KAAiB;IACpC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,GACL,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,kEAAkE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;YAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,uEAAuE;AACvE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,QAAQ,CAAC;QACjE,IAAI,IAAI,CAAC,CAAC;QACV,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,CAAC;YACV,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF,SAAS,IAAI,CACX,IAAoB,EACpB,IAAY,EACZ,OAAe,EACf,IAAa;IAEb,OAAO,GAAG,CAAC;QACT,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;KACjE,CAAC,CAAC;AACL,CAAC;AAED,kEAAkE;AAClE,SAAS,MAAM,CAAC,CAAU;IACxB,MAAM,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,qEAAqE;AACrE,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AAElD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Protocol versions (ADR 0021, 0043).
3
+ *
4
+ * A document's `version` is `"major.minor"`. A minor version only adds, so
5
+ * a reader reads every document of its own major version up to its own
6
+ * minor version. A writer records the oldest version that holds every
7
+ * feature the document uses, so older readers can still show it.
8
+ *
9
+ * The protocol is 1.0 (ADR 0043): 0.9 as it stood. Documents of the 0.x
10
+ * versions are read by relabelling them as 1.0, before validation.
11
+ */
12
+ import type { ProtocolError } from './errors.ts';
13
+ import type { VisualizationInput } from './visualization.ts';
14
+ /**
15
+ * Every protocol version this package reads, oldest first. A protocol
16
+ * change appends a version here and adds its features to
17
+ * `PROTOCOL_FEATURES`.
18
+ */
19
+ export declare const PROTOCOL_VERSIONS: readonly ["1.0"];
20
+ /**
21
+ * The versions before 1.0, which a reader reads by relabelling a document
22
+ * as 1.0: 1.0 is 0.9 as it stood, and every 0.x document is a 0.9
23
+ * document (ADR 0043).
24
+ */
25
+ export declare const UPGRADED_VERSIONS: readonly ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9"];
26
+ /** A protocol version this package reads. */
27
+ export type ProtocolVersion = (typeof PROTOCOL_VERSIONS)[number];
28
+ /** The newest protocol version, the last one this package reads. */
29
+ export declare const PROTOCOL_VERSION: ProtocolVersion;
30
+ /** A version's two numbers. */
31
+ export interface VersionNumbers {
32
+ readonly major: number;
33
+ readonly minor: number;
34
+ }
35
+ /** Splits a `"major.minor"` string, or gives undefined for anything else. */
36
+ export declare function parseVersion(version: unknown): VersionNumbers | undefined;
37
+ /**
38
+ * Orders two versions: negative if `a` is older than `b`, zero if they are
39
+ * the same, positive if `a` is newer. Throws a TypeError if either is not a
40
+ * version, which is a programmer error.
41
+ */
42
+ export declare function compareVersions(a: string, b: string): number;
43
+ /**
44
+ * The versions a reader reads: one major version, from `oldest` to
45
+ * `newest`, and older ones it reads by upgrading them.
46
+ */
47
+ export interface ReadRange {
48
+ readonly oldest: string;
49
+ readonly newest: string;
50
+ readonly upgrades?: readonly string[];
51
+ }
52
+ /** A document, upgraded to the current version, and the version it had. */
53
+ export interface Upgraded {
54
+ readonly document: unknown;
55
+ /** The version the document had, when it was upgraded. */
56
+ readonly from?: string;
57
+ }
58
+ /**
59
+ * The document as this reader reads it: a document of a 0.x version is
60
+ * relabelled as 1.0, which is all the upgrade from 0.9 to 1.0 does (ADR
61
+ * 0043). Anything else is given back as it is. Pure: the input is never
62
+ * changed.
63
+ */
64
+ export declare function upgradeDocument(input: unknown): Upgraded;
65
+ /**
66
+ * Checks a document's `version` against the versions a reader reads (by
67
+ * default, this package's). Gives an `UNSUPPORTED_VERSION` error, or
68
+ * undefined when the reader can read the document.
69
+ */
70
+ export declare function checkVersion(version: unknown, reads?: ReadRange): ProtocolError | undefined;
71
+ /** A document without its version: what features are found in. */
72
+ type Content = Omit<VisualizationInput, 'version'>;
73
+ /** Something added to the protocol after its first version. */
74
+ export interface ProtocolFeature<V extends string = ProtocolVersion> {
75
+ /** Short name, e.g. "sections". */
76
+ readonly name: string;
77
+ /** The version that added it. */
78
+ readonly since: V;
79
+ /** Whether a document uses it. */
80
+ readonly usedBy: (document: Content) => boolean;
81
+ }
82
+ /**
83
+ * Features added after 1.0, with the version that added each: a minor
84
+ * version adds its entries here. Empty at 1.0, which holds everything the
85
+ * 0.x versions added (ADR 0043).
86
+ */
87
+ export declare const PROTOCOL_FEATURES: readonly ProtocolFeature[];
88
+ /**
89
+ * The newest `since` among the features a document uses, or `base` if it
90
+ * uses none of them.
91
+ */
92
+ export declare function newestNeeded<V extends string>(document: Content, features: readonly ProtocolFeature<V>[], base: V): V;
93
+ /**
94
+ * The oldest protocol version that holds every feature a document uses.
95
+ * Writers put this in `version`, so that older readers, such as copies of
96
+ * the player already embedded in pages, can still show the document.
97
+ */
98
+ export declare function minimumVersion(document: Content): ProtocolVersion;
99
+ /** "a", "a and b", "a, b and c". */
100
+ export declare function listOf(names: readonly string[]): string;
101
+ /**
102
+ * Checks that a document's `version` is not older than a feature it uses,
103
+ * which a reader of that version could not show. Gives a
104
+ * `VERSION_TOO_OLD` error, or undefined.
105
+ */
106
+ export declare function checkFeatures<V extends string>(document: Content, version: V, features: readonly ProtocolFeature<V>[]): ProtocolError | undefined;
107
+ export {};
108
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,kBAAmB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,0EAUpB,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,EAAE,eAA2C,CAAC;AAE3E,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAMD,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAKzE;AAYD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAQD,2EAA2E;AAC3E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAUxD;AASD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,SAAiB,GACvB,aAAa,GAAG,SAAS,CAiD3B;AAED,kEAAkE;AAClE,KAAK,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;AAEnD,+DAA+D;AAC/D,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,eAAe;IACjE,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC;CACjD;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAAO,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,EACvC,IAAI,EAAE,CAAC,GACN,CAAC,CAMH;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,CAEjE;AAED,oCAAoC;AACpC,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIvD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,CAAC,EACV,QAAQ,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,GACtC,aAAa,GAAG,SAAS,CAY3B"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Every protocol version this package reads, oldest first. A protocol
3
+ * change appends a version here and adds its features to
4
+ * `PROTOCOL_FEATURES`.
5
+ */
6
+ export const PROTOCOL_VERSIONS = ['1.0'];
7
+ /**
8
+ * The versions before 1.0, which a reader reads by relabelling a document
9
+ * as 1.0: 1.0 is 0.9 as it stood, and every 0.x document is a 0.9
10
+ * document (ADR 0043).
11
+ */
12
+ export const UPGRADED_VERSIONS = [
13
+ '0.1',
14
+ '0.2',
15
+ '0.3',
16
+ '0.4',
17
+ '0.5',
18
+ '0.6',
19
+ '0.7',
20
+ '0.8',
21
+ '0.9',
22
+ ];
23
+ /** The newest protocol version, the last one this package reads. */
24
+ export const PROTOCOL_VERSION = PROTOCOL_VERSIONS.at(-1);
25
+ // No leading zeros, so each version has one spelling; at most nine digits,
26
+ // so the numbers stay exact.
27
+ const VERSION = /^(0|[1-9][0-9]{0,8})\.(0|[1-9][0-9]{0,8})$/;
28
+ /** Splits a `"major.minor"` string, or gives undefined for anything else. */
29
+ export function parseVersion(version) {
30
+ if (typeof version !== 'string')
31
+ return undefined;
32
+ const match = VERSION.exec(version);
33
+ if (match === null)
34
+ return undefined;
35
+ return { major: Number(match[1]), minor: Number(match[2]) };
36
+ }
37
+ function numbers(version) {
38
+ const parsed = parseVersion(version);
39
+ if (parsed === undefined)
40
+ throw new TypeError(`${JSON.stringify(version)} is not a protocol version`);
41
+ return parsed;
42
+ }
43
+ const order = (a, b) => a.major - b.major || a.minor - b.minor;
44
+ /**
45
+ * Orders two versions: negative if `a` is older than `b`, zero if they are
46
+ * the same, positive if `a` is newer. Throws a TypeError if either is not a
47
+ * version, which is a programmer error.
48
+ */
49
+ export function compareVersions(a, b) {
50
+ return order(numbers(a), numbers(b));
51
+ }
52
+ const READS = {
53
+ oldest: PROTOCOL_VERSIONS[0],
54
+ newest: PROTOCOL_VERSION,
55
+ upgrades: UPGRADED_VERSIONS,
56
+ };
57
+ /**
58
+ * The document as this reader reads it: a document of a 0.x version is
59
+ * relabelled as 1.0, which is all the upgrade from 0.9 to 1.0 does (ADR
60
+ * 0043). Anything else is given back as it is. Pure: the input is never
61
+ * changed.
62
+ */
63
+ export function upgradeDocument(input) {
64
+ if (typeof input !== 'object' || input === null || Array.isArray(input))
65
+ return { document: input };
66
+ const { version } = input;
67
+ if (typeof version !== 'string' ||
68
+ !UPGRADED_VERSIONS.includes(version))
69
+ return { document: input };
70
+ return { document: { ...input, version: '1.0' }, from: version };
71
+ }
72
+ /** Quotes a version for a message, shortened so a huge value stays readable. */
73
+ function quote(version) {
74
+ return JSON.stringify(version.length > 16 ? `${version.slice(0, 16)}…` : version);
75
+ }
76
+ /**
77
+ * Checks a document's `version` against the versions a reader reads (by
78
+ * default, this package's). Gives an `UNSUPPORTED_VERSION` error, or
79
+ * undefined when the reader can read the document.
80
+ */
81
+ export function checkVersion(version, reads = READS) {
82
+ const oldest = numbers(reads.oldest);
83
+ const newest = numbers(reads.newest);
84
+ const error = (message, hint) => ({
85
+ code: 'UNSUPPORTED_VERSION',
86
+ path: '$.version',
87
+ message,
88
+ hint,
89
+ });
90
+ const fix = `Set "version" to "${reads.newest}".`;
91
+ if (typeof version !== 'string')
92
+ return error('"version" must be a string', fix);
93
+ const v = parseVersion(version);
94
+ if (v === undefined)
95
+ return error(`Protocol version ${quote(version)} is not of the form "major.minor"`, fix);
96
+ if (order(v, oldest) >= 0 && order(v, newest) <= 0)
97
+ return undefined;
98
+ const upgrades = reads.upgrades ?? [];
99
+ if (upgrades.includes(version))
100
+ return undefined;
101
+ const range = reads.oldest === reads.newest
102
+ ? `version "${reads.newest}"`
103
+ : `versions "${reads.oldest}" to "${reads.newest}"`;
104
+ if (order(v, newest) > 0) {
105
+ // A newer minor version only adds, so a document that uses nothing new
106
+ // can be relabelled; a newer major version may change meanings.
107
+ const relabel = v.major === newest.major
108
+ ? ` If the document uses nothing added after ${reads.newest}, set "version" to "${reads.newest}".`
109
+ : '';
110
+ return error(`Protocol version ${quote(version)} is newer than this copy of algomotion can read`, `This copy reads ${range}. Update algomotion to show this document.${relabel}`);
111
+ }
112
+ // A version of a major version this reader knows, which never existed.
113
+ if (v.major === oldest.major ||
114
+ upgrades.some((u) => numbers(u).major === v.major))
115
+ return error(`There is no protocol version ${quote(version)}`, fix);
116
+ // An older major version with no upgrade this reader knows.
117
+ return error(`Protocol version ${quote(version)} is older than this copy of algomotion can read`, `This copy reads ${range}, and cannot upgrade older documents.`);
118
+ }
119
+ /**
120
+ * Features added after 1.0, with the version that added each: a minor
121
+ * version adds its entries here. Empty at 1.0, which holds everything the
122
+ * 0.x versions added (ADR 0043).
123
+ */
124
+ export const PROTOCOL_FEATURES = [];
125
+ /**
126
+ * The newest `since` among the features a document uses, or `base` if it
127
+ * uses none of them.
128
+ */
129
+ export function newestNeeded(document, features, base) {
130
+ let version = base;
131
+ for (const feature of features)
132
+ if (compareVersions(feature.since, version) > 0 && feature.usedBy(document))
133
+ version = feature.since;
134
+ return version;
135
+ }
136
+ /**
137
+ * The oldest protocol version that holds every feature a document uses.
138
+ * Writers put this in `version`, so that older readers, such as copies of
139
+ * the player already embedded in pages, can still show the document.
140
+ */
141
+ export function minimumVersion(document) {
142
+ return newestNeeded(document, PROTOCOL_FEATURES, PROTOCOL_VERSIONS[0]);
143
+ }
144
+ /** "a", "a and b", "a, b and c". */
145
+ export function listOf(names) {
146
+ return names.length < 2
147
+ ? names.join('')
148
+ : `${names.slice(0, -1).join(', ')} and ${names.at(-1)}`;
149
+ }
150
+ /**
151
+ * Checks that a document's `version` is not older than a feature it uses,
152
+ * which a reader of that version could not show. Gives a
153
+ * `VERSION_TOO_OLD` error, or undefined.
154
+ */
155
+ export function checkFeatures(document, version, features) {
156
+ const newer = features.filter((f) => compareVersions(f.since, version) > 0 && f.usedBy(document));
157
+ if (newer.length === 0)
158
+ return undefined;
159
+ const needed = newestNeeded(document, newer, version);
160
+ return {
161
+ code: 'VERSION_TOO_OLD',
162
+ path: '$.version',
163
+ message: `The document uses ${listOf(newer.map((f) => f.name))}, which need protocol version "${needed}", but its version is "${version}"`,
164
+ hint: `Set "version" to "${needed}".`,
165
+ };
166
+ }
167
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}