@ivorycanvas/qamap 0.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/CHANGELOG.md +93 -0
- package/LICENSE +21 -0
- package/README.md +636 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +879 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +114 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +32 -0
- package/dist/doctor.js +200 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain-language.d.ts +25 -0
- package/dist/domain-language.js +655 -0
- package/dist/domain-language.js.map +1 -0
- package/dist/domains.d.ts +33 -0
- package/dist/domains.js +258 -0
- package/dist/domains.js.map +1 -0
- package/dist/e2e.d.ts +326 -0
- package/dist/e2e.js +6869 -0
- package/dist/e2e.js.map +1 -0
- package/dist/eval.d.ts +40 -0
- package/dist/eval.js +374 -0
- package/dist/eval.js.map +1 -0
- package/dist/flows.d.ts +32 -0
- package/dist/flows.js +246 -0
- package/dist/flows.js.map +1 -0
- package/dist/fs.d.ts +7 -0
- package/dist/fs.js +132 -0
- package/dist/fs.js.map +1 -0
- package/dist/github.d.ts +34 -0
- package/dist/github.js +183 -0
- package/dist/github.js.map +1 -0
- package/dist/history.d.ts +173 -0
- package/dist/history.js +247 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest-suggestions.d.ts +67 -0
- package/dist/manifest-suggestions.js +673 -0
- package/dist/manifest-suggestions.js.map +1 -0
- package/dist/manifest.d.ts +212 -0
- package/dist/manifest.js +1607 -0
- package/dist/manifest.js.map +1 -0
- package/dist/qa.d.ts +53 -0
- package/dist/qa.js +361 -0
- package/dist/qa.js.map +1 -0
- package/dist/report.d.ts +5 -0
- package/dist/report.js +164 -0
- package/dist/report.js.map +1 -0
- package/dist/review.d.ts +31 -0
- package/dist/review.js +383 -0
- package/dist/review.js.map +1 -0
- package/dist/scanner.d.ts +3 -0
- package/dist/scanner.js +797 -0
- package/dist/scanner.js.map +1 -0
- package/dist/severity.d.ts +3 -0
- package/dist/severity.js +9 -0
- package/dist/severity.js.map +1 -0
- package/dist/test-evidence.d.ts +39 -0
- package/dist/test-evidence.js +303 -0
- package/dist/test-evidence.js.map +1 -0
- package/dist/test-plan.d.ts +35 -0
- package/dist/test-plan.js +573 -0
- package/dist/test-plan.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +27 -0
- package/dist/verify.js +244 -0
- package/dist/verify.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/docs/adoption.md +166 -0
- package/docs/agent-skill.md +94 -0
- package/docs/api-contracts.md +30 -0
- package/docs/assets/qamap-30s-demo.gif +0 -0
- package/docs/configuration.md +277 -0
- package/docs/e2e-output-examples.md +464 -0
- package/docs/ecosystem.md +41 -0
- package/docs/eval.md +52 -0
- package/docs/github-action.md +89 -0
- package/docs/manifest.md +350 -0
- package/docs/quickstart-demo.md +268 -0
- package/docs/release-validation.md +247 -0
- package/docs/releasing.md +112 -0
- package/docs/roadmap.md +67 -0
- package/docs/rules.md +28 -0
- package/docs/verify.md +44 -0
- package/package.json +80 -0
- package/schema/qamap-manifest.schema.json +323 -0
- package/schema/qamap.schema.json +58 -0
- package/skills/qamap-pr-qa/SKILL.md +81 -0
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathExists } from "./fs.js";
|
|
4
|
+
const maxFilesPerTerm = 8;
|
|
5
|
+
export async function buildDomainLanguageSummary(rootInput, changedFiles, coreFlows, domains = []) {
|
|
6
|
+
const root = path.resolve(rootInput);
|
|
7
|
+
const files = changedFiles.map((file) => file.path).filter((file) => !isTestLikeFile(file));
|
|
8
|
+
const termMap = new Map();
|
|
9
|
+
for (const flow of coreFlows) {
|
|
10
|
+
addTerm(termMap, flow.name, "core-flow", "high", flow.matchedFiles);
|
|
11
|
+
}
|
|
12
|
+
for (const domain of domains) {
|
|
13
|
+
addTerm(termMap, domain.name, "domain-manifest", "high", domain.matchedFiles);
|
|
14
|
+
for (const alias of domain.aliases) {
|
|
15
|
+
addTerm(termMap, alias, "domain-manifest", "medium", domain.matchedFiles);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
for (const candidate of termsFromPath(file)) {
|
|
20
|
+
addTerm(termMap, candidate.term, "changed-file", candidate.confidence, [file]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (const term of await collectUiCopyTerms(root, files)) {
|
|
24
|
+
addTerm(termMap, term.term, "ui-copy", "low", term.files);
|
|
25
|
+
}
|
|
26
|
+
const terms = [...termMap.values()]
|
|
27
|
+
.filter((term) => isUsefulTerm(term.term))
|
|
28
|
+
.sort(compareTerms)
|
|
29
|
+
.slice(0, 12);
|
|
30
|
+
const behaviorScenarios = buildBehaviorScenarioSuggestions(terms, files);
|
|
31
|
+
const scenarios = buildScenarioSuggestions(terms, coreFlows, domains, behaviorScenarios);
|
|
32
|
+
return {
|
|
33
|
+
terms,
|
|
34
|
+
scenarios,
|
|
35
|
+
guidance: [
|
|
36
|
+
"Prefer these product words in generated test names, PR notes, and reviewer checklists.",
|
|
37
|
+
"Promote durable product terms into `.qamap/domains.yml`, then promote end-to-end journeys into `.qamap/flows.yml`.",
|
|
38
|
+
"Use the suggested scenarios as starting points, then replace generic actor or outcome wording with the team's domain language.",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function addTerm(terms, rawTerm, source, confidence, files) {
|
|
43
|
+
const term = source === "core-flow" || source === "domain-manifest" ? rawTerm.trim() : titleCase(rawTerm);
|
|
44
|
+
if (!isUsefulTerm(term)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const key = term.toLowerCase();
|
|
48
|
+
const existing = terms.get(key);
|
|
49
|
+
if (!existing) {
|
|
50
|
+
terms.set(key, {
|
|
51
|
+
term,
|
|
52
|
+
source,
|
|
53
|
+
confidence,
|
|
54
|
+
files: uniqueStrings(files).slice(0, maxFilesPerTerm),
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
existing.files = uniqueStrings([...existing.files, ...files]).slice(0, maxFilesPerTerm);
|
|
59
|
+
if (confidenceRank(confidence) > confidenceRank(existing.confidence)) {
|
|
60
|
+
existing.term = term;
|
|
61
|
+
existing.confidence = confidence;
|
|
62
|
+
existing.source = source;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function buildScenarioSuggestions(terms, coreFlows, domains, behaviorScenarios = []) {
|
|
66
|
+
const scenarios = [];
|
|
67
|
+
for (const flow of coreFlows.slice(0, 4)) {
|
|
68
|
+
scenarios.push({
|
|
69
|
+
title: flow.name,
|
|
70
|
+
intent: `Verify the team-approved "${flow.name}" flow with the words reviewers already use for this behavior.`,
|
|
71
|
+
checks: flow.checks.length > 0
|
|
72
|
+
? flow.checks
|
|
73
|
+
: [
|
|
74
|
+
"Start from the entry point a real user uses.",
|
|
75
|
+
"Complete the main action.",
|
|
76
|
+
"Confirm the user-visible result.",
|
|
77
|
+
],
|
|
78
|
+
files: flow.matchedFiles,
|
|
79
|
+
source: "core-flow",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
for (const domain of domains.slice(0, 4)) {
|
|
83
|
+
if (domain.scenarios.length > 0) {
|
|
84
|
+
for (const scenario of domain.scenarios.slice(0, 2)) {
|
|
85
|
+
scenarios.push({
|
|
86
|
+
title: scenario.title,
|
|
87
|
+
intent: `Verify the team-approved "${domain.name}" domain with shared product language.`,
|
|
88
|
+
checks: scenario.checks.length > 0
|
|
89
|
+
? scenario.checks
|
|
90
|
+
: [
|
|
91
|
+
`Start from the normal entry point for ${domain.name}.`,
|
|
92
|
+
`Complete the main ${domain.name} action.`,
|
|
93
|
+
`Confirm the user-visible result for ${domain.name}.`,
|
|
94
|
+
],
|
|
95
|
+
files: domain.matchedFiles,
|
|
96
|
+
routes: domain.routes,
|
|
97
|
+
source: "domain-manifest",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
scenarios.push({
|
|
103
|
+
title: `${domain.name} primary journey`,
|
|
104
|
+
intent: `Use "${domain.name}" as the shared name for this changed behavior until the team chooses a more specific scenario.`,
|
|
105
|
+
checks: [
|
|
106
|
+
`Start from the normal entry point for ${domain.name}.`,
|
|
107
|
+
`Complete the main ${domain.name} action with realistic data.`,
|
|
108
|
+
`Confirm the visible result, saved state, navigation, or event that proves ${domain.name} worked.`,
|
|
109
|
+
`Try one empty, blocked, rejected, or failed ${domain.name} path that a real user could hit.`,
|
|
110
|
+
],
|
|
111
|
+
files: domain.matchedFiles,
|
|
112
|
+
routes: domain.routes,
|
|
113
|
+
source: "domain-manifest",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
scenarios.push(...behaviorScenarios);
|
|
117
|
+
for (const term of terms
|
|
118
|
+
.filter((item) => item.source !== "core-flow")
|
|
119
|
+
.filter((item) => !hasBehaviorScenarioForTerm(item, behaviorScenarios))
|
|
120
|
+
.slice(0, 5)) {
|
|
121
|
+
scenarios.push({
|
|
122
|
+
title: `${term.term} primary journey`,
|
|
123
|
+
intent: `Use "${term.term}" as the shared name for this changed behavior until the team chooses a better domain term.`,
|
|
124
|
+
checks: [
|
|
125
|
+
`Start from the normal entry point for ${term.term}.`,
|
|
126
|
+
`Complete the main ${term.term} action with realistic data.`,
|
|
127
|
+
`Confirm the visible result, saved state, navigation, or event that proves ${term.term} worked.`,
|
|
128
|
+
`Try one empty, blocked, rejected, or failed ${term.term} path that a real user could hit.`,
|
|
129
|
+
],
|
|
130
|
+
files: term.files,
|
|
131
|
+
source: term.source,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return dedupeScenarios(scenarios).slice(0, 6);
|
|
135
|
+
}
|
|
136
|
+
function hasBehaviorScenarioForTerm(term, scenarios) {
|
|
137
|
+
const prefix = `${term.term.toLowerCase()} `;
|
|
138
|
+
return scenarios.some((scenario) => scenario.source === "changed-file" && scenario.title.toLowerCase().startsWith(prefix));
|
|
139
|
+
}
|
|
140
|
+
function buildBehaviorScenarioSuggestions(terms, files) {
|
|
141
|
+
const candidates = new Map();
|
|
142
|
+
for (const file of files.filter(isDomainLanguageFile)) {
|
|
143
|
+
const term = bestBehaviorDomainTermForFile(terms, file);
|
|
144
|
+
if (!term) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const behavior = behaviorLabelFromPath(file, term.term);
|
|
148
|
+
if (!behavior) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const title = `${term.term} ${behavior}`;
|
|
152
|
+
const key = title.toLowerCase();
|
|
153
|
+
const existing = candidates.get(key);
|
|
154
|
+
if (existing) {
|
|
155
|
+
existing.files = uniqueStrings([...existing.files, file]).slice(0, maxFilesPerTerm);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
candidates.set(key, {
|
|
159
|
+
title,
|
|
160
|
+
term: term.term,
|
|
161
|
+
behavior,
|
|
162
|
+
files: [file],
|
|
163
|
+
domainFileCount: term.files.length,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return selectBehaviorScenarioCandidates([...candidates.values()])
|
|
167
|
+
.map((candidate) => ({
|
|
168
|
+
title: candidate.title,
|
|
169
|
+
intent: `Verify the changed "${candidate.behavior}" behavior inside ${candidate.term} instead of stopping at a generic primary journey.`,
|
|
170
|
+
checks: [
|
|
171
|
+
`Start from the ${candidate.term} entry point that exposes ${candidate.behavior}.`,
|
|
172
|
+
`Exercise ${candidate.behavior} with realistic data from the changed branch.`,
|
|
173
|
+
`Confirm the visible result, saved state, navigation, request, or event that proves ${candidate.behavior} worked.`,
|
|
174
|
+
`Try one empty, blocked, rejected, or failed ${candidate.behavior} path that a real user or caller could hit.`,
|
|
175
|
+
],
|
|
176
|
+
files: candidate.files,
|
|
177
|
+
source: "changed-file",
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
function selectBehaviorScenarioCandidates(candidates) {
|
|
181
|
+
const selected = [];
|
|
182
|
+
const deferred = [];
|
|
183
|
+
const selectedByTerm = new Map();
|
|
184
|
+
for (const candidate of candidates.sort(compareBehaviorScenarioCandidates)) {
|
|
185
|
+
const currentTermCount = selectedByTerm.get(candidate.term) ?? 0;
|
|
186
|
+
if (currentTermCount < 2) {
|
|
187
|
+
selected.push(candidate);
|
|
188
|
+
selectedByTerm.set(candidate.term, currentTermCount + 1);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
deferred.push(candidate);
|
|
192
|
+
}
|
|
193
|
+
if (selected.length === 4) {
|
|
194
|
+
return selected;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return [...selected, ...deferred].slice(0, 4);
|
|
198
|
+
}
|
|
199
|
+
function bestBehaviorDomainTermForFile(terms, file) {
|
|
200
|
+
return terms
|
|
201
|
+
.filter((term) => term.source !== "ui-copy" && filesOverlap([file], term.files))
|
|
202
|
+
.filter((term) => !isBehaviorOnlyTerm(term.term, file))
|
|
203
|
+
.sort(compareTerms)[0];
|
|
204
|
+
}
|
|
205
|
+
function filesOverlap(left, right) {
|
|
206
|
+
return left.some((leftFile) => right.some((rightFile) => sameOrNestedFileReference(leftFile, rightFile)));
|
|
207
|
+
}
|
|
208
|
+
function sameOrNestedFileReference(left, right) {
|
|
209
|
+
const normalizedLeft = normalizeComparisonPath(left);
|
|
210
|
+
const normalizedRight = normalizeComparisonPath(right);
|
|
211
|
+
return (normalizedLeft === normalizedRight ||
|
|
212
|
+
normalizedLeft.endsWith(`/${normalizedRight}`) ||
|
|
213
|
+
normalizedRight.endsWith(`/${normalizedLeft}`));
|
|
214
|
+
}
|
|
215
|
+
function normalizeComparisonPath(file) {
|
|
216
|
+
return file.replace(/^\.\/+/, "").replace(/\/+$/g, "");
|
|
217
|
+
}
|
|
218
|
+
function isBehaviorOnlyTerm(term, file) {
|
|
219
|
+
const basenameTokens = behaviorTokensFromText(path.basename(file));
|
|
220
|
+
const termTokens = behaviorTokensFromText(term);
|
|
221
|
+
if (termTokens.length < 2 || basenameTokens.length === 0) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
return termTokens.every((token) => basenameTokens.some((basenameToken) => sameToken(token, basenameToken)));
|
|
225
|
+
}
|
|
226
|
+
function behaviorLabelFromPath(file, domainTerm) {
|
|
227
|
+
const basename = path.basename(file).replace(/\.(?:d\.)?(?:[cm]?[jt]sx?|vue|svelte|css|scss|sass|less|json|ya?ml|md|py|go|rs|kt|java|swift|cs)$/i, "");
|
|
228
|
+
const domainTokens = behaviorTokensFromText(domainTerm);
|
|
229
|
+
const tokens = behaviorTokensFromText(basename)
|
|
230
|
+
.filter((token) => !domainTokens.some((domainToken) => sameToken(domainToken, token)))
|
|
231
|
+
.filter((token) => !behaviorStructuralTokens.has(token));
|
|
232
|
+
if (tokens.length === 0) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
if (tokens.length === 1 && !behaviorActionTokens.has(tokens[0]) && !isLikelyBusinessObjectToken(tokens[0])) {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
return titleCase(tokens.map(formatBehaviorToken).join(" "));
|
|
239
|
+
}
|
|
240
|
+
function behaviorTokensFromText(value) {
|
|
241
|
+
return uniqueStrings(value
|
|
242
|
+
.replace(/\.[^.]+$/g, "")
|
|
243
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
244
|
+
.split(/[^a-zA-Z0-9가-힣]+/)
|
|
245
|
+
.map((part) => part.toLowerCase())
|
|
246
|
+
.filter(Boolean));
|
|
247
|
+
}
|
|
248
|
+
function sameToken(left, right) {
|
|
249
|
+
return singularizeToken(left) === singularizeToken(right);
|
|
250
|
+
}
|
|
251
|
+
function singularizeToken(token) {
|
|
252
|
+
return token.endsWith("s") && token.length > 3 ? token.slice(0, -1) : token;
|
|
253
|
+
}
|
|
254
|
+
function formatBehaviorToken(token) {
|
|
255
|
+
const acronyms = {
|
|
256
|
+
api: "API",
|
|
257
|
+
id: "ID",
|
|
258
|
+
url: "URL",
|
|
259
|
+
urls: "URLs",
|
|
260
|
+
ui: "UI",
|
|
261
|
+
};
|
|
262
|
+
return acronyms[token] ?? token;
|
|
263
|
+
}
|
|
264
|
+
function isLikelyBusinessObjectToken(token) {
|
|
265
|
+
return token.length > 4 && !behaviorStructuralTokens.has(token);
|
|
266
|
+
}
|
|
267
|
+
function compareBehaviorScenarioCandidates(left, right) {
|
|
268
|
+
const domainImpactDiff = right.domainFileCount - left.domainFileCount;
|
|
269
|
+
if (domainImpactDiff !== 0) {
|
|
270
|
+
return domainImpactDiff;
|
|
271
|
+
}
|
|
272
|
+
const actionDiff = Number(hasActionToken(right.behavior)) - Number(hasActionToken(left.behavior));
|
|
273
|
+
if (actionDiff !== 0) {
|
|
274
|
+
return actionDiff;
|
|
275
|
+
}
|
|
276
|
+
const fileDiff = right.files.length - left.files.length;
|
|
277
|
+
if (fileDiff !== 0) {
|
|
278
|
+
return fileDiff;
|
|
279
|
+
}
|
|
280
|
+
return left.title.localeCompare(right.title);
|
|
281
|
+
}
|
|
282
|
+
function hasActionToken(value) {
|
|
283
|
+
return behaviorTokensFromText(value).some((token) => behaviorActionTokens.has(token));
|
|
284
|
+
}
|
|
285
|
+
async function collectUiCopyTerms(root, files) {
|
|
286
|
+
const terms = [];
|
|
287
|
+
for (const file of files.filter(isUiImplementationFile).slice(0, 8)) {
|
|
288
|
+
const absolutePath = path.join(root, file);
|
|
289
|
+
if (!(await pathExists(absolutePath))) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const text = await fs.readFile(absolutePath, "utf8");
|
|
293
|
+
for (const term of extractUiCopyTerms(text)) {
|
|
294
|
+
terms.push({ term, files: [file] });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return terms;
|
|
298
|
+
}
|
|
299
|
+
function termsFromPath(file) {
|
|
300
|
+
if (!isDomainLanguageFile(file)) {
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
303
|
+
const terms = [];
|
|
304
|
+
const segments = file.split("/");
|
|
305
|
+
const semanticKeys = [
|
|
306
|
+
{ key: "features", confidence: "high" },
|
|
307
|
+
{ key: "domains", confidence: "high" },
|
|
308
|
+
{ key: "modules", confidence: "high" },
|
|
309
|
+
{ key: "services", confidence: "high" },
|
|
310
|
+
{ key: "entities", confidence: "high" },
|
|
311
|
+
{ key: "pages", confidence: "medium" },
|
|
312
|
+
{ key: "screens", confidence: "medium" },
|
|
313
|
+
{ key: "app", confidence: "medium" },
|
|
314
|
+
{ key: "src", confidence: "medium" },
|
|
315
|
+
];
|
|
316
|
+
for (const { key, confidence } of semanticKeys) {
|
|
317
|
+
const index = segments.indexOf(key);
|
|
318
|
+
const value = normalizeSegment(semanticSegmentAfterKey(segments, index));
|
|
319
|
+
if (value) {
|
|
320
|
+
terms.push({ term: value, confidence });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
const basename = normalizeSegment(path.basename(file));
|
|
324
|
+
if (basename) {
|
|
325
|
+
terms.push({ term: basename, confidence: "medium" });
|
|
326
|
+
}
|
|
327
|
+
return uniquePathTermCandidates(terms);
|
|
328
|
+
}
|
|
329
|
+
function semanticSegmentAfterKey(segments, keyIndex) {
|
|
330
|
+
if (keyIndex < 0) {
|
|
331
|
+
return undefined;
|
|
332
|
+
}
|
|
333
|
+
for (const segment of segments.slice(keyIndex + 1)) {
|
|
334
|
+
if (!isStructuralSegment(segment)) {
|
|
335
|
+
return segment;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
function isStructuralSegment(segment) {
|
|
341
|
+
const normalized = segment.toLowerCase().replace(/[^a-z0-9가-힣]+/g, "-").replace(/^-+|-+$/g, "");
|
|
342
|
+
return /^v?\d+(?:-\d+)?$/i.test(normalized) || structuralSegments.has(normalized);
|
|
343
|
+
}
|
|
344
|
+
function extractUiCopyTerms(text) {
|
|
345
|
+
const terms = [];
|
|
346
|
+
const patterns = [
|
|
347
|
+
/\b(?:accessibilityLabel|aria-label|placeholder|title|label)=["']([^"']{2,80})["']/g,
|
|
348
|
+
/<Text[^>]*>\s*([^<{]{2,80})\s*<\/Text>/g,
|
|
349
|
+
/(?:button|cta|action|screen|page)Title\s*[:=]\s*["']([^"']{2,80})["']/gi,
|
|
350
|
+
];
|
|
351
|
+
for (const pattern of patterns) {
|
|
352
|
+
for (const match of text.matchAll(pattern)) {
|
|
353
|
+
const value = normalizeUiCopy(match[1] ?? "");
|
|
354
|
+
if (value) {
|
|
355
|
+
terms.push(value);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return uniqueStrings(terms).slice(0, 8);
|
|
360
|
+
}
|
|
361
|
+
function normalizeUiCopy(value) {
|
|
362
|
+
const normalized = value.replace(/\s+/g, " ").trim();
|
|
363
|
+
if (!normalized || normalized.length > 60) {
|
|
364
|
+
return undefined;
|
|
365
|
+
}
|
|
366
|
+
if (/TODO|http|www\.|[{}[\]();]/i.test(normalized)) {
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
return normalized;
|
|
370
|
+
}
|
|
371
|
+
function normalizeSegment(value) {
|
|
372
|
+
if (!value) {
|
|
373
|
+
return undefined;
|
|
374
|
+
}
|
|
375
|
+
if (isRouteSyntaxSegment(value)) {
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
const normalized = value
|
|
379
|
+
.replace(/\.(?:d\.)?(?:[cm]?[jt]sx?|vue|svelte|css|scss|sass|less|json|ya?ml|md|py|go|rs|kt|java|swift|cs|png|jpe?g|webp|gif|svg)$/i, "")
|
|
380
|
+
.replace(/(?:Api|Service|Controller|Component|Screen)$/g, "")
|
|
381
|
+
.replace(/^_+|_+$/g, "")
|
|
382
|
+
.trim();
|
|
383
|
+
if (isRouteSyntaxSegment(normalized)) {
|
|
384
|
+
return undefined;
|
|
385
|
+
}
|
|
386
|
+
if (/^use[A-Z]/.test(normalized)) {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
return isUsefulTerm(normalized) ? normalized : undefined;
|
|
390
|
+
}
|
|
391
|
+
function isRouteSyntaxSegment(value) {
|
|
392
|
+
return /^\([^)]*\)$/.test(value) || /^\[{1,2}(?:\.\.\.)?[^/\]]+\]{1,2}$/.test(value);
|
|
393
|
+
}
|
|
394
|
+
function isDomainLanguageFile(file) {
|
|
395
|
+
if (/(?:^|\/)(?:assets?|images?|icons?|fonts?)\//i.test(file)) {
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
if (isGeneratedOutputFile(file)) {
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
if (/(?:^|\/)(?:\.agents?|\.claude|\.cursor|\.dev|\.gemini|\.github|docs?)\//i.test(file)) {
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
if (/(?:^|\/)(?:AGENTS|CLAUDE|CODEX|DECISIONS|GEMINI|README|SKILL)\.md$/i.test(file)) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
if (/(?:^|\/)\.gitignore$/i.test(file)) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
if (/(?:^|\/)(?:CHANGELOG|RELEASES?|release-notes?|\.release-please-manifest)\.(?:md|json)$/i.test(file)) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
if (/(?:package\.json|pnpm-lock\.yaml|yarn\.lock|package-lock\.json|bun\.lockb|Podfile\.lock|\.xcodeproj|eas\.json|app\.config\.)/i.test(file)) {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
function isUiImplementationFile(file) {
|
|
419
|
+
return /\.(?:tsx|jsx|vue|svelte)$/i.test(file);
|
|
420
|
+
}
|
|
421
|
+
function isTestLikeFile(file) {
|
|
422
|
+
return (/(?:^|\/)(?:__tests__|tests?|specs?|e2e)\//i.test(file) ||
|
|
423
|
+
/(?:\.|-)(?:test|spec)\.[cm]?[jt]sx?$/i.test(file) ||
|
|
424
|
+
/(?:^|\/)test_[^/]+\.py$/i.test(file) ||
|
|
425
|
+
/(?:^|\/)[^/]+_test\.(?:py|go)$/i.test(file));
|
|
426
|
+
}
|
|
427
|
+
function isGeneratedOutputFile(file) {
|
|
428
|
+
return (/(?:^|\/)(?:dist|build|out|coverage|generated|__generated__|codegen)\//i.test(file) ||
|
|
429
|
+
/(?:^|\/)(?:public|src|lib|packages?)\/(?:generated|__generated__|codegen)\//i.test(file) ||
|
|
430
|
+
/(?:^|\/)[^/]*(?:generated|codegen)[^/]*\.(?:[cm]?[jt]sx?|json|ya?ml|css|scss|md)$/i.test(file) ||
|
|
431
|
+
/\.(?:generated|gen)\.[cm]?[jt]sx?$/i.test(file));
|
|
432
|
+
}
|
|
433
|
+
function isUsefulTerm(value) {
|
|
434
|
+
const normalized = value.toLowerCase().replace(/[^a-z0-9가-힣]+/g, "-").replace(/^-+|-+$/g, "");
|
|
435
|
+
const ignored = new Set([
|
|
436
|
+
"api",
|
|
437
|
+
"apis",
|
|
438
|
+
"app",
|
|
439
|
+
"client",
|
|
440
|
+
"component",
|
|
441
|
+
"components",
|
|
442
|
+
"config",
|
|
443
|
+
"controller",
|
|
444
|
+
"content",
|
|
445
|
+
"doc",
|
|
446
|
+
"docs",
|
|
447
|
+
"index",
|
|
448
|
+
"ios",
|
|
449
|
+
"android",
|
|
450
|
+
"layout",
|
|
451
|
+
"model",
|
|
452
|
+
"navigation",
|
|
453
|
+
"navigations",
|
|
454
|
+
"page",
|
|
455
|
+
"pages",
|
|
456
|
+
"provider",
|
|
457
|
+
"providers",
|
|
458
|
+
"readme",
|
|
459
|
+
"route",
|
|
460
|
+
"routes",
|
|
461
|
+
"screen",
|
|
462
|
+
"screens",
|
|
463
|
+
"service",
|
|
464
|
+
"services",
|
|
465
|
+
"shared",
|
|
466
|
+
"src",
|
|
467
|
+
"test",
|
|
468
|
+
"tests",
|
|
469
|
+
"ui",
|
|
470
|
+
"util",
|
|
471
|
+
"utils",
|
|
472
|
+
]);
|
|
473
|
+
return normalized.length > 1 && !ignored.has(normalized);
|
|
474
|
+
}
|
|
475
|
+
function compareTerms(left, right) {
|
|
476
|
+
const confidenceDiff = confidenceRank(right.confidence) - confidenceRank(left.confidence);
|
|
477
|
+
if (confidenceDiff !== 0) {
|
|
478
|
+
return confidenceDiff;
|
|
479
|
+
}
|
|
480
|
+
const fileDiff = right.files.length - left.files.length;
|
|
481
|
+
if (fileDiff !== 0) {
|
|
482
|
+
return fileDiff;
|
|
483
|
+
}
|
|
484
|
+
return left.term.localeCompare(right.term);
|
|
485
|
+
}
|
|
486
|
+
function confidenceRank(confidence) {
|
|
487
|
+
if (confidence === "high") {
|
|
488
|
+
return 3;
|
|
489
|
+
}
|
|
490
|
+
if (confidence === "medium") {
|
|
491
|
+
return 2;
|
|
492
|
+
}
|
|
493
|
+
return 1;
|
|
494
|
+
}
|
|
495
|
+
function titleCase(value) {
|
|
496
|
+
if (/[가-힣]/.test(value)) {
|
|
497
|
+
return value.trim();
|
|
498
|
+
}
|
|
499
|
+
return value
|
|
500
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
501
|
+
.replace(/[-_]+/g, " ")
|
|
502
|
+
.replace(/[^a-zA-Z0-9 ]+/g, " ")
|
|
503
|
+
.trim()
|
|
504
|
+
.split(/\s+/)
|
|
505
|
+
.filter(Boolean)
|
|
506
|
+
.map((part) => {
|
|
507
|
+
if (/^[A-Z0-9]+$/.test(part)) {
|
|
508
|
+
return part;
|
|
509
|
+
}
|
|
510
|
+
return `${part.charAt(0).toUpperCase()}${part.slice(1)}`;
|
|
511
|
+
})
|
|
512
|
+
.join(" ");
|
|
513
|
+
}
|
|
514
|
+
function dedupeScenarios(scenarios) {
|
|
515
|
+
const seen = new Set();
|
|
516
|
+
const deduped = [];
|
|
517
|
+
for (const scenario of scenarios) {
|
|
518
|
+
const key = scenario.title.toLowerCase();
|
|
519
|
+
if (seen.has(key)) {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
seen.add(key);
|
|
523
|
+
deduped.push(scenario);
|
|
524
|
+
}
|
|
525
|
+
return deduped;
|
|
526
|
+
}
|
|
527
|
+
function uniqueStrings(values) {
|
|
528
|
+
return [...new Set(values.filter(Boolean))];
|
|
529
|
+
}
|
|
530
|
+
function uniquePathTermCandidates(values) {
|
|
531
|
+
const candidates = new Map();
|
|
532
|
+
for (const value of values) {
|
|
533
|
+
const key = value.term.toLowerCase();
|
|
534
|
+
const existing = candidates.get(key);
|
|
535
|
+
if (!existing || confidenceRank(value.confidence) > confidenceRank(existing.confidence)) {
|
|
536
|
+
candidates.set(key, value);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return [...candidates.values()];
|
|
540
|
+
}
|
|
541
|
+
const structuralSegments = new Set([
|
|
542
|
+
"app",
|
|
543
|
+
"apps",
|
|
544
|
+
"components",
|
|
545
|
+
"content",
|
|
546
|
+
"common",
|
|
547
|
+
"commons",
|
|
548
|
+
"controller",
|
|
549
|
+
"controllers",
|
|
550
|
+
"core",
|
|
551
|
+
"docs",
|
|
552
|
+
"handler",
|
|
553
|
+
"handlers",
|
|
554
|
+
"helper",
|
|
555
|
+
"helpers",
|
|
556
|
+
"lib",
|
|
557
|
+
"libs",
|
|
558
|
+
"features",
|
|
559
|
+
"layouts",
|
|
560
|
+
"middleware",
|
|
561
|
+
"middlewares",
|
|
562
|
+
"modules",
|
|
563
|
+
"navigation",
|
|
564
|
+
"navigations",
|
|
565
|
+
"pages",
|
|
566
|
+
"private",
|
|
567
|
+
"protected",
|
|
568
|
+
"public",
|
|
569
|
+
"providers",
|
|
570
|
+
"routes",
|
|
571
|
+
"screens",
|
|
572
|
+
"services",
|
|
573
|
+
"shared",
|
|
574
|
+
"src",
|
|
575
|
+
"util",
|
|
576
|
+
"utils",
|
|
577
|
+
]);
|
|
578
|
+
const behaviorStructuralTokens = new Set([
|
|
579
|
+
"api",
|
|
580
|
+
"apis",
|
|
581
|
+
"button",
|
|
582
|
+
"card",
|
|
583
|
+
"client",
|
|
584
|
+
"component",
|
|
585
|
+
"components",
|
|
586
|
+
"container",
|
|
587
|
+
"controller",
|
|
588
|
+
"dialog",
|
|
589
|
+
"drawer",
|
|
590
|
+
"form",
|
|
591
|
+
"fragment",
|
|
592
|
+
"hook",
|
|
593
|
+
"hooks",
|
|
594
|
+
"index",
|
|
595
|
+
"item",
|
|
596
|
+
"layout",
|
|
597
|
+
"list",
|
|
598
|
+
"modal",
|
|
599
|
+
"overview",
|
|
600
|
+
"page",
|
|
601
|
+
"pages",
|
|
602
|
+
"panel",
|
|
603
|
+
"provider",
|
|
604
|
+
"route",
|
|
605
|
+
"screen",
|
|
606
|
+
"screens",
|
|
607
|
+
"section",
|
|
608
|
+
"service",
|
|
609
|
+
"services",
|
|
610
|
+
"style",
|
|
611
|
+
"styles",
|
|
612
|
+
"tab",
|
|
613
|
+
"tabs",
|
|
614
|
+
"util",
|
|
615
|
+
"utils",
|
|
616
|
+
"view",
|
|
617
|
+
"widget",
|
|
618
|
+
]);
|
|
619
|
+
const behaviorActionTokens = new Set([
|
|
620
|
+
"add",
|
|
621
|
+
"apply",
|
|
622
|
+
"approve",
|
|
623
|
+
"auth",
|
|
624
|
+
"block",
|
|
625
|
+
"cancel",
|
|
626
|
+
"change",
|
|
627
|
+
"charge",
|
|
628
|
+
"check",
|
|
629
|
+
"complete",
|
|
630
|
+
"confirm",
|
|
631
|
+
"connect",
|
|
632
|
+
"create",
|
|
633
|
+
"delete",
|
|
634
|
+
"detail",
|
|
635
|
+
"edit",
|
|
636
|
+
"fallback",
|
|
637
|
+
"filter",
|
|
638
|
+
"login",
|
|
639
|
+
"logout",
|
|
640
|
+
"open",
|
|
641
|
+
"purchase",
|
|
642
|
+
"reject",
|
|
643
|
+
"remove",
|
|
644
|
+
"renew",
|
|
645
|
+
"reset",
|
|
646
|
+
"save",
|
|
647
|
+
"search",
|
|
648
|
+
"select",
|
|
649
|
+
"submit",
|
|
650
|
+
"sync",
|
|
651
|
+
"update",
|
|
652
|
+
"upload",
|
|
653
|
+
"verify",
|
|
654
|
+
]);
|
|
655
|
+
//# sourceMappingURL=domain-language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-language.js","sourceRoot":"","sources":["../src/domain-language.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AA2CrC,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAAiB,EACjB,YAAmC,EACnC,SAA4B,EAC5B,UAA2B,EAAE;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEtD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACzC,IAAI,CAAC,YAAY,CAAC;SAClB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,MAAM,iBAAiB,GAAG,gCAAgC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAEzF,OAAO;QACL,KAAK;QACL,SAAS;QACT,QAAQ,EAAE;YACR,wFAAwF;YACxF,oHAAoH;YACpH,gIAAgI;SACjI;KACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CACd,KAAsC,EACtC,OAAe,EACf,MAA4B,EAC5B,UAAoC,EACpC,KAAe;IAEf,MAAM,IAAI,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1G,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACb,IAAI;YACJ,MAAM;YACN,UAAU;YACV,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;SACtD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACxF,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAA2B,EAC3B,SAA4B,EAC5B,OAAwB,EACxB,oBAAgD,EAAE;IAElD,MAAM,SAAS,GAA+B,EAAE,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACzC,SAAS,CAAC,IAAI,CAAC;YACb,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,6BAA6B,IAAI,CAAC,IAAI,gEAAgE;YAC9G,MAAM,EACJ,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC;oBACE,8CAA8C;oBAC9C,2BAA2B;oBAC3B,kCAAkC;iBACnC;YACP,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC;oBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,MAAM,EAAE,6BAA6B,MAAM,CAAC,IAAI,wCAAwC;oBACxF,MAAM,EACJ,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;wBACxB,CAAC,CAAC,QAAQ,CAAC,MAAM;wBACjB,CAAC,CAAC;4BACE,yCAAyC,MAAM,CAAC,IAAI,GAAG;4BACvD,qBAAqB,MAAM,CAAC,IAAI,UAAU;4BAC1C,uCAAuC,MAAM,CAAC,IAAI,GAAG;yBACtD;oBACP,KAAK,EAAE,MAAM,CAAC,YAAY;oBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,iBAAiB;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC;YACb,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,kBAAkB;YACvC,MAAM,EAAE,QAAQ,MAAM,CAAC,IAAI,iGAAiG;YAC5H,MAAM,EAAE;gBACN,yCAAyC,MAAM,CAAC,IAAI,GAAG;gBACvD,qBAAqB,MAAM,CAAC,IAAI,8BAA8B;gBAC9D,6EAA6E,MAAM,CAAC,IAAI,UAAU;gBAClG,+CAA+C,MAAM,CAAC,IAAI,mCAAmC;aAC9F;YACD,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,iBAAiB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK;SACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;SAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;SACtE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACf,SAAS,CAAC,IAAI,CAAC;YACb,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,kBAAkB;YACrC,MAAM,EAAE,QAAQ,IAAI,CAAC,IAAI,6FAA6F;YACtH,MAAM,EAAE;gBACN,yCAAyC,IAAI,CAAC,IAAI,GAAG;gBACrD,qBAAqB,IAAI,CAAC,IAAI,8BAA8B;gBAC5D,6EAA6E,IAAI,CAAC,IAAI,UAAU;gBAChG,+CAA+C,IAAI,CAAC,IAAI,mCAAmC;aAC5F;YACD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAwB,EAAE,SAAqC;IACjG,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;IAC7C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7H,CAAC;AAED,SAAS,gCAAgC,CACvC,KAA2B,EAC3B,KAAe;IAEf,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqC,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,6BAA6B,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACpF,SAAS;QACX,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,KAAK,EAAE,CAAC,IAAI,CAAC;YACb,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;SACnC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,gCAAgC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;SAC9D,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,uBAAuB,SAAS,CAAC,QAAQ,qBAAqB,SAAS,CAAC,IAAI,oDAAoD;QACxI,MAAM,EAAE;YACN,kBAAkB,SAAS,CAAC,IAAI,6BAA6B,SAAS,CAAC,QAAQ,GAAG;YAClF,YAAY,SAAS,CAAC,QAAQ,+CAA+C;YAC7E,sFAAsF,SAAS,CAAC,QAAQ,UAAU;YAClH,+CAA+C,SAAS,CAAC,QAAQ,6CAA6C;SAC/G;QACD,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,cAAc;KACvB,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,gCAAgC,CAAC,UAAuC;IAC/E,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC;QAC3E,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,6BAA6B,CAAC,KAA2B,EAAE,IAAY;IAC9E,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;SAC/E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACtD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,KAAe;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY,EAAE,KAAa;IAC5D,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO,CACL,cAAc,KAAK,eAAe;QAClC,cAAc,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC;QAC9C,eAAe,CAAC,QAAQ,CAAC,IAAI,cAAc,EAAE,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,IAAY;IACpD,MAAM,cAAc,GAAG,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,UAAkB;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,oGAAoG,EAAE,EAAE,CAAC,CAAC;IACvJ,MAAM,YAAY,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC;SAC5C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;SACrF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3G,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,OAAO,aAAa,CAClB,KAAK;SACF,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,KAAK,CAAC,kBAAkB,CAAC;SACzB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACjC,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,QAAQ,GAA2B;QACvC,GAAG,EAAE,KAAK;QACV,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,IAAI;KACT,CAAC;IACF,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAClC,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAChD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,iCAAiC,CAAC,IAA+B,EAAE,KAAgC;IAC1G,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACtE,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClG,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACxD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,IAAY,EACZ,KAAe;IAEf,MAAM,KAAK,GAA6C,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,YAAY,GAAiE;QACjF,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE;QACvC,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE;QACtC,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE;QACtC,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE;QACvC,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE;QACvC,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE;QACtC,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE;QACxC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;QACpC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;KACrC,CAAC;IACF,KAAK,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,YAAY,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACzE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAkB,EAAE,QAAgB;IACnE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChG,OAAO,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG;QACf,oFAAoF;QACpF,yCAAyC;QACzC,yEAAyE;KAC1E,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK;SACrB,OAAO,CAAC,2HAA2H,EAAE,EAAE,CAAC;SACxI,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC;SAC5D,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,IAAI,EAAE,CAAC;IACV,IAAI,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,0EAA0E,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,qEAAqE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,yFAAyF,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,+HAA+H,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/I,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,CACL,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC;QACvD,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;QAClD,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;QACrC,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,CACL,wEAAwE,CAAC,IAAI,CAAC,IAAI,CAAC;QACnF,8EAA8E,CAAC,IAAI,CAAC,IAAI,CAAC;QACzF,oFAAoF,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/F,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CACjD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;QACtB,KAAK;QACL,MAAM;QACN,KAAK;QACL,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,SAAS;QACT,KAAK;QACL,MAAM;QACN,OAAO;QACP,KAAK;QACL,SAAS;QACT,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,aAAa;QACb,MAAM;QACN,OAAO;QACP,UAAU;QACV,WAAW;QACX,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,SAAS;QACT,UAAU;QACV,QAAQ;QACR,KAAK;QACL,MAAM;QACN,OAAO;QACP,IAAI;QACJ,MAAM;QACN,OAAO;KACR,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,IAAwB,EAAE,KAAyB;IACvE,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1F,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACxD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,UAAoC;IAC1D,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,SAAqC;IAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,MAAgB;IACrC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,wBAAwB,CAAC,MAA2B;IAC3D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;IACxD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxF,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,KAAK;IACL,MAAM;IACN,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,aAAa;IACb,MAAM;IACN,MAAM;IACN,SAAS;IACT,UAAU;IACV,QAAQ;IACR,SAAS;IACT,KAAK;IACL,MAAM;IACN,UAAU;IACV,SAAS;IACT,YAAY;IACZ,aAAa;IACb,SAAS;IACT,YAAY;IACZ,aAAa;IACb,OAAO;IACP,SAAS;IACT,WAAW;IACX,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;IACT,UAAU;IACV,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IACvC,KAAK;IACL,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;IACV,MAAM;IACN,OAAO;IACP,OAAO;IACP,UAAU;IACV,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,UAAU;IACV,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC"}
|