@ttsc/graph 0.16.5 → 0.16.6
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/lib/TtscGraphApplication.js +36 -23
- package/lib/TtscGraphApplication.js.map +1 -1
- package/lib/model/loadGraph.js +17 -17
- package/lib/server/accessAliases.js +53 -0
- package/lib/server/accessAliases.js.map +1 -0
- package/lib/server/createServer.js +1133 -634
- package/lib/server/createServer.js.map +1 -1
- package/lib/server/instructions.js +69 -21
- package/lib/server/instructions.js.map +1 -1
- package/lib/server/runDetails.js +413 -0
- package/lib/server/runDetails.js.map +1 -0
- package/lib/server/{runIndex.js → runEntrypoints.js} +91 -26
- package/lib/server/runEntrypoints.js.map +1 -0
- package/lib/server/{runQuery.js → runLookup.js} +102 -15
- package/lib/server/runLookup.js.map +1 -0
- package/lib/server/runOverview.js +31 -21
- package/lib/server/runOverview.js.map +1 -1
- package/lib/server/runTrace.js +133 -38
- package/lib/server/runTrace.js.map +1 -1
- package/lib/structures/{ITtscGraphQuery.js → ITtscGraphDetails.js} +1 -1
- package/lib/structures/ITtscGraphDetails.js.map +1 -0
- package/lib/structures/ITtscGraphEntrypoints.js +3 -0
- package/lib/structures/ITtscGraphEntrypoints.js.map +1 -0
- package/lib/structures/{ITtscGraphExpand.js → ITtscGraphEscape.js} +1 -1
- package/lib/structures/ITtscGraphEscape.js.map +1 -0
- package/lib/structures/{ITtscGraphIndex.js → ITtscGraphLookup.js} +1 -1
- package/lib/structures/ITtscGraphLookup.js.map +1 -0
- package/lib/structures/index.js +4 -3
- package/lib/structures/index.js.map +1 -1
- package/package.json +2 -2
- package/src/TtscGraphApplication.ts +39 -32
- package/src/server/accessAliases.ts +55 -0
- package/src/server/createServer.ts +4 -7
- package/src/server/instructions.ts +69 -21
- package/src/server/runDetails.ts +469 -0
- package/src/server/{runIndex.ts → runEntrypoints.ts} +109 -34
- package/src/server/{runQuery.ts → runLookup.ts} +123 -16
- package/src/server/runOverview.ts +35 -23
- package/src/server/runTrace.ts +164 -38
- package/src/structures/ITtscGraphApplication.ts +100 -52
- package/src/structures/ITtscGraphDecorator.ts +12 -14
- package/src/structures/ITtscGraphDetails.ts +134 -0
- package/src/structures/{ITtscGraphIndex.ts → ITtscGraphEntrypoints.ts} +34 -16
- package/src/structures/ITtscGraphEscape.ts +39 -0
- package/src/structures/ITtscGraphEvidence.ts +5 -8
- package/src/structures/ITtscGraphLookup.ts +61 -0
- package/src/structures/ITtscGraphNode.ts +10 -4
- package/src/structures/ITtscGraphOverview.ts +24 -16
- package/src/structures/ITtscGraphTrace.ts +54 -11
- package/src/structures/TtscGraphNodeKind.ts +2 -2
- package/src/structures/index.ts +4 -3
- package/lib/server/runExpand.js +0 -177
- package/lib/server/runExpand.js.map +0 -1
- package/lib/server/runIndex.js.map +0 -1
- package/lib/server/runQuery.js.map +0 -1
- package/lib/structures/ITtscGraphExpand.js.map +0 -1
- package/lib/structures/ITtscGraphIndex.js.map +0 -1
- package/lib/structures/ITtscGraphQuery.js.map +0 -1
- package/src/server/runExpand.ts +0 -186
- package/src/structures/ITtscGraphExpand.ts +0 -85
- package/src/structures/ITtscGraphQuery.ts +0 -49
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TtscGraphApplication = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const runDetails_1 = require("./server/runDetails");
|
|
5
|
+
const runEntrypoints_1 = require("./server/runEntrypoints");
|
|
6
|
+
const runLookup_1 = require("./server/runLookup");
|
|
6
7
|
const runOverview_1 = require("./server/runOverview");
|
|
7
|
-
const runQuery_1 = require("./server/runQuery");
|
|
8
8
|
const runTrace_1 = require("./server/runTrace");
|
|
9
9
|
/**
|
|
10
10
|
* The MCP tool surface as a plain class over the resident
|
|
11
11
|
* {@link TtscGraphMemory}.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* {@link ITtscGraphApplication} to generate
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* binds them to the graph.
|
|
13
|
+
* Its public method is the MCP tool: `typia.llm.controller` reflects
|
|
14
|
+
* {@link ITtscGraphApplication} to generate the tool's JSON schema and argument
|
|
15
|
+
* validator from the signature and JSDoc, with no hand-written schema. The
|
|
16
|
+
* method delegates to the pure graph functions in `./server`, which are
|
|
17
|
+
* unit-testable without a transport; this class only binds them to the graph.
|
|
19
18
|
*
|
|
20
19
|
* Every method answers from the resident graph; none recompiles. Output is kept
|
|
21
20
|
* compact and bounded so a model can read structure without a file read, which
|
|
@@ -26,20 +25,34 @@ class TtscGraphApplication {
|
|
|
26
25
|
constructor(source) {
|
|
27
26
|
this.graph = typeof source === "function" ? source : () => source;
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
query(props) {
|
|
29
|
+
switch (props.request.type) {
|
|
30
|
+
case "entrypoints":
|
|
31
|
+
return { result: (0, runEntrypoints_1.runEntrypoints)(this.graph(), props.request) };
|
|
32
|
+
case "lookup":
|
|
33
|
+
return { result: (0, runLookup_1.runLookup)(this.graph(), props.request) };
|
|
34
|
+
case "trace":
|
|
35
|
+
return { result: (0, runTrace_1.runTrace)(this.graph(), props.request) };
|
|
36
|
+
case "details":
|
|
37
|
+
return { result: (0, runDetails_1.runDetails)(this.graph(), props.request) };
|
|
38
|
+
case "overview":
|
|
39
|
+
return { result: (0, runOverview_1.runOverview)(this.graph(), props.request) };
|
|
40
|
+
case "escape": {
|
|
41
|
+
const result = {
|
|
42
|
+
type: "escape",
|
|
43
|
+
skipped: true,
|
|
44
|
+
reason: props.request.reason,
|
|
45
|
+
};
|
|
46
|
+
if (props.request.nextStep !== undefined) {
|
|
47
|
+
result.nextStep = props.request.nextStep;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
result,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
default:
|
|
54
|
+
throw new Error("Unknown graph request type");
|
|
55
|
+
}
|
|
43
56
|
}
|
|
44
57
|
}
|
|
45
58
|
exports.TtscGraphApplication = TtscGraphApplication;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TtscGraphApplication.js","sourceRoot":"","sources":["../src/TtscGraphApplication.ts"],"names":[],"mappings":";;;AACA,kDAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"TtscGraphApplication.js","sourceRoot":"","sources":["../src/TtscGraphApplication.ts"],"names":[],"mappings":";;;AACA,oDAAiD;AACjD,4DAAyD;AACzD,kDAA+C;AAC/C,sDAAmD;AACnD,gDAA6C;AAM7C;;;;;;;;;;;;;GAaG;AACH;IACmB,KAAK,CAAwB;IAE9C,YAAmB,MAAuB;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IACpE,CAAC;IAEM,KAAK,CACV,KAAmC;QAEnC,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,aAAa;gBAChB,OAAO,EAAE,MAAM,EAAE,IAAA,+BAAc,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,KAAK,QAAQ;gBACX,OAAO,EAAE,MAAM,EAAE,IAAA,qBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,KAAK,OAAO;gBACV,OAAO,EAAE,MAAM,EAAE,IAAA,mBAAQ,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,KAAK,SAAS;gBACZ,OAAO,EAAE,MAAM,EAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,KAAK,UAAU;gBACb,OAAO,EAAE,MAAM,EAAE,IAAA,yBAAW,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,KAAK,QAAQ,EAAE,CAAC;gBACd,MAAM,MAAM,GAAqB;oBAC/B,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;iBAC7B,CAAC;gBACF,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACzC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC3C,CAAC;gBACD,OAAO;oBACL,MAAM;iBACP,CAAC;YACJ,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF"}
|
package/lib/model/loadGraph.js
CHANGED
|
@@ -251,6 +251,16 @@ function parseDump(json) {
|
|
|
251
251
|
path: _path + ".evidence",
|
|
252
252
|
expected: "(ITtscGraphEvidence | undefined)",
|
|
253
253
|
value: input.evidence
|
|
254
|
+
}, _errorFactory)) && (undefined === input.implementation || ("object" === typeof input.implementation && null !== input.implementation || _a._assertGuard(_exceptionable, {
|
|
255
|
+
method: "typia.assert",
|
|
256
|
+
path: _path + ".implementation",
|
|
257
|
+
expected: "(ITtscGraphEvidence | undefined)",
|
|
258
|
+
value: input.implementation
|
|
259
|
+
}, _errorFactory)) && _ao4(input.implementation, _path + ".implementation", true && _exceptionable) || _a._assertGuard(_exceptionable, {
|
|
260
|
+
method: "typia.assert",
|
|
261
|
+
path: _path + ".implementation",
|
|
262
|
+
expected: "(ITtscGraphEvidence | undefined)",
|
|
263
|
+
value: input.implementation
|
|
254
264
|
}, _errorFactory));
|
|
255
265
|
const _ao2 = (input, _path, _exceptionable = true) => ("string" === typeof input.name || _a._assertGuard(_exceptionable, {
|
|
256
266
|
method: "typia.assert",
|
|
@@ -262,7 +272,7 @@ function parseDump(json) {
|
|
|
262
272
|
path: _path + ".arguments",
|
|
263
273
|
expected: "Array<ITtscGraphDecorator.IArgument>",
|
|
264
274
|
value: input.arguments
|
|
265
|
-
}, _errorFactory)) && input.arguments.every((elem, _index17) => ("object" === typeof elem && null !== elem || _a._assertGuard(_exceptionable, {
|
|
275
|
+
}, _errorFactory)) && input.arguments.every((elem, _index17) => ("object" === typeof elem && null !== elem && false === Array.isArray(elem) || _a._assertGuard(_exceptionable, {
|
|
266
276
|
method: "typia.assert",
|
|
267
277
|
path: _path + ".arguments[" + _index17 + "]",
|
|
268
278
|
expected: "ITtscGraphDecorator.IArgument",
|
|
@@ -278,17 +288,12 @@ function parseDump(json) {
|
|
|
278
288
|
expected: "Array<ITtscGraphDecorator.IArgument>",
|
|
279
289
|
value: input.arguments
|
|
280
290
|
}, _errorFactory));
|
|
281
|
-
const _ao3 = (input, _path, _exceptionable = true) =>
|
|
282
|
-
method: "typia.assert",
|
|
283
|
-
path: _path + ".text",
|
|
284
|
-
expected: "string",
|
|
285
|
-
value: input.text
|
|
286
|
-
}, _errorFactory)) && (undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal || _a._assertGuard(_exceptionable, {
|
|
291
|
+
const _ao3 = (input, _path, _exceptionable = true) => undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal || _a._assertGuard(_exceptionable, {
|
|
287
292
|
method: "typia.assert",
|
|
288
293
|
path: _path + ".literal",
|
|
289
294
|
expected: "(boolean | number | string | undefined)",
|
|
290
295
|
value: input.literal
|
|
291
|
-
}, _errorFactory)
|
|
296
|
+
}, _errorFactory);
|
|
292
297
|
const _ao4 = (input, _path, _exceptionable = true) => ("string" === typeof input.file || _a._assertGuard(_exceptionable, {
|
|
293
298
|
method: "typia.assert",
|
|
294
299
|
path: _path + ".file",
|
|
@@ -314,11 +319,6 @@ function parseDump(json) {
|
|
|
314
319
|
path: _path + ".endCol",
|
|
315
320
|
expected: "(number | undefined)",
|
|
316
321
|
value: input.endCol
|
|
317
|
-
}, _errorFactory)) && (undefined === input.text || "string" === typeof input.text || _a._assertGuard(_exceptionable, {
|
|
318
|
-
method: "typia.assert",
|
|
319
|
-
path: _path + ".text",
|
|
320
|
-
expected: "(string | undefined)",
|
|
321
|
-
value: input.text
|
|
322
322
|
}, _errorFactory));
|
|
323
323
|
const _ao5 = (input, _path, _exceptionable = true) => ("string" === typeof input.from || _a._assertGuard(_exceptionable, {
|
|
324
324
|
method: "typia.assert",
|
|
@@ -388,10 +388,10 @@ function parseDump(json) {
|
|
|
388
388
|
value: input.node
|
|
389
389
|
}, _errorFactory));
|
|
390
390
|
const _io0 = input => "string" === typeof input.project && "string" === typeof input.tsconfig && (Array.isArray(input.nodes) && input.nodes.every(elem => "object" === typeof elem && null !== elem && _io1(elem))) && (Array.isArray(input.edges) && input.edges.every(elem => "object" === typeof elem && null !== elem && _io5(elem))) && (undefined === input.diagnostics || Array.isArray(input.diagnostics) && input.diagnostics.every(elem => "object" === typeof elem && null !== elem && _io6(elem)));
|
|
391
|
-
const _io1 = input => "string" === typeof input.id && true === _iv4.has(input.kind) && "string" === typeof input.name && (undefined === input.qualifiedName || "string" === typeof input.qualifiedName) && "string" === typeof input.file && "boolean" === typeof input.external && (undefined === input.ignored || "boolean" === typeof input.ignored) && (undefined === input.exported || "boolean" === typeof input.exported) && (undefined === input.modifiers || Array.isArray(input.modifiers) && input.modifiers.every(elem => true === _iv6.has(elem))) && (undefined === input.decorators || Array.isArray(input.decorators) && input.decorators.every(elem => "object" === typeof elem && null !== elem && _io2(elem))) && (undefined === input.evidence || "object" === typeof input.evidence && null !== input.evidence && _io4(input.evidence));
|
|
392
|
-
const _io2 = input => "string" === typeof input.name && (Array.isArray(input.arguments) && input.arguments.every(elem => "object" === typeof elem && null !== elem && _io3(elem)));
|
|
393
|
-
const _io3 = input =>
|
|
394
|
-
const _io4 = input => "string" === typeof input.file && "number" === typeof input.startLine && (undefined === input.startCol || "number" === typeof input.startCol) && (undefined === input.endLine || "number" === typeof input.endLine) && (undefined === input.endCol || "number" === typeof input.endCol)
|
|
391
|
+
const _io1 = input => "string" === typeof input.id && true === _iv4.has(input.kind) && "string" === typeof input.name && (undefined === input.qualifiedName || "string" === typeof input.qualifiedName) && "string" === typeof input.file && "boolean" === typeof input.external && (undefined === input.ignored || "boolean" === typeof input.ignored) && (undefined === input.exported || "boolean" === typeof input.exported) && (undefined === input.modifiers || Array.isArray(input.modifiers) && input.modifiers.every(elem => true === _iv6.has(elem))) && (undefined === input.decorators || Array.isArray(input.decorators) && input.decorators.every(elem => "object" === typeof elem && null !== elem && _io2(elem))) && (undefined === input.evidence || "object" === typeof input.evidence && null !== input.evidence && _io4(input.evidence)) && (undefined === input.implementation || "object" === typeof input.implementation && null !== input.implementation && _io4(input.implementation));
|
|
392
|
+
const _io2 = input => "string" === typeof input.name && (Array.isArray(input.arguments) && input.arguments.every(elem => "object" === typeof elem && null !== elem && false === Array.isArray(elem) && _io3(elem)));
|
|
393
|
+
const _io3 = input => undefined === input.literal || "string" === typeof input.literal || "number" === typeof input.literal || "boolean" === typeof input.literal;
|
|
394
|
+
const _io4 = input => "string" === typeof input.file && "number" === typeof input.startLine && (undefined === input.startCol || "number" === typeof input.startCol) && (undefined === input.endLine || "number" === typeof input.endLine) && (undefined === input.endCol || "number" === typeof input.endCol);
|
|
395
395
|
const _io5 = input => "string" === typeof input.from && "string" === typeof input.to && true === _iv9.has(input.kind) && (undefined === input.evidence || "object" === typeof input.evidence && null !== input.evidence && _io4(input.evidence));
|
|
396
396
|
const _io6 = input => "string" === typeof input.file && "number" === typeof input.line && (undefined === input.column || "number" === typeof input.column) && ("string" === typeof input.code || "number" === typeof input.code) && "string" === typeof input.message && (undefined === input.severity || "error" === input.severity || "hint" === input.severity || "info" === input.severity || "warning" === input.severity) && (undefined === input.origin || "lint" === input.origin || "plugin" === input.origin || "tsc" === input.origin) && (undefined === input.node || "string" === typeof input.node);
|
|
397
397
|
const __is = input => "object" === typeof input && null !== input && _io0(input);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.accessAliasesFor = accessAliasesFor;
|
|
4
|
+
/**
|
|
5
|
+
* Derive stable access-path aliases for a member edge from its source
|
|
6
|
+
* expression. If a hop reaches `Owner.member` through `obj.path.member`, the
|
|
7
|
+
* alias `Owner.path.member` keeps both the resolved owner and the concrete
|
|
8
|
+
* access path visible without reopening source.
|
|
9
|
+
*/
|
|
10
|
+
function accessAliasesFor(node, evidenceText) {
|
|
11
|
+
if (node === undefined ||
|
|
12
|
+
node.qualifiedName === undefined ||
|
|
13
|
+
evidenceText === undefined) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const segments = dottedSegments(evidenceText);
|
|
17
|
+
if (segments.length < 2 || segments[segments.length - 1] !== node.name) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const dot = node.qualifiedName.lastIndexOf(".");
|
|
21
|
+
if (dot < 0)
|
|
22
|
+
return undefined;
|
|
23
|
+
const owner = node.qualifiedName.slice(0, dot);
|
|
24
|
+
const suffix = segments.slice(1).join(".");
|
|
25
|
+
const aliases = new Set();
|
|
26
|
+
for (const candidate of [...ownerDisplayAliases(owner), owner]) {
|
|
27
|
+
const alias = `${candidate}.${suffix}`;
|
|
28
|
+
if (alias !== node.qualifiedName)
|
|
29
|
+
aliases.add(alias);
|
|
30
|
+
}
|
|
31
|
+
return aliases.size > 0 ? [...aliases] : undefined;
|
|
32
|
+
}
|
|
33
|
+
function dottedSegments(text) {
|
|
34
|
+
const normalized = text.trim().replace(/\?\./g, ".");
|
|
35
|
+
const parts = normalized.split(".");
|
|
36
|
+
if (parts.length < 2)
|
|
37
|
+
return [];
|
|
38
|
+
return parts.every((part) => /^[A-Za-z_$][\w$]*$/.test(part)) ? parts : [];
|
|
39
|
+
}
|
|
40
|
+
function ownerDisplayAliases(owner) {
|
|
41
|
+
const display = owner.replace(/^_+/, "");
|
|
42
|
+
const out = new Set();
|
|
43
|
+
for (const suffix of ["Internals", "Internal"]) {
|
|
44
|
+
if (display.length > suffix.length && display.endsWith(suffix)) {
|
|
45
|
+
out.add(display.slice(0, -suffix.length));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (out.size === 0 && display !== owner)
|
|
49
|
+
out.add(display);
|
|
50
|
+
out.delete(owner);
|
|
51
|
+
return [...out];
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=accessAliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessAliases.js","sourceRoot":"","sources":["../../src/server/accessAliases.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,0BACE,IAAgC,EAChC,YAAgC;IAEhC,IACE,IAAI,KAAK,SAAS;QAClB,IAAI,CAAC,aAAa,KAAK,SAAS;QAChC,YAAY,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK;QAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC"}
|