stitch-forge 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/.claude/skills/forge-build/SKILL.md +79 -0
  2. package/.claude/skills/forge-design/SKILL.md +64 -0
  3. package/.claude/skills/forge-discover/SKILL.md +139 -0
  4. package/.claude/skills/forge-generate/SKILL.md +77 -0
  5. package/.claude/skills/forge-preview/SKILL.md +26 -0
  6. package/.claude/skills/forge-research/SKILL.md +42 -0
  7. package/.claude/skills/forge-sync/SKILL.md +45 -0
  8. package/DESIGN.md +113 -0
  9. package/LICENSE +21 -0
  10. package/README.es.md +242 -0
  11. package/README.md +242 -0
  12. package/dist/adapters/astro.d.ts +8 -0
  13. package/dist/adapters/astro.js +24 -0
  14. package/dist/adapters/astro.js.map +1 -0
  15. package/dist/adapters/index.d.ts +3 -0
  16. package/dist/adapters/index.js +9 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/nextjs.d.ts +7 -0
  19. package/dist/adapters/nextjs.js +136 -0
  20. package/dist/adapters/nextjs.js.map +1 -0
  21. package/dist/adapters/static.d.ts +7 -0
  22. package/dist/adapters/static.js +43 -0
  23. package/dist/adapters/static.js.map +1 -0
  24. package/dist/adapters/types.d.ts +22 -0
  25. package/dist/adapters/types.js +6 -0
  26. package/dist/adapters/types.js.map +1 -0
  27. package/dist/commands/build.d.ts +7 -0
  28. package/dist/commands/build.js +98 -0
  29. package/dist/commands/build.js.map +1 -0
  30. package/dist/commands/design.d.ts +3 -0
  31. package/dist/commands/design.js +39 -0
  32. package/dist/commands/design.js.map +1 -0
  33. package/dist/commands/discover.d.ts +9 -0
  34. package/dist/commands/discover.js +91 -0
  35. package/dist/commands/discover.js.map +1 -0
  36. package/dist/commands/generate.d.ts +7 -0
  37. package/dist/commands/generate.js +105 -0
  38. package/dist/commands/generate.js.map +1 -0
  39. package/dist/commands/init.d.ts +1 -0
  40. package/dist/commands/init.js +99 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/preview.d.ts +5 -0
  43. package/dist/commands/preview.js +41 -0
  44. package/dist/commands/preview.js.map +1 -0
  45. package/dist/commands/research.d.ts +1 -0
  46. package/dist/commands/research.js +38 -0
  47. package/dist/commands/research.js.map +1 -0
  48. package/dist/commands/sync.d.ts +1 -0
  49. package/dist/commands/sync.js +53 -0
  50. package/dist/commands/sync.js.map +1 -0
  51. package/dist/commands/workflow.d.ts +1 -0
  52. package/dist/commands/workflow.js +38 -0
  53. package/dist/commands/workflow.js.map +1 -0
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.js +113 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp/auth.d.ts +15 -0
  58. package/dist/mcp/auth.js +56 -0
  59. package/dist/mcp/auth.js.map +1 -0
  60. package/dist/mcp/client.d.ts +65 -0
  61. package/dist/mcp/client.js +302 -0
  62. package/dist/mcp/client.js.map +1 -0
  63. package/dist/mcp/tools.d.ts +26 -0
  64. package/dist/mcp/tools.js +46 -0
  65. package/dist/mcp/tools.js.map +1 -0
  66. package/dist/research/business-researcher.d.ts +41 -0
  67. package/dist/research/business-researcher.js +888 -0
  68. package/dist/research/business-researcher.js.map +1 -0
  69. package/dist/research/crawler.d.ts +11 -0
  70. package/dist/research/crawler.js +56 -0
  71. package/dist/research/crawler.js.map +1 -0
  72. package/dist/research/design-synthesizer.d.ts +46 -0
  73. package/dist/research/design-synthesizer.js +628 -0
  74. package/dist/research/design-synthesizer.js.map +1 -0
  75. package/dist/research/differ.d.ts +19 -0
  76. package/dist/research/differ.js +58 -0
  77. package/dist/research/differ.js.map +1 -0
  78. package/dist/research/known-state.json +68 -0
  79. package/dist/research/research-cache.d.ts +6 -0
  80. package/dist/research/research-cache.js +62 -0
  81. package/dist/research/research-cache.js.map +1 -0
  82. package/dist/research/types.d.ts +98 -0
  83. package/dist/research/types.js +6 -0
  84. package/dist/research/types.js.map +1 -0
  85. package/dist/research/updater.d.ts +5 -0
  86. package/dist/research/updater.js +43 -0
  87. package/dist/research/updater.js.map +1 -0
  88. package/dist/templates/design-md.d.ts +52 -0
  89. package/dist/templates/design-md.js +315 -0
  90. package/dist/templates/design-md.js.map +1 -0
  91. package/dist/templates/prompts.d.ts +31 -0
  92. package/dist/templates/prompts.js +39 -0
  93. package/dist/templates/prompts.js.map +1 -0
  94. package/dist/templates/workflows.d.ts +9 -0
  95. package/dist/templates/workflows.js +21 -0
  96. package/dist/templates/workflows.js.map +1 -0
  97. package/dist/tui/App.d.ts +1 -0
  98. package/dist/tui/App.js +87 -0
  99. package/dist/tui/App.js.map +1 -0
  100. package/dist/tui/Dashboard.d.ts +5 -0
  101. package/dist/tui/Dashboard.js +23 -0
  102. package/dist/tui/Dashboard.js.map +1 -0
  103. package/dist/tui/DesignEditor.d.ts +6 -0
  104. package/dist/tui/DesignEditor.js +76 -0
  105. package/dist/tui/DesignEditor.js.map +1 -0
  106. package/dist/tui/PromptBuilder.d.ts +5 -0
  107. package/dist/tui/PromptBuilder.js +102 -0
  108. package/dist/tui/PromptBuilder.js.map +1 -0
  109. package/dist/tui/components/QuotaMeter.d.ts +8 -0
  110. package/dist/tui/components/QuotaMeter.js +10 -0
  111. package/dist/tui/components/QuotaMeter.js.map +1 -0
  112. package/dist/tui/components/ScreenCard.d.ts +7 -0
  113. package/dist/tui/components/ScreenCard.js +6 -0
  114. package/dist/tui/components/ScreenCard.js.map +1 -0
  115. package/dist/tui/components/Spinner.d.ts +5 -0
  116. package/dist/tui/components/Spinner.js +7 -0
  117. package/dist/tui/components/Spinner.js.map +1 -0
  118. package/dist/tui/components/StatusBar.d.ts +7 -0
  119. package/dist/tui/components/StatusBar.js +6 -0
  120. package/dist/tui/components/StatusBar.js.map +1 -0
  121. package/dist/utils/config.d.ts +26 -0
  122. package/dist/utils/config.js +66 -0
  123. package/dist/utils/config.js.map +1 -0
  124. package/dist/utils/design-validator.d.ts +44 -0
  125. package/dist/utils/design-validator.js +396 -0
  126. package/dist/utils/design-validator.js.map +1 -0
  127. package/dist/utils/logger.d.ts +8 -0
  128. package/dist/utils/logger.js +10 -0
  129. package/dist/utils/logger.js.map +1 -0
  130. package/dist/utils/output-validator.d.ts +18 -0
  131. package/dist/utils/output-validator.js +194 -0
  132. package/dist/utils/output-validator.js.map +1 -0
  133. package/dist/utils/preview.d.ts +4 -0
  134. package/dist/utils/preview.js +49 -0
  135. package/dist/utils/preview.js.map +1 -0
  136. package/dist/utils/prompt-enhancer.d.ts +21 -0
  137. package/dist/utils/prompt-enhancer.js +104 -0
  138. package/dist/utils/prompt-enhancer.js.map +1 -0
  139. package/dist/utils/quota.d.ts +18 -0
  140. package/dist/utils/quota.js +49 -0
  141. package/dist/utils/quota.js.map +1 -0
  142. package/dist/utils/validators.d.ts +125 -0
  143. package/dist/utils/validators.js +110 -0
  144. package/dist/utils/validators.js.map +1 -0
  145. package/package.json +77 -0
@@ -0,0 +1,628 @@
1
+ /**
2
+ * Design Synthesizer — transforms BusinessResearchResult into a tailored DESIGN.md.
3
+ *
4
+ * Uses real brand data (colors, fonts, competitor analysis) when available,
5
+ * falling back to the static template generator for low-confidence research.
6
+ */
7
+ import { generateDesignMdTemplate, matchIndustry, matchAesthetic, generateImageryGuidelines, generateDosAndDonts, } from '../templates/design-md.js';
8
+ import { scoreDesignMd } from '../utils/design-validator.js';
9
+ // ─── Color naming utility ──────────────────────────────────────────
10
+ function parseHexToRgb(hex) {
11
+ const clean = hex.replace('#', '');
12
+ return [
13
+ parseInt(clean.substring(0, 2), 16),
14
+ parseInt(clean.substring(2, 4), 16),
15
+ parseInt(clean.substring(4, 6), 16),
16
+ ];
17
+ }
18
+ function rgbToHsl(r, g, b) {
19
+ r /= 255;
20
+ g /= 255;
21
+ b /= 255;
22
+ const max = Math.max(r, g, b);
23
+ const min = Math.min(r, g, b);
24
+ const l = (max + min) / 2;
25
+ let h = 0;
26
+ let s = 0;
27
+ if (max !== min) {
28
+ const d = max - min;
29
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
30
+ if (max === r)
31
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
32
+ else if (max === g)
33
+ h = ((b - r) / d + 2) / 6;
34
+ else
35
+ h = ((r - g) / d + 4) / 6;
36
+ }
37
+ return [h * 360, s * 100, l * 100];
38
+ }
39
+ function getHueCategory(hue) {
40
+ if (hue < 15 || hue >= 345)
41
+ return 'Red';
42
+ if (hue < 40)
43
+ return 'Orange';
44
+ if (hue < 70)
45
+ return 'Yellow';
46
+ if (hue < 150)
47
+ return 'Green';
48
+ if (hue < 190)
49
+ return 'Teal';
50
+ if (hue < 270)
51
+ return 'Blue';
52
+ if (hue < 310)
53
+ return 'Purple';
54
+ if (hue < 345)
55
+ return 'Rose';
56
+ return 'Red';
57
+ }
58
+ function getToneWord(saturation, lightness) {
59
+ if (lightness < 25)
60
+ return 'Deep';
61
+ if (lightness > 80)
62
+ return 'Light';
63
+ if (saturation > 70)
64
+ return 'Vivid';
65
+ if (saturation < 20)
66
+ return 'Muted';
67
+ if (lightness < 40)
68
+ return 'Dark';
69
+ return 'Rich';
70
+ }
71
+ /**
72
+ * Generates a descriptive name for a hex color given a context word.
73
+ * E.g. nameColor('#DC0C0C', 'Storefront') -> "Storefront Red"
74
+ */
75
+ export function nameColor(hex, context) {
76
+ const [r, g, b] = parseHexToRgb(hex);
77
+ const [hue, saturation, lightness] = rgbToHsl(r, g, b);
78
+ // Very low saturation = grayscale
79
+ if (saturation < 10) {
80
+ if (lightness < 20)
81
+ return `${context} Black`;
82
+ if (lightness > 90)
83
+ return `${context} White`;
84
+ return `${context} Gray`;
85
+ }
86
+ const hueCategory = getHueCategory(hue);
87
+ // Refine common hue+tone combos
88
+ if (hueCategory === 'Blue' && lightness < 30)
89
+ return `${context} Navy`;
90
+ if (hueCategory === 'Green' && saturation < 40)
91
+ return `${context} Sage`;
92
+ if (hueCategory === 'Red' && lightness < 35)
93
+ return `${context} Crimson`;
94
+ if (hueCategory === 'Orange' && lightness > 60)
95
+ return `${context} Amber`;
96
+ return `${context} ${hueCategory}`;
97
+ }
98
+ // ─── Hex distance utility ──────────────────────────────────────────
99
+ function hexDistance(a, b) {
100
+ const [r1, g1, b1] = parseHexToRgb(a);
101
+ const [r2, g2, b2] = parseHexToRgb(b);
102
+ return Math.sqrt((r1 - r2) ** 2 + (g1 - g2) ** 2 + (b1 - b2) ** 2);
103
+ }
104
+ function shiftHue(hex, degrees) {
105
+ const [r, g, b] = parseHexToRgb(hex);
106
+ const [h, s, l] = rgbToHsl(r, g, b);
107
+ const newH = (h + degrees + 360) % 360;
108
+ return hslToHex(newH, s, l);
109
+ }
110
+ function hslToHex(h, s, l) {
111
+ s /= 100;
112
+ l /= 100;
113
+ const a = s * Math.min(l, 1 - l);
114
+ const f = (n) => {
115
+ const k = (n + h / 30) % 12;
116
+ const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
117
+ return Math.round(255 * color)
118
+ .toString(16)
119
+ .padStart(2, '0');
120
+ };
121
+ return `#${f(0)}${f(8)}${f(4)}`.toUpperCase();
122
+ }
123
+ // ─── Curated font lists ────────────────────────────────────────────
124
+ const SERIF_HEADINGS = [
125
+ 'DM Serif Display',
126
+ 'Instrument Serif',
127
+ 'Playfair Display',
128
+ 'Lora',
129
+ 'Merriweather',
130
+ ];
131
+ const SANS_HEADINGS = [
132
+ 'Space Grotesk',
133
+ 'Outfit',
134
+ 'Sora',
135
+ 'DM Sans',
136
+ 'Manrope',
137
+ 'General Sans',
138
+ ];
139
+ const BODY_FONTS = [
140
+ 'Libre Franklin',
141
+ 'Source Sans 3',
142
+ 'Nunito Sans',
143
+ 'Instrument Sans',
144
+ 'Work Sans',
145
+ ];
146
+ export function synthesizePalette(research) {
147
+ const aesthetic = matchAesthetic(research.brief.aesthetic);
148
+ let primaryHex;
149
+ let primaryName;
150
+ let primaryRationale;
151
+ let secondaryHex;
152
+ let secondaryName;
153
+ let secondaryRationale;
154
+ let accentHex;
155
+ let accentName;
156
+ let accentRationale;
157
+ const hasSitePalette = research.currentSite?.palette &&
158
+ research.currentSite.palette.colors.length > 0;
159
+ if (hasSitePalette) {
160
+ // Priority 1: Use real brand colors from current site
161
+ const site = research.currentSite;
162
+ const dominant = site.palette.dominantHex || site.palette.colors[0].hex;
163
+ primaryHex = dominant;
164
+ primaryName = nameColor(dominant, 'Brand');
165
+ primaryRationale = `Extracted from existing site ${site.url} — maintains brand continuity`;
166
+ if (site.palette.accentHex) {
167
+ secondaryHex = site.palette.accentHex;
168
+ secondaryName = nameColor(site.palette.accentHex, 'Accent');
169
+ secondaryRationale = `Accent color from existing site — preserves established visual hierarchy`;
170
+ }
171
+ else if (site.palette.colors.length > 1) {
172
+ const second = site.palette.colors[1];
173
+ secondaryHex = second.hex;
174
+ secondaryName = nameColor(second.hex, 'Supporting');
175
+ secondaryRationale = `Secondary color from existing site palette`;
176
+ }
177
+ else {
178
+ const industryPalette = matchIndustry(research.brief.industry);
179
+ secondaryHex = industryPalette.secondary.hex;
180
+ secondaryName = industryPalette.secondary.name;
181
+ secondaryRationale = `Industry-standard secondary for ${research.brief.industry}`;
182
+ }
183
+ // Check if primary is too similar to competitors
184
+ if (research.competitors.length > 0) {
185
+ for (const comp of research.competitors) {
186
+ if (comp.palette.dominantHex &&
187
+ hexDistance(primaryHex, comp.palette.dominantHex) < 50) {
188
+ // Shift hue to differentiate
189
+ primaryHex = shiftHue(primaryHex, 30);
190
+ primaryName = nameColor(primaryHex, 'Distinct');
191
+ primaryRationale += ` (hue shifted +30deg to differentiate from ${comp.name})`;
192
+ break;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ else if (research.competitors.length > 0) {
198
+ // Priority 2: Use industry palette but differentiate from competitors
199
+ const industryPalette = matchIndustry(research.brief.industry);
200
+ primaryHex = industryPalette.primary.hex;
201
+ primaryName = industryPalette.primary.name;
202
+ primaryRationale = `Industry palette for ${research.brief.industry}`;
203
+ // Check for competitor collision
204
+ for (const comp of research.competitors) {
205
+ if (comp.palette.dominantHex &&
206
+ hexDistance(primaryHex, comp.palette.dominantHex) < 50) {
207
+ primaryHex = shiftHue(primaryHex, 30);
208
+ primaryName = nameColor(primaryHex, 'Distinct');
209
+ primaryRationale = `Industry palette shifted to differentiate from ${comp.name}`;
210
+ break;
211
+ }
212
+ }
213
+ secondaryHex = industryPalette.secondary.hex;
214
+ secondaryName = industryPalette.secondary.name;
215
+ secondaryRationale = `Industry-standard secondary for ${research.brief.industry}`;
216
+ if (industryPalette.accent) {
217
+ accentHex = industryPalette.accent.hex;
218
+ accentName = industryPalette.accent.name;
219
+ accentRationale = `Industry accent for ${research.brief.industry}`;
220
+ }
221
+ }
222
+ else {
223
+ // Priority 3: Pure industry palette fallback
224
+ const industryPalette = matchIndustry(research.brief.industry);
225
+ primaryHex = industryPalette.primary.hex;
226
+ primaryName = industryPalette.primary.name;
227
+ primaryRationale = `Industry palette for ${research.brief.industry} (no site or competitor data available)`;
228
+ secondaryHex = industryPalette.secondary.hex;
229
+ secondaryName = industryPalette.secondary.name;
230
+ secondaryRationale = `Industry-standard secondary for ${research.brief.industry}`;
231
+ if (industryPalette.accent) {
232
+ accentHex = industryPalette.accent.hex;
233
+ accentName = industryPalette.accent.name;
234
+ accentRationale = `Industry accent for ${research.brief.industry}`;
235
+ }
236
+ }
237
+ const result = {
238
+ primary: { name: primaryName, hex: primaryHex, rationale: primaryRationale },
239
+ secondary: {
240
+ name: secondaryName,
241
+ hex: secondaryHex,
242
+ rationale: secondaryRationale,
243
+ },
244
+ surface: { name: aesthetic.surface.name, hex: aesthetic.surface.hex },
245
+ onSurface: { name: aesthetic.onSurface.name, hex: aesthetic.onSurface.hex },
246
+ muted: { name: aesthetic.muted.name, hex: aesthetic.muted.hex },
247
+ };
248
+ if (accentHex && accentName && accentRationale) {
249
+ result.accent = {
250
+ name: accentName,
251
+ hex: accentHex,
252
+ rationale: accentRationale,
253
+ };
254
+ }
255
+ return result;
256
+ }
257
+ export function synthesizeTypography(research) {
258
+ const aesthetic = matchAesthetic(research.brief.aesthetic);
259
+ // Priority 1: Keep existing brand fonts
260
+ if (research.currentSite?.typography?.fonts?.length) {
261
+ const site = research.currentSite;
262
+ const heading = site.typography.headingFont || site.typography.fonts[0];
263
+ const body = site.typography.bodyFont ||
264
+ (site.typography.fonts.length > 1
265
+ ? site.typography.fonts[1]
266
+ : BODY_FONTS[0]);
267
+ return {
268
+ heading,
269
+ body,
270
+ mono: aesthetic.monoFont.replace(/"/g, '').split(',')[0].trim(),
271
+ rationale: `Fonts from existing site ${site.url} preserved for brand consistency`,
272
+ };
273
+ }
274
+ // Priority 2: Differentiate from competitors
275
+ if (research.competitors.length > 0) {
276
+ const competitorHeadingFonts = new Set();
277
+ const competitorBodyFonts = new Set();
278
+ for (const comp of research.competitors) {
279
+ if (comp.typography.headingFont) {
280
+ competitorHeadingFonts.add(comp.typography.headingFont);
281
+ }
282
+ if (comp.typography.bodyFont) {
283
+ competitorBodyFonts.add(comp.typography.bodyFont);
284
+ }
285
+ for (const font of comp.typography.fonts) {
286
+ competitorHeadingFonts.add(font);
287
+ competitorBodyFonts.add(font);
288
+ }
289
+ }
290
+ // Determine aesthetic heading category preference
291
+ const aestheticHeading = aesthetic.headingFont;
292
+ const preferSerif = /serif/i.test(aestheticHeading) && !/sans/i.test(aestheticHeading);
293
+ const headingPool = preferSerif ? SERIF_HEADINGS : SANS_HEADINGS;
294
+ // Find a heading font not used by competitors
295
+ let heading = headingPool.find((f) => !competitorHeadingFonts.has(f)) ||
296
+ headingPool[0];
297
+ // Find a body font not used by competitors
298
+ let body = BODY_FONTS.find((f) => !competitorBodyFonts.has(f)) || BODY_FONTS[0];
299
+ const competitorNames = research.competitors
300
+ .map((c) => c.name)
301
+ .join(', ');
302
+ return {
303
+ heading,
304
+ body,
305
+ mono: aesthetic.monoFont.replace(/"/g, '').split(',')[0].trim(),
306
+ rationale: `Chosen to differentiate from competitors (${competitorNames})`,
307
+ };
308
+ }
309
+ // Priority 3: Aesthetic fallback
310
+ return {
311
+ heading: aesthetic.headingFont.replace(/"/g, '').split(',')[0].trim(),
312
+ body: aesthetic.bodyFont.replace(/"/g, '').split(',')[0].trim(),
313
+ mono: aesthetic.monoFont.replace(/"/g, '').split(',')[0].trim(),
314
+ rationale: `Based on ${research.brief.aesthetic} aesthetic defaults`,
315
+ };
316
+ }
317
+ // ─── Imagery synthesizer ──────────────────────────────────────────
318
+ export function synthesizeImagery(research) {
319
+ const lines = [];
320
+ // Base imagery from template system
321
+ const baseImagery = generateImageryGuidelines(research.brief.industry, research.brief.targetAudience);
322
+ lines.push(baseImagery);
323
+ // Cultural considerations from audience insights
324
+ if (research.audienceInsights.culturalConsiderations.length > 0) {
325
+ lines.push('');
326
+ lines.push(`Cultural notes: ${research.audienceInsights.culturalConsiderations.join('. ')}.`);
327
+ }
328
+ // Market position adjustments
329
+ if (research.marketPosition.pricePoint === 'budget') {
330
+ lines.push('');
331
+ lines.push('Emphasize value: show real products with visible pricing, authentic shopping environments, and approachable settings.');
332
+ }
333
+ else if (research.marketPosition.pricePoint === 'premium' ||
334
+ research.marketPosition.pricePoint === 'luxury') {
335
+ lines.push('');
336
+ lines.push('Emphasize quality: editorial-grade photography with minimal backgrounds, studio lighting, and careful composition.');
337
+ }
338
+ // Photo format specs (always include)
339
+ lines.push('');
340
+ lines.push('Standard formats: 16:9 hero banners, 4:3 feature cards, 1:1 product/team thumbnails.');
341
+ // Avoid line
342
+ const avoidItems = [
343
+ 'generic stock photos with artificial smiles',
344
+ 'over-processed HDR imagery',
345
+ ];
346
+ if (research.marketPosition.pricePoint === 'budget' ||
347
+ research.marketPosition.pricePoint === 'mid-range') {
348
+ avoidItems.push('luxury lifestyle imagery that contradicts value positioning');
349
+ }
350
+ if (research.audienceInsights.culturalConsiderations.some((c) => /mexic|latin|español/i.test(c))) {
351
+ avoidItems.push('American/European stock photography for Latin audiences');
352
+ }
353
+ lines.push('');
354
+ lines.push(`Avoid: ${avoidItems.join('; ')}.`);
355
+ return lines.join('\n');
356
+ }
357
+ // ─── Do's and Don'ts synthesizer ───────────────────────────────────
358
+ export function synthesizeDosAndDonts(research) {
359
+ // Start with base anti-slop rules
360
+ const base = generateDosAndDonts(research.brief.industry, research.brief.targetAudience);
361
+ const dos = [...base.dos];
362
+ const donts = [...base.donts];
363
+ // Add competitor-derived rules
364
+ for (const comp of research.competitors) {
365
+ if (comp.palette.dominantHex) {
366
+ donts.push(`Don't use ${comp.palette.dominantHex} as primary color — it's ${comp.name}'s brand color`);
367
+ }
368
+ if (comp.typography.headingFont) {
369
+ donts.push(`Don't use ${comp.typography.headingFont} for headings — already associated with ${comp.name}`);
370
+ }
371
+ }
372
+ // Cultural considerations
373
+ for (const consideration of research.audienceInsights.culturalConsiderations) {
374
+ dos.push(`Respect local context: ${consideration}`);
375
+ }
376
+ // Market position rules
377
+ if (research.marketPosition.pricePoint === 'budget') {
378
+ dos.push('Show prices prominently on every product card');
379
+ donts.push("Don't hide pricing behind navigation or interstitials");
380
+ }
381
+ // Layout pattern rules from current site
382
+ if (research.currentSite?.layoutPatterns) {
383
+ const patterns = research.currentSite.layoutPatterns;
384
+ if (patterns.includes('hero-banner')) {
385
+ dos.push('Maintain the existing hero banner pattern for visual continuity');
386
+ }
387
+ if (patterns.includes('card-grid')) {
388
+ dos.push('Keep the card grid layout for browsable content sections');
389
+ }
390
+ }
391
+ // Business-model-aware rules
392
+ const bm = research.businessModel;
393
+ if (bm) {
394
+ if (bm.type === 'physical-retail') {
395
+ dos.push('Make store locator or "find nearest store" the primary CTA on every page');
396
+ dos.push('Show weekly deals as a browsable flyer, not as a shopping interface');
397
+ dos.push('Include store hours and location information prominently');
398
+ dos.push('Feature the store count and geographic reach as social proof');
399
+ donts.push("Don't add a shopping cart, checkout flow, or 'add to cart' buttons — this is not an e-commerce site");
400
+ donts.push("Don't show product detail pages with purchase options");
401
+ donts.push("Don't use e-commerce patterns (product grid with buy buttons, wishlists, user accounts)");
402
+ }
403
+ if (bm.type === 'e-commerce') {
404
+ dos.push('Make product search and category navigation the primary interaction');
405
+ dos.push('Show product images, prices, and add-to-cart buttons on product cards');
406
+ dos.push('Include trust badges, shipping info, and return policy prominently');
407
+ donts.push("Don't hide the shopping cart or make checkout multi-step without progress indicator");
408
+ }
409
+ if (bm.type === 'saas') {
410
+ dos.push('Show the product in action with realistic screenshots or demo');
411
+ dos.push('Make pricing and plan comparison easily accessible');
412
+ dos.push('Include a prominent free trial or demo CTA above the fold');
413
+ donts.push("Don't use generic feature lists without showing the actual product");
414
+ donts.push("Don't hide pricing behind a 'contact sales' wall unless enterprise-only");
415
+ }
416
+ if (bm.type === 'service') {
417
+ dos.push('Make booking or contact form the primary CTA');
418
+ dos.push('Show team credentials, certifications, and client testimonials');
419
+ donts.push("Don't hide contact information behind multiple clicks");
420
+ }
421
+ }
422
+ // Deduplicate — normalize to catch near-duplicates
423
+ const normalize = (s) => s.toLowerCase().replace(/[^a-z0-9]/g, '').slice(0, 40);
424
+ const dedup = (arr) => {
425
+ const seen = new Set();
426
+ return arr.filter(item => {
427
+ const key = normalize(item);
428
+ if (seen.has(key))
429
+ return false;
430
+ seen.add(key);
431
+ return true;
432
+ });
433
+ };
434
+ return { dos: dedup(dos), donts: dedup(donts) };
435
+ }
436
+ // ─── Markdown assembly ─────────────────────────────────────────────
437
+ function assembleDesignMd(research, palette, typography, imagery, dosAndDonts) {
438
+ const { brief } = research;
439
+ const aesthetic = matchAesthetic(brief.aesthetic);
440
+ // Section 1: Visual Theme & Atmosphere
441
+ const themeLines = [];
442
+ themeLines.push(`${brief.aesthetic} design language for ${brief.companyName}, a ${brief.industry} brand serving ${brief.targetAudience}.`);
443
+ if (research.currentSite) {
444
+ themeLines.push('Building on the existing brand identity with refinements for modern web standards.');
445
+ }
446
+ if (research.competitors.length > 0) {
447
+ const compNames = research.competitors
448
+ .map((c) => c.name)
449
+ .join(', ');
450
+ themeLines.push(`Differentiated from competitors like ${compNames} through unique typography and color palette choices.`);
451
+ }
452
+ themeLines.push(`The visual identity balances a ${research.marketPosition.personality} personality with the practical needs of ${brief.targetAudience}.`);
453
+ // Add business model context when confidence is sufficient
454
+ const bm = research.businessModel;
455
+ if (bm && bm.confidence >= 40) {
456
+ themeLines.push('');
457
+ themeLines.push(`**Business Model**: ${bm.type.replace('-', ' ')} — ${bm.primaryRevenue}.`);
458
+ themeLines.push(`**Website Purpose**: ${bm.websitePurpose}`);
459
+ if (bm.primaryUserGoals.length > 0) {
460
+ themeLines.push('**Primary User Goals**:');
461
+ bm.primaryUserGoals.forEach((g, i) => themeLines.push(`${i + 1}. ${g}`));
462
+ }
463
+ if (bm.keyFeatures.length > 0) {
464
+ themeLines.push(`**Key Page Elements**: ${bm.keyFeatures.join(', ')}.`);
465
+ }
466
+ if (bm.notFeatures.length > 0) {
467
+ themeLines.push(`**Avoid on this site**: ${bm.notFeatures.join(', ')}.`);
468
+ }
469
+ }
470
+ const themeText = themeLines.join('\n');
471
+ // Section 2: Color table
472
+ const accentRow = palette.accent
473
+ ? `| Accent | ${palette.accent.name} | ${palette.accent.hex} | Tertiary highlights, category markers |\n`
474
+ : '';
475
+ // Section 5: Components
476
+ const btnRadius = aesthetic.borderRadius.split(',')[0] || '6px';
477
+ const cardRadius = aesthetic.borderRadius.split(',')[1]?.trim() || '8px';
478
+ const md = `# ${brief.companyName} — Design System
479
+
480
+ ## 1. Visual Theme & Atmosphere
481
+
482
+ ${themeText}
483
+
484
+ ## 2. Color Palette & Roles
485
+
486
+ | Role | Name | Hex | Usage |
487
+ |------|------|-----|-------|
488
+ | Primary | ${palette.primary.name} | ${palette.primary.hex} | Main brand color, CTAs, key UI elements |
489
+ | Secondary | ${palette.secondary.name} | ${palette.secondary.hex} | Supporting elements, hover states, accents |
490
+ ${accentRow}| Surface | ${palette.surface.name} | ${palette.surface.hex} | Background, cards |
491
+ | On-Surface | ${palette.onSurface.name} | ${palette.onSurface.hex} | Body text on surface |
492
+ | Error | Signal Red | #DC2626 | Error states, destructive actions |
493
+ | Success | Verified Green | #16A34A | Success states, confirmations |
494
+ | Muted | ${palette.muted.name} | ${palette.muted.hex} | Disabled states, section alternates |
495
+ | Border | Light Border | #E5E5E5 | Card borders, dividers, input outlines |
496
+
497
+ ## 3. Typography
498
+
499
+ - **Heading**: "${typography.heading}", sans-serif
500
+ - **Body**: "${typography.body}", sans-serif
501
+ - **Mono**: "${typography.mono}", monospace
502
+
503
+ ${typography.rationale}
504
+
505
+ | Element | Size | Weight | Line Height |
506
+ |---------|------|--------|-------------|
507
+ | H1 | 2.75rem | 700 | 1.15 |
508
+ | H2 | 2rem | 700 | 1.2 |
509
+ | H3 | 1.375rem | 600 | 1.3 |
510
+ | Body | 1rem | 400 | 1.6 |
511
+ | Small | 0.875rem | 400 | 1.5 |
512
+
513
+ ## 4. Spacing & Layout
514
+
515
+ - **Base unit**: 4px
516
+ - **Scale**: 4, 8, 12, 16, 24, 32, 48, 64, 96
517
+ - **Max content width**: 1200px
518
+ - **Grid**: 12-column, 20px gutter
519
+ - **Breakpoints**: 640px (sm), 768px (md), 1024px (lg), 1280px (xl)
520
+ - **Section vertical padding**: 64px desktop, 40px mobile
521
+
522
+ ## 5. Component Patterns
523
+
524
+ ### Buttons
525
+ - Primary: filled with Primary color, white text, ${btnRadius}, 14px 28px padding
526
+ - Secondary: outline with Primary border, Primary text
527
+ - Ghost: no background, Primary text, hover shows Muted background
528
+
529
+ ### Cards
530
+ - Surface background, 1px Border color, ${cardRadius}, 20px padding
531
+ - Shadow: ${aesthetic.shadowStyle}
532
+ - Hover: slight elevation increase
533
+
534
+ ### Inputs
535
+ - 1px Border color, ${btnRadius}, 12px 16px padding
536
+ - Focus: Primary border, subtle Primary ring
537
+ - Error: Error border, Error text below
538
+
539
+ ## 6. Iconography
540
+
541
+ ${aesthetic.iconStyle}
542
+
543
+ ## 7. Imagery Guidelines
544
+
545
+ ${imagery}
546
+
547
+ ## 8. Do's and Don'ts
548
+
549
+ ### Do
550
+ ${dosAndDonts.dos.map((d) => `- ${d}`).join('\n')}
551
+
552
+ ### Don't
553
+ ${dosAndDonts.donts.map((d) => `- ${d}`).join('\n')}
554
+ `;
555
+ return md;
556
+ }
557
+ // ─── Main synthesizer ──────────────────────────────────────────────
558
+ /**
559
+ * Transforms a BusinessResearchResult into a full, scored DESIGN.md.
560
+ *
561
+ * Falls back to the static template generator when research confidence is < 30.
562
+ */
563
+ const DEFAULT_BUSINESS_MODEL = {
564
+ type: 'other',
565
+ primaryRevenue: 'Unknown',
566
+ websitePurpose: 'Inform visitors about the organization.',
567
+ primaryUserGoals: ['Learn about the organization'],
568
+ keyFeatures: [],
569
+ notFeatures: [],
570
+ differentiators: [],
571
+ confidence: 0,
572
+ };
573
+ export function synthesizeDesign(research) {
574
+ // Ensure businessModel is always present (fallback for legacy callers)
575
+ if (!research.businessModel) {
576
+ research = { ...research, businessModel: DEFAULT_BUSINESS_MODEL };
577
+ }
578
+ const sources = [];
579
+ // Low confidence: fall back to static template
580
+ if (research.confidence < 30) {
581
+ const fallbackBrief = {
582
+ companyName: research.brief.companyName,
583
+ industry: research.brief.industry,
584
+ targetAudience: research.brief.targetAudience,
585
+ aesthetic: research.brief.aesthetic,
586
+ };
587
+ const markdown = generateDesignMdTemplate(fallbackBrief);
588
+ const tokenEstimate = Math.ceil(markdown.length / 4);
589
+ const qualityScore = scoreDesignMd(markdown, research);
590
+ // Apply fallback penalty: template-generated output is less specific
591
+ // and not research-informed, cap specificity and differentiation
592
+ qualityScore.specificity = Math.min(qualityScore.specificity, 15);
593
+ qualityScore.differentiation = Math.min(qualityScore.differentiation, 10);
594
+ qualityScore.total =
595
+ qualityScore.specificity +
596
+ qualityScore.differentiation +
597
+ qualityScore.completeness +
598
+ qualityScore.actionability;
599
+ qualityScore.issues.push({
600
+ section: 'General',
601
+ severity: 'warning',
602
+ message: 'Generated from static template due to low research confidence — not informed by real brand or competitor data',
603
+ });
604
+ sources.push('template_fallback');
605
+ sources.push(...research.fallbacksUsed);
606
+ return { markdown, tokenEstimate, qualityScore, sources };
607
+ }
608
+ // High confidence: synthesize from research data
609
+ if (research.currentSite) {
610
+ sources.push(`site:${research.currentSite.url}`);
611
+ }
612
+ for (const comp of research.competitors) {
613
+ sources.push(`competitor:${comp.url}`);
614
+ }
615
+ if (sources.length === 0) {
616
+ sources.push('industry_defaults');
617
+ }
618
+ sources.push(...research.fallbacksUsed);
619
+ const palette = synthesizePalette(research);
620
+ const typography = synthesizeTypography(research);
621
+ const imagery = synthesizeImagery(research);
622
+ const dosAndDonts = synthesizeDosAndDonts(research);
623
+ const markdown = assembleDesignMd(research, palette, typography, imagery, dosAndDonts);
624
+ const tokenEstimate = Math.ceil(markdown.length / 4);
625
+ const qualityScore = scoreDesignMd(markdown, research);
626
+ return { markdown, tokenEstimate, qualityScore, sources };
627
+ }
628
+ //# sourceMappingURL=design-synthesizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-synthesizer.js","sourceRoot":"","sources":["../../src/research/design-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,sEAAsE;AAEtE,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO;QACL,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACnC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACnC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CACf,CAAS,EACT,CAAS,EACT,CAAS;IAET,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;IACT,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QACpB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACpD,IAAI,GAAG,KAAK,CAAC;YAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAClD,IAAI,GAAG,KAAK,CAAC;YAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;YACzC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,OAAO,CAAC;IAC9B,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,SAAiB;IACxD,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,UAAU,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,UAAU,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,OAAe;IACpD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,kCAAkC;IAClC,IAAI,UAAU,GAAG,EAAE,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,QAAQ,CAAC;QAC9C,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,QAAQ,CAAC;QAC9C,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAExC,gCAAgC;IAChC,IAAI,WAAW,KAAK,MAAM,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IACvE,IAAI,WAAW,KAAK,OAAO,IAAI,UAAU,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IACzE,IAAI,WAAW,KAAK,KAAK,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,UAAU,CAAC;IACzE,IAAI,WAAW,KAAK,QAAQ,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,QAAQ,CAAC;IAE1E,OAAO,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;AACrC,CAAC;AAED,sEAAsE;AAEtE,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,OAAe;IAC5C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACvC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;IACT,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;aAC3B,QAAQ,CAAC,EAAE,CAAC;aACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;AAChD,CAAC;AAED,sEAAsE;AAEtE,MAAM,cAAc,GAAG;IACrB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,MAAM;IACN,cAAc;CACf,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,eAAe;IACf,QAAQ;IACR,MAAM;IACN,SAAS;IACT,SAAS;IACT,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,GAAG;IACjB,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,WAAW;CACZ,CAAC;AAmBF,MAAM,UAAU,iBAAiB,CAC/B,QAAgC;IAEhC,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,UAAkB,CAAC;IACvB,IAAI,WAAmB,CAAC;IACxB,IAAI,gBAAwB,CAAC;IAC7B,IAAI,YAAoB,CAAC;IACzB,IAAI,aAAqB,CAAC;IAC1B,IAAI,kBAA0B,CAAC;IAC/B,IAAI,SAA6B,CAAC;IAClC,IAAI,UAA8B,CAAC;IACnC,IAAI,eAAmC,CAAC;IAExC,MAAM,cAAc,GAClB,QAAQ,CAAC,WAAW,EAAE,OAAO;QAC7B,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjD,IAAI,cAAc,EAAE,CAAC;QACnB,sDAAsD;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAY,CAAC;QACnC,MAAM,QAAQ,GACZ,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC;QAC1D,UAAU,GAAG,QAAQ,CAAC;QACtB,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,gBAAgB,GAAG,gCAAgC,IAAI,CAAC,GAAG,+BAA+B,CAAC;QAE3F,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC3B,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5D,kBAAkB,GAAG,0EAA0E,CAAC;QAClG,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;YACvC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC;YAC1B,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACpD,kBAAkB,GAAG,4CAA4C,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/D,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC;YAC7C,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC;YAC/C,kBAAkB,GAAG,mCAAmC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpF,CAAC;QAED,iDAAiD;QACjD,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACxC,IACE,IAAI,CAAC,OAAO,CAAC,WAAW;oBACxB,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,EACtD,CAAC;oBACD,6BAA6B;oBAC7B,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBACtC,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;oBAChD,gBAAgB,IAAI,8CAA8C,IAAI,CAAC,IAAI,GAAG,CAAC;oBAC/E,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,sEAAsE;QACtE,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/D,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;QACzC,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C,gBAAgB,GAAG,wBAAwB,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAErE,iCAAiC;QACjC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxC,IACE,IAAI,CAAC,OAAO,CAAC,WAAW;gBACxB,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,EACtD,CAAC;gBACD,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACtC,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAChD,gBAAgB,GAAG,kDAAkD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACjF,MAAM;YACR,CAAC;QACH,CAAC;QAED,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC;QAC7C,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/C,kBAAkB,GAAG,mCAAmC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAElF,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;YAC3B,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;YACvC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;YACzC,eAAe,GAAG,uBAAuB,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/D,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;QACzC,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C,gBAAgB,GAAG,wBAAwB,QAAQ,CAAC,KAAK,CAAC,QAAQ,yCAAyC,CAAC;QAE5G,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC;QAC7C,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/C,kBAAkB,GAAG,mCAAmC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAElF,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;YAC3B,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;YACvC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;YACzC,eAAe,GAAG,uBAAuB,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAuB;QACjC,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE;QAC5E,SAAS,EAAE;YACT,IAAI,EAAE,aAAa;YACnB,GAAG,EAAE,YAAY;YACjB,SAAS,EAAE,kBAAkB;SAC9B;QACD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;QACrE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;QAC3E,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;KAChE,CAAC;IAEF,IAAI,SAAS,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,GAAG;YACd,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,SAAS;YACd,SAAS,EAAE,eAAe;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD,MAAM,UAAU,oBAAoB,CAClC,QAAgC;IAEhC,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE3D,wCAAwC;IACxC,IAAI,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QACzE,MAAM,IAAI,GACR,IAAI,CAAC,UAAU,CAAC,QAAQ;YACxB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE;gBAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC;QAEtB,OAAO;YACL,OAAO;YACP,IAAI;YACJ,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YAChE,SAAS,EAAE,4BAA4B,IAAI,CAAC,GAAG,kCAAkC;SAClF,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;QACjD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;gBAChC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC7B,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACzC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;QAEjE,8CAA8C;QAC9C,IAAI,OAAO,GACT,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,WAAW,CAAC,CAAC,CAAE,CAAC;QAElB,2CAA2C;QAC3C,IAAI,IAAI,GACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC;QAExE,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,OAAO;YACP,IAAI;YACJ,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YAChE,SAAS,EAAE,6CAA6C,eAAe,GAAG;SAC3E,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;QACtE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;QAChE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;QAChE,SAAS,EAAE,YAAY,QAAQ,CAAC,KAAK,CAAC,SAAS,qBAAqB;KACrE,CAAC;AACJ,CAAC;AAED,qEAAqE;AAErE,MAAM,UAAU,iBAAiB,CAC/B,QAAgC;IAEhC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,oCAAoC;IACpC,MAAM,WAAW,GAAG,yBAAyB,CAC3C,QAAQ,CAAC,KAAK,CAAC,QAAQ,EACvB,QAAQ,CAAC,KAAK,CAAC,cAAc,CAC9B,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAExB,iDAAiD;IACjD,IAAI,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,mBAAmB,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAClF,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,uHAAuH,CACxH,CAAC;IACJ,CAAC;SAAM,IACL,QAAQ,CAAC,cAAc,CAAC,UAAU,KAAK,SAAS;QAChD,QAAQ,CAAC,cAAc,CAAC,UAAU,KAAK,QAAQ,EAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,sFAAsF,CACvF,CAAC;IAEF,aAAa;IACb,MAAM,UAAU,GAAa;QAC3B,6CAA6C;QAC7C,4BAA4B;KAC7B,CAAC;IACF,IACE,QAAQ,CAAC,cAAc,CAAC,UAAU,KAAK,QAAQ;QAC/C,QAAQ,CAAC,cAAc,CAAC,UAAU,KAAK,WAAW,EAClD,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,IACE,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1D,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/B,EACD,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,sEAAsE;AAEtE,MAAM,UAAU,qBAAqB,CACnC,QAAgC;IAEhC,kCAAkC;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAC9B,QAAQ,CAAC,KAAK,CAAC,QAAQ,EACvB,QAAQ,CAAC,KAAK,CAAC,cAAc,CAC9B,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9B,+BAA+B;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CACR,aAAa,IAAI,CAAC,OAAO,CAAC,WAAW,4BAA4B,IAAI,CAAC,IAAI,gBAAgB,CAC3F,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CACR,aAAa,IAAI,CAAC,UAAU,CAAC,WAAW,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;QAC7E,GAAG,CAAC,IAAI,CAAC,0BAA0B,aAAa,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,wBAAwB;IACxB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CACR,uDAAuD,CACxD,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,IAAI,QAAQ,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC;QACrD,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC;IAClC,IAAI,EAAE,EAAE,CAAC;QACP,IAAI,EAAE,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;YACrF,GAAG,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YAChF,GAAG,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAC;YAClH,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YAChF,GAAG,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;YAClF,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;QACpG,CAAC;QAED,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC1E,GAAG,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YACjF,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;YAC3E,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,CAAC,GAAa,EAAY,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,sEAAsE;AAEtE,SAAS,gBAAgB,CACvB,QAAgC,EAChC,OAA2B,EAC3B,UAAiC,EACjC,OAAe,EACf,WAA+C;IAE/C,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAElD,uCAAuC;IACvC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,UAAU,CAAC,IAAI,CACb,GAAG,KAAK,CAAC,SAAS,wBAAwB,KAAK,CAAC,WAAW,OAAO,KAAK,CAAC,QAAQ,kBAAkB,KAAK,CAAC,cAAc,GAAG,CAC1H,CAAC;IACF,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CACb,wCAAwC,SAAS,uDAAuD,CACzG,CAAC;IACJ,CAAC;IACD,UAAU,CAAC,IAAI,CACb,kCAAkC,QAAQ,CAAC,cAAc,CAAC,WAAW,4CAA4C,KAAK,CAAC,cAAc,GAAG,CACzI,CAAC;IAEF,2DAA2D;IAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC;IAClC,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,cAAc,GAAG,CAAC,CAAC;QAC5F,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC3C,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExC,yBAAyB;IACzB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM;QAC9B,CAAC,CAAC,cAAc,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,8CAA8C;QACzG,CAAC,CAAC,EAAE,CAAC;IAEP,wBAAwB;IACxB,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IAChE,MAAM,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC;IAEzE,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,WAAW;;;;EAIjC,SAAS;;;;;;cAMG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG;gBAC3C,OAAO,CAAC,SAAS,CAAC,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG;EAC/D,SAAS,eAAe,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG;iBACtD,OAAO,CAAC,SAAS,CAAC,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG;;;YAGtD,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG;;;;;kBAKnC,UAAU,CAAC,OAAO;eACrB,UAAU,CAAC,IAAI;eACf,UAAU,CAAC,IAAI;;EAE5B,UAAU,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;oDAsB8B,SAAS;;;;;0CAKnB,UAAU;YACxC,SAAS,CAAC,WAAW;;;;sBAIX,SAAS;;;;;;EAM7B,SAAS,CAAC,SAAS;;;;EAInB,OAAO;;;;;EAKP,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG/C,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAClD,CAAC;IAEA,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,sEAAsE;AAEtE;;;;GAIG;AACH,MAAM,sBAAsB,GAAyB;IACnD,IAAI,EAAE,OAAO;IACb,cAAc,EAAE,SAAS;IACzB,cAAc,EAAE,yCAAyC;IACzD,gBAAgB,EAAE,CAAC,8BAA8B,CAAC;IAClD,WAAW,EAAE,EAAE;IACf,WAAW,EAAE,EAAE;IACf,eAAe,EAAE,EAAE;IACnB,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,QAAgC;IAEhC,uEAAuE;IACvE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5B,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,+CAA+C;IAC/C,IAAI,QAAQ,CAAC,UAAU,GAAG,EAAE,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAgB;YACjC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW;YACvC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ;YACjC,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc;YAC7C,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS;SACpC,CAAC;QACF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEvD,qEAAqE;QACrE,iEAAiE;QACjE,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAClE,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC1E,YAAY,CAAC,KAAK;YAChB,YAAY,CAAC,WAAW;gBACxB,YAAY,CAAC,eAAe;gBAC5B,YAAY,CAAC,YAAY;gBACzB,YAAY,CAAC,aAAa,CAAC;QAC7B,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,+GAA+G;SACzH,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QAExC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;IAED,iDAAiD;IACjD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,WAAW,CACZ,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEvD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AAC5D,CAAC"}