@usejunior/docx-core 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/generation/index.d.ts +0 -1
  3. package/dist/generation/index.d.ts.map +1 -1
  4. package/dist/generation/index.js +0 -1
  5. package/dist/generation/index.js.map +1 -1
  6. package/dist/index.d.ts +7 -25
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +7 -47
  9. package/dist/index.js.map +1 -1
  10. package/dist/primitives/accept_ai_edits.d.ts +87 -0
  11. package/dist/primitives/accept_ai_edits.d.ts.map +1 -0
  12. package/dist/primitives/accept_ai_edits.js +253 -0
  13. package/dist/primitives/accept_ai_edits.js.map +1 -0
  14. package/dist/primitives/accept_changes.d.ts +13 -1
  15. package/dist/primitives/accept_changes.d.ts.map +1 -1
  16. package/dist/primitives/accept_changes.js +44 -29
  17. package/dist/primitives/accept_changes.js.map +1 -1
  18. package/dist/primitives/document.d.ts +51 -0
  19. package/dist/primitives/document.d.ts.map +1 -1
  20. package/dist/primitives/document.js +144 -1
  21. package/dist/primitives/document.js.map +1 -1
  22. package/dist/primitives/index.d.ts +1 -0
  23. package/dist/primitives/index.d.ts.map +1 -1
  24. package/dist/primitives/index.js +1 -0
  25. package/dist/primitives/index.js.map +1 -1
  26. package/dist/primitives/reject_changes.d.ts +4 -1
  27. package/dist/primitives/reject_changes.d.ts.map +1 -1
  28. package/dist/primitives/reject_changes.js +54 -30
  29. package/dist/primitives/reject_changes.js.map +1 -1
  30. package/dist/primitives/relationships.d.ts +33 -0
  31. package/dist/primitives/relationships.d.ts.map +1 -1
  32. package/dist/primitives/relationships.js +84 -1
  33. package/dist/primitives/relationships.js.map +1 -1
  34. package/package.json +8 -9
  35. package/dist/atomizer.d.ts +0 -273
  36. package/dist/atomizer.d.ts.map +0 -1
  37. package/dist/atomizer.js +0 -1002
  38. package/dist/atomizer.js.map +0 -1
  39. package/dist/baselines/atomizer/atomLcs.d.ts +0 -82
  40. package/dist/baselines/atomizer/atomLcs.d.ts.map +0 -1
  41. package/dist/baselines/atomizer/atomLcs.js +0 -376
  42. package/dist/baselines/atomizer/atomLcs.js.map +0 -1
  43. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +0 -99
  44. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +0 -1
  45. package/dist/baselines/atomizer/auxiliaryIdCollision.js +0 -415
  46. package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +0 -1
  47. package/dist/baselines/atomizer/consumerCompatibility.d.ts +0 -2
  48. package/dist/baselines/atomizer/consumerCompatibility.d.ts.map +0 -1
  49. package/dist/baselines/atomizer/consumerCompatibility.js +0 -188
  50. package/dist/baselines/atomizer/consumerCompatibility.js.map +0 -1
  51. package/dist/baselines/atomizer/debug.d.ts +0 -41
  52. package/dist/baselines/atomizer/debug.d.ts.map +0 -1
  53. package/dist/baselines/atomizer/debug.js +0 -85
  54. package/dist/baselines/atomizer/debug.js.map +0 -1
  55. package/dist/baselines/atomizer/documentReconstructor.d.ts +0 -75
  56. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +0 -1
  57. package/dist/baselines/atomizer/documentReconstructor.js +0 -1449
  58. package/dist/baselines/atomizer/documentReconstructor.js.map +0 -1
  59. package/dist/baselines/atomizer/formattingFidelity.d.ts +0 -99
  60. package/dist/baselines/atomizer/formattingFidelity.d.ts.map +0 -1
  61. package/dist/baselines/atomizer/formattingFidelity.js +0 -449
  62. package/dist/baselines/atomizer/formattingFidelity.js.map +0 -1
  63. package/dist/baselines/atomizer/hierarchicalLcs.d.ts +0 -121
  64. package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +0 -1
  65. package/dist/baselines/atomizer/hierarchicalLcs.js +0 -753
  66. package/dist/baselines/atomizer/hierarchicalLcs.js.map +0 -1
  67. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +0 -37
  68. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +0 -1
  69. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +0 -189
  70. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +0 -1
  71. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +0 -74
  72. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +0 -1
  73. package/dist/baselines/atomizer/inPlaceModifier-containers.js +0 -171
  74. package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +0 -1
  75. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +0 -88
  76. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +0 -1
  77. package/dist/baselines/atomizer/inPlaceModifier-deletion.js +0 -326
  78. package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +0 -1
  79. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +0 -85
  80. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +0 -1
  81. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +0 -402
  82. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +0 -1
  83. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +0 -39
  84. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +0 -1
  85. package/dist/baselines/atomizer/inPlaceModifier-presplit.js +0 -265
  86. package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +0 -1
  87. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +0 -62
  88. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +0 -1
  89. package/dist/baselines/atomizer/inPlaceModifier-shared.js +0 -139
  90. package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +0 -1
  91. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +0 -198
  92. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +0 -1
  93. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +0 -475
  94. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +0 -1
  95. package/dist/baselines/atomizer/inPlaceModifier.d.ts +0 -27
  96. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +0 -1
  97. package/dist/baselines/atomizer/inPlaceModifier.js +0 -648
  98. package/dist/baselines/atomizer/inPlaceModifier.js.map +0 -1
  99. package/dist/baselines/atomizer/numberingIntegration.d.ts +0 -59
  100. package/dist/baselines/atomizer/numberingIntegration.d.ts.map +0 -1
  101. package/dist/baselines/atomizer/numberingIntegration.js +0 -209
  102. package/dist/baselines/atomizer/numberingIntegration.js.map +0 -1
  103. package/dist/baselines/atomizer/pipeline.d.ts +0 -103
  104. package/dist/baselines/atomizer/pipeline.d.ts.map +0 -1
  105. package/dist/baselines/atomizer/pipeline.js +0 -1160
  106. package/dist/baselines/atomizer/pipeline.js.map +0 -1
  107. package/dist/baselines/atomizer/premergeRuns.d.ts +0 -26
  108. package/dist/baselines/atomizer/premergeRuns.d.ts.map +0 -1
  109. package/dist/baselines/atomizer/premergeRuns.js +0 -153
  110. package/dist/baselines/atomizer/premergeRuns.js.map +0 -1
  111. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +0 -63
  112. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +0 -1
  113. package/dist/baselines/atomizer/trackChangesAcceptor.js +0 -254
  114. package/dist/baselines/atomizer/trackChangesAcceptor.js.map +0 -1
  115. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +0 -64
  116. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +0 -1
  117. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +0 -642
  118. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +0 -1
  119. package/dist/baselines/atomizer/xmlToWmlElement.d.ts +0 -65
  120. package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +0 -1
  121. package/dist/baselines/atomizer/xmlToWmlElement.js +0 -96
  122. package/dist/baselines/atomizer/xmlToWmlElement.js.map +0 -1
  123. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +0 -51
  124. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +0 -1
  125. package/dist/baselines/wmlcomparer/DocxodusWasm.js +0 -83
  126. package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +0 -1
  127. package/dist/baselines/wmlcomparer/DotnetCli.d.ts +0 -40
  128. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +0 -1
  129. package/dist/baselines/wmlcomparer/DotnetCli.js +0 -142
  130. package/dist/baselines/wmlcomparer/DotnetCli.js.map +0 -1
  131. package/dist/cli/compare-two.d.ts +0 -28
  132. package/dist/cli/compare-two.d.ts.map +0 -1
  133. package/dist/cli/compare-two.js +0 -112
  134. package/dist/cli/compare-two.js.map +0 -1
  135. package/dist/cli/index.d.ts +0 -3
  136. package/dist/cli/index.d.ts.map +0 -1
  137. package/dist/cli/index.js +0 -25
  138. package/dist/cli/index.js.map +0 -1
  139. package/dist/compare-types.d.ts +0 -197
  140. package/dist/compare-types.d.ts.map +0 -1
  141. package/dist/compare-types.js +0 -2
  142. package/dist/compare-types.js.map +0 -1
  143. package/dist/format-detection.d.ts +0 -120
  144. package/dist/format-detection.d.ts.map +0 -1
  145. package/dist/format-detection.js +0 -339
  146. package/dist/format-detection.js.map +0 -1
  147. package/dist/generation/recipes.d.ts +0 -144
  148. package/dist/generation/recipes.d.ts.map +0 -1
  149. package/dist/generation/recipes.js +0 -358
  150. package/dist/generation/recipes.js.map +0 -1
  151. package/dist/move-detection.d.ts +0 -211
  152. package/dist/move-detection.d.ts.map +0 -1
  153. package/dist/move-detection.js +0 -390
  154. package/dist/move-detection.js.map +0 -1
@@ -1,642 +0,0 @@
1
- /**
2
- * Track Changes Acceptor/Rejector (AST-based)
3
- *
4
- * AST-based utilities to accept or reject all track changes in a document.
5
- * Replaces the regex-based implementation for better reliability with nested structures.
6
- */
7
- import { parseDocumentXml, serializeToXml } from './xmlToWmlElement.js';
8
- import { removeAllByTagName, unwrapAllByTagName, findAllByTagName, renameElement, insertChildAt, childElements, getLeafText, NODE_TYPE, } from '../../primitives/index.js';
9
- /**
10
- * Remove w:hyperlink elements left with no element children after change
11
- * resolution. Word drops a hyperlink whose entire content was a resolved
12
- * tracked change (all link text deleted + accepted, or all link text
13
- * inserted + rejected); keeping the empty wrapper would ship a contentless
14
- * `<w:hyperlink r:id=".."/>` husk. Hyperlinks that still hold any element
15
- * (runs, bookmarks, range markers) are kept.
16
- *
17
- * @conformance ECMA-376 edition 5, Part 1 § 17.16.22
18
- * @see https://github.com/UseJunior/safe-docx/issues/368
19
- */
20
- function removeEmptyHyperlinks(root) {
21
- for (const hyperlink of findAllByTagName(root, 'w:hyperlink')) {
22
- if (childElements(hyperlink).length === 0 && hyperlink.parentNode) {
23
- hyperlink.parentNode.removeChild(hyperlink);
24
- }
25
- }
26
- }
27
- /** xmldom does not implement parentElement; use parentNode with an Element guard. */
28
- function parentElement(node) {
29
- const p = node.parentNode;
30
- return p && p.nodeType === NODE_TYPE.ELEMENT ? p : undefined;
31
- }
32
- function getParagraphPPr(p) {
33
- return childElements(p).find((c) => c.tagName === 'w:pPr');
34
- }
35
- function paragraphHasParaMarker(p, tagName) {
36
- // Strict paragraph-mark marker shape: w:p > w:pPr > w:rPr > (w:ins | w:del),
37
- // navigated by direct children only — NOT a descendant search. A descendant
38
- // search would mistake a marker nested inside a w:pPrChange snapshot (which
39
- // stores a prior w:pPr/w:rPr) for the live paragraph mark, and would diverge
40
- // from the primitive rejectChanges (primitives/reject_changes.ts), which both
41
- // reject paths must agree with.
42
- const pPr = getParagraphPPr(p);
43
- if (!pPr)
44
- return false;
45
- const rPr = childElements(pPr).find((c) => c.tagName === 'w:rPr');
46
- if (!rPr)
47
- return false;
48
- return childElements(rPr).some((c) => c.tagName === tagName);
49
- }
50
- function removeParaMarkers(root) {
51
- // Remove paragraph-level revision markers (<w:ins/> / <w:del/>) that live under <w:pPr>.
52
- for (const p of findAllByTagName(root, 'w:p')) {
53
- const pPr = getParagraphPPr(p);
54
- if (!pPr)
55
- continue;
56
- const markers = [
57
- ...findAllByTagName(pPr, 'w:ins'),
58
- ...findAllByTagName(pPr, 'w:del'),
59
- ];
60
- for (const m of markers) {
61
- if (m.parentNode)
62
- m.parentNode.removeChild(m);
63
- }
64
- }
65
- }
66
- function findContainingParagraph(node) {
67
- let current = node;
68
- while (current) {
69
- if (current.tagName === 'w:p') {
70
- return current;
71
- }
72
- current = parentElement(current);
73
- }
74
- return undefined;
75
- }
76
- function findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, direction) {
77
- const parent = parentElement(paragraph);
78
- if (!parent) {
79
- return undefined;
80
- }
81
- const siblings = childElements(parent);
82
- const paragraphIndex = siblings.indexOf(paragraph);
83
- if (paragraphIndex < 0) {
84
- return undefined;
85
- }
86
- const step = direction === 'previous' ? -1 : 1;
87
- for (let i = paragraphIndex + step; i >= 0 && i < siblings.length; i += step) {
88
- const sibling = siblings[i];
89
- if (sibling?.tagName !== 'w:p') {
90
- continue;
91
- }
92
- if (paragraphsToRemove.has(sibling)) {
93
- continue;
94
- }
95
- return sibling;
96
- }
97
- return undefined;
98
- }
99
- function paragraphContentStartIndex(paragraph) {
100
- const children = childElements(paragraph);
101
- let idx = 0;
102
- while (idx < children.length && children[idx]?.tagName === 'w:pPr') {
103
- idx++;
104
- }
105
- return idx;
106
- }
107
- // Marker-ish elements that may sit between two paragraphs at block level
108
- // without ending the search for a merge target: the full EG_RangeMarkupElements
109
- // schema group (wml.xsd), plus permStart/permEnd range markers and proofErr
110
- // proofing anchors.
111
- const RANGE_MARKUP_BLOCK_SIBLING_TAGS = new Set([
112
- 'w:bookmarkStart', 'w:bookmarkEnd',
113
- 'w:commentRangeStart', 'w:commentRangeEnd',
114
- 'w:moveFromRangeStart', 'w:moveFromRangeEnd',
115
- 'w:moveToRangeStart', 'w:moveToRangeEnd',
116
- 'w:customXmlInsRangeStart', 'w:customXmlInsRangeEnd',
117
- 'w:customXmlDelRangeStart', 'w:customXmlDelRangeEnd',
118
- 'w:customXmlMoveFromRangeStart', 'w:customXmlMoveFromRangeEnd',
119
- 'w:customXmlMoveToRangeStart', 'w:customXmlMoveToRangeEnd',
120
- 'w:permStart', 'w:permEnd',
121
- 'w:proofErr',
122
- ]);
123
- /**
124
- * Find the next sibling paragraph a paragraph-mark revision can merge into,
125
- * skipping block-level range/annotation markers. Returns undefined when the
126
- * next block is not a paragraph (table, sdt, sectPr, end of parent).
127
- */
128
- function findFollowingSiblingParagraph(p) {
129
- const parent = parentElement(p);
130
- if (!parent)
131
- return undefined;
132
- const siblings = childElements(parent);
133
- const idx = siblings.indexOf(p);
134
- if (idx < 0)
135
- return undefined;
136
- for (let i = idx + 1; i < siblings.length; i++) {
137
- const sibling = siblings[i];
138
- if (sibling.tagName === 'w:p')
139
- return sibling;
140
- if (RANGE_MARKUP_BLOCK_SIBLING_TAGS.has(sibling.tagName))
141
- continue;
142
- return undefined;
143
- }
144
- return undefined;
145
- }
146
- /** True iff the paragraph still holds content beyond w:pPr and bare annotation markers. */
147
- function paragraphHasContent(p) {
148
- return childElements(p).some((c) => c.tagName !== 'w:pPr' && !RANGE_MARKUP_BLOCK_SIBLING_TAGS.has(c.tagName));
149
- }
150
- /**
151
- * True iff removing an emptied mark-revised paragraph keeps its parent
152
- * structurally valid for Word: the parent must retain at least one block
153
- * element, must not end on a w:tbl (a trailing table needs a following
154
- * paragraph), and two tables must not become adjacent (Word merges
155
- * back-to-back tables). w:sectPr is ignored — a trailing body sectPr is not a
156
- * block element.
157
- */
158
- function canSafelyRemoveEmptyParagraph(p) {
159
- const parent = parentElement(p);
160
- if (!parent)
161
- return false;
162
- const siblings = childElements(parent).filter((c) => !RANGE_MARKUP_BLOCK_SIBLING_TAGS.has(c.tagName) && c.tagName !== 'w:sectPr');
163
- const idx = siblings.indexOf(p);
164
- if (idx < 0)
165
- return false;
166
- const prev = siblings[idx - 1];
167
- const next = siblings[idx + 1];
168
- if (!prev && !next)
169
- return false;
170
- if (prev?.tagName === 'w:tbl' && !next)
171
- return false;
172
- if (prev?.tagName === 'w:tbl' && next?.tagName === 'w:tbl')
173
- return false;
174
- return true;
175
- }
176
- /**
177
- * Resolve a paragraph whose paragraph MARK revision was applied (deleted mark
178
- * accepted, or inserted mark rejected): the paragraph break disappears, so the
179
- * paragraph's remaining content merges into the FOLLOWING paragraph. The
180
- * surviving (following) paragraph keeps its own w:pPr — formatting follows the
181
- * surviving paragraph mark — and the merged-away paragraph's w:pPr is dropped.
182
- *
183
- * The revision targets only the mark, never the paragraph's contents, so the
184
- * contents must not be dropped wholesale (they are removed only via their own
185
- * run-level w:del / w:ins wrappers). When no following sibling paragraph
186
- * exists (last block, or the next block is a table), there is no break to
187
- * remove into: content-bearing paragraphs are kept, and emptied ones are
188
- * removed only where removal keeps the parent structurally valid
189
- * (canSafelyRemoveEmptyParagraph).
190
- *
191
- * @conformance ECMA-376 edition 5, Part 1 § 17.13.5.15
192
- * @conformance ECMA-376 edition 5, Part 1 § 17.13.5.20
193
- * @see https://github.com/UseJunior/safe-docx/issues/431
194
- */
195
- function resolveParagraphMarkRevision(p) {
196
- const parent = p.parentNode;
197
- if (!parent)
198
- return;
199
- const target = findFollowingSiblingParagraph(p);
200
- if (!target) {
201
- if (!paragraphHasContent(p) && canSafelyRemoveEmptyParagraph(p)) {
202
- parent.removeChild(p);
203
- }
204
- return;
205
- }
206
- // The merged content precedes the target's own content in document order.
207
- let insertIndex = paragraphContentStartIndex(target);
208
- for (const child of childElements(p)) {
209
- if (child.tagName === 'w:pPr')
210
- continue;
211
- p.removeChild(child);
212
- insertChildAt(target, child, insertIndex);
213
- insertIndex++;
214
- }
215
- parent.removeChild(p);
216
- }
217
- function moveBookmarkMarker(marker, targetParagraph, position) {
218
- if (marker.tagName === 'w:bookmarkStart') {
219
- const markerId = marker.getAttribute('w:id');
220
- const markerName = marker.getAttribute('w:name');
221
- for (const existing of findAllByTagName(targetParagraph, 'w:bookmarkStart')) {
222
- if (markerId && existing.getAttribute('w:id') === markerId) {
223
- if (marker.parentNode)
224
- marker.parentNode.removeChild(marker);
225
- return;
226
- }
227
- if (markerName && existing.getAttribute('w:name') === markerName) {
228
- if (marker.parentNode)
229
- marker.parentNode.removeChild(marker);
230
- return;
231
- }
232
- }
233
- }
234
- if (marker.tagName === 'w:bookmarkEnd') {
235
- const markerId = marker.getAttribute('w:id');
236
- if (markerId) {
237
- for (const existing of findAllByTagName(targetParagraph, 'w:bookmarkEnd')) {
238
- if (existing.getAttribute('w:id') === markerId) {
239
- if (marker.parentNode)
240
- marker.parentNode.removeChild(marker);
241
- return;
242
- }
243
- }
244
- }
245
- }
246
- if (marker.parentNode) {
247
- marker.parentNode.removeChild(marker);
248
- }
249
- if (position === 'start') {
250
- insertChildAt(targetParagraph, marker, paragraphContentStartIndex(targetParagraph));
251
- return;
252
- }
253
- targetParagraph.appendChild(marker);
254
- }
255
- function collectBookmarksById(nodes) {
256
- const byId = new Map();
257
- for (const node of nodes) {
258
- const id = node.getAttribute('w:id');
259
- if (!id) {
260
- continue;
261
- }
262
- const existing = byId.get(id);
263
- if (existing) {
264
- existing.push(node);
265
- }
266
- else {
267
- byId.set(id, [node]);
268
- }
269
- }
270
- return byId;
271
- }
272
- function hasCounterpartOutsideRemovedParagraphs(counterpartNodes, paragraphsToRemove, sourceParagraph) {
273
- if (!counterpartNodes || counterpartNodes.length === 0) {
274
- return false;
275
- }
276
- for (const node of counterpartNodes) {
277
- if (!node.parentNode) {
278
- continue;
279
- }
280
- const nodeParagraph = findContainingParagraph(node);
281
- if (!nodeParagraph || nodeParagraph === sourceParagraph) {
282
- continue;
283
- }
284
- if (!paragraphsToRemove.has(nodeParagraph)) {
285
- return true;
286
- }
287
- }
288
- return false;
289
- }
290
- function collectReferencedBookmarkNamesOutsideRemovedParagraphs(root, paragraphsToRemove) {
291
- const names = new Set();
292
- const refRegex = /\b(?:PAGEREF|REF)\s+([^\s\\]+)/g;
293
- for (const instrText of findAllByTagName(root, 'w:instrText')) {
294
- const paragraph = findContainingParagraph(instrText);
295
- if (paragraph && paragraphsToRemove.has(paragraph)) {
296
- continue;
297
- }
298
- const text = getLeafText(instrText) ?? '';
299
- for (const match of text.matchAll(refRegex)) {
300
- const name = match[1]?.trim();
301
- if (name) {
302
- names.add(name);
303
- }
304
- }
305
- }
306
- return names;
307
- }
308
- function getBookmarkNameForId(startsById, id) {
309
- const starts = startsById.get(id);
310
- if (!starts)
311
- return undefined;
312
- for (const start of starts) {
313
- const name = start.getAttribute('w:name');
314
- if (name)
315
- return name;
316
- }
317
- return undefined;
318
- }
319
- /**
320
- * Preserve bookmark markers that span outside paragraphs being removed during Reject All.
321
- *
322
- * Inserted paragraphs are removed wholesale. If they contain a bookmark boundary whose
323
- * counterpart sits in a kept paragraph, dropping that boundary corrupts bookmark pairing.
324
- * Move those boundary markers into adjacent kept paragraphs before removal.
325
- */
326
- function preserveCrossParagraphBookmarksForReject(root, paragraphsToRemove) {
327
- if (paragraphsToRemove.size === 0) {
328
- return;
329
- }
330
- const startsById = collectBookmarksById(findAllByTagName(root, 'w:bookmarkStart'));
331
- const endsById = collectBookmarksById(findAllByTagName(root, 'w:bookmarkEnd'));
332
- const referencedNamesOutsideRemoved = collectReferencedBookmarkNamesOutsideRemovedParagraphs(root, paragraphsToRemove);
333
- for (const paragraph of paragraphsToRemove) {
334
- const startTarget = findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'next') ??
335
- findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'previous');
336
- const endTarget = findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'previous') ??
337
- findNeighborParagraphOutsideRemoval(paragraph, paragraphsToRemove, 'next');
338
- if (!startTarget && !endTarget) {
339
- continue;
340
- }
341
- for (const start of findAllByTagName(paragraph, 'w:bookmarkStart')) {
342
- if (!start.parentNode || !startTarget) {
343
- continue;
344
- }
345
- if (parentElement(start) === paragraph && findFollowingSiblingParagraph(paragraph)) {
346
- // A direct child of a merging paragraph rides the Step-3 merge in
347
- // document order; pre-moving it here would reorder the boundary
348
- // relative to the surviving untracked content.
349
- continue;
350
- }
351
- const id = start.getAttribute('w:id');
352
- if (!id) {
353
- continue;
354
- }
355
- const startName = start.getAttribute('w:name');
356
- const hasDuplicateStartOutside = hasCounterpartOutsideRemovedParagraphs(startsById.get(id), paragraphsToRemove, paragraph);
357
- if (hasDuplicateStartOutside) {
358
- // A surviving start marker with this ID already exists outside removed
359
- // paragraphs. Moving this marker would create duplicate starts after
360
- // Reject All.
361
- continue;
362
- }
363
- const hasCounterpartOutside = hasCounterpartOutsideRemovedParagraphs(endsById.get(id), paragraphsToRemove, paragraph);
364
- const referencedOutside = startName ? referencedNamesOutsideRemoved.has(startName) : false;
365
- if (!hasCounterpartOutside && !referencedOutside) {
366
- continue;
367
- }
368
- moveBookmarkMarker(start, startTarget, 'start');
369
- }
370
- for (const end of findAllByTagName(paragraph, 'w:bookmarkEnd')) {
371
- if (!end.parentNode || !endTarget) {
372
- continue;
373
- }
374
- if (parentElement(end) === paragraph && findFollowingSiblingParagraph(paragraph)) {
375
- // A direct child of a merging paragraph rides the Step-3 merge in
376
- // document order; pre-moving it here would reorder the boundary
377
- // relative to the surviving untracked content.
378
- continue;
379
- }
380
- const id = end.getAttribute('w:id');
381
- if (!id) {
382
- continue;
383
- }
384
- const hasDuplicateEndOutside = hasCounterpartOutsideRemovedParagraphs(endsById.get(id), paragraphsToRemove, paragraph);
385
- if (hasDuplicateEndOutside) {
386
- // A surviving end marker with this ID already exists outside removed
387
- // paragraphs. Moving this marker would create duplicate ends after
388
- // Reject All.
389
- continue;
390
- }
391
- const hasCounterpartOutside = hasCounterpartOutsideRemovedParagraphs(startsById.get(id), paragraphsToRemove, paragraph);
392
- const pairedName = getBookmarkNameForId(startsById, id);
393
- const referencedOutside = pairedName ? referencedNamesOutsideRemoved.has(pairedName) : false;
394
- if (!hasCounterpartOutside && !referencedOutside) {
395
- continue;
396
- }
397
- moveBookmarkMarker(end, endTarget, 'end');
398
- }
399
- }
400
- }
401
- /**
402
- * Accept all track changes in document XML (AST-based).
403
- *
404
- * - Removes w:del elements entirely (deleted content disappears)
405
- * - Unwraps w:ins elements (inserted content becomes normal)
406
- * - Handles w:moveFrom (remove) and w:moveTo (unwrap)
407
- * - Removes format change tracking elements
408
- *
409
- * @param documentXml - The document.xml content with track changes
410
- * @returns Document XML with all changes accepted
411
- */
412
- export function acceptAllChanges(documentXml) {
413
- const root = parseDocumentXml(documentXml);
414
- // Merge a paragraph on Accept All iff its paragraph MARK is a tracked deletion
415
- // (<w:pPr><w:rPr><w:del .../></w:rPr>) — the paragraph BREAK itself was deleted, so accepting
416
- // the deletion merges the paragraph's surviving content into the following paragraph
417
- // (resolveParagraphMarkRevision). The contents are deleted only via their own run-level
418
- // w:del wrappers. This is the Word/LibreOffice-faithful, purely mark-based rule (the
419
- // accept-side mirror of rejectAllChanges).
420
- //
421
- // We deliberately do NOT touch a paragraph based on content (e.g. "all runs are inside w:del"
422
- // or "w:moveFrom"). A run-level deletion under an UNTRACKED paragraph mark means text was
423
- // deleted from a pre-existing paragraph; Word and LibreOffice both keep that paragraph (empty)
424
- // on accept, and a content-based drop over-deletes it. safe-docx's own deleted paragraphs
425
- // always carry the PPR-DEL mark (wrapParagraphAsDeleted), so the mark-based rule covers them
426
- // without the old content heuristic.
427
- const markDeletedParagraphs = [];
428
- for (const p of findAllByTagName(root, 'w:p')) {
429
- if (paragraphHasParaMarker(p, 'w:del')) {
430
- markDeletedParagraphs.push(p);
431
- }
432
- }
433
- // Remove w:del elements entirely (deleted content disappears)
434
- removeAllByTagName(root, 'w:del');
435
- // Remove w:moveFrom elements entirely
436
- removeAllByTagName(root, 'w:moveFrom');
437
- // Remove move range markers
438
- removeAllByTagName(root, 'w:moveFromRangeStart');
439
- removeAllByTagName(root, 'w:moveFromRangeEnd');
440
- removeAllByTagName(root, 'w:moveToRangeStart');
441
- removeAllByTagName(root, 'w:moveToRangeEnd');
442
- // Unwrap w:ins elements (keep content, remove wrapper)
443
- unwrapAllByTagName(root, 'w:ins');
444
- // Unwrap w:moveTo elements
445
- unwrapAllByTagName(root, 'w:moveTo');
446
- // Remove format change tracking
447
- removeAllByTagName(root, 'w:rPrChange');
448
- removeAllByTagName(root, 'w:pPrChange');
449
- // Strip paragraph-level markers now that changes are accepted.
450
- removeParaMarkers(root);
451
- // Resolve the PPR-DEL-marked paragraphs (their paragraph mark was deleted):
452
- // merge each into its following paragraph (document order, so consecutive
453
- // mark-deleted paragraphs cascade forward into the first surviving one).
454
- for (const p of markDeletedParagraphs) {
455
- resolveParagraphMarkRevision(p);
456
- }
457
- // Drop hyperlink wrappers emptied by the accepted deletions above.
458
- removeEmptyHyperlinks(root);
459
- return serializeToXml(root);
460
- }
461
- /**
462
- * Reject all track changes in document XML (AST-based).
463
- *
464
- * - Removes w:ins elements entirely (inserted content disappears)
465
- * - Unwraps w:del elements and converts w:delText to w:t
466
- * - Handles w:moveFrom (unwrap) and w:moveTo (remove)
467
- * - Removes format change tracking elements
468
- *
469
- * @param documentXml - The document.xml content with track changes
470
- * @returns Document XML with all changes rejected
471
- */
472
- export function rejectAllChanges(documentXml) {
473
- const root = parseDocumentXml(documentXml);
474
- // Step 1: Merge a paragraph on Reject All iff its paragraph MARK is a tracked
475
- // insertion (<w:pPr><w:rPr><w:ins .../></w:rPr>) — i.e. the paragraph break itself
476
- // was inserted, so rejecting the insertion merges the paragraph's surviving content
477
- // into the following paragraph (resolveParagraphMarkRevision). The contents
478
- // disappear only via their own run-level w:ins wrappers. This is the
479
- // Word/LibreOffice-faithful, purely mark-based rule.
480
- //
481
- // We deliberately do NOT touch a paragraph based on content (e.g. "all runs are inside
482
- // w:ins"). A run-level insertion under an UNTRACKED paragraph mark means text was
483
- // inserted into a pre-existing paragraph; Word and LibreOffice both keep that
484
- // paragraph (empty) on reject, and a content-based drop over-deletes it. safe-docx's
485
- // own inserted paragraphs always carry the PPR-INS mark now (wrapParagraphAsInserted),
486
- // so the mark-based rule covers them without the old content heuristic.
487
- const markInsertedParagraphs = new Set();
488
- for (const p of findAllByTagName(root, 'w:p')) {
489
- if (paragraphHasParaMarker(p, 'w:ins')) {
490
- markInsertedParagraphs.add(p);
491
- }
492
- }
493
- // Bookmarks nested inside w:ins content are dropped with Step 2's wrapper
494
- // removal, so boundaries whose counterpart lives in a kept paragraph must
495
- // move out first. (Direct-child bookmarks would survive the Step-3 merge.)
496
- preserveCrossParagraphBookmarksForReject(root, markInsertedParagraphs);
497
- // Step 2: Remove w:ins elements entirely (inserted content disappears)
498
- removeAllByTagName(root, 'w:ins');
499
- // Step 3: Resolve the PPR-INS-marked paragraphs (their paragraph mark was
500
- // inserted): merge each into its following paragraph (document order, so
501
- // consecutive mark-inserted paragraphs cascade forward into the first
502
- // surviving one).
503
- for (const p of markInsertedParagraphs) {
504
- resolveParagraphMarkRevision(p);
505
- }
506
- // Remove w:moveTo elements entirely
507
- removeAllByTagName(root, 'w:moveTo');
508
- // Remove move range markers
509
- removeAllByTagName(root, 'w:moveFromRangeStart');
510
- removeAllByTagName(root, 'w:moveFromRangeEnd');
511
- removeAllByTagName(root, 'w:moveToRangeStart');
512
- removeAllByTagName(root, 'w:moveToRangeEnd');
513
- // Unwrap w:del elements (keep content, remove wrapper)
514
- unwrapAllByTagName(root, 'w:del');
515
- // Unwrap w:moveFrom elements
516
- unwrapAllByTagName(root, 'w:moveFrom');
517
- // Convert w:delText to w:t
518
- for (const delText of findAllByTagName(root, 'w:delText')) {
519
- renameElement(delText, 'w:t');
520
- }
521
- // Convert w:delInstrText to w:instrText
522
- for (const delInstrText of findAllByTagName(root, 'w:delInstrText')) {
523
- renameElement(delInstrText, 'w:instrText');
524
- }
525
- // Remove format change tracking
526
- removeAllByTagName(root, 'w:rPrChange');
527
- removeAllByTagName(root, 'w:pPrChange');
528
- // Strip paragraph-level markers now that changes are rejected.
529
- removeParaMarkers(root);
530
- // Drop hyperlink wrappers emptied by the rejected insertions above.
531
- removeEmptyHyperlinks(root);
532
- return serializeToXml(root);
533
- }
534
- /**
535
- * Extract plain text content from document XML (AST-based).
536
- *
537
- * @param documentXml - The document.xml content
538
- * @returns Plain text content
539
- */
540
- export function extractTextContent(documentXml) {
541
- const root = parseDocumentXml(documentXml);
542
- const texts = [];
543
- // Extract text from w:t elements
544
- for (const t of findAllByTagName(root, 'w:t')) {
545
- const text = getLeafText(t) ?? '';
546
- if (text) {
547
- texts.push(text);
548
- }
549
- }
550
- // Also extract from w:delText (for rejected changes before conversion)
551
- for (const delText of findAllByTagName(root, 'w:delText')) {
552
- const text = getLeafText(delText) ?? '';
553
- if (text) {
554
- texts.push(text);
555
- }
556
- }
557
- return texts.join('');
558
- }
559
- /**
560
- * Extract text in document order, respecting paragraph breaks (AST-based).
561
- */
562
- export function extractTextWithParagraphs(documentXml) {
563
- const root = parseDocumentXml(documentXml);
564
- const paragraphs = [];
565
- // Find all paragraphs
566
- for (const p of findAllByTagName(root, 'w:p')) {
567
- const texts = [];
568
- // Extract text from w:t elements within this paragraph
569
- for (const t of findAllByTagName(p, 'w:t')) {
570
- const text = getLeafText(t) ?? '';
571
- if (text) {
572
- texts.push(text);
573
- }
574
- }
575
- // Also check w:delText
576
- for (const delText of findAllByTagName(p, 'w:delText')) {
577
- const text = getLeafText(delText) ?? '';
578
- if (text) {
579
- texts.push(text);
580
- }
581
- }
582
- paragraphs.push(texts.join(''));
583
- }
584
- return paragraphs.join('\n');
585
- }
586
- /**
587
- * Normalize text for comparison (handles whitespace differences).
588
- *
589
- * Performs the following normalization:
590
- * - Convert CRLF and CR to LF
591
- * - Convert tabs to spaces
592
- * - Collapse multiple spaces to single space
593
- * - Strip trailing spaces from each line
594
- * - Collapse multiple newlines to single newline
595
- * - Trim leading/trailing whitespace
596
- */
597
- export function normalizeText(text) {
598
- return text
599
- .replace(/\r\n/g, '\n')
600
- .replace(/\r/g, '\n')
601
- .replace(/\t/g, ' ')
602
- .replace(/ +/g, ' ')
603
- .replace(/ \n/g, '\n') // Strip trailing spaces from lines
604
- .replace(/\n /g, '\n') // Strip leading spaces from lines
605
- .replace(/\n+/g, '\n')
606
- .trim();
607
- }
608
- /**
609
- * Compare two texts and return detailed differences.
610
- */
611
- export function compareTexts(expected, actual) {
612
- const normalizedExpected = normalizeText(expected);
613
- const normalizedActual = normalizeText(actual);
614
- const differences = [];
615
- if (expected !== actual) {
616
- // Find first difference
617
- let firstDiff = 0;
618
- while (firstDiff < expected.length && firstDiff < actual.length) {
619
- if (expected[firstDiff] !== actual[firstDiff]) {
620
- break;
621
- }
622
- firstDiff++;
623
- }
624
- if (firstDiff < expected.length || firstDiff < actual.length) {
625
- const context = 50;
626
- const start = Math.max(0, firstDiff - context);
627
- const expectedSnippet = expected.slice(start, firstDiff + context);
628
- const actualSnippet = actual.slice(start, firstDiff + context);
629
- differences.push(`First difference at position ${firstDiff}:`);
630
- differences.push(` Expected: "...${expectedSnippet}..."`);
631
- differences.push(` Actual: "...${actualSnippet}..."`);
632
- }
633
- }
634
- return {
635
- identical: expected === actual,
636
- normalizedIdentical: normalizedExpected === normalizedActual,
637
- expectedLength: expected.length,
638
- actualLength: actual.length,
639
- differences,
640
- };
641
- }
642
- //# sourceMappingURL=trackChangesAcceptorAst.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trackChangesAcceptorAst.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptorAst.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,GACV,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;GAUG;AACH,SAAS,qBAAqB,CAAC,IAAa;IAC1C,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;QAC9D,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YAClE,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,SAAS,aAAa,CAAC,IAAU;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAE,CAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5E,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAU,EAAE,OAA0B;IACpE,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IAC5E,6EAA6E;IAC7E,8EAA8E;IAC9E,gCAAgC;IAChC,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,yFAAyF;IACzF,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,MAAM,OAAO,GAAG;YACd,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC;YACjC,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC;SAClC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,UAAU;gBAAE,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAyB;IACxD,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mCAAmC,CAC1C,SAAkB,EAClB,kBAAwC,EACxC,SAA8B;IAE9B,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,cAAc,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAkB;IACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;QACnE,GAAG,EAAE,CAAC;IACR,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,oBAAoB;AACpB,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC;IAC9C,iBAAiB,EAAE,eAAe;IAClC,qBAAqB,EAAE,mBAAmB;IAC1C,sBAAsB,EAAE,oBAAoB;IAC5C,oBAAoB,EAAE,kBAAkB;IACxC,0BAA0B,EAAE,wBAAwB;IACpD,0BAA0B,EAAE,wBAAwB;IACpD,+BAA+B,EAAE,6BAA6B;IAC9D,6BAA6B,EAAE,2BAA2B;IAC1D,aAAa,EAAE,WAAW;IAC1B,YAAY;CACb,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,6BAA6B,CAAC,CAAU;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO,OAAO,CAAC;QAC9C,IAAI,+BAA+B,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,2FAA2F;AAC3F,SAAS,mBAAmB,CAAC,CAAU;IACrC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAChF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,6BAA6B,CAAC,CAAU;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,UAAU,CACnF,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,IAAI,EAAE,OAAO,KAAK,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,IAAI,EAAE,OAAO,KAAK,OAAO,IAAI,IAAI,EAAE,OAAO,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,4BAA4B,CAAC,CAAU;IAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,MAAM,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO;IACT,CAAC;IAED,0EAA0E;IAC1E,IAAI,WAAW,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;YAAE,SAAS;QACxC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC1C,WAAW,EAAE,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAe,EACf,eAAwB,EACxB,QAAyB;IAEzB,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACjD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,CAAC;YAC5E,IAAI,QAAQ,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC3D,IAAI,MAAM,CAAC,UAAU;oBAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YACD,IAAI,UAAU,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,UAAU,EAAE,CAAC;gBACjE,IAAI,MAAM,CAAC,UAAU;oBAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;gBAC1E,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC/C,IAAI,MAAM,CAAC,UAAU;wBAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC7D,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,0BAA0B,CAAC,eAAe,CAAC,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sCAAsC,CAC7C,gBAAuC,EACvC,kBAAwC,EACxC,eAAwB;IAExB,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;YACxD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sDAAsD,CAC7D,IAAa,EACb,kBAAwC;IAExC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,QAAQ,GAAG,iCAAiC,CAAC;IAEnD,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,SAAS,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkC,EAAE,EAAU;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wCAAwC,CAC/C,IAAa,EACb,kBAAwC;IAExC,IAAI,kBAAkB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/E,MAAM,6BAA6B,GAAG,sDAAsD,CAC1F,IAAI,EACJ,kBAAkB,CACnB,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,WAAW,GACf,mCAAmC,CAAC,SAAS,EAAE,kBAAkB,EAAE,MAAM,CAAC;YAC1E,mCAAmC,CAAC,SAAS,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,SAAS,GACb,mCAAmC,CAAC,SAAS,EAAE,kBAAkB,EAAE,UAAU,CAAC;YAC9E,mCAAmC,CAAC,SAAS,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAE7E,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,6BAA6B,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnF,kEAAkE;gBAClE,gEAAgE;gBAChE,+CAA+C;gBAC/C,SAAS;YACX,CAAC;YAED,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,wBAAwB,GAAG,sCAAsC,CACrE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAClB,kBAAkB,EAClB,SAAS,CACV,CAAC;YACF,IAAI,wBAAwB,EAAE,CAAC;gBAC7B,uEAAuE;gBACvE,qEAAqE;gBACrE,cAAc;gBACd,SAAS;YACX,CAAC;YAED,MAAM,qBAAqB,GAAG,sCAAsC,CAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAChB,kBAAkB,EAClB,SAAS,CACV,CAAC;YACF,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAE3F,IAAI,CAAC,qBAAqB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,6BAA6B,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjF,kEAAkE;gBAClE,gEAAgE;gBAChE,+CAA+C;gBAC/C,SAAS;YACX,CAAC;YAED,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,SAAS;YACX,CAAC;YAED,MAAM,sBAAsB,GAAG,sCAAsC,CACnE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAChB,kBAAkB,EAClB,SAAS,CACV,CAAC;YACF,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,qEAAqE;gBACrE,mEAAmE;gBACnE,cAAc;gBACd,SAAS;YACX,CAAC;YAED,MAAM,qBAAqB,GAAG,sCAAsC,CAClE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAClB,kBAAkB,EAClB,SAAS,CACV,CAAC;YACF,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,6BAA6B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAE7F,IAAI,CAAC,qBAAqB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE3C,+EAA+E;IAC/E,8FAA8F;IAC9F,qFAAqF;IACrF,wFAAwF;IACxF,qFAAqF;IACrF,2CAA2C;IAC3C,EAAE;IACF,8FAA8F;IAC9F,0FAA0F;IAC1F,+FAA+F;IAC/F,0FAA0F;IAC1F,6FAA6F;IAC7F,qCAAqC;IACrC,MAAM,qBAAqB,GAAc,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;YACvC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAElC,sCAAsC;IACtC,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEvC,4BAA4B;IAC5B,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACjD,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC/C,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC/C,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAE7C,uDAAuD;IACvD,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAElC,2BAA2B;IAC3B,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAErC,gCAAgC;IAChC,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxC,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAExC,+DAA+D;IAC/D,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,KAAK,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACtC,4BAA4B,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,mEAAmE;IACnE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE5B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE3C,8EAA8E;IAC9E,mFAAmF;IACnF,oFAAoF;IACpF,4EAA4E;IAC5E,qEAAqE;IACrE,qDAAqD;IACrD,EAAE;IACF,uFAAuF;IACvF,kFAAkF;IAClF,8EAA8E;IAC9E,qFAAqF;IACrF,uFAAuF;IACvF,wEAAwE;IACxE,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAW,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;YACvC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,wCAAwC,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAEvE,uEAAuE;IACvE,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAElC,0EAA0E;IAC1E,yEAAyE;IACzE,sEAAsE;IACtE,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,sBAAsB,EAAE,CAAC;QACvC,4BAA4B,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,oCAAoC;IACpC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAErC,4BAA4B;IAC5B,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACjD,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC/C,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC/C,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAE7C,uDAAuD;IACvD,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAElC,6BAA6B;IAC7B,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEvC,2BAA2B;IAC3B,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1D,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,YAAY,IAAI,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,CAAC;QACpE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,gCAAgC;IAChC,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxC,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAExC,+DAA+D;IAC/D,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,oEAAoE;IACpE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE5B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,iCAAiC;IACjC,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC3D,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,sBAAsB;IACtB,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,uDAAuD;QACvD,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,mCAAmC;SACzD,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,kCAAkC;SACxD,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,MAAc;IAQd,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,wBAAwB;QACxB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAChE,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,MAAM;YACR,CAAC;YACD,SAAS,EAAE,CAAC;QACd,CAAC;QAED,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;YAC/C,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;YAE/D,WAAW,CAAC,IAAI,CAAC,gCAAgC,SAAS,GAAG,CAAC,CAAC;YAC/D,WAAW,CAAC,IAAI,CAAC,mBAAmB,eAAe,MAAM,CAAC,CAAC;YAC3D,WAAW,CAAC,IAAI,CAAC,mBAAmB,aAAa,MAAM,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,QAAQ,KAAK,MAAM;QAC9B,mBAAmB,EAAE,kBAAkB,KAAK,gBAAgB;QAC5D,cAAc,EAAE,QAAQ,CAAC,MAAM;QAC/B,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,WAAW;KACZ,CAAC;AACJ,CAAC"}