@pdf-testkit/core 0.1.1 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC;AAExG,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKhF;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,IAAI,GAAE,WAAgB,GACrB,UAAU,CAwHZ"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAA8C,MAAM,cAAc,CAAC;AAExG,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKhF;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,IAAI,GAAE,WAAgB,GACrB,UAAU,CAyHZ"}
package/dist/diff/diff.js CHANGED
@@ -102,6 +102,7 @@ export function diffSnapshots(baseline, next, opts = {}) {
102
102
  type: 'element-removed',
103
103
  severity: severityOf('element-removed'),
104
104
  confidence: node.confidence,
105
+ nodeId: node.id,
105
106
  role: node.role,
106
107
  textPreview: textPreview(node.text),
107
108
  pageIndex: node.pageIndex,
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Causal grouping of semantic events for *human-facing* output only.
3
+ *
4
+ * A single structural change fans out into a large flat event list: on the
5
+ * FormePDF invoice fixture, adding 14 table rows produces 123 events — 97 of
6
+ * them the table's own subtree, 14 downstream page shifts, 4 the new page's
7
+ * repeated footer, and 6 the three totals actually changing value. Every one is
8
+ * individually accurate, and the list is still useless: a reviewer scrolling
9
+ * past 123 rows approves without reading, which is the exact failure mode a
10
+ * semantic differ exists to prevent.
11
+ *
12
+ * This module does NOT change what `diffSnapshots` emits. `DiffResult.events`,
13
+ * the `--json` output, and `shouldFail` all keep the full precise per-element
14
+ * list — machine consumers must not lose resolution. Grouping is a *view*, never
15
+ * a filter: the union of every group's `events` equals the input list exactly,
16
+ * and a test asserts it.
17
+ *
18
+ * It lives in core rather than in each formatter because the CLI, the matcher
19
+ * failure message, and the GitHub Action all render the same list and all have
20
+ * the same problem; three independently-maintained copies of a causality
21
+ * heuristic is a drift bug waiting to happen.
22
+ */
23
+ import type { DiffOptions, SemanticEvent, Severity } from '../events.js';
24
+ import type { StructuralSnapshot } from '../types.js';
25
+ export type GroupKind = 'single' | 'table-resized' | 'page-shift-cascade' | 'new-page-furniture' | 'value-changed';
26
+ export interface EventGroup {
27
+ kind: GroupKind;
28
+ /** The member event that defines this group's severity and headline. */
29
+ root: SemanticEvent;
30
+ /** Always equals `root.severity`: a group never absorbs anything more severe. */
31
+ severity: Severity;
32
+ /** One line. For a `single` group this is just `root.message`. */
33
+ summary: string;
34
+ /** Every member, root first. Union across all groups === the input, exactly. */
35
+ events: SemanticEvent[];
36
+ }
37
+ /**
38
+ * Collapse `events` into causally-related groups. Pass the same `opts` used for
39
+ * the `diffSnapshots` call that produced `events` so node matching agrees.
40
+ */
41
+ export declare function groupEvents(baseline: StructuralSnapshot, next: StructuralSnapshot, events: SemanticEvent[], opts?: DiffOptions): EventGroup[];
42
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/diff/group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAqB,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGhF,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,eAAe,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,wEAAwE;IACxE,IAAI,EAAE,aAAa,CAAC;IACpB,iFAAiF;IACjF,QAAQ,EAAE,QAAQ,CAAC;IACnB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAyDD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,aAAa,EAAE,EACvB,IAAI,GAAE,WAAgB,GACrB,UAAU,EAAE,CA+Od"}
@@ -0,0 +1,783 @@
1
+ /**
2
+ * Causal grouping of semantic events for *human-facing* output only.
3
+ *
4
+ * A single structural change fans out into a large flat event list: on the
5
+ * FormePDF invoice fixture, adding 14 table rows produces 123 events — 97 of
6
+ * them the table's own subtree, 14 downstream page shifts, 4 the new page's
7
+ * repeated footer, and 6 the three totals actually changing value. Every one is
8
+ * individually accurate, and the list is still useless: a reviewer scrolling
9
+ * past 123 rows approves without reading, which is the exact failure mode a
10
+ * semantic differ exists to prevent.
11
+ *
12
+ * This module does NOT change what `diffSnapshots` emits. `DiffResult.events`,
13
+ * the `--json` output, and `shouldFail` all keep the full precise per-element
14
+ * list — machine consumers must not lose resolution. Grouping is a *view*, never
15
+ * a filter: the union of every group's `events` equals the input list exactly,
16
+ * and a test asserts it.
17
+ *
18
+ * It lives in core rather than in each formatter because the CLI, the matcher
19
+ * failure message, and the GitHub Action all render the same list and all have
20
+ * the same problem; three independently-maintained copies of a causality
21
+ * heuristic is a drift bug waiting to happen.
22
+ */
23
+ import { matchNodes } from './match.js';
24
+ const RANK = { info: 0, warn: 1, error: 2 };
25
+ /**
26
+ * Below this, a cascade is already readable as a flat list and collapsing it
27
+ * would only cost information.
28
+ */
29
+ const MIN_CASCADE_MEMBERS = 3;
30
+ /** Roles that are structural children of a table rather than content of their own. */
31
+ const TABLE_PARTS = new Set(['row', 'cell']);
32
+ /**
33
+ * Events that say where a node went. The rest (`text-overflowed-container`,
34
+ * `heading-hierarchy-changed`) are extra observations *about* a node that may
35
+ * also have a structural event, so they must never displace it when answering
36
+ * "what happened to this node".
37
+ */
38
+ const STRUCTURAL = new Set([
39
+ 'element-added',
40
+ 'element-removed',
41
+ 'element-moved-to-different-page',
42
+ 'table-moved',
43
+ ]);
44
+ /**
45
+ * Collapse `events` into causally-related groups. Pass the same `opts` used for
46
+ * the `diffSnapshots` call that produced `events` so node matching agrees.
47
+ */
48
+ export function groupEvents(baseline, next, events, opts = {}) {
49
+ if (events.length === 0)
50
+ return [];
51
+ const ignore = new Set(opts.ignoreRoles ?? []);
52
+ const baseNodes = baseline.nodes.filter((n) => !ignore.has(n.role));
53
+ const nextNodes = next.nodes.filter((n) => !ignore.has(n.role));
54
+ const baseById = byId(baseNodes);
55
+ const nextById = byId(nextNodes);
56
+ const baseRank = readingRank(baseNodes);
57
+ const nextRank = readingRank(nextNodes);
58
+ // Re-run the matcher rather than threading its result out of `diffSnapshots`:
59
+ // it is deterministic over the same inputs, and grouping needs the *pairing*
60
+ // (which base node became which next node) that the flat event list drops.
61
+ const { pairs } = matchNodes(baseNodes, nextNodes);
62
+ const baseToNext = new Map();
63
+ const nextToBase = new Map();
64
+ for (const p of pairs) {
65
+ baseToNext.set(p.base.id, p.next.id);
66
+ nextToBase.set(p.next.id, p.base.id);
67
+ }
68
+ // Event indices that carry a resolvable node, split by which snapshot the id
69
+ // belongs to. `element-removed` is the only one pointing at the baseline.
70
+ // One node can produce several events (an added cell that also overflows), so
71
+ // a structural event always wins the slot over a decorative one.
72
+ const eventIdxByNextId = new Map();
73
+ const eventIdxByBaseId = new Map();
74
+ events.forEach((e, i) => {
75
+ if (!('nodeId' in e))
76
+ return;
77
+ const into = e.type === 'element-removed' ? eventIdxByBaseId : eventIdxByNextId;
78
+ const held = into.get(e.nodeId);
79
+ if (held != null && !STRUCTURAL.has(e.type))
80
+ return;
81
+ if (held != null && STRUCTURAL.has(events[held].type))
82
+ return;
83
+ into.set(e.nodeId, i);
84
+ });
85
+ const pageCountIdx = events.findIndex((e) => e.type === 'page-count-changed');
86
+ const repeated = repeatedNormTexts(nextNodes);
87
+ /** The document lost pages rather than gaining them. */
88
+ const shed = next.pageCount < baseline.pageCount;
89
+ /**
90
+ * Where a node sits in the *new* document's reading order. A removed node has
91
+ * no position there at all, so it borrows the slot just after the last
92
+ * surviving thing that preceded it in the baseline — which is exactly where
93
+ * its absence is felt, and lets a deletion be cited as the cause of a shift.
94
+ */
95
+ const baseByRank = new Map();
96
+ for (const n of baseNodes) {
97
+ const r = baseRank.get(n.id);
98
+ if (r != null)
99
+ baseByRank.set(r, n);
100
+ }
101
+ const rankInNext = (nodeId) => {
102
+ const direct = nextRank.get(nodeId);
103
+ if (direct != null)
104
+ return direct;
105
+ const from = baseRank.get(nodeId);
106
+ if (from == null)
107
+ return null;
108
+ for (let r = from - 1; r >= 0; r--) {
109
+ const prev = baseByRank.get(r);
110
+ const mapped = prev == null ? undefined : baseToNext.get(prev.id);
111
+ const rank = mapped == null ? undefined : nextRank.get(mapped);
112
+ if (rank != null)
113
+ return rank + 0.5;
114
+ }
115
+ return -0.5; // Removed from the very top of the document.
116
+ };
117
+ /** -1 = unclaimed. Otherwise the index of the group this event belongs to. */
118
+ const claim = new Array(events.length).fill(-1);
119
+ const groups = [];
120
+ const open = (kind, rootIdx, summary, label) => {
121
+ const id = groups.length;
122
+ groups.push({ kind, rootIdx, members: [rootIdx], summary, label });
123
+ claim[rootIdx] = id;
124
+ return id;
125
+ };
126
+ const attach = (groupId, idx) => {
127
+ if (claim[idx] !== -1)
128
+ return;
129
+ claim[idx] = groupId;
130
+ groups[groupId].members.push(idx);
131
+ };
132
+ // ── Rule 4 — paired value change ───────────────────────────────────────────
133
+ // Runs FIRST, and deliberately pairs rather than collapses. A removed+added
134
+ // text at the same slot is a real content change (here: three totals moving
135
+ // by ~3x). Letting a later rule fold it into a "downstream cascade" summary
136
+ // would hide the one fact in the whole diff a reviewer must not miss.
137
+ for (const [removedIdx, addedIdx] of pairValueChanges(events, baseById, nextById, baseToNext)) {
138
+ const removed = events[removedIdx];
139
+ const added = events[addedIdx];
140
+ const before = 'textPreview' in removed ? removed.textPreview : '';
141
+ const after = 'textPreview' in added ? added.textPreview : '';
142
+ const role = 'role' in added ? added.role : 'element';
143
+ const id = open('value-changed', addedIdx, `${role} "${before}" → "${after}"`);
144
+ attach(id, removedIdx);
145
+ }
146
+ // ── Rule 3 — page furniture ────────────────────────────────────────────────
147
+ // A page that did not exist in the baseline brings a fresh copy of every
148
+ // repeated fixed element with it; a page that goes away takes its copy with
149
+ // it. Either way those adds/removes are a restatement of `page-count-changed`,
150
+ // not independent findings — so the rule reads whichever snapshot holds the
151
+ // pages that only exist on one side.
152
+ if (pageCountIdx !== -1) {
153
+ const side = shed
154
+ ? {
155
+ type: 'element-removed',
156
+ nodes: baseNodes,
157
+ index: baseById,
158
+ eventIdx: eventIdxByBaseId,
159
+ repeated: repeatedNormTexts(baseNodes),
160
+ firstGonePage: next.pageCount,
161
+ }
162
+ : {
163
+ type: 'element-added',
164
+ nodes: nextNodes,
165
+ index: nextById,
166
+ eventIdx: eventIdxByNextId,
167
+ repeated,
168
+ firstGonePage: baseline.pageCount,
169
+ };
170
+ const furniture = [];
171
+ for (const root of subtreeRoots(side.type, events, claim, side.index, side.eventIdx)) {
172
+ if (root.node.pageIndex < side.firstGonePage)
173
+ continue;
174
+ // A table row is content wherever it sits. Line-item text can repeat
175
+ // across pages by coincidence, and mistaking that for a running footer
176
+ // would drag half a table into the page-count group.
177
+ if (root.node.role === 'table' || TABLE_PARTS.has(root.node.role))
178
+ continue;
179
+ const subtree = collectSubtree(root.node, side.nodes);
180
+ if (!subtree.some((n) => n.normText != null && side.repeated.has(n.normText)))
181
+ continue;
182
+ for (const n of subtree) {
183
+ const idx = side.eventIdx.get(n.id);
184
+ if (idx != null && claim[idx] === -1)
185
+ furniture.push(idx);
186
+ }
187
+ }
188
+ if (furniture.length > 0) {
189
+ const id = open('new-page-furniture', pageCountIdx, furnitureSummary(events[pageCountIdx], furniture.length), 'the page-count change');
190
+ for (const idx of furniture)
191
+ attach(id, idx);
192
+ }
193
+ }
194
+ // ── Rule 1 — table subtree resize ──────────────────────────────────────────
195
+ // Restricted to row/cell/table roles on purpose. "Anything added under a node
196
+ // that changed" would swallow a new paragraph inside a container that merely
197
+ // moved; a row or a cell, by contrast, has no meaning apart from its table.
198
+ // A table that spans a page break carries a continuation fragment, which the
199
+ // extractor reports as a whole separate table. Those are resolved back to the
200
+ // fragment that actually paired — on *both* sides, since the fragment that
201
+ // exists alone lives in the baseline when the table shrank.
202
+ const tables = {
203
+ baseById,
204
+ nextById,
205
+ baseToNext,
206
+ nextToBase,
207
+ contBase: continuationAnchors(baseNodes, baseRank, baseToNext, pageCountIdx !== -1),
208
+ contNext: continuationAnchors(nextNodes, nextRank, nextToBase, pageCountIdx !== -1),
209
+ eventIdxByBaseId,
210
+ eventIdxByNextId,
211
+ };
212
+ const tableGroups = new Map(); // canonical table key -> group id
213
+ for (let i = 0; i < events.length; i++) {
214
+ if (claim[i] !== -1)
215
+ continue;
216
+ const e = events[i];
217
+ if (e.type !== 'element-added' && e.type !== 'element-removed')
218
+ continue;
219
+ const key = owningTable(e, tables);
220
+ if (key == null)
221
+ continue;
222
+ let gid = tableGroups.get(key);
223
+ if (gid == null) {
224
+ const rootIdx = tableRootIdx(key, tables);
225
+ if (rootIdx == null || claim[rootIdx] !== -1)
226
+ continue;
227
+ gid = open('table-resized', rootIdx, '');
228
+ tableGroups.set(key, gid);
229
+ }
230
+ attach(gid, i);
231
+ }
232
+ for (const [key, gid] of tableGroups) {
233
+ const g = groups[gid];
234
+ const { summary, label } = tableSummary(key, tables, g.members, events);
235
+ g.summary = summary;
236
+ g.label = label;
237
+ }
238
+ // ── Rule 2 — uniform page-shift cascade ────────────────────────────────────
239
+ // Partitioned by page *delta*, not destination: on the invoice fixture 8
240
+ // elements go page 1→2 and 6 go page 2→3, so "everything moved to page 3"
241
+ // would be flatly wrong. Partitioning by delta also separates two independent
242
+ // insertions automatically, since they produce +1 and +2 regions.
243
+ const movesByDelta = new Map();
244
+ events.forEach((e, i) => {
245
+ if (claim[i] !== -1 || e.type !== 'element-moved-to-different-page')
246
+ return;
247
+ const d = e.toPage - e.fromPage;
248
+ const bucket = movesByDelta.get(d);
249
+ if (bucket)
250
+ bucket.push(i);
251
+ else
252
+ movesByDelta.set(d, [i]);
253
+ });
254
+ for (const [delta, idxs] of movesByDelta) {
255
+ if (idxs.length < MIN_CASCADE_MEMBERS)
256
+ continue;
257
+ const ranked = idxs
258
+ .map((i) => ({ i, rank: nextRank.get(events[i].nodeId) ?? -1 }))
259
+ .filter((m) => m.rank >= 0)
260
+ .sort((a, b) => a.rank - b.rank);
261
+ if (ranked.length < MIN_CASCADE_MEMBERS)
262
+ continue;
263
+ // A shared delta does not imply a shared cause: two separate insertions in
264
+ // different parts of a document both push everything after them one page
265
+ // down. Split the bucket into contiguous document runs and judge each on
266
+ // its own, so a genuine two-region regression reports as two findings
267
+ // rather than one false "everything shifted" line.
268
+ const movedIds = new Set(ranked.map((m) => events[m.i].nodeId));
269
+ for (const run of contiguousRuns(ranked, nextNodes, nextRank, eventIdxByNextId, repeated, movedIds)) {
270
+ if (run.length < MIN_CASCADE_MEMBERS)
271
+ continue;
272
+ const cause = nearestPrecedingCause(groups, events, rankInNext, run[0].rank, pageCountIdx);
273
+ if (cause == null)
274
+ continue; // No root -> no group. "These moved, cause unknown" helps nobody.
275
+ const id = open('page-shift-cascade', run[0].i, cascadeSummary(run.length, delta, run.map((m) => m.i), events, cause));
276
+ for (const m of run)
277
+ attach(id, m.i);
278
+ }
279
+ }
280
+ // ── Everything else stays exactly as the diff reported it ──────────────────
281
+ for (let i = 0; i < events.length; i++) {
282
+ if (claim[i] === -1)
283
+ open('single', i, events[i].message);
284
+ }
285
+ return finalize(groups, events);
286
+ }
287
+ /**
288
+ * Enforce the hard severity invariant, then order for reading.
289
+ *
290
+ * A group never contains an event more severe than its root. An overflow error
291
+ * riding along on an added table cell, or a heading break sitting inside a
292
+ * shifted run, is ejected to its own top-level row rather than being quietly
293
+ * demoted into a warn-level summary. Severity has to mean the same thing
294
+ * everywhere or the gate stops meaning anything.
295
+ */
296
+ function finalize(raw, events) {
297
+ // `at` is the root's index in the original event list; it orders groups within
298
+ // a severity band so output follows the order the diff engine reported.
299
+ const built = [];
300
+ for (const g of raw) {
301
+ const root = events[g.rootIdx];
302
+ const kept = [];
303
+ for (const idx of g.members) {
304
+ if (idx !== g.rootIdx && RANK[events[idx].severity] > RANK[root.severity]) {
305
+ const ejected = events[idx];
306
+ built.push({
307
+ at: idx,
308
+ group: { kind: 'single', root: ejected, severity: ejected.severity, summary: ejected.message, events: [ejected] },
309
+ });
310
+ continue;
311
+ }
312
+ kept.push(idx);
313
+ }
314
+ kept.sort((a, b) => (a === g.rootIdx ? -1 : b === g.rootIdx ? 1 : a - b));
315
+ // A group that lost everything but its root is just that event again.
316
+ const kind = kept.length === 1 ? 'single' : g.kind;
317
+ built.push({
318
+ at: g.rootIdx,
319
+ group: {
320
+ kind,
321
+ root,
322
+ severity: root.severity,
323
+ summary: kind === 'single' ? root.message : g.summary,
324
+ events: kept.map((i) => events[i]),
325
+ },
326
+ });
327
+ }
328
+ built.sort((a, b) => RANK[b.group.severity] - RANK[a.group.severity] || a.at - b.at);
329
+ return built.map((b) => b.group);
330
+ }
331
+ // ── Rule 4 helpers ──────────────────────────────────────────────────────────
332
+ /**
333
+ * A removed node and an added node are the *same slot* when they share a role,
334
+ * their parents correspond, and they sit at the same ordinal among their
335
+ * parent's same-role children.
336
+ *
337
+ * "Correspond" deliberately does not mean the matcher paired the two parents.
338
+ * Layout containers are anonymous — a FormePDF `View` has no text — so they all
339
+ * share the matcher's exact key and pair by global reading-order rank, which
340
+ * shifts wholesale the moment one container is inserted. Anchoring on a matched
341
+ * *child* instead (the "Subtotal" label next to the amount) is stable, because
342
+ * that child has content to match on.
343
+ */
344
+ function pairValueChanges(events, baseById, nextById, baseToNext) {
345
+ const removed = [];
346
+ const added = [];
347
+ events.forEach((e, i) => {
348
+ if (e.type === 'element-removed') {
349
+ const n = baseById.get(e.nodeId);
350
+ if (n && isTexty(n.role))
351
+ removed.push({ idx: i, node: n });
352
+ }
353
+ else if (e.type === 'element-added') {
354
+ const n = nextById.get(e.nodeId);
355
+ if (n && isTexty(n.role))
356
+ added.push({ idx: i, node: n });
357
+ }
358
+ });
359
+ if (removed.length === 0 || added.length === 0)
360
+ return [];
361
+ const baseSiblings = siblingOrdinals([...baseById.values()]);
362
+ const nextSiblings = siblingOrdinals([...nextById.values()]);
363
+ const parentAnchor = anchorParents(baseById, nextById, baseToNext);
364
+ const taken = new Set();
365
+ const out = [];
366
+ for (const r of removed) {
367
+ if (r.node.parentId == null)
368
+ continue;
369
+ const mappedParent = parentAnchor.get(r.node.parentId);
370
+ if (mappedParent == null)
371
+ continue;
372
+ const match = added.find((a) => !taken.has(a.idx) &&
373
+ a.node.role === r.node.role &&
374
+ a.node.parentId === mappedParent &&
375
+ nextSiblings.get(a.node.id) === baseSiblings.get(r.node.id));
376
+ if (match) {
377
+ taken.add(match.idx);
378
+ out.push([r.idx, match.idx]);
379
+ }
380
+ }
381
+ return out;
382
+ }
383
+ /**
384
+ * base parent id -> next parent id, inferred from where that parent's *matched
385
+ * children* ended up. Requires an outright winner: a tie means the children
386
+ * disagree about where their parent went, and a guess there is worse than
387
+ * declining to pair.
388
+ */
389
+ function anchorParents(baseById, nextById, baseToNext) {
390
+ const votes = new Map();
391
+ for (const [baseId, nextId] of baseToNext) {
392
+ const b = baseById.get(baseId);
393
+ const n = nextById.get(nextId);
394
+ if (!b?.parentId || !n?.parentId)
395
+ continue;
396
+ let bucket = votes.get(b.parentId);
397
+ if (!bucket)
398
+ votes.set(b.parentId, (bucket = new Map()));
399
+ bucket.set(n.parentId, (bucket.get(n.parentId) ?? 0) + 1);
400
+ }
401
+ const out = new Map();
402
+ for (const [baseParent, bucket] of votes) {
403
+ const ranked = [...bucket].sort((a, b) => b[1] - a[1]);
404
+ if (ranked.length === 1 || ranked[0][1] > ranked[1][1])
405
+ out.set(baseParent, ranked[0][0]);
406
+ }
407
+ return out;
408
+ }
409
+ function siblingOrdinals(nodes) {
410
+ const byParent = new Map();
411
+ for (const n of nodes) {
412
+ const key = `${n.parentId ?? ''}|${n.role}`;
413
+ const bucket = byParent.get(key);
414
+ if (bucket)
415
+ bucket.push(n);
416
+ else
417
+ byParent.set(key, [n]);
418
+ }
419
+ const out = new Map();
420
+ for (const bucket of byParent.values()) {
421
+ bucket.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order);
422
+ bucket.forEach((n, i) => out.set(n.id, i));
423
+ }
424
+ return out;
425
+ }
426
+ // ── Rule 3 helpers ──────────────────────────────────────────────────────────
427
+ /** normTexts appearing on two or more pages — the running header/footer signature. */
428
+ function repeatedNormTexts(nodes) {
429
+ const pages = new Map();
430
+ for (const n of nodes) {
431
+ if (n.normText == null)
432
+ continue;
433
+ const seen = pages.get(n.normText);
434
+ if (seen)
435
+ seen.add(n.pageIndex);
436
+ else
437
+ pages.set(n.normText, new Set([n.pageIndex]));
438
+ }
439
+ const out = new Set();
440
+ for (const [text, seen] of pages)
441
+ if (seen.size >= 2)
442
+ out.add(text);
443
+ return out;
444
+ }
445
+ /**
446
+ * Nodes added (or removed) whose parent was not itself added (or removed) — the
447
+ * tops of the subtrees that appeared or vanished wholesale.
448
+ */
449
+ function subtreeRoots(type, events, claim, index, eventIdx) {
450
+ const isSameChange = (id) => {
451
+ const idx = eventIdx.get(id);
452
+ return idx != null && events[idx].type === type;
453
+ };
454
+ const out = [];
455
+ events.forEach((e, i) => {
456
+ if (claim[i] !== -1 || e.type !== type)
457
+ return;
458
+ const node = index.get(e.nodeId);
459
+ if (!node)
460
+ return;
461
+ if (node.parentId != null && isSameChange(node.parentId))
462
+ return;
463
+ out.push({ idx: i, node });
464
+ });
465
+ return out;
466
+ }
467
+ function collectSubtree(root, nodes) {
468
+ const children = new Map();
469
+ for (const n of nodes) {
470
+ if (n.parentId == null)
471
+ continue;
472
+ const bucket = children.get(n.parentId);
473
+ if (bucket)
474
+ bucket.push(n);
475
+ else
476
+ children.set(n.parentId, [n]);
477
+ }
478
+ const out = [];
479
+ const stack = [root];
480
+ while (stack.length > 0) {
481
+ const n = stack.pop();
482
+ out.push(n);
483
+ for (const c of children.get(n.id) ?? [])
484
+ stack.push(c);
485
+ }
486
+ return out;
487
+ }
488
+ function furnitureSummary(pageCount, extra) {
489
+ if (pageCount.type !== 'page-count-changed')
490
+ return pageCount.message;
491
+ const shed = pageCount.to < pageCount.from;
492
+ const pages = Math.abs(pageCount.to - pageCount.from);
493
+ const noun = `repeated header/footer element${extra === 1 ? '' : 's'}`;
494
+ const where = `${shed ? 'removed' : 'new'} page${pages === 1 ? '' : 's'}`;
495
+ return `${pageCount.message} (${shed ? '-' : '+'}${extra} ${noun} on the ${where})`;
496
+ }
497
+ // ── Rule 1 helpers ──────────────────────────────────────────────────────────
498
+ /**
499
+ * Within one snapshot, map every table fragment that exists only on this side to
500
+ * the nearest preceding fragment the matcher recognised. A table crossing a page
501
+ * break is reported by the extractor as two whole tables, and which side holds
502
+ * the extra fragment depends purely on which way the change went — so this runs
503
+ * over the baseline and the new snapshot alike, keyed off `paired` (this side's
504
+ * ids that the matcher resolved to a counterpart).
505
+ *
506
+ * Pairing rather than event type is the anchor test on purpose: the surviving
507
+ * fragment's event is filed under the *other* snapshot's id, so asking "does
508
+ * this fragment have a non-additive event here" answers yes going forwards and
509
+ * no going backwards, which is exactly how deletions stopped grouping.
510
+ *
511
+ * Only when the page count changed: absent that, a second table really is a
512
+ * second table and deserves its own top-level event.
513
+ */
514
+ function continuationAnchors(nodes, rank, paired, pageCountChanged) {
515
+ const out = new Map();
516
+ if (!pageCountChanged)
517
+ return out;
518
+ const tables = nodes
519
+ .filter((n) => n.role === 'table')
520
+ .sort((a, b) => (rank.get(a.id) ?? 0) - (rank.get(b.id) ?? 0));
521
+ let anchor = null;
522
+ for (const t of tables) {
523
+ if (paired.has(t.id))
524
+ anchor = t.id;
525
+ else if (anchor != null)
526
+ out.set(t.id, anchor);
527
+ }
528
+ return out;
529
+ }
530
+ /**
531
+ * The canonical key of the logical table this add/remove belongs to, or null.
532
+ *
533
+ * The key is side-prefixed (`next:<id>` / `base:<id>`) because a table only
534
+ * present in the baseline has no new-snapshot id to be named by, and forcing one
535
+ * is what made deletions ungroupable: every descendant of a vanished fragment
536
+ * failed its `baseToNext` lookup and fell out as a loose row.
537
+ */
538
+ function owningTable(e, t) {
539
+ const fromBase = e.type === 'element-removed';
540
+ const index = fromBase ? t.baseById : t.nextById;
541
+ const cont = fromBase ? t.contBase : t.contNext;
542
+ const node = 'nodeId' in e ? index.get(e.nodeId) : undefined;
543
+ if (!node)
544
+ return null;
545
+ let table;
546
+ if (node.role === 'table') {
547
+ // A table's own add/remove groups only when it is a continuation fragment of
548
+ // a table that survived; otherwise it is a finding in its own right.
549
+ const anchor = cont.get(node.id);
550
+ if (anchor == null)
551
+ return null;
552
+ table = index.get(anchor);
553
+ }
554
+ else {
555
+ if (!TABLE_PARTS.has(node.role))
556
+ return null;
557
+ let cur = node;
558
+ while (cur?.parentId != null) {
559
+ const parent = index.get(cur.parentId);
560
+ if (!parent)
561
+ return null;
562
+ if (parent.role === 'table') {
563
+ table = parent;
564
+ break;
565
+ }
566
+ cur = parent;
567
+ }
568
+ }
569
+ if (!table)
570
+ return null;
571
+ // Rows and cells under a continuation fragment belong to its anchor table.
572
+ const anchorId = cont.get(table.id) ?? table.id;
573
+ const nextId = fromBase ? t.baseToNext.get(anchorId) : anchorId;
574
+ if (nextId != null && t.eventIdxByNextId.has(nextId))
575
+ return `next:${nextId}`;
576
+ const baseId = fromBase ? anchorId : t.nextToBase.get(anchorId);
577
+ if (baseId != null && t.eventIdxByBaseId.has(baseId))
578
+ return `base:${baseId}`;
579
+ return null;
580
+ }
581
+ function splitKey(key) {
582
+ const at = key.indexOf(':');
583
+ return { side: key.slice(0, at), id: key.slice(at + 1) };
584
+ }
585
+ /** The event index that heads this table's group. */
586
+ function tableRootIdx(key, t) {
587
+ const { side, id } = splitKey(key);
588
+ return side === 'next' ? t.eventIdxByNextId.get(id) : t.eventIdxByBaseId.get(id);
589
+ }
590
+ /** The anchor fragment plus every continuation fragment that points at it. */
591
+ function fragmentsOf(anchorId, index, cont) {
592
+ if (anchorId == null)
593
+ return [];
594
+ const anchor = index.get(anchorId);
595
+ const out = anchor ? [anchor] : [];
596
+ for (const [id, a] of cont) {
597
+ if (a !== anchorId)
598
+ continue;
599
+ const n = index.get(id);
600
+ if (n)
601
+ out.push(n);
602
+ }
603
+ return out.sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order);
604
+ }
605
+ /**
606
+ * The table's before/after shape is read from the *structure* — every fragment
607
+ * on each side — rather than from the group's member events. Scanning members
608
+ * only ever sees the fragments that changed, so on a shrink it would miss the
609
+ * baseline's continuation fragment entirely and report a 21-row table as a
610
+ * 9-row one. Row and cell counts still come from the members, so the numbers in
611
+ * the headline always agree with what is inside the group.
612
+ */
613
+ function tableSummary(key, t, members, events) {
614
+ const { side, id } = splitKey(key);
615
+ const baseFrags = fragmentsOf(side === 'base' ? id : t.nextToBase.get(id), t.baseById, t.contBase);
616
+ const nextFrags = fragmentsOf(side === 'next' ? id : t.baseToNext.get(id), t.nextById, t.contNext);
617
+ let rows = 0;
618
+ let cells = 0;
619
+ for (const m of members) {
620
+ const e = events[m];
621
+ if (!('nodeId' in e))
622
+ continue;
623
+ const removed = e.type === 'element-removed';
624
+ const n = (removed ? t.baseById : t.nextById).get(e.nodeId);
625
+ if (!n)
626
+ continue;
627
+ const sign = removed ? -1 : 1;
628
+ if (n.role === 'row')
629
+ rows += sign;
630
+ else if (n.role === 'cell')
631
+ cells += sign;
632
+ }
633
+ const delta = [
634
+ rows !== 0 ? `${rows > 0 ? '+' : ''}${rows} row${Math.abs(rows) === 1 ? '' : 's'}` : null,
635
+ cells !== 0 ? `${cells > 0 ? '+' : ''}${cells} cell${Math.abs(cells) === 1 ? '' : 's'}` : null,
636
+ ]
637
+ .filter(Boolean)
638
+ .join(', ');
639
+ if (baseFrags.length === 0) {
640
+ return { summary: `table added (${dims(nextFrags)})${delta ? `, ${delta}` : ''}`, label: 'the new table' };
641
+ }
642
+ if (nextFrags.length === 0) {
643
+ return { summary: `table removed (${dims(baseFrags)})${delta ? `, ${delta}` : ''}`, label: 'the removed table' };
644
+ }
645
+ const before = totalRows(baseFrags);
646
+ const after = totalRows(nextFrags);
647
+ const verb = after < before ? 'shrank' : after > before ? 'grew' : 'changed';
648
+ const pages = [...new Set(nextFrags.map((f) => f.pageIndex + 1))].sort((a, b) => a - b);
649
+ const span = pages.length > 1 ? `, now spans pages ${pages[0]}–${pages[pages.length - 1]}` : '';
650
+ return {
651
+ summary: `table ${verb}${delta ? ` ${delta}` : ''} (${dims(baseFrags)} → ${dims(nextFrags)})${span}`,
652
+ label: verb === 'shrank' ? 'the table shrinking' : "the table's growth",
653
+ };
654
+ }
655
+ function totalRows(frags) {
656
+ return frags.reduce((s, f) => s + (f.table?.rows ?? 0), 0);
657
+ }
658
+ function dims(frags) {
659
+ return `${totalRows(frags)}×${frags[0]?.table?.cols ?? '?'}`;
660
+ }
661
+ // ── Rule 2 helpers ──────────────────────────────────────────────────────────
662
+ /**
663
+ * The nearest group root that precedes the whole run in document order — this
664
+ * is what turns "23 things moved" into "23 things moved *because of this*".
665
+ * `page-count-changed` has no position, so it is the last-resort cause.
666
+ */
667
+ function nearestPrecedingCause(groups, events, rankInNext, firstMemberRank, pageCountIdx) {
668
+ let best = null;
669
+ let bestRank = -Infinity;
670
+ for (const g of groups) {
671
+ // A cascade is an effect, never a cause; citing one would produce "N moved
672
+ // following M moved following the real thing". A value change swaps one
673
+ // string for another in place, so it cannot push content across a page
674
+ // boundary and is never the reason a page shifted either.
675
+ if (g.kind === 'page-shift-cascade' || g.kind === 'value-changed')
676
+ continue;
677
+ const root = events[g.rootIdx];
678
+ if (!('nodeId' in root))
679
+ continue;
680
+ const rank = rankInNext(root.nodeId);
681
+ if (rank == null || rank >= firstMemberRank)
682
+ continue;
683
+ if (rank > bestRank) {
684
+ bestRank = rank;
685
+ best = { summary: g.summary, label: g.label };
686
+ }
687
+ }
688
+ if (best)
689
+ return best;
690
+ if (pageCountIdx !== -1)
691
+ return { summary: events[pageCountIdx].message };
692
+ return null;
693
+ }
694
+ /**
695
+ * Split a same-delta set of moves into maximal runs that are contiguous in
696
+ * document order, tolerating two kinds of gap: a node that is the subject of
697
+ * some other event in this diff, and a repeated fixed element.
698
+ *
699
+ * The second is not a fixture-specific escape hatch. A running header or footer
700
+ * is page-anchored, so it correctly does *not* move when the content around it
701
+ * shifts, and it will therefore break a downstream run at every single page
702
+ * boundary in every document that has one.
703
+ *
704
+ * Anything else in the gap is content that stayed put while its neighbours
705
+ * moved — which is not a cascade, so the run ends there.
706
+ */
707
+ function contiguousRuns(ranked, nextNodes, nextRank, eventIdxByNextId, repeated, movedIds) {
708
+ const byRank = new Map();
709
+ for (const n of nextNodes) {
710
+ const r = nextRank.get(n.id);
711
+ if (r != null)
712
+ byRank.set(r, n);
713
+ }
714
+ const cache = new Map();
715
+ const subtree = (n) => {
716
+ let s = cache.get(n.id);
717
+ if (!s)
718
+ cache.set(n.id, (s = collectSubtree(n, nextNodes)));
719
+ return s;
720
+ };
721
+ const bridges = (from, to) => {
722
+ for (let r = from + 1; r < to; r++) {
723
+ const node = byRank.get(r);
724
+ if (!node)
725
+ return false;
726
+ if (eventIdxByNextId.has(node.id))
727
+ continue; // changed for its own reasons
728
+ const inside = subtree(node);
729
+ // Page-anchored, and so correctly did not move.
730
+ if (inside.some((d) => d.normText != null && repeated.has(d.normText)))
731
+ continue;
732
+ // An anonymous layout container whose own children are in this very run.
733
+ // Containers have no text to match on, so the matcher pairs them by
734
+ // position and they often end up without a move event even though
735
+ // everything they hold moved. That is a gap in the pairing, not content
736
+ // that stayed behind — the evidence comes from the run itself, so this
737
+ // can never bridge two unrelated regions together.
738
+ if (inside.some((d) => d.id !== node.id && movedIds.has(d.id)))
739
+ continue;
740
+ return false;
741
+ }
742
+ return true;
743
+ };
744
+ const runs = [];
745
+ let current = [ranked[0]];
746
+ for (let k = 1; k < ranked.length; k++) {
747
+ if (bridges(ranked[k - 1].rank, ranked[k].rank))
748
+ current.push(ranked[k]);
749
+ else {
750
+ runs.push(current);
751
+ current = [ranked[k]];
752
+ }
753
+ }
754
+ runs.push(current);
755
+ return runs;
756
+ }
757
+ function cascadeSummary(count, delta, idxs, events, cause) {
758
+ const hops = [
759
+ ...new Set(idxs.map((i) => {
760
+ const e = events[i];
761
+ return e.type === 'element-moved-to-different-page' ? `${e.fromPage + 1}→${e.toPage + 1}` : '';
762
+ })),
763
+ ]
764
+ .filter(Boolean)
765
+ .sort();
766
+ const dir = delta > 0 ? `+${delta}` : `${delta}`;
767
+ return `${count} elements shifted ${dir} page${Math.abs(delta) === 1 ? '' : 's'} (${hops.join(', ')}) following ${cause.label ?? cause.summary}`;
768
+ }
769
+ // ── Shared helpers ──────────────────────────────────────────────────────────
770
+ function byId(nodes) {
771
+ return new Map(nodes.map((n) => [n.id, n]));
772
+ }
773
+ function readingRank(nodes) {
774
+ const out = new Map();
775
+ [...nodes]
776
+ .sort((a, b) => a.pageIndex - b.pageIndex || a.order - b.order)
777
+ .forEach((n, i) => out.set(n.id, i));
778
+ return out;
779
+ }
780
+ function isTexty(role) {
781
+ return role === 'text' || role === 'heading';
782
+ }
783
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/diff/group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAoDxC,MAAM,IAAI,GAA6B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAEtE;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,sFAAsF;AACtF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAoB;IAC5C,eAAe;IACf,iBAAiB;IACjB,iCAAiC;IACjC,aAAa;CACd,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAA4B,EAC5B,IAAwB,EACxB,MAAuB,EACvB,OAAoB,EAAE;IAEtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAW,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAExC,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,iEAAiE;IACjE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;YAAE,OAAO;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO;QACpD,IAAI,IAAI,IAAI,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC;YAAE,OAAO;QAC/D,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC9C,wDAAwD;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IAEjD;;;;;OAKG;IACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,MAAc,EAAiB,EAAE;QACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,MAAM,CAAC;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,IAAI,IAAI,IAAI;gBAAE,OAAO,IAAI,GAAG,GAAG,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAC,6CAA6C;IAC5D,CAAC,CAAC;IAEF,8EAA8E;IAC9E,MAAM,KAAK,GAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,MAAM,IAAI,GAAG,CAAC,IAAe,EAAE,OAAe,EAAE,OAAe,EAAE,KAAc,EAAU,EAAE;QACzF,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,GAAW,EAAQ,EAAE;QACpD,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO;QAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QACrB,MAAM,CAAC,OAAO,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,8EAA8E;IAC9E,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,sEAAsE;IACtE,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;QAC/E,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,8EAA8E;IAC9E,yEAAyE;IACzE,4EAA4E;IAC5E,+EAA+E;IAC/E,4EAA4E;IAC5E,qCAAqC;IACrC,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI;YACf,CAAC,CAAC;gBACE,IAAI,EAAE,iBAA0B;gBAChC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,iBAAiB,CAAC,SAAS,CAAC;gBACtC,aAAa,EAAE,IAAI,CAAC,SAAS;aAC9B;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,eAAwB;gBAC9B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ;gBACR,aAAa,EAAE,QAAQ,CAAC,SAAS;aAClC,CAAC;QACN,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrF,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa;gBAAE,SAAS;YACvD,qEAAqE;YACrE,uEAAuE;YACvE,qDAAqD;YACrD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5E,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAAE,SAAS;YACxF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CACb,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAE,EAAE,SAAS,CAAC,MAAM,CAAC,EACzD,uBAAuB,CACxB,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,SAAS;gBAAE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,6EAA6E;IAC7E,4EAA4E;IAC5E,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,4DAA4D;IAC5D,MAAM,MAAM,GAAa;QACvB,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,UAAU;QACV,QAAQ,EAAE,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC;QACnF,QAAQ,EAAE,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC;QACnF,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,kCAAkC;IACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,SAAS;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;YAAE,SAAS;QAEzE,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,IAAI;YAAE,SAAS;QAE1B,IAAI,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC1C,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAAE,SAAS;YACvD,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACzC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxE,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,yEAAyE;IACzE,0EAA0E;IAC1E,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,iCAAiC;YAAE,OAAO;QAC5E,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;QAChC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YACtB,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,MAAM,GAAG,mBAAmB;YAAE,SAAS;QAChD,MAAM,MAAM,GAAG,IAAI;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAE,MAAM,CAAC,CAAC,CAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;aACvF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAmB;YAAE,SAAS;QAElD,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpG,IAAI,GAAG,CAAC,MAAM,GAAG,mBAAmB;gBAAE,SAAS;YAC/C,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC5F,IAAI,KAAK,IAAI,IAAI;gBAAE,SAAS,CAAC,kEAAkE;YAC/F,MAAM,EAAE,GAAG,IAAI,CACb,oBAAoB,EACpB,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,EACT,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CACtE,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,GAAG;gBAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,QAAQ,CAAC,GAAe,EAAE,MAAuB;IACxD,+EAA+E;IAC/E,wEAAwE;IACxE,MAAM,KAAK,GAAwC,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC;QAChC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,GAAG;oBACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;iBAClH,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1E,sEAAsE;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,OAAO;YACb,KAAK,EAAE;gBACL,IAAI;gBACJ,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;gBACrD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;aACpC;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,SAAS,gBAAgB,CACvB,MAAuB,EACvB,QAAqC,EACrC,QAAqC,EACrC,UAA+B;IAE/B,MAAM,OAAO,GAA4C,EAAE,CAAC;IAC5D,MAAM,KAAK,GAA4C,EAAE,CAAC;IAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1D,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;YAAE,SAAS;QACtC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,YAAY,IAAI,IAAI;YAAE,SAAS;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI;YAC3B,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,YAAY;YAChC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC9D,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,QAAqC,EACrC,QAAqC,EACrC,UAA+B;IAE/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,EAAE,QAAQ;YAAE,SAAS;QAC3C,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,KAAuB;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAE/E,sFAAsF;AACtF,SAAS,iBAAiB,CAAC,KAAuB;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;;YAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK;QAAE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,IAAyC,EACzC,MAAuB,EACvB,KAAe,EACf,KAAkC,EAClC,QAA6B;IAE7B,MAAM,YAAY,GAAG,CAAC,EAAU,EAAW,EAAE;QAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,IAAI,IAAI,MAAM,CAAC,GAAG,CAAE,CAAC,IAAI,KAAK,IAAI,CAAC;IACnD,CAAC,CAAC;IACF,MAAM,GAAG,GAA4C,EAAE,CAAC;IACxD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QACjE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB,EAAE,KAAuB;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI;YAAE,SAAS;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAwB,EAAE,KAAa;IAC/D,IAAI,SAAS,CAAC,IAAI,KAAK,oBAAoB;QAAE,OAAO,SAAS,CAAC,OAAO,CAAC;IACtE,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,iCAAiC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACvE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1E,OAAO,GAAG,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI,WAAW,KAAK,GAAG,CAAC;AACtF,CAAC;AAED,+EAA+E;AAE/E;;;;;;;;;;;;;;;GAeG;AACH,SAAS,mBAAmB,CAC1B,KAAuB,EACvB,IAAyB,EACzB,MAA2B,EAC3B,gBAAyB;IAEzB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,CAAC,gBAAgB;QAAE,OAAO,GAAG,CAAC;IAElC,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;SACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjE,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;aAC/B,IAAI,MAAM,IAAI,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,CAAgB,EAAE,CAAW;IAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChD,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,KAAiC,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,6EAA6E;QAC7E,qEAAqE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,GAAG,GAA+B,IAAI,CAAC;QAC3C,OAAO,GAAG,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,MAAM,GAA+B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,KAAK,GAAG,MAAM,CAAC;gBACf,MAAM;YACR,CAAC;YACD,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChE,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,MAAM,EAAE,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAoB,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,qDAAqD;AACrD,SAAS,YAAY,CAAC,GAAW,EAAE,CAAW;IAC5C,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,8EAA8E;AAC9E,SAAS,WAAW,CAClB,QAA4B,EAC5B,KAAkC,EAClC,IAAyB;IAEzB,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,QAAQ;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CACnB,GAAW,EACX,CAAW,EACX,OAAiB,EACjB,MAAuB;IAEvB,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEnG,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;YAAE,IAAI,IAAI,IAAI,CAAC;aAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,KAAK,IAAI,IAAI,CAAC;IAC5C,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;QACzF,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;KAC/F;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC7G,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,OAAO;QACL,OAAO,EAAE,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;QACpG,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB;IACxC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,IAAI,CAAC,KAAuB;IACnC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;AAC/D,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,MAAkB,EAClB,MAAuB,EACvB,UAA6C,EAC7C,eAAuB,EACvB,YAAoB;IAEpB,IAAI,IAAI,GAA+C,IAAI,CAAC;IAC5D,IAAI,QAAQ,GAAG,CAAC,QAAQ,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,2EAA2E;QAC3E,wEAAwE;QACxE,uEAAuE;QACvE,0DAA0D;QAC1D,IAAI,CAAC,CAAC,IAAI,KAAK,oBAAoB,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;YAAE,SAAS;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC;QAChC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,eAAe;YAAE,SAAS;QACtD,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,YAAY,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,CAAE,CAAC,OAAO,EAAE,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,cAAc,CACrB,MAAqC,EACrC,SAA2B,EAC3B,QAA6B,EAC7B,gBAAqC,EACrC,QAAqB,EACrB,QAAqB;IAErB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,CAAiB,EAAoB,EAAE;QACtD,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAU,EAAW,EAAE;QACpD,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,SAAS,CAAC,8BAA8B;YAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,gDAAgD;YAChD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAAE,SAAS;YACjF,yEAAyE;YACzE,oEAAoE;YACpE,kEAAkE;YAClE,wEAAwE;YACxE,uEAAuE;YACvE,mDAAmD;YACnD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAE,SAAS;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,IAAI,GAAoC,EAAE,CAAC;IACjD,IAAI,OAAO,GAAkC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;aACvE,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,KAAa,EACb,IAAc,EACd,MAAuB,EACvB,KAA0C;IAE1C,MAAM,IAAI,GAAG;QACX,GAAG,IAAI,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACrB,OAAO,CAAC,CAAC,IAAI,KAAK,iCAAiC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,CAAC,CAAC,CACH;KACF;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,EAAE,CAAC;IACV,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;IACjD,OAAO,GAAG,KAAK,qBAAqB,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AACnJ,CAAC;AAED,+EAA+E;AAE/E,SAAS,IAAI,CAAC,KAAuB;IACnC,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,CAAC,GAAG,KAAK,CAAC;SACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SAC9D,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,CAAC;AAC/C,CAAC"}
package/dist/events.d.ts CHANGED
@@ -53,6 +53,12 @@ export interface ElementAddedEvent extends BaseEvent {
53
53
  }
54
54
  export interface ElementRemovedEvent extends BaseEvent {
55
55
  type: 'element-removed';
56
+ /**
57
+ * Id in the *baseline* snapshot — a removed node exists nowhere else. Every
58
+ * other event's `nodeId` refers to the new run; this one cannot, so callers
59
+ * resolving ids must pick the matching snapshot.
60
+ */
61
+ nodeId: string;
56
62
  role: NodeRole;
57
63
  textPreview: string;
58
64
  pageIndex: number;
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAwGA,MAAM,CAAC,MAAM,gBAAgB,GAAwC;IACnE,oBAAoB,EAAE,OAAO;IAC7B,2BAA2B,EAAE,OAAO;IACpC,2BAA2B,EAAE,OAAO;IACpC,iCAAiC,EAAE,MAAM;IACzC,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;IACvB,iBAAiB,EAAE,MAAM;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AA8GA,MAAM,CAAC,MAAM,gBAAgB,GAAwC;IACnE,oBAAoB,EAAE,OAAO;IAC7B,2BAA2B,EAAE,OAAO;IACpC,2BAA2B,EAAE,OAAO;IACpC,iCAAiC,EAAE,MAAM;IACzC,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;IACvB,iBAAiB,EAAE,MAAM;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fromPdf.d.ts","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAShE;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,kBAAkB,CAAC,CAoG7B"}
1
+ {"version":3,"file":"fromPdf.d.ts","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAShE;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,kBAAkB,CAAC,CA6G7B"}
@@ -18,8 +18,22 @@ export async function fromPdf(bytes, opts) {
18
18
  const page = await doc.getPage(i);
19
19
  perPage.push(await extractTextRuns(page));
20
20
  }
21
- // Heading model is doc-wide so levels are consistent across pages.
22
- const headingModel = buildHeadingModel(perPage.flatMap((p) => p.runs));
21
+ // Detect tables up front and collect the runs they consume, so the heading
22
+ // model can be built from PROSE only. Table cell text is often voluminous and,
23
+ // in HTML/CSS output, smaller than body prose; left in, it drags the
24
+ // char-count-weighted body-size baseline down and mis-flags paragraphs as
25
+ // headings. The doc-wide model keeps heading levels consistent across pages.
26
+ const pageTables = perPage.map((pg) => detectTables(pg.runs));
27
+ const consumed = new Set();
28
+ for (const tables of pageTables) {
29
+ for (const t of tables)
30
+ for (const row of t.rows)
31
+ for (const cell of row.cells)
32
+ for (const r of cell.runs)
33
+ consumed.add(r);
34
+ }
35
+ const proseRuns = perPage.flatMap((p) => p.runs).filter((r) => !consumed.has(r));
36
+ const headingModel = buildHeadingModel(proseRuns.length > 0 ? proseRuns : perPage.flatMap((p) => p.runs));
23
37
  const rawPages = [];
24
38
  const rawNodes = [];
25
39
  let counter = 0;
@@ -32,8 +46,7 @@ export async function fromPdf(bytes, opts) {
32
46
  contentBox: inferContentBox(pg.runs, pg.width, pg.height),
33
47
  });
34
48
  const overflowOf = buildOverflowModel(pg.runs, pg.width);
35
- const tables = detectTables(pg.runs);
36
- const consumed = new Set();
49
+ const tables = pageTables[pageIndex] ?? [];
37
50
  for (const table of tables) {
38
51
  const tableTempId = nextId();
39
52
  rawNodes.push({
@@ -1 +1 @@
1
- {"version":3,"file":"fromPdf.js","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fromPdf.js","sourceRoot":"","sources":["../../src/extract/fromPdf.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"textRuns.d.ts","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAEpE,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8BhE"}
1
+ {"version":3,"file":"textRuns.d.ts","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAEpE,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmChE"}
@@ -21,7 +21,12 @@ export async function extractTextRuns(page) {
21
21
  const items = content.items.filter((it) => typeof it?.str === 'string');
22
22
  const raw = [];
23
23
  for (const it of items) {
24
- if (it.str.length === 0)
24
+ // Skip whitespace-only items. Some producers (react-pdf, PDFKit, Chrome)
25
+ // emit inter-column space glyphs; if kept, mergeRuns chains through them
26
+ // (word + spaces + word), collapsing a whole table row into one run and
27
+ // erasing the columns table detection needs. Real word spacing is still
28
+ // reconstructed from the inter-run gap below.
29
+ if (it.str.trim().length === 0)
25
30
  continue;
26
31
  const t = it.transform;
27
32
  const x = t[4] ?? 0;
@@ -1 +1 @@
1
- {"version":3,"file":"textRuns.js","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"textRuns.js","sourceRoot":"","sources":["../../../src/extract/pdfjs/textRuns.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,8 @@ export { fromPdf } from './extract/fromPdf.js';
8
8
  export { diffSnapshots } from './diff/diff.js';
9
9
  export { matchNodes } from './diff/match.js';
10
10
  export type { MatchResult, NodePair } from './diff/match.js';
11
+ export { groupEvents } from './diff/group.js';
12
+ export type { EventGroup, GroupKind } from './diff/group.js';
11
13
  export { readSnapshotFile, writeSnapshotFile } from './snapshot/io.js';
12
14
  export { loadSnapshotFromFile } from './snapshot/load.js';
13
15
  export { serializeSnapshot, computeContentHash, stableStringify } from './snapshot/serialize.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAGxC,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAGxC,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,9 @@ export { fromPdf } from './extract/fromPdf.js';
6
6
  // Diff engine
7
7
  export { diffSnapshots } from './diff/diff.js';
8
8
  export { matchNodes } from './diff/match.js';
9
+ // Causal grouping — a *view* over the event list for human-facing output.
10
+ // Never changes DiffResult, the JSON output, or the fail gate.
11
+ export { groupEvents } from './diff/group.js';
9
12
  // Snapshot IO + helpers
10
13
  export { readSnapshotFile, writeSnapshotFile } from './snapshot/io.js';
11
14
  export { loadSnapshotFromFile } from './snapshot/load.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AA+BxC,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE/E,aAAa;AACb,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AA+BxC,OAAO,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE/E,aAAa;AACb,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,0EAA0E;AAC1E,+DAA+D;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,wBAAwB;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdf-testkit/core",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Semantic structural model, extractors, and diff engine for pdf-testkit",
5
5
  "license": "MIT",
6
6
  "type": "module",