@reidelsaltres/pureper 0.1.157 → 0.1.160
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/out/foundation/api/Observer.d.ts +30 -0
- package/out/foundation/api/Observer.d.ts.map +1 -1
- package/out/foundation/api/Observer.js +48 -0
- package/out/foundation/api/Observer.js.map +1 -1
- package/out/foundation/engine/BalancedParser.d.ts +58 -0
- package/out/foundation/engine/BalancedParser.d.ts.map +1 -0
- package/out/foundation/engine/BalancedParser.js +301 -0
- package/out/foundation/engine/BalancedParser.js.map +1 -0
- package/out/foundation/engine/EscapeHandler.d.ts +27 -0
- package/out/foundation/engine/EscapeHandler.d.ts.map +1 -0
- package/out/foundation/engine/EscapeHandler.js +47 -0
- package/out/foundation/engine/EscapeHandler.js.map +1 -0
- package/out/foundation/engine/Expression.d.ts +83 -0
- package/out/foundation/engine/Expression.d.ts.map +1 -0
- package/out/foundation/engine/Expression.js +256 -0
- package/out/foundation/engine/Expression.js.map +1 -0
- package/out/foundation/engine/Rule.d.ts +83 -0
- package/out/foundation/engine/Rule.d.ts.map +1 -0
- package/out/foundation/engine/Rule.js +69 -0
- package/out/foundation/engine/Rule.js.map +1 -0
- package/out/foundation/engine/Scope.d.ts +57 -0
- package/out/foundation/engine/Scope.d.ts.map +1 -0
- package/out/foundation/engine/Scope.js +147 -0
- package/out/foundation/engine/Scope.js.map +1 -0
- package/out/foundation/engine/TemplateEngine.d.ts +79 -0
- package/out/foundation/engine/TemplateEngine.d.ts.map +1 -0
- package/out/foundation/engine/TemplateEngine.js +187 -0
- package/out/foundation/engine/TemplateEngine.js.map +1 -0
- package/out/foundation/engine/TemplateInstance.d.ts +121 -0
- package/out/foundation/engine/TemplateInstance.d.ts.map +1 -0
- package/out/foundation/engine/TemplateInstance.js +255 -0
- package/out/foundation/engine/TemplateInstance.js.map +1 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.d.ts +21 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.d.ts.map +1 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.js +26 -0
- package/out/foundation/engine/exceptions/TemplateExceptions.js.map +1 -0
- package/out/foundation/engine/index.d.ts +18 -0
- package/out/foundation/engine/index.d.ts.map +1 -0
- package/out/foundation/engine/index.js +19 -0
- package/out/foundation/engine/index.js.map +1 -0
- package/out/foundation/engine/rules/attribute/EventRule.d.ts +22 -0
- package/out/foundation/engine/rules/attribute/EventRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/attribute/EventRule.js +129 -0
- package/out/foundation/engine/rules/attribute/EventRule.js.map +1 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.d.ts +20 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.js +108 -0
- package/out/foundation/engine/rules/attribute/InjectionRule.js.map +1 -0
- package/out/foundation/engine/rules/attribute/RefRule.d.ts +23 -0
- package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/attribute/RefRule.js +98 -0
- package/out/foundation/engine/rules/attribute/RefRule.js.map +1 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts +19 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.js +82 -0
- package/out/foundation/engine/rules/syntax/ExpressionRule.js.map +1 -0
- package/out/foundation/engine/rules/syntax/ForRule.d.ts +19 -0
- package/out/foundation/engine/rules/syntax/ForRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/syntax/ForRule.js +226 -0
- package/out/foundation/engine/rules/syntax/ForRule.js.map +1 -0
- package/out/foundation/engine/rules/syntax/IfRule.d.ts +17 -0
- package/out/foundation/engine/rules/syntax/IfRule.d.ts.map +1 -0
- package/out/foundation/engine/rules/syntax/IfRule.js +220 -0
- package/out/foundation/engine/rules/syntax/IfRule.js.map +1 -0
- package/out/foundation/worker/Router.d.ts.map +1 -1
- package/out/foundation/worker/Router.js.map +1 -1
- package/out/index.d.ts +3 -0
- package/out/index.d.ts.map +1 -1
- package/out/index.js +3 -0
- package/out/index.js.map +1 -1
- package/package.json +1 -1
- package/src/foundation/api/Observer.ts +60 -0
- package/src/foundation/engine/BalancedParser.ts +353 -0
- package/src/foundation/engine/EscapeHandler.ts +54 -0
- package/src/foundation/engine/Expression.ts +285 -0
- package/src/foundation/engine/Rule.ts +136 -0
- package/src/foundation/engine/Scope.ts +166 -0
- package/src/foundation/engine/TemplateEngine.ts +243 -0
- package/src/foundation/engine/TemplateInstance.ts +355 -0
- package/src/foundation/engine/exceptions/TemplateExceptions.ts +27 -0
- package/src/foundation/engine/rules/attribute/EventRule.ts +171 -0
- package/src/foundation/engine/rules/attribute/InjectionRule.ts +140 -0
- package/src/foundation/engine/rules/attribute/RefRule.ts +119 -0
- package/src/foundation/engine/rules/syntax/ExpressionRule.ts +102 -0
- package/src/foundation/engine/rules/syntax/ForRule.ts +267 -0
- package/src/foundation/engine/rules/syntax/IfRule.ts +261 -0
- package/src/foundation/worker/Router.ts +1 -1
- package/src/index.ts +9 -0
|
@@ -19,14 +19,44 @@ export declare class Observer<T> {
|
|
|
19
19
|
unsubscribe(listener: (data: T) => void): void;
|
|
20
20
|
notify(data: T): void;
|
|
21
21
|
}
|
|
22
|
+
export declare class MutationObserver<T> implements IMutationObserver<T> {
|
|
23
|
+
private listeners;
|
|
24
|
+
subscribe(listener: (oldValue: T, newValue: T) => void): void;
|
|
25
|
+
unsubscribe(listener: (oldValue: T, newValue: T) => void): void;
|
|
26
|
+
notify(oldValue: T, newValue: T): void;
|
|
27
|
+
}
|
|
28
|
+
export declare const OBSERVABLE_SYMBOL: unique symbol;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a value is an Observable
|
|
31
|
+
*/
|
|
32
|
+
export declare function isObservable<T = any>(value: any): value is Observable<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Observable - простой реактивный контейнер без Proxy.
|
|
35
|
+
*
|
|
36
|
+
* Для доступа к значению используйте getObject():
|
|
37
|
+
* const user = new Observable({ name: 'Alice', age: 25 });
|
|
38
|
+
* user.getObject().name // 'Alice'
|
|
39
|
+
* user.setObject({ name: 'Bob', age: 30 }); // triggers subscribers
|
|
40
|
+
*
|
|
41
|
+
* В шаблонах синтаксис прозрачный:
|
|
42
|
+
* @(user.name) - автоматически распознаётся как user.getObject().name
|
|
43
|
+
*/
|
|
22
44
|
export default class Observable<T> {
|
|
23
45
|
private object;
|
|
24
46
|
private observer;
|
|
47
|
+
private mutationObserver;
|
|
48
|
+
readonly [OBSERVABLE_SYMBOL] = true;
|
|
25
49
|
constructor(object: T);
|
|
26
50
|
getObject(): T;
|
|
27
51
|
getObserver(): Observer<T>;
|
|
52
|
+
getMutationObserver(): MutationObserver<T>;
|
|
28
53
|
subscribe(listener: (data: T) => void): void;
|
|
29
54
|
unsubscribe(listener: (data: T) => void): void;
|
|
55
|
+
/**
|
|
56
|
+
* Subscribe to mutation events (oldValue, newValue)
|
|
57
|
+
*/
|
|
58
|
+
subscribeMutation(listener: (oldValue: T, newValue: T) => void): void;
|
|
59
|
+
unsubscribeMutation(listener: (oldValue: T, newValue: T) => void): void;
|
|
30
60
|
setObject(object: T): void;
|
|
31
61
|
}
|
|
32
62
|
//# sourceMappingURL=Observer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACzB;AACD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CAC1C;AACD,MAAM,WAAW,oBAAoB,CAAC,CAAC,EAAE,CAAC;IACtC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACtE,WAAW,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACxE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,qBAAa,QAAQ,CAAC,CAAC;IACnB,OAAO,CAAC,SAAS,CAAgC;IAE1C,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAG5C,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAI9C,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;CAG/B;
|
|
1
|
+
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,9 +10,43 @@ export class Observer {
|
|
|
10
10
|
this.listeners.forEach(listener => listener(data));
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
export class MutationObserver {
|
|
14
|
+
listeners = [];
|
|
15
|
+
subscribe(listener) {
|
|
16
|
+
this.listeners.push(listener);
|
|
17
|
+
}
|
|
18
|
+
unsubscribe(listener) {
|
|
19
|
+
this.listeners = this.listeners.filter(l => l !== listener);
|
|
20
|
+
}
|
|
21
|
+
notify(oldValue, newValue) {
|
|
22
|
+
this.listeners.forEach(listener => listener(oldValue, newValue));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Symbol to identify Observable instances
|
|
26
|
+
export const OBSERVABLE_SYMBOL = Symbol.for('Observable');
|
|
27
|
+
/**
|
|
28
|
+
* Check if a value is an Observable
|
|
29
|
+
*/
|
|
30
|
+
export function isObservable(value) {
|
|
31
|
+
return value && value[OBSERVABLE_SYMBOL] === true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Observable - простой реактивный контейнер без Proxy.
|
|
35
|
+
*
|
|
36
|
+
* Для доступа к значению используйте getObject():
|
|
37
|
+
* const user = new Observable({ name: 'Alice', age: 25 });
|
|
38
|
+
* user.getObject().name // 'Alice'
|
|
39
|
+
* user.setObject({ name: 'Bob', age: 30 }); // triggers subscribers
|
|
40
|
+
*
|
|
41
|
+
* В шаблонах синтаксис прозрачный:
|
|
42
|
+
* @(user.name) - автоматически распознаётся как user.getObject().name
|
|
43
|
+
*/
|
|
13
44
|
export default class Observable {
|
|
14
45
|
object;
|
|
15
46
|
observer = new Observer();
|
|
47
|
+
mutationObserver = new MutationObserver();
|
|
48
|
+
// Mark as Observable
|
|
49
|
+
[OBSERVABLE_SYMBOL] = true;
|
|
16
50
|
constructor(object) {
|
|
17
51
|
this.object = object;
|
|
18
52
|
}
|
|
@@ -22,15 +56,29 @@ export default class Observable {
|
|
|
22
56
|
getObserver() {
|
|
23
57
|
return this.observer;
|
|
24
58
|
}
|
|
59
|
+
getMutationObserver() {
|
|
60
|
+
return this.mutationObserver;
|
|
61
|
+
}
|
|
25
62
|
subscribe(listener) {
|
|
26
63
|
this.observer.subscribe(listener);
|
|
27
64
|
}
|
|
28
65
|
unsubscribe(listener) {
|
|
29
66
|
this.observer.unsubscribe(listener);
|
|
30
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Subscribe to mutation events (oldValue, newValue)
|
|
70
|
+
*/
|
|
71
|
+
subscribeMutation(listener) {
|
|
72
|
+
this.mutationObserver.subscribe(listener);
|
|
73
|
+
}
|
|
74
|
+
unsubscribeMutation(listener) {
|
|
75
|
+
this.mutationObserver.unsubscribe(listener);
|
|
76
|
+
}
|
|
31
77
|
setObject(object) {
|
|
78
|
+
const oldObject = this.object;
|
|
32
79
|
this.object = object;
|
|
33
80
|
this.observer.notify(this.object);
|
|
81
|
+
this.mutationObserver.notify(oldObject, this.object);
|
|
34
82
|
}
|
|
35
83
|
}
|
|
36
84
|
//# sourceMappingURL=Observer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observer.js","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACT,SAAS,GAA6B,EAAE,CAAC;IAE1C,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,IAAO;QACjB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"Observer.js","sourceRoot":"","sources":["../../../src/foundation/api/Observer.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,QAAQ;IACT,SAAS,GAA6B,EAAE,CAAC;IAE1C,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,IAAO;QACjB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;CACJ;AAED,MAAM,OAAO,gBAAgB;IACjB,SAAS,GAA8C,EAAE,CAAC;IAE3D,SAAS,CAAC,QAA4C;QACzD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACM,WAAW,CAAC,QAA4C;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,QAAW,EAAE,QAAW;QAClC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC;CACJ;AAED,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,YAAY,CAAU,KAAU;IAC5C,OAAO,KAAK,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;AACtD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IACnB,MAAM,CAAI;IACV,QAAQ,GAAgB,IAAI,QAAQ,EAAK,CAAC;IAC1C,gBAAgB,GAAwB,IAAI,gBAAgB,EAAK,CAAC;IAE1E,qBAAqB;IACL,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAE3C,YAAY,MAAS;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,SAAS;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEM,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,mBAAmB;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAEM,SAAS,CAAC,QAA2B;QACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,WAAW,CAAC,QAA2B;QAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,QAA4C;QACjE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,mBAAmB,CAAC,QAA4C;QACnE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAEM,SAAS,CAAC,MAAS;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;CACJ"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BalancedParser - утилита для парсинга сбалансированных скобок (), {}.
|
|
3
|
+
* Корректно обрабатывает строки и комментарии.
|
|
4
|
+
*/
|
|
5
|
+
export default class BalancedParser {
|
|
6
|
+
/**
|
|
7
|
+
* Найти все сбалансированные выражения с заданным opener.
|
|
8
|
+
* @param input - входная строка
|
|
9
|
+
* @param opener - открывающая последовательность, например '@(' или '@for('
|
|
10
|
+
* @returns массив объектов с content и позициями
|
|
11
|
+
*/
|
|
12
|
+
static parseBalanced(input: string, opener: string, closerChar?: ')' | '}'): Array<{
|
|
13
|
+
content: string;
|
|
14
|
+
start: number;
|
|
15
|
+
end: number;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Парсить блочные Rule типа @for(...) { ... }
|
|
19
|
+
* @returns объект с condition (содержимое скобок) и block (содержимое фигурных скобок)
|
|
20
|
+
*/
|
|
21
|
+
static parseBlockRule(input: string, opener: string): Array<{
|
|
22
|
+
condition: string;
|
|
23
|
+
block: string;
|
|
24
|
+
start: number;
|
|
25
|
+
end: number;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Парсить @if/@elseif/@else цепочки
|
|
29
|
+
*/
|
|
30
|
+
static parseIfChain(input: string): Array<{
|
|
31
|
+
type: 'if' | 'elseif' | 'else';
|
|
32
|
+
condition?: string;
|
|
33
|
+
block: string;
|
|
34
|
+
start: number;
|
|
35
|
+
end: number;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Skip over a string literal (handles escape sequences)
|
|
39
|
+
*/
|
|
40
|
+
private static skipString;
|
|
41
|
+
/**
|
|
42
|
+
* Skip single-line comment
|
|
43
|
+
*/
|
|
44
|
+
private static skipLineComment;
|
|
45
|
+
/**
|
|
46
|
+
* Skip block comment
|
|
47
|
+
*/
|
|
48
|
+
private static skipBlockComment;
|
|
49
|
+
/**
|
|
50
|
+
* Извлечь простые @(expression) без блоков
|
|
51
|
+
*/
|
|
52
|
+
static parseExpressions(input: string): Array<{
|
|
53
|
+
content: string;
|
|
54
|
+
start: number;
|
|
55
|
+
end: number;
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=BalancedParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalancedParser.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/BalancedParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAE/B;;;;;OAKG;WACW,aAAa,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,GAAG,GAAG,GAAS,GAC5B,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAwDzD;;;OAGG;WACW,cAAc,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACf,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAqH1E;;OAEG;WACW,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAC7C,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACf,CAAC;IAwFF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IA0BzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B;;OAEG;WACW,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAGxG"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BalancedParser - утилита для парсинга сбалансированных скобок (), {}.
|
|
3
|
+
* Корректно обрабатывает строки и комментарии.
|
|
4
|
+
*/
|
|
5
|
+
export default class BalancedParser {
|
|
6
|
+
/**
|
|
7
|
+
* Найти все сбалансированные выражения с заданным opener.
|
|
8
|
+
* @param input - входная строка
|
|
9
|
+
* @param opener - открывающая последовательность, например '@(' или '@for('
|
|
10
|
+
* @returns массив объектов с content и позициями
|
|
11
|
+
*/
|
|
12
|
+
static parseBalanced(input, opener, closerChar = ')') {
|
|
13
|
+
const results = [];
|
|
14
|
+
const openerChar = closerChar === ')' ? '(' : '{';
|
|
15
|
+
let i = 0;
|
|
16
|
+
while (i < input.length) {
|
|
17
|
+
const idx = input.indexOf(opener, i);
|
|
18
|
+
if (idx === -1)
|
|
19
|
+
break;
|
|
20
|
+
const contentStart = idx + opener.length;
|
|
21
|
+
let pos = contentStart;
|
|
22
|
+
let depth = 1;
|
|
23
|
+
while (pos < input.length && depth > 0) {
|
|
24
|
+
const ch = input[pos];
|
|
25
|
+
// Skip string literals
|
|
26
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
27
|
+
pos = this.skipString(input, pos, ch);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// Skip single-line comments
|
|
31
|
+
if (ch === '/' && input[pos + 1] === '/') {
|
|
32
|
+
pos = this.skipLineComment(input, pos);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Skip multi-line comments
|
|
36
|
+
if (ch === '/' && input[pos + 1] === '*') {
|
|
37
|
+
pos = this.skipBlockComment(input, pos);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (ch === openerChar)
|
|
41
|
+
depth++;
|
|
42
|
+
else if (ch === closerChar)
|
|
43
|
+
depth--;
|
|
44
|
+
pos++;
|
|
45
|
+
}
|
|
46
|
+
if (depth === 0) {
|
|
47
|
+
results.push({
|
|
48
|
+
content: input.slice(contentStart, pos - 1),
|
|
49
|
+
start: idx,
|
|
50
|
+
end: pos
|
|
51
|
+
});
|
|
52
|
+
i = pos;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Unbalanced, skip this opener and continue
|
|
56
|
+
i = idx + 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return results;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Парсить блочные Rule типа @for(...) { ... }
|
|
63
|
+
* @returns объект с condition (содержимое скобок) и block (содержимое фигурных скобок)
|
|
64
|
+
*/
|
|
65
|
+
static parseBlockRule(input, opener // например '@for', '@if'
|
|
66
|
+
) {
|
|
67
|
+
const results = [];
|
|
68
|
+
const openerLower = opener.toLowerCase();
|
|
69
|
+
let i = 0;
|
|
70
|
+
while (i < input.length) {
|
|
71
|
+
// Case-insensitive search
|
|
72
|
+
const lowerInput = input.toLowerCase();
|
|
73
|
+
let idx = lowerInput.indexOf(openerLower, i);
|
|
74
|
+
if (idx === -1)
|
|
75
|
+
break;
|
|
76
|
+
// Check for @@ escape
|
|
77
|
+
if (idx > 0 && input[idx - 1] === '@') {
|
|
78
|
+
i = idx + 1;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Find opening parenthesis
|
|
82
|
+
let parenStart = idx + opener.length;
|
|
83
|
+
while (parenStart < input.length && /\s/.test(input[parenStart])) {
|
|
84
|
+
parenStart++;
|
|
85
|
+
}
|
|
86
|
+
if (input[parenStart] !== '(') {
|
|
87
|
+
i = idx + 1;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Parse balanced parentheses for condition
|
|
91
|
+
let pos = parenStart + 1;
|
|
92
|
+
let depth = 1;
|
|
93
|
+
while (pos < input.length && depth > 0) {
|
|
94
|
+
const ch = input[pos];
|
|
95
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
96
|
+
pos = this.skipString(input, pos, ch);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (ch === '/' && input[pos + 1] === '/') {
|
|
100
|
+
pos = this.skipLineComment(input, pos);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (ch === '/' && input[pos + 1] === '*') {
|
|
104
|
+
pos = this.skipBlockComment(input, pos);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (ch === '(')
|
|
108
|
+
depth++;
|
|
109
|
+
else if (ch === ')')
|
|
110
|
+
depth--;
|
|
111
|
+
pos++;
|
|
112
|
+
}
|
|
113
|
+
if (depth !== 0) {
|
|
114
|
+
i = idx + 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const condition = input.slice(parenStart + 1, pos - 1);
|
|
118
|
+
const conditionEnd = pos;
|
|
119
|
+
// Find opening brace for block
|
|
120
|
+
let braceStart = conditionEnd;
|
|
121
|
+
while (braceStart < input.length && /\s/.test(input[braceStart])) {
|
|
122
|
+
braceStart++;
|
|
123
|
+
}
|
|
124
|
+
if (input[braceStart] !== '{') {
|
|
125
|
+
i = idx + 1;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Parse balanced braces for block
|
|
129
|
+
pos = braceStart + 1;
|
|
130
|
+
depth = 1;
|
|
131
|
+
while (pos < input.length && depth > 0) {
|
|
132
|
+
const ch = input[pos];
|
|
133
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
134
|
+
pos = this.skipString(input, pos, ch);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (ch === '/' && input[pos + 1] === '/') {
|
|
138
|
+
pos = this.skipLineComment(input, pos);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (ch === '/' && input[pos + 1] === '*') {
|
|
142
|
+
pos = this.skipBlockComment(input, pos);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (ch === '{')
|
|
146
|
+
depth++;
|
|
147
|
+
else if (ch === '}')
|
|
148
|
+
depth--;
|
|
149
|
+
pos++;
|
|
150
|
+
}
|
|
151
|
+
if (depth !== 0) {
|
|
152
|
+
i = idx + 1;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const block = input.slice(braceStart + 1, pos - 1);
|
|
156
|
+
results.push({
|
|
157
|
+
condition,
|
|
158
|
+
block,
|
|
159
|
+
start: idx,
|
|
160
|
+
end: pos
|
|
161
|
+
});
|
|
162
|
+
i = pos;
|
|
163
|
+
}
|
|
164
|
+
return results;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Парсить @if/@elseif/@else цепочки
|
|
168
|
+
*/
|
|
169
|
+
static parseIfChain(input) {
|
|
170
|
+
const results = [];
|
|
171
|
+
// Find @if first
|
|
172
|
+
const ifMatches = this.parseBlockRule(input, '@if');
|
|
173
|
+
for (const ifMatch of ifMatches) {
|
|
174
|
+
results.push({
|
|
175
|
+
type: 'if',
|
|
176
|
+
condition: ifMatch.condition,
|
|
177
|
+
block: ifMatch.block,
|
|
178
|
+
start: ifMatch.start,
|
|
179
|
+
end: ifMatch.end
|
|
180
|
+
});
|
|
181
|
+
// Look for @elseif/@else after this @if
|
|
182
|
+
let searchPos = ifMatch.end;
|
|
183
|
+
while (searchPos < input.length) {
|
|
184
|
+
// Skip whitespace
|
|
185
|
+
while (searchPos < input.length && /\s/.test(input[searchPos])) {
|
|
186
|
+
searchPos++;
|
|
187
|
+
}
|
|
188
|
+
const remaining = input.slice(searchPos).toLowerCase();
|
|
189
|
+
if (remaining.startsWith('@elseif')) {
|
|
190
|
+
const elseifMatches = this.parseBlockRule(input.slice(searchPos), '@elseif');
|
|
191
|
+
if (elseifMatches.length > 0) {
|
|
192
|
+
const m = elseifMatches[0];
|
|
193
|
+
results.push({
|
|
194
|
+
type: 'elseif',
|
|
195
|
+
condition: m.condition,
|
|
196
|
+
block: m.block,
|
|
197
|
+
start: searchPos + m.start,
|
|
198
|
+
end: searchPos + m.end
|
|
199
|
+
});
|
|
200
|
+
searchPos = searchPos + m.end;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (remaining.startsWith('@else')) {
|
|
205
|
+
// @else without condition
|
|
206
|
+
let pos = searchPos + 5; // length of '@else'
|
|
207
|
+
while (pos < input.length && /\s/.test(input[pos])) {
|
|
208
|
+
pos++;
|
|
209
|
+
}
|
|
210
|
+
if (input[pos] === '{') {
|
|
211
|
+
let bracePos = pos + 1;
|
|
212
|
+
let depth = 1;
|
|
213
|
+
while (bracePos < input.length && depth > 0) {
|
|
214
|
+
const ch = input[bracePos];
|
|
215
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
216
|
+
bracePos = this.skipString(input, bracePos, ch);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (ch === '{')
|
|
220
|
+
depth++;
|
|
221
|
+
else if (ch === '}')
|
|
222
|
+
depth--;
|
|
223
|
+
bracePos++;
|
|
224
|
+
}
|
|
225
|
+
if (depth === 0) {
|
|
226
|
+
results.push({
|
|
227
|
+
type: 'else',
|
|
228
|
+
block: input.slice(pos + 1, bracePos - 1),
|
|
229
|
+
start: searchPos,
|
|
230
|
+
end: bracePos
|
|
231
|
+
});
|
|
232
|
+
searchPos = bracePos;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
break; // No more @elseif/@else found
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return results;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Skip over a string literal (handles escape sequences)
|
|
244
|
+
*/
|
|
245
|
+
static skipString(input, pos, quote) {
|
|
246
|
+
pos++; // skip opening quote
|
|
247
|
+
while (pos < input.length) {
|
|
248
|
+
if (input[pos] === '\\') {
|
|
249
|
+
pos += 2; // skip escape sequence
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (input[pos] === quote) {
|
|
253
|
+
return pos + 1;
|
|
254
|
+
}
|
|
255
|
+
// Handle template literal ${...}
|
|
256
|
+
if (quote === '`' && input[pos] === '$' && input[pos + 1] === '{') {
|
|
257
|
+
pos += 2;
|
|
258
|
+
let depth = 1;
|
|
259
|
+
while (pos < input.length && depth > 0) {
|
|
260
|
+
if (input[pos] === '{')
|
|
261
|
+
depth++;
|
|
262
|
+
else if (input[pos] === '}')
|
|
263
|
+
depth--;
|
|
264
|
+
pos++;
|
|
265
|
+
}
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
pos++;
|
|
269
|
+
}
|
|
270
|
+
return pos;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Skip single-line comment
|
|
274
|
+
*/
|
|
275
|
+
static skipLineComment(input, pos) {
|
|
276
|
+
while (pos < input.length && input[pos] !== '\n') {
|
|
277
|
+
pos++;
|
|
278
|
+
}
|
|
279
|
+
return pos + 1;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Skip block comment
|
|
283
|
+
*/
|
|
284
|
+
static skipBlockComment(input, pos) {
|
|
285
|
+
pos += 2; // skip /*
|
|
286
|
+
while (pos < input.length - 1) {
|
|
287
|
+
if (input[pos] === '*' && input[pos + 1] === '/') {
|
|
288
|
+
return pos + 2;
|
|
289
|
+
}
|
|
290
|
+
pos++;
|
|
291
|
+
}
|
|
292
|
+
return pos;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Извлечь простые @(expression) без блоков
|
|
296
|
+
*/
|
|
297
|
+
static parseExpressions(input) {
|
|
298
|
+
return this.parseBalanced(input, '@(', ')');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=BalancedParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalancedParser.js","sourceRoot":"","sources":["../../../src/foundation/engine/BalancedParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscapeHandler - обработка escape-последовательностей.
|
|
3
|
+
* @@ -> @
|
|
4
|
+
* @@@@ -> @@
|
|
5
|
+
*/
|
|
6
|
+
export default class EscapeHandler {
|
|
7
|
+
/**
|
|
8
|
+
* Заменить @@ на специальный placeholder перед парсингом
|
|
9
|
+
*/
|
|
10
|
+
static escapeDoubleAt(input: string): {
|
|
11
|
+
result: string;
|
|
12
|
+
placeholder: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Восстановить @ из placeholder после парсинга
|
|
16
|
+
*/
|
|
17
|
+
static restoreEscapes(input: string, placeholder: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Полный цикл: escape -> process -> restore
|
|
20
|
+
*/
|
|
21
|
+
static process(input: string, processor: (escaped: string) => string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Проверить, является ли позиция escaped (предшествует @@)
|
|
24
|
+
*/
|
|
25
|
+
static isEscaped(input: string, position: number): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=EscapeHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EscapeHandler.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAOpF;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAIxE;;OAEG;WACW,OAAO,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACvC,MAAM;IAMT;;OAEG;WACW,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;CAcpE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscapeHandler - обработка escape-последовательностей.
|
|
3
|
+
* @@ -> @
|
|
4
|
+
* @@@@ -> @@
|
|
5
|
+
*/
|
|
6
|
+
export default class EscapeHandler {
|
|
7
|
+
/**
|
|
8
|
+
* Заменить @@ на специальный placeholder перед парсингом
|
|
9
|
+
*/
|
|
10
|
+
static escapeDoubleAt(input) {
|
|
11
|
+
// Use a unique placeholder that won't appear in normal code
|
|
12
|
+
const placeholder = '\x00AT_ESCAPE\x00';
|
|
13
|
+
const result = input.replace(/@@/g, placeholder);
|
|
14
|
+
return { result, placeholder };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Восстановить @ из placeholder после парсинга
|
|
18
|
+
*/
|
|
19
|
+
static restoreEscapes(input, placeholder) {
|
|
20
|
+
return input.replace(new RegExp(placeholder.replace(/\x00/g, '\\x00'), 'g'), '@');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Полный цикл: escape -> process -> restore
|
|
24
|
+
*/
|
|
25
|
+
static process(input, processor) {
|
|
26
|
+
const { result: escaped, placeholder } = this.escapeDoubleAt(input);
|
|
27
|
+
const processed = processor(escaped);
|
|
28
|
+
return this.restoreEscapes(processed, placeholder);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Проверить, является ли позиция escaped (предшествует @@)
|
|
32
|
+
*/
|
|
33
|
+
static isEscaped(input, position) {
|
|
34
|
+
if (position === 0)
|
|
35
|
+
return false;
|
|
36
|
+
// Count consecutive @ before this position
|
|
37
|
+
let count = 0;
|
|
38
|
+
let i = position - 1;
|
|
39
|
+
while (i >= 0 && input[i] === '@') {
|
|
40
|
+
count++;
|
|
41
|
+
i--;
|
|
42
|
+
}
|
|
43
|
+
// If odd number of @ before, this @ is escaped
|
|
44
|
+
return count % 2 === 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=EscapeHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EscapeHandler.js","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa;QACtC,4DAA4D;QAC5D,MAAM,WAAW,GAAG,mBAAmB,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,WAAmB;QAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAO,CACjB,KAAa,EACb,SAAsC;QAEtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,QAAgB;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,2CAA2C;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChC,KAAK,EAAE,CAAC;YACR,CAAC,EAAE,CAAC;QACR,CAAC;QAED,+CAA+C;QAC/C,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACJ"}
|