@bendyline/squisq-formats 1.2.3 → 1.3.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.
- package/dist/__tests__/html.test.js +78 -4
- package/dist/__tests__/html.test.js.map +1 -1
- package/dist/__tests__/pdfExport.test.js +1 -1
- package/dist/__tests__/pdfExport.test.js.map +1 -1
- package/dist/__tests__/plainHtml.test.d.ts +5 -0
- package/dist/__tests__/plainHtml.test.d.ts.map +1 -0
- package/dist/__tests__/plainHtml.test.js +327 -0
- package/dist/__tests__/plainHtml.test.js.map +1 -0
- package/dist/__tests__/plainHtmlBundle.test.d.ts +11 -0
- package/dist/__tests__/plainHtmlBundle.test.d.ts.map +1 -0
- package/dist/__tests__/plainHtmlBundle.test.js +210 -0
- package/dist/__tests__/plainHtmlBundle.test.js.map +1 -0
- package/dist/chunk-33YRFXZZ.js +1187 -0
- package/dist/chunk-33YRFXZZ.js.map +1 -0
- package/dist/{chunk-EUQQYBZZ.js → chunk-ERZ627GR.js} +4 -4
- package/dist/chunk-ERZ627GR.js.map +1 -0
- package/dist/{chunk-MEZF76JA.js → chunk-UDS45KUJ.js} +68 -25
- package/dist/chunk-UDS45KUJ.js.map +1 -0
- package/dist/{chunk-NGWHV77G.js → chunk-VN2KEOYB.js} +7 -6
- package/dist/chunk-VN2KEOYB.js.map +1 -0
- package/dist/docx/export.d.ts.map +1 -1
- package/dist/docx/export.js +153 -22
- package/dist/docx/export.js.map +1 -1
- package/dist/epub/export.js +3 -3
- package/dist/epub/export.js.map +1 -1
- package/dist/html/docsHtmlBundle.d.ts +53 -0
- package/dist/html/docsHtmlBundle.d.ts.map +1 -0
- package/dist/html/docsHtmlBundle.js +299 -0
- package/dist/html/docsHtmlBundle.js.map +1 -0
- package/dist/html/htmlTemplate.d.ts.map +1 -1
- package/dist/html/htmlTemplate.js +43 -0
- package/dist/html/htmlTemplate.js.map +1 -1
- package/dist/html/index.d.ts +6 -0
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +31 -3
- package/dist/html/index.js.map +1 -1
- package/dist/html/plainHtml.d.ts +79 -0
- package/dist/html/plainHtml.d.ts.map +1 -0
- package/dist/html/plainHtml.js +614 -0
- package/dist/html/plainHtml.js.map +1 -0
- package/dist/html/plainHtmlBundle.d.ts +93 -0
- package/dist/html/plainHtmlBundle.d.ts.map +1 -0
- package/dist/html/plainHtmlBundle.js +357 -0
- package/dist/html/plainHtmlBundle.js.map +1 -0
- package/dist/pptx/export.d.ts.map +1 -1
- package/dist/pptx/export.js +10 -8
- package/dist/pptx/export.js.map +1 -1
- package/package.json +3 -2
- package/src/__tests__/html.test.ts +82 -4
- package/src/__tests__/pdfExport.test.ts +1 -1
- package/src/__tests__/plainHtml.test.ts +372 -0
- package/src/__tests__/plainHtmlBundle.test.ts +235 -0
- package/src/docx/export.ts +163 -22
- package/src/epub/export.ts +3 -3
- package/src/html/docsHtmlBundle.ts +369 -0
- package/src/html/htmlTemplate.ts +40 -0
- package/src/html/index.ts +32 -3
- package/src/html/plainHtml.ts +736 -0
- package/src/html/plainHtmlBundle.ts +419 -0
- package/src/pptx/export.ts +10 -9
- package/dist/chunk-EUQQYBZZ.js.map +0 -1
- package/dist/chunk-MEZF76JA.js.map +0 -1
- package/dist/chunk-NGWHV77G.js.map +0 -1
- package/dist/chunk-UM5V2XZG.js +0 -242
- package/dist/chunk-UM5V2XZG.js.map +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the recursive plain-HTML bundle export
|
|
3
|
+
* (`markdownDocsToPlainHtmlBundle`).
|
|
4
|
+
*
|
|
5
|
+
* Each test sets up an in-memory "container" — a `Map<path, string>`
|
|
6
|
+
* for markdown sources and a `Map<path, ArrayBuffer>` for binary
|
|
7
|
+
* assets — wires it up as the `readDocument` / `readBinary` callbacks,
|
|
8
|
+
* exports the bundle, and inspects the resulting JSZip.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import JSZip from 'jszip';
|
|
12
|
+
import { markdownDocsToPlainHtmlBundle } from '../html/plainHtmlBundle';
|
|
13
|
+
/** Helper to read a Blob as Uint8Array (works in jsdom). */
|
|
14
|
+
async function blobToUint8Array(blob) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const reader = new FileReader();
|
|
17
|
+
reader.onload = () => resolve(new Uint8Array(reader.result));
|
|
18
|
+
reader.onerror = () => reject(reader.error);
|
|
19
|
+
reader.readAsArrayBuffer(blob);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function makeContainer(docs, binaries = {}) {
|
|
23
|
+
return {
|
|
24
|
+
readDocument: async (p) => (p in docs ? docs[p] : null),
|
|
25
|
+
readBinary: async (p) => (p in binaries ? binaries[p] : null),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async function readZipPath(blob, path) {
|
|
29
|
+
const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
|
|
30
|
+
const file = zip.file(path);
|
|
31
|
+
return file ? file.async('text') : null;
|
|
32
|
+
}
|
|
33
|
+
async function listZipPaths(blob) {
|
|
34
|
+
const zip = await JSZip.loadAsync(await blobToUint8Array(blob));
|
|
35
|
+
// JSZip emits implicit directory entries (paths ending in `/`) when
|
|
36
|
+
// any file lives in a subfolder. We're testing file content; the
|
|
37
|
+
// directory placeholders are noise.
|
|
38
|
+
return Object.keys(zip.files)
|
|
39
|
+
.filter((p) => !p.endsWith('/'))
|
|
40
|
+
.sort();
|
|
41
|
+
}
|
|
42
|
+
describe('markdownDocsToPlainHtmlBundle', () => {
|
|
43
|
+
it('exports a single doc with no links to a 1-file html', async () => {
|
|
44
|
+
const c = makeContainer({ 'home.md': '# Home\n\nJust a single page.' });
|
|
45
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
46
|
+
entryPath: 'home.md',
|
|
47
|
+
...c,
|
|
48
|
+
});
|
|
49
|
+
const paths = await listZipPaths(blob);
|
|
50
|
+
expect(paths).toEqual(['home.html']);
|
|
51
|
+
const html = await readZipPath(blob, 'home.html');
|
|
52
|
+
expect(html).toContain('<h1>Home</h1>');
|
|
53
|
+
});
|
|
54
|
+
it('follows a linear chain home.md → resume.md and bundles both', async () => {
|
|
55
|
+
const c = makeContainer({
|
|
56
|
+
'home.md': '# Home\n\nMy [resume](resume.md) is here.',
|
|
57
|
+
'resume.md': '# Resume\n\nWork history.',
|
|
58
|
+
});
|
|
59
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
60
|
+
entryPath: 'home.md',
|
|
61
|
+
...c,
|
|
62
|
+
});
|
|
63
|
+
const paths = await listZipPaths(blob);
|
|
64
|
+
expect(paths).toContain('home.html');
|
|
65
|
+
expect(paths).toContain('resume.html');
|
|
66
|
+
const home = await readZipPath(blob, 'home.html');
|
|
67
|
+
// The .md link is rewritten to .html
|
|
68
|
+
expect(home).toContain('href="resume.html"');
|
|
69
|
+
expect(home).not.toContain('href="resume.md"');
|
|
70
|
+
const resume = await readZipPath(blob, 'resume.html');
|
|
71
|
+
expect(resume).toContain('<h1>Resume</h1>');
|
|
72
|
+
});
|
|
73
|
+
it('cycle-detects so a.md ↔ b.md does not loop', async () => {
|
|
74
|
+
const c = makeContainer({
|
|
75
|
+
'a.md': '# A\n\n[b](b.md)',
|
|
76
|
+
'b.md': '# B\n\n[a](a.md)',
|
|
77
|
+
});
|
|
78
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
79
|
+
entryPath: 'a.md',
|
|
80
|
+
...c,
|
|
81
|
+
});
|
|
82
|
+
const paths = await listZipPaths(blob);
|
|
83
|
+
expect(paths.sort()).toEqual(['a.html', 'b.html']);
|
|
84
|
+
});
|
|
85
|
+
it('does NOT follow ../parent.md (scope rule)', async () => {
|
|
86
|
+
const c = makeContainer({
|
|
87
|
+
'subdir/intro.md': '# Intro\n\nLink to [parent](../outside.md).',
|
|
88
|
+
'outside.md': '# Outside',
|
|
89
|
+
});
|
|
90
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
91
|
+
entryPath: 'subdir/intro.md',
|
|
92
|
+
...c,
|
|
93
|
+
});
|
|
94
|
+
const paths = await listZipPaths(blob);
|
|
95
|
+
// `outside.md` lives ABOVE the entry doc's directory → out of scope.
|
|
96
|
+
expect(paths).toEqual(['subdir/intro.html']);
|
|
97
|
+
const intro = await readZipPath(blob, 'subdir/intro.html');
|
|
98
|
+
// The link is not rewritten to .html — it stays as authored.
|
|
99
|
+
expect(intro).toContain('href="../outside.md"');
|
|
100
|
+
});
|
|
101
|
+
it('follows links into subfolders (still in scope)', async () => {
|
|
102
|
+
const c = makeContainer({
|
|
103
|
+
'home.md': '# Home\n\n[chapter 1](chapters/one.md)',
|
|
104
|
+
'chapters/one.md': '# Chapter 1\n\nContent.',
|
|
105
|
+
});
|
|
106
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
107
|
+
entryPath: 'home.md',
|
|
108
|
+
...c,
|
|
109
|
+
});
|
|
110
|
+
const paths = await listZipPaths(blob);
|
|
111
|
+
expect(paths).toContain('home.html');
|
|
112
|
+
expect(paths).toContain('chapters/one.html');
|
|
113
|
+
const home = await readZipPath(blob, 'home.html');
|
|
114
|
+
expect(home).toContain('href="chapters/one.html"');
|
|
115
|
+
});
|
|
116
|
+
it('preserves #anchor fragments when rewriting .md → .html', async () => {
|
|
117
|
+
const c = makeContainer({
|
|
118
|
+
'home.md': '# Home\n\nJump to [exp](resume.md#experience).',
|
|
119
|
+
'resume.md': '# Resume\n\n## Experience',
|
|
120
|
+
});
|
|
121
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
122
|
+
entryPath: 'home.md',
|
|
123
|
+
...c,
|
|
124
|
+
});
|
|
125
|
+
const home = await readZipPath(blob, 'home.html');
|
|
126
|
+
expect(home).toContain('href="resume.html#experience"');
|
|
127
|
+
});
|
|
128
|
+
it('aborts with an error when a linked doc cannot be read', async () => {
|
|
129
|
+
const c = makeContainer({
|
|
130
|
+
'home.md': '# Home\n\n[missing](does-not-exist.md)',
|
|
131
|
+
});
|
|
132
|
+
await expect(markdownDocsToPlainHtmlBundle({ entryPath: 'home.md', ...c })).rejects.toThrow(/failed to read.*does-not-exist\.md/i);
|
|
133
|
+
});
|
|
134
|
+
it('emits image assets at their authored relative paths inside the zip', async () => {
|
|
135
|
+
const png = new Uint8Array([0x89, 0x50, 0x4e, 0x47]).buffer;
|
|
136
|
+
const c = makeContainer({ 'home.md': '# Home\n\n' }, { 'home_files/hero.png': png });
|
|
137
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
138
|
+
entryPath: 'home.md',
|
|
139
|
+
...c,
|
|
140
|
+
});
|
|
141
|
+
const paths = await listZipPaths(blob);
|
|
142
|
+
expect(paths).toContain('home_files/hero.png');
|
|
143
|
+
const home = await readZipPath(blob, 'home.html');
|
|
144
|
+
expect(home).toContain('src="home_files/hero.png"');
|
|
145
|
+
});
|
|
146
|
+
it('linked sub-folder docs reference parent assets via ../', async () => {
|
|
147
|
+
// The doc lives in subdir/, the image in home_files/, so the
|
|
148
|
+
// rewritten src should walk up one level.
|
|
149
|
+
const png = new Uint8Array([0x89]).buffer;
|
|
150
|
+
const c = makeContainer({
|
|
151
|
+
'home.md': '# Home\n\n[deep](chapters/one.md)',
|
|
152
|
+
'chapters/one.md': '# One\n\n',
|
|
153
|
+
}, { 'home_files/hero.png': png });
|
|
154
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
155
|
+
entryPath: 'home.md',
|
|
156
|
+
...c,
|
|
157
|
+
});
|
|
158
|
+
const paths = await listZipPaths(blob);
|
|
159
|
+
expect(paths).toContain('home_files/hero.png');
|
|
160
|
+
const one = await readZipPath(blob, 'chapters/one.html');
|
|
161
|
+
expect(one).toContain('src="../home_files/hero.png"');
|
|
162
|
+
});
|
|
163
|
+
it('passes the entry title through; sibling docs derive title from the shallowest heading', async () => {
|
|
164
|
+
const c = makeContainer({
|
|
165
|
+
'home.md': '# Home\n\n[resume](resume.md)\n\n[notes](notes.md)',
|
|
166
|
+
'resume.md': '# Resume',
|
|
167
|
+
'notes.md': 'Just a paragraph.',
|
|
168
|
+
});
|
|
169
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
170
|
+
entryPath: 'home.md',
|
|
171
|
+
title: 'My Home Page',
|
|
172
|
+
...c,
|
|
173
|
+
});
|
|
174
|
+
const home = await readZipPath(blob, 'home.html');
|
|
175
|
+
expect(home).toContain('<title>My Home Page</title>');
|
|
176
|
+
// Heading-bearing sibling uses its heading text, not the filename.
|
|
177
|
+
const resume = await readZipPath(blob, 'resume.html');
|
|
178
|
+
expect(resume).toContain('<title>Resume</title>');
|
|
179
|
+
// Heading-less sibling falls back to the filename.
|
|
180
|
+
const notes = await readZipPath(blob, 'notes.html');
|
|
181
|
+
expect(notes).toContain('<title>notes</title>');
|
|
182
|
+
});
|
|
183
|
+
it('respects maxDepth — depth 0 means entry only, no link following', async () => {
|
|
184
|
+
const c = makeContainer({
|
|
185
|
+
'home.md': '# Home\n\n[resume](resume.md)',
|
|
186
|
+
'resume.md': '# Resume',
|
|
187
|
+
});
|
|
188
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
189
|
+
entryPath: 'home.md',
|
|
190
|
+
maxDepth: 0,
|
|
191
|
+
...c,
|
|
192
|
+
});
|
|
193
|
+
const paths = await listZipPaths(blob);
|
|
194
|
+
expect(paths).toEqual(['home.html']);
|
|
195
|
+
});
|
|
196
|
+
it('does not rewrite external links (http://) or fragment-only links', async () => {
|
|
197
|
+
const c = makeContainer({
|
|
198
|
+
'home.md': '[google](https://google.com)\n\n[#section](#somewhere)\n\n[email](mailto:me@example.com)',
|
|
199
|
+
});
|
|
200
|
+
const blob = await markdownDocsToPlainHtmlBundle({
|
|
201
|
+
entryPath: 'home.md',
|
|
202
|
+
...c,
|
|
203
|
+
});
|
|
204
|
+
const home = await readZipPath(blob, 'home.html');
|
|
205
|
+
expect(home).toContain('href="https://google.com"');
|
|
206
|
+
expect(home).toContain('href="#somewhere"');
|
|
207
|
+
expect(home).toContain('href="mailto:me@example.com"');
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=plainHtmlBundle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plainHtmlBundle.test.js","sourceRoot":"","sources":["../../src/__tests__/plainHtmlBundle.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAExE,4DAA4D;AAC5D,KAAK,UAAU,gBAAgB,CAAC,IAAU;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAqB,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAA4B,EAAE,WAAwC,EAAE;IAC7F,OAAO;QACL,YAAY,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,UAAU,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAU,EAAE,IAAY;IACjD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAU;IACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,oEAAoE;IACpE,iEAAiE;IACjE,oCAAoC;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SAC/B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,SAAS,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EAAE,2CAA2C;YACtD,WAAW,EAAE,2BAA2B;SACzC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,qCAAqC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,MAAM;YACjB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,iBAAiB,EAAE,6CAA6C;YAChE,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,iBAAiB;YAC5B,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,qEAAqE;QACrE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC3D,6DAA6D;QAC7D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EAAE,wCAAwC;YACnD,iBAAiB,EAAE,yBAAyB;SAC7C,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EAAE,gDAAgD;YAC3D,WAAW,EAAE,2BAA2B;SACzC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EAAE,wCAAwC;SACpD,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,6BAA6B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzF,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,MAAM,CAAC,GAAG,aAAa,CACrB,EAAE,SAAS,EAAE,wCAAwC,EAAE,EACvD,EAAE,qBAAqB,EAAE,GAAG,EAAE,CAC/B,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,6DAA6D;QAC7D,0CAA0C;QAC1C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1C,MAAM,CAAC,GAAG,aAAa,CACrB;YACE,SAAS,EAAE,mCAAmC;YAC9C,iBAAiB,EAAE,4CAA4C;SAChE,EACD,EAAE,qBAAqB,EAAE,GAAG,EAAE,CAC/B,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EAAE,oDAAoD;YAC/D,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,mBAAmB;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,cAAc;YACrB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACtD,mEAAmE;QACnE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,mDAAmD;QACnD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EAAE,+BAA+B;YAC1C,WAAW,EAAE,UAAU;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,CAAC;YACX,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,CAAC,GAAG,aAAa,CAAC;YACtB,SAAS,EACP,0FAA0F;SAC7F,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,6BAA6B,CAAC;YAC/C,SAAS,EAAE,SAAS;YACpB,GAAG,CAAC;SACL,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|