@mmnto/totem 1.118.1 → 1.119.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts/admission.d.ts +12 -12
- package/dist/artifacts/verdict.d.ts +16 -16
- package/dist/compile-manifest.d.ts +89 -0
- package/dist/compile-manifest.d.ts.map +1 -1
- package/dist/compile-manifest.js +180 -31
- package/dist/compile-manifest.js.map +1 -1
- package/dist/compile-manifest.test.js +169 -1
- package/dist/compile-manifest.test.js.map +1 -1
- package/dist/compiler-schema.d.ts +1067 -0
- package/dist/compiler-schema.d.ts.map +1 -1
- package/dist/compiler-schema.js +204 -1
- package/dist/compiler-schema.js.map +1 -1
- package/dist/compiler-schema.test.js +92 -0
- package/dist/compiler-schema.test.js.map +1 -1
- package/dist/compiler.d.ts +2 -6
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +6 -17
- package/dist/compiler.js.map +1 -1
- package/dist/freeze.d.ts +3 -3
- package/dist/index.d.ts +12 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/ledger.d.ts +12 -12
- package/dist/regex-safety/apply-rules-bounded.d.ts +11 -0
- package/dist/regex-safety/apply-rules-bounded.d.ts.map +1 -1
- package/dist/regex-safety/apply-rules-bounded.js +59 -5
- package/dist/regex-safety/apply-rules-bounded.js.map +1 -1
- package/dist/regex-validation.d.ts +7 -0
- package/dist/regex-validation.d.ts.map +1 -0
- package/dist/regex-validation.js +32 -0
- package/dist/regex-validation.js.map +1 -0
- package/dist/rule-engine.d.ts +11 -1
- package/dist/rule-engine.d.ts.map +1 -1
- package/dist/rule-engine.js +125 -18
- package/dist/rule-engine.js.map +1 -1
- package/dist/spine/authored-rule.d.ts +669 -245
- package/dist/spine/authored-rule.d.ts.map +1 -1
- package/dist/spine/authored-rule.js +113 -27
- package/dist/spine/authored-rule.js.map +1 -1
- package/dist/spine/authored-rule.test.js +170 -4
- package/dist/spine/authored-rule.test.js.map +1 -1
- package/dist/spine/authoring-ledger.d.ts +69 -10
- package/dist/spine/authoring-ledger.d.ts.map +1 -1
- package/dist/spine/authoring-ledger.js +46 -25
- package/dist/spine/authoring-ledger.js.map +1 -1
- package/dist/spine/authoring-ledger.test.js +20 -7
- package/dist/spine/authoring-ledger.test.js.map +1 -1
- package/dist/spine/candidate-rule.d.ts +18 -1
- package/dist/spine/candidate-rule.d.ts.map +1 -1
- package/dist/spine/candidate-rule.js.map +1 -1
- package/dist/spine/cert-corpus-seed.d.ts +8 -8
- package/dist/spine/compile.d.ts +4 -1
- package/dist/spine/compile.d.ts.map +1 -1
- package/dist/spine/compile.js +50 -3
- package/dist/spine/compile.js.map +1 -1
- package/dist/spine/compile.test.js +189 -23
- package/dist/spine/compile.test.js.map +1 -1
- package/dist/spine/frozen-split.d.ts +18 -18
- package/dist/spine/ledgers.d.ts +24 -24
- package/dist/spine/lf-normalize.d.ts +9 -0
- package/dist/spine/lf-normalize.d.ts.map +1 -0
- package/dist/spine/lf-normalize.js +38 -0
- package/dist/spine/lf-normalize.js.map +1 -0
- package/dist/spine/preimage-differential.d.ts +3 -1
- package/dist/spine/preimage-differential.d.ts.map +1 -1
- package/dist/spine/preimage-differential.js +9 -6
- package/dist/spine/preimage-differential.js.map +1 -1
- package/dist/spine/preimage-differential.test.js +59 -0
- package/dist/spine/preimage-differential.test.js.map +1 -1
- package/dist/spine/record-exemplars.fixture.d.ts +5 -0
- package/dist/spine/record-exemplars.fixture.d.ts.map +1 -0
- package/dist/spine/record-exemplars.fixture.js +61 -0
- package/dist/spine/record-exemplars.fixture.js.map +1 -0
- package/dist/spine/record-lower.d.ts +90 -0
- package/dist/spine/record-lower.d.ts.map +1 -0
- package/dist/spine/record-lower.js +418 -0
- package/dist/spine/record-lower.js.map +1 -0
- package/dist/spine/record-lower.test.d.ts +2 -0
- package/dist/spine/record-lower.test.d.ts.map +1 -0
- package/dist/spine/record-lower.test.js +562 -0
- package/dist/spine/record-lower.test.js.map +1 -0
- package/dist/spine/record-runtime.d.ts +215 -0
- package/dist/spine/record-runtime.d.ts.map +1 -0
- package/dist/spine/record-runtime.js +330 -0
- package/dist/spine/record-runtime.js.map +1 -0
- package/dist/spine/record-runtime.test.d.ts +2 -0
- package/dist/spine/record-runtime.test.d.ts.map +1 -0
- package/dist/spine/record-runtime.test.js +814 -0
- package/dist/spine/record-runtime.test.js.map +1 -0
- package/dist/spine/rule-record.d.ts +864 -0
- package/dist/spine/rule-record.d.ts.map +1 -0
- package/dist/spine/rule-record.js +781 -0
- package/dist/spine/rule-record.js.map +1 -0
- package/dist/spine/rule-record.test.d.ts +2 -0
- package/dist/spine/rule-record.test.d.ts.map +1 -0
- package/dist/spine/rule-record.test.js +1262 -0
- package/dist/spine/rule-record.test.js.map +1 -0
- package/dist/spine/windtunnel-firing.d.ts.map +1 -1
- package/dist/spine/windtunnel-firing.js +28 -1
- package/dist/spine/windtunnel-firing.js.map +1 -1
- package/dist/spine/windtunnel-lock.d.ts +10 -10
- package/dist/stage4-verifier.d.ts.map +1 -1
- package/dist/stage4-verifier.js +61 -17
- package/dist/stage4-verifier.js.map +1 -1
- package/dist/sys/glob.d.ts +30 -0
- package/dist/sys/glob.d.ts.map +1 -1
- package/dist/sys/glob.js +62 -1
- package/dist/sys/glob.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
// ─── Prop 310 § Design 14 — conformance suite, slice 2: LOWERING ─────────────
|
|
2
|
+
//
|
|
3
|
+
// Slice 1's suite pins what the parser ADMITS; this one pins what lowering DOES
|
|
4
|
+
// with what was admitted. The § Design 12 obligation under test is total
|
|
5
|
+
// lowering: "every construct the parser admits either lands on the compiled
|
|
6
|
+
// record or fails compile LOUD — no construct is accepted at parse and dropped at
|
|
7
|
+
// compile." Each cannot-lower construct class gets a negative fixture, each
|
|
8
|
+
// verbatim carry gets a positive one, and the freeze boundary gets a guard that
|
|
9
|
+
// fails the moment the record path starts sanitizing (or the legacy path stops).
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { describe, expect, it } from 'vitest';
|
|
13
|
+
import { stringify as yamlStringify } from 'yaml';
|
|
14
|
+
import { extensionToLanguage } from '../ast-classifier.js';
|
|
15
|
+
import { extensionToLang, resolveAstGrepLangs } from '../ast-grep-query.js';
|
|
16
|
+
import { canonicalStringify } from '../compile-manifest.js';
|
|
17
|
+
import { fileMatchesGlobs, sanitizeFileGlobs } from '../compiler.js';
|
|
18
|
+
import { CompiledRuleSchema, CompiledRulesFileSchema } from '../compiler-schema.js';
|
|
19
|
+
import { design4ExemplarRecord, design8ExemplarRecord } from './record-exemplars.fixture.js';
|
|
20
|
+
import { compileRuleRecord, languageProbeGlobs, resolveRecordLanguage, V1_INEXPRESSIBLE_NAPI_KEYS, } from './record-lower.js';
|
|
21
|
+
import { isRecordPathRule, RECORD_COMPILED_HOME_KEYS, ruleAppliesToFile, } from './record-runtime.js';
|
|
22
|
+
import { parseRuleRecord, RequiresScopeSchema, RuleCurationSchema, RuleRecordExampleSchema, } from './rule-record.js';
|
|
23
|
+
const FILE = '.totem/rules/fail-open-catch.rule.yaml';
|
|
24
|
+
/**
|
|
25
|
+
* The size of the shipped legacy corpus. A CONSTANT, not a floor, because the
|
|
26
|
+
* `rule-compilation` freeze means nothing regenerates `.totem/compiled-rules.json`
|
|
27
|
+
* — so this number cannot drift while the freeze stands. When the freeze lifts and
|
|
28
|
+
* the corpus is regenerated or migrated, this updates ONCE, deliberately, and the
|
|
29
|
+
* update is the signal that the corpus moved.
|
|
30
|
+
*/
|
|
31
|
+
const SHIPPED_RULE_COUNT = 485;
|
|
32
|
+
/** A well-formed ADR-112 §8 minted id (16 lowercase hex, no collision suffix). */
|
|
33
|
+
const RULE_ID = '0123456789abcdef';
|
|
34
|
+
const NOW = '2026-08-21T00:00:00.000Z';
|
|
35
|
+
function lower(record, ruleId = RULE_ID) {
|
|
36
|
+
const parsed = parseRuleRecord(yamlStringify(record), FILE);
|
|
37
|
+
return compileRuleRecord(parsed, { ruleId, now: NOW });
|
|
38
|
+
}
|
|
39
|
+
/** Lower and assert success, returning the compiled rule (a rejection fails loudly, with its reason). */
|
|
40
|
+
function lowerOk(record, ruleId = RULE_ID) {
|
|
41
|
+
const outcome = lower(record, ruleId);
|
|
42
|
+
if (outcome.kind !== 'compiled') {
|
|
43
|
+
throw new Error(`expected a compiled outcome, got rejected: ${outcome.reason}`);
|
|
44
|
+
}
|
|
45
|
+
return outcome.rule;
|
|
46
|
+
}
|
|
47
|
+
/** Lower and assert rejection, returning the reason (a compile fails loudly). */
|
|
48
|
+
function lowerRejected(record) {
|
|
49
|
+
const outcome = lower(record);
|
|
50
|
+
if (outcome.kind !== 'rejected') {
|
|
51
|
+
throw new Error('expected a rejected outcome, got a compiled rule');
|
|
52
|
+
}
|
|
53
|
+
return outcome.reason;
|
|
54
|
+
}
|
|
55
|
+
/** A minimal dialect-clean ast-grep record (compound tree payload). */
|
|
56
|
+
function astGrepRecord() {
|
|
57
|
+
return {
|
|
58
|
+
schemaVersion: 1,
|
|
59
|
+
severity: 'error',
|
|
60
|
+
message: 'Catch blocks must re-throw or route the error.',
|
|
61
|
+
target: {
|
|
62
|
+
type: 'ast-grep',
|
|
63
|
+
language: 'typescript',
|
|
64
|
+
rule: { kind: 'catch_clause' },
|
|
65
|
+
scope: { fileGlobs: ['packages/**/*.ts'] },
|
|
66
|
+
},
|
|
67
|
+
examples: [
|
|
68
|
+
{
|
|
69
|
+
bad: 'try { risky() } catch (e) { log(e) }',
|
|
70
|
+
good: 'try { risky() } catch (e) { throw e }',
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** A minimal dialect-clean regex record. */
|
|
76
|
+
function regexRecord() {
|
|
77
|
+
return {
|
|
78
|
+
schemaVersion: 1,
|
|
79
|
+
severity: 'warning',
|
|
80
|
+
message: 'git output-consuming commands must pin LC_ALL=C on the same line.',
|
|
81
|
+
target: {
|
|
82
|
+
type: 'regex',
|
|
83
|
+
pattern: '\\bgit\\s+(log|diff|status)\\b',
|
|
84
|
+
scope: { fileGlobs: ['**/*.sh'] },
|
|
85
|
+
},
|
|
86
|
+
examples: [{ bad: 'git log --oneline', good: 'LC_ALL=C git log --oneline' }],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ─── A. The compiled homes (§ Design 12) + mined-path byte identity ──────────
|
|
90
|
+
describe('CompiledRuleSchema additions — the § Design 12 compiled homes', () => {
|
|
91
|
+
const repoRoot = fileURLToPath(new URL('../../../../', import.meta.url));
|
|
92
|
+
const manifestPath = `${repoRoot}.totem/compiled-rules.json`;
|
|
93
|
+
const rawManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
94
|
+
it('reads a NON-EMPTY corpus at the expected size (the floor the sweeps stand on)', () => {
|
|
95
|
+
// Without this, every assertion below is self-referentially vacuous: an empty
|
|
96
|
+
// or truncated `rules` array satisfies "all rules re-validate", "no rule
|
|
97
|
+
// carries a record field", and "every rule scopes identically" trivially, and
|
|
98
|
+
// the suite would go green on a corpus that had silently disappeared.
|
|
99
|
+
expect(rawManifest.rules.length).toBe(SHIPPED_RULE_COUNT);
|
|
100
|
+
});
|
|
101
|
+
it('re-validates the shipped 485-rule manifest BYTE-IDENTICALLY under the extended schema', () => {
|
|
102
|
+
// The freeze-compatibility proof (Amendment R11 / § Data model deltas): the
|
|
103
|
+
// additions are optional, so the frozen corpus parses unchanged — and
|
|
104
|
+
// "unchanged" is checked on the MANIFEST-HASH basis (canonical, key-sorted),
|
|
105
|
+
// which is the identity that actually matters to `verify-manifest`. A
|
|
106
|
+
// required addition, or one that introduced a default, would move every hash.
|
|
107
|
+
const parsed = CompiledRulesFileSchema.parse(rawManifest);
|
|
108
|
+
expect(parsed.rules.length).toBe(SHIPPED_RULE_COUNT);
|
|
109
|
+
expect(canonicalStringify(parsed.rules)).toBe(canonicalStringify(rawManifest.rules));
|
|
110
|
+
});
|
|
111
|
+
it('leaves every legacy rule OUTSIDE the record path — the discriminator cannot flip one', () => {
|
|
112
|
+
// The runtime reads field PRESENCE as the record-path discriminator, so this
|
|
113
|
+
// is what makes "legacy rules keep their matching behaviour byte-for-byte" a
|
|
114
|
+
// fact rather than an intention. If a future writer ever puts one of these
|
|
115
|
+
// fields on a mined rule, this fails before the matcher silently changes.
|
|
116
|
+
expect(rawManifest.rules.length).toBe(SHIPPED_RULE_COUNT);
|
|
117
|
+
const carriers = rawManifest.rules.filter((rule) => RECORD_COMPILED_HOME_KEYS.some((key) => rule[key] !== undefined));
|
|
118
|
+
expect(carriers).toEqual([]);
|
|
119
|
+
const compiled = CompiledRulesFileSchema.parse(rawManifest).rules;
|
|
120
|
+
expect(compiled.filter(isRecordPathRule)).toEqual([]);
|
|
121
|
+
});
|
|
122
|
+
it('keys the record path on `examples` ALONE — a cosmetic field never flips a matcher', () => {
|
|
123
|
+
// `examples` is the EXACT discriminator: § Design 5 makes it non-omittable
|
|
124
|
+
// and the lowering emits it unconditionally. A wider "any compiled home"
|
|
125
|
+
// test would let a legacy-shaped rule that merely gained a `recoveryHint`
|
|
126
|
+
// silently switch matchers — flipping the same `*.ts` glob from the shipped
|
|
127
|
+
// tree-wide reading to the record dialect's root-only one.
|
|
128
|
+
const base = {
|
|
129
|
+
lessonHash: 'fedcba9876543210',
|
|
130
|
+
lessonHeading: 'legacy',
|
|
131
|
+
pattern: 'x',
|
|
132
|
+
message: 'm',
|
|
133
|
+
engine: 'regex',
|
|
134
|
+
compiledAt: NOW,
|
|
135
|
+
fileGlobs: ['*.ts'],
|
|
136
|
+
};
|
|
137
|
+
expect(isRecordPathRule(CompiledRuleSchema.parse(base))).toBe(false);
|
|
138
|
+
expect(isRecordPathRule(CompiledRuleSchema.parse({ ...base, recoveryHint: 'try harder' }))).toBe(false);
|
|
139
|
+
expect(isRecordPathRule(CompiledRuleSchema.parse({ ...base, verificationShadow: { type: 'rego', source: 'p' } }))).toBe(false);
|
|
140
|
+
// The deliberate contract: `examples` present ⇒ record path.
|
|
141
|
+
expect(isRecordPathRule(CompiledRuleSchema.parse({ ...base, examples: [{ bad: 'b', good: 'g' }] }))).toBe(true);
|
|
142
|
+
// And every rule this slice lowers carries it.
|
|
143
|
+
expect(isRecordPathRule(lowerOk(regexRecord()))).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
it('CORPUS SWEEP: every legacy rule scopes IDENTICALLY under the shared predicate', () => {
|
|
146
|
+
// The reviewer's sweep, promoted to a standing test. `ruleAppliesToFile` is
|
|
147
|
+
// now the single scope predicate for both lint dispatchers, Stage 4, and the
|
|
148
|
+
// wind tunnel, so "legacy behaviour is byte-identical" has to be a measured
|
|
149
|
+
// property of the whole shipped corpus, not a claim about one code path.
|
|
150
|
+
const compiled = CompiledRulesFileSchema.parse(rawManifest).rules;
|
|
151
|
+
expect(compiled.length).toBe(SHIPPED_RULE_COUNT);
|
|
152
|
+
const paths = [
|
|
153
|
+
'a.ts',
|
|
154
|
+
'src/a.ts',
|
|
155
|
+
'packages/core/src/a.ts',
|
|
156
|
+
'packages/core/src/a.test.ts',
|
|
157
|
+
'scripts/x.sh',
|
|
158
|
+
'deep/nest/mod.rs',
|
|
159
|
+
'README.md',
|
|
160
|
+
'src/a.tsx',
|
|
161
|
+
'.github/workflows/ci.yml',
|
|
162
|
+
'packages/cli/src/index.cjs',
|
|
163
|
+
];
|
|
164
|
+
let compared = 0;
|
|
165
|
+
for (const rule of compiled) {
|
|
166
|
+
for (const filePath of paths) {
|
|
167
|
+
const shipped = rule.fileGlobs && rule.fileGlobs.length > 0
|
|
168
|
+
? fileMatchesGlobs(filePath, rule.fileGlobs)
|
|
169
|
+
: true;
|
|
170
|
+
expect(ruleAppliesToFile(rule, filePath)).toBe(shipped);
|
|
171
|
+
compared += 1;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
expect(compared).toBe(compiled.length * paths.length);
|
|
175
|
+
});
|
|
176
|
+
it('accepts a rule carrying NONE of the additions (every one is optional)', () => {
|
|
177
|
+
const minimal = CompiledRuleSchema.parse({
|
|
178
|
+
lessonHash: 'abcdef0123456789',
|
|
179
|
+
lessonHeading: 'legacy',
|
|
180
|
+
pattern: 'foo',
|
|
181
|
+
message: 'no',
|
|
182
|
+
engine: 'regex',
|
|
183
|
+
compiledAt: NOW,
|
|
184
|
+
});
|
|
185
|
+
for (const key of RECORD_COMPILED_HOME_KEYS) {
|
|
186
|
+
expect(minimal[key]).toBeUndefined();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
it('couples the compiled `requires.scope` enum to the grammar’s RequiresScopeSchema', () => {
|
|
190
|
+
// `compiler-schema.ts` is an import-graph leaf and cannot import the grammar
|
|
191
|
+
// (it would close a cycle), so the two enums are mirrored in source and
|
|
192
|
+
// COUPLED here. `block` stays reserved-unimplemented on both sides.
|
|
193
|
+
const rule = lowerOk({ ...regexRecord(), requires: { pattern: 'x', scope: 'file' } });
|
|
194
|
+
expect(RequiresScopeSchema.options).toEqual(['line', 'file']);
|
|
195
|
+
expect(rule.requires?.scope).toBe('file');
|
|
196
|
+
for (const scope of RequiresScopeSchema.options) {
|
|
197
|
+
expect(CompiledRuleSchema.safeParse({
|
|
198
|
+
lessonHash: RULE_ID,
|
|
199
|
+
lessonHeading: 'h',
|
|
200
|
+
pattern: 'p',
|
|
201
|
+
message: 'm',
|
|
202
|
+
engine: 'regex',
|
|
203
|
+
compiledAt: NOW,
|
|
204
|
+
requires: { pattern: 'x', scope },
|
|
205
|
+
}).success).toBe(true);
|
|
206
|
+
}
|
|
207
|
+
expect(CompiledRuleSchema.safeParse({
|
|
208
|
+
lessonHash: RULE_ID,
|
|
209
|
+
lessonHeading: 'h',
|
|
210
|
+
pattern: 'p',
|
|
211
|
+
message: 'm',
|
|
212
|
+
engine: 'regex',
|
|
213
|
+
compiledAt: NOW,
|
|
214
|
+
requires: { pattern: 'x', scope: 'block' },
|
|
215
|
+
}).success).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
it('couples the compiled `examples` and `curation` shapes to the grammar’s schemas', () => {
|
|
218
|
+
expect(Object.keys(RuleRecordExampleSchema.shape).sort()).toEqual(['bad', 'good']);
|
|
219
|
+
expect(Object.keys(RuleCurationSchema.innerType().shape).sort()).toEqual([
|
|
220
|
+
'baseline5Phase',
|
|
221
|
+
'curatedAt',
|
|
222
|
+
'curatedBy',
|
|
223
|
+
'sourceLesson',
|
|
224
|
+
]);
|
|
225
|
+
const rule = lowerOk(design4ExemplarRecord());
|
|
226
|
+
expect(Object.keys(rule.examples[0]).sort()).toEqual(['bad', 'good']);
|
|
227
|
+
expect(Object.keys(rule.curation).sort()).toEqual([
|
|
228
|
+
'baseline5Phase',
|
|
229
|
+
'curatedAt',
|
|
230
|
+
'curatedBy',
|
|
231
|
+
'sourceLesson',
|
|
232
|
+
]);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
// ─── B. The freeze boundary (§ Design 7 conformance scope) ───────────────────
|
|
236
|
+
describe('freeze guard — sanitizeFileGlobs is untouched and never runs on the record path', () => {
|
|
237
|
+
it('keeps the legacy brace EXPANSION byte-for-byte', () => {
|
|
238
|
+
expect(sanitizeFileGlobs(['**/*.{ts,js}'])).toEqual(['**/*.ts', '**/*.js']);
|
|
239
|
+
expect(sanitizeFileGlobs(['src/*.{ts,tsx,js}'])).toEqual(['src/*.ts', 'src/*.tsx', 'src/*.js']);
|
|
240
|
+
});
|
|
241
|
+
it('keeps the legacy shallow-glob PROMOTION byte-for-byte', () => {
|
|
242
|
+
expect(sanitizeFileGlobs(['*.ts'])).toEqual(['**/*.ts']);
|
|
243
|
+
expect(sanitizeFileGlobs(['*'])).toEqual(['**/*']);
|
|
244
|
+
expect(sanitizeFileGlobs(['!*.ts'])).toEqual(['!**/*.ts']);
|
|
245
|
+
expect(sanitizeFileGlobs(['src/*.ts'])).toEqual(['src/*.ts']);
|
|
246
|
+
});
|
|
247
|
+
it('carries record globs VERBATIM — no promotion, no expansion, no trimming', () => {
|
|
248
|
+
// The negative half of the two guards above: the same `*.ts` the sanitizer
|
|
249
|
+
// promotes tree-wide survives lowering unchanged. Braces never reach here
|
|
250
|
+
// (a parse error), so the only observable transform would be promotion.
|
|
251
|
+
const record = regexRecord();
|
|
252
|
+
record.target.scope = {
|
|
253
|
+
fileGlobs: ['*.ts', 'src/*.ts', '**/*.sh'],
|
|
254
|
+
excludeGlobs: ['**/*.test.ts'],
|
|
255
|
+
};
|
|
256
|
+
const rule = lowerOk(record);
|
|
257
|
+
expect(rule.fileGlobs).toEqual(['*.ts', 'src/*.ts', '**/*.sh']);
|
|
258
|
+
expect(rule.excludeGlobs).toEqual(['**/*.test.ts']);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
// ─── C. § Design 6 — language resolution moves to the declared language ──────
|
|
262
|
+
describe('§ Design 6 — the declared language resolves against the registry', () => {
|
|
263
|
+
it('resolves a registered language and reports its representative extension', () => {
|
|
264
|
+
const resolution = resolveRecordLanguage('typescript');
|
|
265
|
+
expect(resolution.resolved).toBe(true);
|
|
266
|
+
if (!resolution.resolved)
|
|
267
|
+
return;
|
|
268
|
+
expect(resolution.language).toBe('typescript');
|
|
269
|
+
expect(['.cts', '.mts', '.ts']).toContain(resolution.extension);
|
|
270
|
+
});
|
|
271
|
+
it('fails loud on an unresolvable language, naming the registry as the authority', () => {
|
|
272
|
+
const resolution = resolveRecordLanguage('rust');
|
|
273
|
+
expect(resolution.resolved).toBe(false);
|
|
274
|
+
if (resolution.resolved)
|
|
275
|
+
return;
|
|
276
|
+
expect(resolution.reason).toContain('§ Design 6');
|
|
277
|
+
expect(resolution.reason).toContain('extensionToLanguage registry');
|
|
278
|
+
expect(resolution.reason).toContain('typescript');
|
|
279
|
+
});
|
|
280
|
+
it('pins the validator probe to EXACTLY one Lang (coupling guard on resolveAstGrepLangs)', () => {
|
|
281
|
+
// The record path pins `validateAstGrepPattern` to one grammar by handing it
|
|
282
|
+
// a probe glob carrying one registered extension. That indirection is only
|
|
283
|
+
// safe while the shipped derivation still maps one extension to one Lang —
|
|
284
|
+
// so this asserts the coupling instead of trusting it.
|
|
285
|
+
for (const language of ['typescript', 'tsx', 'javascript']) {
|
|
286
|
+
const resolution = resolveRecordLanguage(language);
|
|
287
|
+
expect(resolution.resolved).toBe(true);
|
|
288
|
+
if (!resolution.resolved)
|
|
289
|
+
continue;
|
|
290
|
+
const langs = resolveAstGrepLangs(languageProbeGlobs(resolution.extension));
|
|
291
|
+
expect(langs).toEqual([extensionToLang(resolution.extension)]);
|
|
292
|
+
expect(langs).toHaveLength(1);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
it('validates under the DECLARED language, not a permissive fallback (the “moves” row)', () => {
|
|
296
|
+
// `type_alias_declaration` exists in the TypeScript/TSX grammars and not in
|
|
297
|
+
// JavaScript. The shipped validator falls back to `Lang.Tsx` — its most
|
|
298
|
+
// permissive parser — whenever a glob carries no registered extension, and
|
|
299
|
+
// accepts a pattern under ANY resolved Lang; the record path resolves ONLY
|
|
300
|
+
// the declared language and validates under exactly it. Since the language⇄
|
|
301
|
+
// glob floor now requires the scope to agree with the declaration, the globs
|
|
302
|
+
// co-vary — but they never reach the validator, which sees only the
|
|
303
|
+
// language-derived probe.
|
|
304
|
+
const typescript = astGrepRecord();
|
|
305
|
+
const tsTarget = typescript.target;
|
|
306
|
+
tsTarget.rule = { kind: 'type_alias_declaration' };
|
|
307
|
+
tsTarget.scope = { fileGlobs: ['**/*.ts'] };
|
|
308
|
+
expect(lower(typescript).kind).toBe('compiled');
|
|
309
|
+
const javascript = astGrepRecord();
|
|
310
|
+
const jsTarget = javascript.target;
|
|
311
|
+
jsTarget.language = 'javascript';
|
|
312
|
+
jsTarget.rule = { kind: 'type_alias_declaration' };
|
|
313
|
+
jsTarget.scope = { fileGlobs: ['**/*.js'] };
|
|
314
|
+
const reason = lowerRejected(javascript);
|
|
315
|
+
// The PAYLOAD gate rejected it — not the consistency floor. That distinction
|
|
316
|
+
// is what makes this a language-pinning test rather than a scope test.
|
|
317
|
+
expect(reason).toContain('target.rule failed ast-grep validation');
|
|
318
|
+
expect(reason).toContain("declared language 'javascript'");
|
|
319
|
+
expect(reason).toContain('try-each-glob-derived-Lang');
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
// ─── § Design 6 — the language⇄glob consistency floor ────────────────────────
|
|
323
|
+
describe('§ Design 6 — an ast-grep scope must agree with its declared language', () => {
|
|
324
|
+
function astGrepScoped(language, fileGlobs, excludeGlobs) {
|
|
325
|
+
const record = astGrepRecord();
|
|
326
|
+
const target = record.target;
|
|
327
|
+
target.language = language;
|
|
328
|
+
target.scope = { fileGlobs, ...(excludeGlobs ? { excludeGlobs } : {}) };
|
|
329
|
+
return record;
|
|
330
|
+
}
|
|
331
|
+
it('rejects a scope whose extension resolves to a DIFFERENT language', () => {
|
|
332
|
+
// The demonstrated gap: this lowered clean before the floor, and the runtime
|
|
333
|
+
// — which dispatches ast-grep by file extension — would then evaluate a
|
|
334
|
+
// TypeScript-validated payload under the JavaScript grammar.
|
|
335
|
+
const reason = lowerRejected(astGrepScoped('typescript', ['**/*.js']));
|
|
336
|
+
expect(reason).toContain('§ Design 6');
|
|
337
|
+
expect(reason).toContain("targets language 'javascript'");
|
|
338
|
+
expect(reason).toContain("declares 'typescript'");
|
|
339
|
+
expect(reason).toContain('N records');
|
|
340
|
+
});
|
|
341
|
+
it('rejects `.tsx` under `language: typescript` — the registry says they are different grammars', () => {
|
|
342
|
+
// `extensionToLanguage('.tsx')` is `'tsx'`, a distinct SupportedLanguage with
|
|
343
|
+
// its own WASM loader and its own napi `Lang`. Admitting it under
|
|
344
|
+
// `typescript` would reopen exactly the gap this floor closes, so the
|
|
345
|
+
// mechanical rule governs: a `.tsx` scope declares `language: tsx`.
|
|
346
|
+
expect(extensionToLanguage('.tsx')).toBe('tsx');
|
|
347
|
+
const reason = lowerRejected(astGrepScoped('typescript', ['**/*.ts', '**/*.tsx']));
|
|
348
|
+
expect(reason).toContain("targets language 'tsx'");
|
|
349
|
+
expect(lower(astGrepScoped('tsx', ['**/*.tsx', '**/*.jsx'])).kind).toBe('compiled');
|
|
350
|
+
});
|
|
351
|
+
it('accepts MULTIPLE globs that all resolve to the declared language', () => {
|
|
352
|
+
expect(lower(astGrepScoped('typescript', ['**/*.ts', '**/*.mts', 'packages/**/*.cts'])).kind).toBe('compiled');
|
|
353
|
+
});
|
|
354
|
+
it('rejects an EXTENSION-LESS glob on an ast-grep target', () => {
|
|
355
|
+
const reason = lowerRejected(astGrepScoped('typescript', ['packages/**']));
|
|
356
|
+
expect(reason).toContain('carries no file extension');
|
|
357
|
+
expect(reason).toContain('§ Design 6');
|
|
358
|
+
});
|
|
359
|
+
it('rejects an UNREGISTERED extension it cannot confirm', () => {
|
|
360
|
+
const reason = lowerRejected(astGrepScoped('typescript', ['**/*.rs']));
|
|
361
|
+
expect(reason).toContain("extension '.rs', which is not registered");
|
|
362
|
+
});
|
|
363
|
+
it('EXEMPTS excludeGlobs — an exclusion only ever narrows', () => {
|
|
364
|
+
const outcome = lower(astGrepScoped('typescript', ['packages/**/*.ts'], ['**/*.test.js', 'vendor/**']));
|
|
365
|
+
expect(outcome.kind).toBe('compiled');
|
|
366
|
+
});
|
|
367
|
+
it('leaves REGEX targets unchecked — a regex payload has no grammar binding', () => {
|
|
368
|
+
const record = regexRecord();
|
|
369
|
+
record.target.scope = {
|
|
370
|
+
fileGlobs: ['**/*.js', 'packages/**', '**/*.rs'],
|
|
371
|
+
};
|
|
372
|
+
expect(lower(record).kind).toBe('compiled');
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
// ─── D. Cannot-lower negatives, one per construct class ──────────────────────
|
|
376
|
+
describe('§ Design 12 — a construct that cannot lower fails compile LOUD', () => {
|
|
377
|
+
it('rejects a bad regex in `requires.pattern` (gated on EVERY engine)', () => {
|
|
378
|
+
const reason = lowerRejected({
|
|
379
|
+
...regexRecord(),
|
|
380
|
+
requires: { pattern: '(a+)+$', scope: 'line' },
|
|
381
|
+
});
|
|
382
|
+
expect(reason).toContain('§ Design 8');
|
|
383
|
+
expect(reason).toContain('requires.pattern');
|
|
384
|
+
expect(reason).toContain('ReDoS');
|
|
385
|
+
});
|
|
386
|
+
it('gates `requires.pattern` on an ast-grep rule too — the check is engine-independent', () => {
|
|
387
|
+
const reason = lowerRejected({
|
|
388
|
+
...astGrepRecord(),
|
|
389
|
+
requires: { pattern: '(a+)+$', scope: 'file' },
|
|
390
|
+
});
|
|
391
|
+
expect(reason).toContain('§ Design 8');
|
|
392
|
+
expect(reason).toContain('independent of target.type');
|
|
393
|
+
});
|
|
394
|
+
it('rejects `requires.scope: line` on an ast-grep target (span-vs-line ruling)', () => {
|
|
395
|
+
// An ast-grep match is a SPAN. Reading it as its start line makes the verdict
|
|
396
|
+
// depend on how the author wrapped the source, and § Design 8 reserves
|
|
397
|
+
// `block` — the span's natural unit — as unimplemented, so V1 rejects rather
|
|
398
|
+
// than shipping a formatting-dependent semantic.
|
|
399
|
+
const reason = lowerRejected({
|
|
400
|
+
...astGrepRecord(),
|
|
401
|
+
requires: { pattern: 'LC_ALL=C', scope: 'line' },
|
|
402
|
+
});
|
|
403
|
+
expect(reason).toContain('§ Design 8');
|
|
404
|
+
expect(reason).toContain('an ast-grep match is a SPAN');
|
|
405
|
+
expect(reason).toContain('`block`');
|
|
406
|
+
});
|
|
407
|
+
it('keeps `line` valid on regex and `file` valid on BOTH engines', () => {
|
|
408
|
+
expect(lower({ ...regexRecord(), requires: { pattern: 'x', scope: 'line' } }).kind).toBe('compiled');
|
|
409
|
+
expect(lower({ ...regexRecord(), requires: { pattern: 'x', scope: 'file' } }).kind).toBe('compiled');
|
|
410
|
+
expect(lower({ ...astGrepRecord(), requires: { pattern: 'x', scope: 'file' } }).kind).toBe('compiled');
|
|
411
|
+
});
|
|
412
|
+
it('rejects an unresolvable `language`', () => {
|
|
413
|
+
const record = astGrepRecord();
|
|
414
|
+
record.target.language = 'brainfuck';
|
|
415
|
+
const reason = lowerRejected(record);
|
|
416
|
+
expect(reason).toContain('§ Design 6');
|
|
417
|
+
expect(reason).toContain("'brainfuck' is not registered");
|
|
418
|
+
});
|
|
419
|
+
it('rejects a malformed ast-grep tree at the engine gate', () => {
|
|
420
|
+
const record = astGrepRecord();
|
|
421
|
+
record.target.rule = { notARule: 1 };
|
|
422
|
+
const reason = lowerRejected(record);
|
|
423
|
+
expect(reason).toContain('§ Design 6');
|
|
424
|
+
expect(reason).toContain('target.rule failed ast-grep validation');
|
|
425
|
+
});
|
|
426
|
+
it('rejects a bad regex in `target.pattern`', () => {
|
|
427
|
+
const record = regexRecord();
|
|
428
|
+
record.target.pattern = '(';
|
|
429
|
+
const reason = lowerRejected(record);
|
|
430
|
+
expect(reason).toContain('§ Design 6');
|
|
431
|
+
expect(reason).toContain('invalid syntax');
|
|
432
|
+
});
|
|
433
|
+
it('rejects V1-inexpressible NapiConfig siblings smuggled into the rule tree', () => {
|
|
434
|
+
for (const key of V1_INEXPRESSIBLE_NAPI_KEYS) {
|
|
435
|
+
const record = astGrepRecord();
|
|
436
|
+
record.target.rule = { kind: 'catch_clause', [key]: {} };
|
|
437
|
+
const reason = lowerRejected(record);
|
|
438
|
+
expect(reason).toContain('operator ruling 2026-08-21');
|
|
439
|
+
expect(reason).toContain(`'${key}' is a NapiConfig SIBLING`);
|
|
440
|
+
expect(reason).toContain('construct-gap');
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
it('THROWS on a malformed ruleId — identity is a producer contract, not authored content', () => {
|
|
444
|
+
expect(() => lower(regexRecord(), 'not-a-minted-id')).toThrow(/malformed ruleId/);
|
|
445
|
+
expect(() => lower(regexRecord(), '')).toThrow(/malformed ruleId/);
|
|
446
|
+
// A 16-hex base with the mint's own collision suffix is well-formed.
|
|
447
|
+
expect(lowerOk(regexRecord(), '0123456789abcdef-2').lessonHash).toBe('0123456789abcdef-2');
|
|
448
|
+
});
|
|
449
|
+
it('THROWS on a record key with no defined lowering (the runtime totality check)', () => {
|
|
450
|
+
// A key that got past the parser — via a cast, a schema/table desync, or a
|
|
451
|
+
// future grammar edit that forgot this file — must never be silently dropped.
|
|
452
|
+
const parsed = parseRuleRecord(yamlStringify(regexRecord()), FILE);
|
|
453
|
+
const smuggled = {
|
|
454
|
+
...parsed,
|
|
455
|
+
record: { ...parsed.record, futureConstruct: 'x' },
|
|
456
|
+
};
|
|
457
|
+
expect(() => compileRuleRecord(smuggled, { ruleId: RULE_ID, now: NOW })).toThrow(/record key 'futureConstruct' has no defined lowering/);
|
|
458
|
+
});
|
|
459
|
+
it('THROWS on an engine-binding divergence — the tamper guard fires (defence in depth)', () => {
|
|
460
|
+
// Honest scope, per the falsification round: this divergence is UNREACHABLE
|
|
461
|
+
// from any parse-valid record, because slice 1's `RuleTargetSchema` already
|
|
462
|
+
// kills the payload/type mismatch class at parse (pattern XOR rule, per
|
|
463
|
+
// type). The assert is therefore defence in depth against a future lowering
|
|
464
|
+
// edit or a hand-built `ParsedRuleRecord`, NOT a live § Design 3 gate — and
|
|
465
|
+
// what this test demonstrates is that the guard fires on tampered input.
|
|
466
|
+
const parsed = parseRuleRecord(yamlStringify(regexRecord()), FILE);
|
|
467
|
+
const tampered = { ...parsed, derivedEngine: 'ast-grep' };
|
|
468
|
+
expect(() => compileRuleRecord(tampered, { ruleId: RULE_ID, now: NOW })).toThrow(/declared target.type 'ast-grep' but its payload compiled as 'regex'/);
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
// ─── E. Identity, verbatim carries, and the tree-form ruling ─────────────────
|
|
472
|
+
describe('lowering — identity, verbatim carries, and the derived NapiConfig wrapper', () => {
|
|
473
|
+
it('takes identity as an INPUT: lessonHash ← ruleId, never a dslSource hash', () => {
|
|
474
|
+
const rule = lowerOk(regexRecord());
|
|
475
|
+
expect(rule.lessonHash).toBe(RULE_ID);
|
|
476
|
+
expect(rule.lessonHeading).toBe(`Prop 310 rule record (${RULE_ID})`);
|
|
477
|
+
// The heading is NOT a copy of the author's message (Tenet 20 — one home).
|
|
478
|
+
expect(rule.lessonHeading).not.toBe(rule.message);
|
|
479
|
+
});
|
|
480
|
+
it('mints Yellow: unverified true, legitimacy and ruleClass absent', () => {
|
|
481
|
+
const rule = lowerOk(regexRecord());
|
|
482
|
+
expect(rule.unverified).toBe(true);
|
|
483
|
+
expect(rule.legitimacy).toBeUndefined();
|
|
484
|
+
expect(rule.ruleClass).toBeUndefined();
|
|
485
|
+
expect(rule.compiledAt).toBe(NOW);
|
|
486
|
+
expect(rule.createdAt).toBe(NOW);
|
|
487
|
+
});
|
|
488
|
+
it('carries every § Design 4 construct verbatim onto the compiled rule', () => {
|
|
489
|
+
const record = design4ExemplarRecord();
|
|
490
|
+
const rule = lowerOk(record);
|
|
491
|
+
expect(rule.severity).toBe('error');
|
|
492
|
+
expect(rule.message).toBe(record.message);
|
|
493
|
+
expect(rule.recoveryHint).toBe(record.recoveryHint);
|
|
494
|
+
expect(rule.examples).toEqual(record.examples);
|
|
495
|
+
expect(rule.curation).toEqual(record.curation);
|
|
496
|
+
expect(rule.fileGlobs).toEqual(['packages/**/*.ts']);
|
|
497
|
+
expect(rule.excludeGlobs).toEqual(['**/*.test.ts']);
|
|
498
|
+
expect(rule.language).toBe('typescript');
|
|
499
|
+
expect(rule.engine).toBe('ast-grep');
|
|
500
|
+
});
|
|
501
|
+
it('renames `verification_shadow` → `verificationShadow` exactly once, verbatim', () => {
|
|
502
|
+
const record = design4ExemplarRecord();
|
|
503
|
+
const rule = lowerOk(record);
|
|
504
|
+
expect(rule.verificationShadow).toEqual(record.verification_shadow);
|
|
505
|
+
// The snake_case record key never survives onto the compiled artifact.
|
|
506
|
+
expect(rule.verification_shadow).toBeUndefined();
|
|
507
|
+
});
|
|
508
|
+
it('derives the NapiConfig wrapper from the rule TREE (operator ruling 2026-08-21)', () => {
|
|
509
|
+
const record = design4ExemplarRecord();
|
|
510
|
+
const rule = lowerOk(record);
|
|
511
|
+
const tree = record.target.rule;
|
|
512
|
+
// `{rule: <tree>}` plus the napi language derived from the RESOLVED
|
|
513
|
+
// `target.language` — so the record carries no duplicate language home.
|
|
514
|
+
expect(rule.astGrepYamlRule).toEqual({ rule: tree, language: extensionToLang('.ts') });
|
|
515
|
+
expect(rule.astGrepPattern).toBeUndefined();
|
|
516
|
+
expect(rule.pattern).toBe('');
|
|
517
|
+
});
|
|
518
|
+
it('routes a FLAT ast-grep payload to astGrepPattern, still language-pinned', () => {
|
|
519
|
+
const record = astGrepRecord();
|
|
520
|
+
const target = record.target;
|
|
521
|
+
delete target.rule;
|
|
522
|
+
target.pattern = 'console.log($A)';
|
|
523
|
+
const rule = lowerOk(record);
|
|
524
|
+
expect(rule.astGrepPattern).toBe('console.log($A)');
|
|
525
|
+
expect(rule.astGrepYamlRule).toBeUndefined();
|
|
526
|
+
expect(rule.language).toBe('typescript');
|
|
527
|
+
});
|
|
528
|
+
it('omits `language` for a regex rule — the grammar forbids it there', () => {
|
|
529
|
+
const rule = lowerOk(regexRecord());
|
|
530
|
+
expect(rule.language).toBeUndefined();
|
|
531
|
+
expect(rule.pattern).toBe('\\bgit\\s+(log|diff|status)\\b');
|
|
532
|
+
});
|
|
533
|
+
it('omits every optional home the record did not declare', () => {
|
|
534
|
+
const rule = lowerOk(regexRecord());
|
|
535
|
+
expect(rule.excludeGlobs).toBeUndefined();
|
|
536
|
+
expect(rule.requires).toBeUndefined();
|
|
537
|
+
expect(rule.curation).toBeUndefined();
|
|
538
|
+
expect(rule.verificationShadow).toBeUndefined();
|
|
539
|
+
expect(rule.recoveryHint).toBeUndefined();
|
|
540
|
+
});
|
|
541
|
+
it('does NOT mirror examples onto the legacy badExample/goodExample pair', () => {
|
|
542
|
+
// Amendment 1 makes the record's `examples` the single hand-editable home;
|
|
543
|
+
// projecting it onto the legacy pair would be a second copy (Tenet 20).
|
|
544
|
+
const rule = lowerOk(design4ExemplarRecord());
|
|
545
|
+
expect(rule.badExample).toBeUndefined();
|
|
546
|
+
expect(rule.goodExample).toBeUndefined();
|
|
547
|
+
expect(rule.examples).toHaveLength(1);
|
|
548
|
+
});
|
|
549
|
+
it('is deterministic — the same record and inputs lower to a deep-equal rule', () => {
|
|
550
|
+
expect(lowerOk(design4ExemplarRecord())).toEqual(lowerOk(design4ExemplarRecord()));
|
|
551
|
+
});
|
|
552
|
+
it('lowers BOTH Prop 310 exemplars (slice 1 parse → slice 2 compile)', () => {
|
|
553
|
+
const design4 = lowerOk(design4ExemplarRecord());
|
|
554
|
+
expect(design4.engine).toBe('ast-grep');
|
|
555
|
+
const design8 = lowerOk(design8ExemplarRecord());
|
|
556
|
+
expect(design8.engine).toBe('regex');
|
|
557
|
+
expect(design8.requires).toEqual({ pattern: 'LC_ALL=C', scope: 'line' });
|
|
558
|
+
expect(design8.fileGlobs).toEqual(['**/*.sh', '**/*.cjs']);
|
|
559
|
+
expect(design8.severity).toBe('warning');
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
//# sourceMappingURL=record-lower.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-lower.test.js","sourceRoot":"","sources":["../../src/spine/record-lower.test.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,gFAAgF;AAChF,yEAAyE;AACzE,4EAA4E;AAC5E,kFAAkF;AAClF,4EAA4E;AAC5E,gFAAgF;AAChF,iFAAiF;AAEjF,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,IAAI,GAAG,wCAAwC,CAAC;AACtD;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,kFAAkF;AAClF,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,GAAG,GAAG,0BAA0B,CAAC;AAEvC,SAAS,KAAK,CAAC,MAA+B,EAAE,MAAM,GAAG,OAAO;IAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,iBAAiB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,yGAAyG;AACzG,SAAS,OAAO,CAAC,MAA+B,EAAE,MAAM,GAAG,OAAO;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,iFAAiF;AACjF,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,uEAAuE;AACvE,SAAS,aAAa;IACpB,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,gDAAgD;QACzD,MAAM,EAAE;YACN,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;YAC9B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,kBAAkB,CAAC,EAAE;SAC3C;QACD,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,sCAAsC;gBAC3C,IAAI,EAAE,uCAAuC;aAC9C;SACF;KACF,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,SAAS,WAAW;IAClB,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,mEAAmE;QAC5E,MAAM,EAAE;YACN,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,gCAAgC;YACzC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE;SAClC;QACD,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,GAAG,QAAQ,4BAA4B,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAEpE,CAAC;IAEF,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,8EAA8E;QAC9E,yEAAyE;QACzE,8EAA8E;QAC9E,sEAAsE;QACtE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,4EAA4E;QAC5E,sEAAsE;QACtE,6EAA6E;QAC7E,sEAAsE;QACtE,8EAA8E;QAC9E,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACrD,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,6EAA6E;QAC7E,6EAA6E;QAC7E,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACjD,yBAAyB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CACjE,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,4EAA4E;QAC5E,2DAA2D;QAC3D,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,QAAQ;YACvB,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,OAAgB;YACxB,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,CAAC,MAAM,CAAC;SACpB,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CACJ,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CACpF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,MAAM,CACJ,gBAAgB,CACd,kBAAkB,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CACzF,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,6DAA6D;QAC7D,MAAM,CACJ,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAC7F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,+CAA+C;QAC/C,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,4EAA4E;QAC5E,6EAA6E;QAC7E,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG;YACZ,MAAM;YACN,UAAU;YACV,wBAAwB;YACxB,6BAA6B;YAC7B,cAAc;YACd,kBAAkB;YAClB,WAAW;YACX,WAAW;YACX,0BAA0B;YAC1B,4BAA4B;SAC7B,CAAC;QACF,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC7B,MAAM,OAAO,GACX,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;oBACzC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;oBAC5C,CAAC,CAAC,IAAI,CAAC;gBACX,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxD,QAAQ,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC;YACvC,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,QAAQ;YACvB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,6EAA6E;QAC7E,wEAAwE;QACxE,oEAAoE;QACpE,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,GAAG,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAChD,MAAM,CACJ,kBAAkB,CAAC,SAAS,CAAC;gBAC3B,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,GAAG;gBAClB,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE,GAAG;gBACZ,MAAM,EAAE,OAAO;gBACf,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE;aAClC,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,MAAM,CACJ,kBAAkB,CAAC,SAAS,CAAC;YAC3B,UAAU,EAAE,OAAO;YACnB,aAAa,EAAE,GAAG;YAClB,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;SAC3C,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;YACvE,gBAAgB;YAChB,WAAW;YACX,WAAW;YACX,cAAc;SACf,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;YACjD,gBAAgB;YAChB,WAAW;YACX,WAAW;YACX,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAC/F,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,iBAAiB,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,2EAA2E;QAC3E,0EAA0E;QAC1E,wEAAwE;QACxE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAkC,CAAC,KAAK,GAAG;YACjD,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC;YAC1C,YAAY,EAAE,CAAC,cAAc,CAAC;SAC/B,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAChF,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,QAAQ;YAAE,OAAO;QACjC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,QAAQ;YAAE,OAAO;QAChC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,uDAAuD;QACvD,KAAK,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,QAAQ;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,6EAA6E;QAC7E,oEAAoE;QACpE,0BAA0B;QAC1B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAiC,CAAC;QAC9D,QAAQ,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;QACnD,QAAQ,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEhD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAiC,CAAC;QAC9D,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,QAAQ,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;QACnD,QAAQ,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,6EAA6E;QAC7E,uEAAuE;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,sEAAsE,EAAE,GAAG,EAAE;IACpF,SAAS,aAAa,CAAC,QAAgB,EAAE,SAAmB,EAAE,YAAuB;QACnF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAiC,CAAC;QACxD,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACxE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,6EAA6E;QAC7E,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACrG,8EAA8E;QAC9E,kEAAkE;QAClE,sEAAsE;QACtE,oEAAoE;QACpE,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CACJ,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CACtF,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,KAAK,CACnB,aAAa,CAAC,YAAY,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CACjF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAkC,CAAC,KAAK,GAAG;YACjD,SAAS,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC;SACjD,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC9E,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,GAAG,WAAW,EAAE;YAChB,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,GAAG,aAAa,EAAE;YAClB,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,8EAA8E;QAC9E,uEAAuE;QACvE,6EAA6E;QAC7E,iDAAiD;QACjD,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,GAAG,aAAa,EAAE;YAClB,QAAQ,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;SACjD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtF,UAAU,CACX,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACtF,UAAU,CACX,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,aAAa,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACxF,UAAU,CACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAkC,CAAC,QAAQ,GAAG,WAAW,CAAC;QAClE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAkC,CAAC,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAkC,CAAC,OAAO,GAAG,GAAG,CAAC;QACzD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAkC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;YACtF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,2BAA2B,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAClF,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACnE,qEAAqE;QACrE,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,oBAAoB,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,2EAA2E;QAC3E,8EAA8E;QAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG;YACf,GAAG,MAAM;YACT,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE;SACpB,CAAC;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAC9E,sDAAsD,CACvD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,4EAA4E;QAC5E,4EAA4E;QAC5E,wEAAwE;QACxE,4EAA4E;QAC5E,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAAiC,CAAC;QACzF,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAC9E,qEAAqE,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACzF,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,yBAAyB,OAAO,GAAG,CAAC,CAAC;QACrE,2EAA2E;QAC3E,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACpE,uEAAuE;QACvE,MAAM,CAAE,IAAgC,CAAC,mBAAmB,CAAC,CAAC,aAAa,EAAE,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAI,MAAM,CAAC,MAAkC,CAAC,IAAI,CAAC;QAC7D,oEAAoE;QACpE,wEAAwE;QACxE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAiC,CAAC;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC;QACnB,MAAM,CAAC,OAAO,GAAG,iBAAiB,CAAC;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|