intent-core 0.1.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/LICENSE +21 -0
- package/README.md +34 -0
- package/dist/compiler/index.d.ts +53 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +147 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/parser.d.ts +25 -0
- package/dist/compiler/parser.d.ts.map +1 -0
- package/dist/compiler/parser.js +198 -0
- package/dist/compiler/parser.js.map +1 -0
- package/dist/generator/ai-manifest.d.ts +14 -0
- package/dist/generator/ai-manifest.d.ts.map +1 -0
- package/dist/generator/ai-manifest.js +276 -0
- package/dist/generator/ai-manifest.js.map +1 -0
- package/dist/generator/css.d.ts +16 -0
- package/dist/generator/css.d.ts.map +1 -0
- package/dist/generator/css.js +230 -0
- package/dist/generator/css.js.map +1 -0
- package/dist/generator/types.d.ts +11 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +229 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/schema/define.d.ts +60 -0
- package/dist/schema/define.d.ts.map +1 -0
- package/dist/schema/define.js +167 -0
- package/dist/schema/define.js.map +1 -0
- package/dist/types/index.d.ts +156 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validator/constraints.d.ts +16 -0
- package/dist/validator/constraints.d.ts.map +1 -0
- package/dist/validator/constraints.js +168 -0
- package/dist/validator/constraints.js.map +1 -0
- package/dist/validator/index.d.ts +22 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +321 -0
- package/dist/validator/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
export type TokenValue = string | number;
|
|
2
|
+
export type TokenCategory = 'color' | 'space' | 'elevation' | 'typography' | 'radius' | 'border' | 'zIndex' | 'opacity' | 'transition';
|
|
3
|
+
export type TokenRegistry = {
|
|
4
|
+
[K in TokenCategory]?: Record<string, TokenValue>;
|
|
5
|
+
};
|
|
6
|
+
export type PropertyType = 'enum' | 'boolean' | 'string' | 'number';
|
|
7
|
+
export interface EnumProperty {
|
|
8
|
+
type: 'enum';
|
|
9
|
+
values: string[];
|
|
10
|
+
required?: boolean;
|
|
11
|
+
default?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface BooleanProperty {
|
|
14
|
+
type: 'boolean';
|
|
15
|
+
required?: boolean;
|
|
16
|
+
default?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface StringProperty {
|
|
19
|
+
type: 'string';
|
|
20
|
+
required?: boolean;
|
|
21
|
+
default?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface NumberProperty {
|
|
24
|
+
type: 'number';
|
|
25
|
+
required?: boolean;
|
|
26
|
+
default?: number;
|
|
27
|
+
min?: number;
|
|
28
|
+
max?: number;
|
|
29
|
+
}
|
|
30
|
+
export type PropertyDefinition = EnumProperty | BooleanProperty | StringProperty | NumberProperty;
|
|
31
|
+
export interface PropertySet {
|
|
32
|
+
[key: string]: PropertyDefinition;
|
|
33
|
+
}
|
|
34
|
+
export type ConstraintOperator = 'eq' | 'neq' | 'in' | 'nin' | 'gt' | 'lt' | 'gte' | 'lte';
|
|
35
|
+
export interface ConstraintCondition {
|
|
36
|
+
[property: string]: string | string[] | number | boolean | {
|
|
37
|
+
op: ConstraintOperator;
|
|
38
|
+
value: unknown;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface ConstraintAction {
|
|
42
|
+
forbid?: string[];
|
|
43
|
+
require?: Record<string, string[]>;
|
|
44
|
+
suggest?: Record<string, string>;
|
|
45
|
+
}
|
|
46
|
+
export interface Constraint {
|
|
47
|
+
when: ConstraintCondition;
|
|
48
|
+
forbid?: string[];
|
|
49
|
+
require?: Record<string, string[]>;
|
|
50
|
+
message?: string;
|
|
51
|
+
}
|
|
52
|
+
export type CSSProperty = string;
|
|
53
|
+
export type TokenReference = string;
|
|
54
|
+
export type StyleValue = TokenReference | {
|
|
55
|
+
[key: string]: TokenReference;
|
|
56
|
+
} | string;
|
|
57
|
+
export interface VisualMapping {
|
|
58
|
+
[cssProperty: CSSProperty]: StyleValue;
|
|
59
|
+
}
|
|
60
|
+
export interface ConditionalMapping {
|
|
61
|
+
condition: Record<string, string>;
|
|
62
|
+
styles: VisualMapping;
|
|
63
|
+
}
|
|
64
|
+
export interface ComponentSchema {
|
|
65
|
+
name: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
properties: PropertySet;
|
|
68
|
+
constraints: Constraint[];
|
|
69
|
+
mappings: Record<string, VisualMapping | ConditionalMapping[]>;
|
|
70
|
+
baseStyles?: VisualMapping;
|
|
71
|
+
}
|
|
72
|
+
export interface DesignSystemConfig {
|
|
73
|
+
name: string;
|
|
74
|
+
version?: string;
|
|
75
|
+
tokens: TokenRegistry;
|
|
76
|
+
darkTokens?: Partial<TokenRegistry>;
|
|
77
|
+
components: Record<string, ComponentSchema>;
|
|
78
|
+
settings?: {
|
|
79
|
+
cssPrefix?: string;
|
|
80
|
+
generateCSSVariables?: boolean;
|
|
81
|
+
strictMode?: boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export interface DesignSystem {
|
|
85
|
+
config: DesignSystemConfig;
|
|
86
|
+
validate(): ValidationResult;
|
|
87
|
+
getComponent(name: string): ComponentSchema | undefined;
|
|
88
|
+
getToken(category: TokenCategory, name: string): TokenValue | undefined;
|
|
89
|
+
}
|
|
90
|
+
export type ValidationSeverity = 'error' | 'warning' | 'info';
|
|
91
|
+
export interface ValidationIssue {
|
|
92
|
+
severity: ValidationSeverity;
|
|
93
|
+
code: string;
|
|
94
|
+
message: string;
|
|
95
|
+
path: string;
|
|
96
|
+
suggestion?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface ValidationResult {
|
|
99
|
+
valid: boolean;
|
|
100
|
+
issues: ValidationIssue[];
|
|
101
|
+
}
|
|
102
|
+
export interface ComponentUsage {
|
|
103
|
+
component: string;
|
|
104
|
+
props: Record<string, unknown>;
|
|
105
|
+
location?: {
|
|
106
|
+
file: string;
|
|
107
|
+
line: number;
|
|
108
|
+
column: number;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export interface CompiledStyles {
|
|
112
|
+
css: string;
|
|
113
|
+
classes: string[];
|
|
114
|
+
sourceMap?: Record<string, string>;
|
|
115
|
+
}
|
|
116
|
+
export interface ComponentCompilation {
|
|
117
|
+
component: string;
|
|
118
|
+
styles: CompiledStyles;
|
|
119
|
+
typeDefinition: string;
|
|
120
|
+
propCombinations: string[][];
|
|
121
|
+
}
|
|
122
|
+
export interface CompilationOutput {
|
|
123
|
+
css: string;
|
|
124
|
+
metadata: {
|
|
125
|
+
tokens: TokenRegistry;
|
|
126
|
+
components: string[];
|
|
127
|
+
usedCombinations: Record<string, string[][]>;
|
|
128
|
+
};
|
|
129
|
+
types: string;
|
|
130
|
+
}
|
|
131
|
+
export interface ComponentSchemaForAI {
|
|
132
|
+
name: string;
|
|
133
|
+
description: string;
|
|
134
|
+
properties: Array<{
|
|
135
|
+
name: string;
|
|
136
|
+
type: string;
|
|
137
|
+
values?: string[];
|
|
138
|
+
required: boolean;
|
|
139
|
+
default?: unknown;
|
|
140
|
+
description?: string;
|
|
141
|
+
valueDescriptions?: Record<string, string>;
|
|
142
|
+
}>;
|
|
143
|
+
constraints: string[];
|
|
144
|
+
examples: {
|
|
145
|
+
valid: string[];
|
|
146
|
+
invalid: string[];
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export interface AIManifest {
|
|
150
|
+
version: string;
|
|
151
|
+
designSystem: string;
|
|
152
|
+
tokens: TokenRegistry;
|
|
153
|
+
components: ComponentSchemaForAI[];
|
|
154
|
+
semanticDescriptions: Record<string, string>;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constraint Engine
|
|
3
|
+
*
|
|
4
|
+
* Validates component prop combinations against defined constraints.
|
|
5
|
+
*/
|
|
6
|
+
import type { ComponentSchema, ValidationIssue, ComponentUsage } from '../types/index.js';
|
|
7
|
+
export interface ValidationContext {
|
|
8
|
+
component?: string;
|
|
9
|
+
file?: string;
|
|
10
|
+
line?: number;
|
|
11
|
+
column?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function validateConstraints(schema: ComponentSchema, usage: ComponentUsage, context?: ValidationContext): ValidationIssue[];
|
|
14
|
+
export declare function generateValidCombinations(schema: ComponentSchema): Array<Record<string, string>>;
|
|
15
|
+
export declare function suggestValidAlternatives(schema: ComponentSchema, invalidProps: Record<string, unknown>): Array<Record<string, string>>;
|
|
16
|
+
//# sourceMappingURL=constraints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../../src/validator/constraints.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAGf,eAAe,EACf,cAAc,EACf,MAAM,mBAAmB,CAAC;AA4D3B,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,eAAe,EAAE,CA6DnB;AAgBD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoC/B;AAMD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiB/B"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constraint Engine
|
|
3
|
+
*
|
|
4
|
+
* Validates component prop combinations against defined constraints.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Condition Evaluation
|
|
8
|
+
// ============================================================================
|
|
9
|
+
function evaluateCondition(condition, props) {
|
|
10
|
+
for (const [key, expectedValue] of Object.entries(condition)) {
|
|
11
|
+
const actualValue = props[key];
|
|
12
|
+
// Handle array of allowed values
|
|
13
|
+
if (Array.isArray(expectedValue)) {
|
|
14
|
+
if (!expectedValue.includes(String(actualValue))) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
// Handle operator objects
|
|
20
|
+
if (typeof expectedValue === 'object' && expectedValue !== null && 'op' in expectedValue) {
|
|
21
|
+
const { op, value } = expectedValue;
|
|
22
|
+
const result = evaluateOperator(op, actualValue, value);
|
|
23
|
+
if (!result)
|
|
24
|
+
return false;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Simple equality check
|
|
28
|
+
if (String(actualValue) !== String(expectedValue)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
function evaluateOperator(op, actual, expected) {
|
|
35
|
+
switch (op) {
|
|
36
|
+
case 'eq': return actual === expected;
|
|
37
|
+
case 'neq': return actual !== expected;
|
|
38
|
+
case 'in': return Array.isArray(expected) && expected.includes(String(actual));
|
|
39
|
+
case 'nin': return Array.isArray(expected) && !expected.includes(String(actual));
|
|
40
|
+
case 'gt': return typeof actual === 'number' && typeof expected === 'number' && actual > expected;
|
|
41
|
+
case 'lt': return typeof actual === 'number' && typeof expected === 'number' && actual < expected;
|
|
42
|
+
case 'gte': return typeof actual === 'number' && typeof expected === 'number' && actual >= expected;
|
|
43
|
+
case 'lte': return typeof actual === 'number' && typeof expected === 'number' && actual <= expected;
|
|
44
|
+
default: return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function validateConstraints(schema, usage, context) {
|
|
48
|
+
const issues = [];
|
|
49
|
+
const props = usage.props;
|
|
50
|
+
for (const constraint of schema.constraints) {
|
|
51
|
+
// Check if the condition applies
|
|
52
|
+
if (!evaluateCondition(constraint.when, props)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Check forbidden props
|
|
56
|
+
if (constraint.forbid) {
|
|
57
|
+
for (const forbiddenProp of constraint.forbid) {
|
|
58
|
+
if (forbiddenProp in props && props[forbiddenProp] !== undefined) {
|
|
59
|
+
issues.push({
|
|
60
|
+
severity: 'error',
|
|
61
|
+
code: 'CONSTRAINT_FORBIDDEN_PROP',
|
|
62
|
+
message: constraint.message ||
|
|
63
|
+
`Property "${forbiddenProp}" is not allowed when ${formatCondition(constraint.when)}`,
|
|
64
|
+
path: context
|
|
65
|
+
? `${context.file}:${context.line}:${context.column}`
|
|
66
|
+
: `${usage.component}`,
|
|
67
|
+
suggestion: `Remove "${forbiddenProp}" or change ${formatCondition(constraint.when)}`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Check required props
|
|
73
|
+
if (constraint.require) {
|
|
74
|
+
for (const [propName, allowedValues] of Object.entries(constraint.require)) {
|
|
75
|
+
const actualValue = props[propName];
|
|
76
|
+
if (actualValue === undefined) {
|
|
77
|
+
issues.push({
|
|
78
|
+
severity: 'error',
|
|
79
|
+
code: 'CONSTRAINT_MISSING_REQUIRED',
|
|
80
|
+
message: constraint.message ||
|
|
81
|
+
`Property "${propName}" is required when ${formatCondition(constraint.when)}`,
|
|
82
|
+
path: context
|
|
83
|
+
? `${context.file}:${context.line}:${context.column}`
|
|
84
|
+
: `${usage.component}`,
|
|
85
|
+
suggestion: `Add ${propName}="${allowedValues[0]}"`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else if (!allowedValues.includes(String(actualValue))) {
|
|
89
|
+
issues.push({
|
|
90
|
+
severity: 'error',
|
|
91
|
+
code: 'CONSTRAINT_INVALID_VALUE',
|
|
92
|
+
message: constraint.message ||
|
|
93
|
+
`Property "${propName}" must be one of [${allowedValues.join(', ')}] when ${formatCondition(constraint.when)}, got "${actualValue}"`,
|
|
94
|
+
path: context
|
|
95
|
+
? `${context.file}:${context.line}:${context.column}`
|
|
96
|
+
: `${usage.component}`,
|
|
97
|
+
suggestion: `Change to ${propName}="${allowedValues[0]}"`,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return issues;
|
|
104
|
+
}
|
|
105
|
+
function formatCondition(condition) {
|
|
106
|
+
const parts = Object.entries(condition).map(([key, value]) => {
|
|
107
|
+
if (Array.isArray(value)) {
|
|
108
|
+
return `${key} is [${value.join(', ')}]`;
|
|
109
|
+
}
|
|
110
|
+
return `${key}="${value}"`;
|
|
111
|
+
});
|
|
112
|
+
return parts.join(' and ');
|
|
113
|
+
}
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Generate All Valid Combinations
|
|
116
|
+
// ============================================================================
|
|
117
|
+
export function generateValidCombinations(schema) {
|
|
118
|
+
const combinations = [];
|
|
119
|
+
// Get all enum properties
|
|
120
|
+
const enumProps = Object.entries(schema.properties)
|
|
121
|
+
.filter(([, def]) => def.type === 'enum')
|
|
122
|
+
.map(([name, def]) => ({
|
|
123
|
+
name,
|
|
124
|
+
values: def.values,
|
|
125
|
+
}));
|
|
126
|
+
// Generate cartesian product of all enum values
|
|
127
|
+
function generate(index, current) {
|
|
128
|
+
if (index >= enumProps.length) {
|
|
129
|
+
// Validate this combination against constraints
|
|
130
|
+
const mockUsage = {
|
|
131
|
+
component: schema.name,
|
|
132
|
+
props: current,
|
|
133
|
+
};
|
|
134
|
+
const issues = validateConstraints(schema, mockUsage);
|
|
135
|
+
if (issues.length === 0) {
|
|
136
|
+
combinations.push({ ...current });
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const { name, values } = enumProps[index];
|
|
141
|
+
for (const value of values) {
|
|
142
|
+
current[name] = value;
|
|
143
|
+
generate(index + 1, current);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
generate(0, {});
|
|
147
|
+
return combinations;
|
|
148
|
+
}
|
|
149
|
+
// ============================================================================
|
|
150
|
+
// Suggest Valid Alternatives
|
|
151
|
+
// ============================================================================
|
|
152
|
+
export function suggestValidAlternatives(schema, invalidProps) {
|
|
153
|
+
const validCombos = generateValidCombinations(schema);
|
|
154
|
+
// Score combinations by similarity to invalid props
|
|
155
|
+
const scored = validCombos.map(combo => {
|
|
156
|
+
let score = 0;
|
|
157
|
+
for (const [key, value] of Object.entries(invalidProps)) {
|
|
158
|
+
if (combo[key] === String(value)) {
|
|
159
|
+
score += 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return { combo, score };
|
|
163
|
+
});
|
|
164
|
+
// Sort by score descending and return top matches
|
|
165
|
+
scored.sort((a, b) => b.score - a.score);
|
|
166
|
+
return scored.slice(0, 3).map(s => s.combo);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=constraints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraints.js","sourceRoot":"","sources":["../../src/validator/constraints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates component usage against design system schemas.
|
|
5
|
+
*/
|
|
6
|
+
import type { DesignSystemConfig, ComponentSchema, ValidationResult, ComponentUsage } from '../types/index.js';
|
|
7
|
+
export interface ValidatorOptions {
|
|
8
|
+
strict?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function validateSchema(config: DesignSystemConfig): ValidationResult;
|
|
11
|
+
export interface UsageValidationContext {
|
|
12
|
+
file: string;
|
|
13
|
+
line?: number;
|
|
14
|
+
column?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function validateUsage(schema: ComponentSchema, usage: ComponentUsage, context?: UsageValidationContext): ValidationResult;
|
|
17
|
+
export interface BatchUsage {
|
|
18
|
+
file: string;
|
|
19
|
+
usages: ComponentUsage[];
|
|
20
|
+
}
|
|
21
|
+
export declare function validateAllUsages(config: DesignSystemConfig, batch: BatchUsage[], options?: ValidatorOptions): ValidationResult;
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAEf,gBAAgB,EAChB,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAO3B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,gBAAgB,CA0G3E;AAuED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,gBAAgB,CAsDlB;AAmGD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,gBAAgB,CA4BlB"}
|