@gesslar/toolkit 3.23.0 → 3.25.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/package.json +6 -6
- package/src/node/lib/FileObject.js +45 -0
- package/src/node/lib/FileSystem.js +8 -6
- package/src/node/lib/Notify.js +21 -6
- package/src/node/lib/Util.js +0 -10
- package/types/node/lib/FileObject.d.ts +13 -0
- package/types/node/lib/FileObject.d.ts.map +1 -1
- package/types/node/lib/FileSystem.d.ts +6 -4
- package/types/node/lib/FileSystem.d.ts.map +1 -1
- package/types/node/lib/Notify.d.ts +10 -0
- package/types/node/lib/Notify.d.ts.map +1 -1
- package/types/node/lib/Util.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"name": "gesslar",
|
|
6
6
|
"url": "https://gesslar.dev"
|
|
7
7
|
},
|
|
8
|
-
"version": "3.
|
|
8
|
+
"version": "3.25.0",
|
|
9
9
|
"license": "Unlicense",
|
|
10
10
|
"homepage": "https://github.com/gesslar/toolkit#readme",
|
|
11
11
|
"repository": {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"UNLICENSE.txt"
|
|
50
50
|
],
|
|
51
51
|
"engines": {
|
|
52
|
-
"node": ">=
|
|
52
|
+
"node": ">=24.13.0"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@eslint/js": "^9.39.2",
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
"yaml": "^2.8.2"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
|
-
"@gesslar/uglier": "^1.
|
|
65
|
+
"@gesslar/uglier": "^1.2.0",
|
|
66
66
|
"eslint": "^9.39.2",
|
|
67
|
-
"eslint-plugin-jsdoc": "^62.
|
|
68
|
-
"happy-dom": "^20.3.
|
|
67
|
+
"eslint-plugin-jsdoc": "^62.3.0",
|
|
68
|
+
"happy-dom": "^20.3.4",
|
|
69
69
|
"typescript": "^5.9.3",
|
|
70
|
-
"typescript-eslint": "^8.53.
|
|
70
|
+
"typescript-eslint": "^8.53.1"
|
|
71
71
|
},
|
|
72
72
|
"scripts": {
|
|
73
73
|
"types": "node -e \"require('fs').rmSync('types',{recursive:true,force:true});\" && tsc -p tsconfig.types.json",
|
|
@@ -488,4 +488,49 @@ export default class FileObject extends FS {
|
|
|
488
488
|
|
|
489
489
|
return await fs.unlink(filePath)
|
|
490
490
|
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Creates a FileObject representing the current working file (the file
|
|
494
|
+
* that called this method). Parses the stack trace to determine the
|
|
495
|
+
* caller's file path.
|
|
496
|
+
*
|
|
497
|
+
* @returns {FileObject} A new FileObject instance for the calling file
|
|
498
|
+
* @throws {Sass} If unable to determine caller file from stack trace
|
|
499
|
+
* @example
|
|
500
|
+
* // In /home/user/project/src/app.js:
|
|
501
|
+
* const thisFile = FileObject.fromCwf()
|
|
502
|
+
* console.log(thisFile.path) // /home/user/project/src/app.js
|
|
503
|
+
*/
|
|
504
|
+
static fromCwf() {
|
|
505
|
+
const originalPrepare = Error.prepareStackTrace
|
|
506
|
+
Error.prepareStackTrace = (_, stack) => stack
|
|
507
|
+
/** @type {Array<{getFileName: () => string|null}>} */
|
|
508
|
+
const stack = (new Error().stack)
|
|
509
|
+
Error.prepareStackTrace = originalPrepare
|
|
510
|
+
|
|
511
|
+
// Find the first call site that isn't this file
|
|
512
|
+
// Stack filenames may be file:// URLs, so compare both forms
|
|
513
|
+
const thisFileUrl = import.meta.url
|
|
514
|
+
const thisFilePath = FS.urlToPath(thisFileUrl)
|
|
515
|
+
const callerSite = stack.find(site => {
|
|
516
|
+
const fileName = site.getFileName()
|
|
517
|
+
|
|
518
|
+
if(!fileName)
|
|
519
|
+
return false
|
|
520
|
+
|
|
521
|
+
return fileName !== thisFileUrl && fileName !== thisFilePath
|
|
522
|
+
})
|
|
523
|
+
|
|
524
|
+
const callerFile = callerSite?.getFileName()
|
|
525
|
+
|
|
526
|
+
if(!callerFile)
|
|
527
|
+
throw Sass.new("Unable to determine caller file from stack trace")
|
|
528
|
+
|
|
529
|
+
// Handle file:// URLs
|
|
530
|
+
const filePath = callerFile.startsWith("file://")
|
|
531
|
+
? FS.urlToPath(callerFile)
|
|
532
|
+
: callerFile
|
|
533
|
+
|
|
534
|
+
return new this(filePath)
|
|
535
|
+
}
|
|
491
536
|
}
|
|
@@ -80,17 +80,19 @@ export default class FileSystem {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
|
-
* Convert a
|
|
83
|
+
* Convert a file URL to a path.
|
|
84
84
|
*
|
|
85
85
|
* @static
|
|
86
|
-
* @param {string}
|
|
87
|
-
* @returns {string} The path
|
|
86
|
+
* @param {string} fileUrl - The file URL to convert (e.g., import.meta.url)
|
|
87
|
+
* @returns {string} The file path
|
|
88
|
+
* @example
|
|
89
|
+
* const currentFile = FileSystem.urlToPath(import.meta.url)
|
|
88
90
|
*/
|
|
89
|
-
static urlToPath(
|
|
91
|
+
static urlToPath(fileUrl) {
|
|
90
92
|
try {
|
|
91
|
-
return url.fileURLToPath(
|
|
93
|
+
return url.fileURLToPath(fileUrl)
|
|
92
94
|
} catch {
|
|
93
|
-
return
|
|
95
|
+
return fileUrl
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
|
package/src/node/lib/Notify.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import {EventEmitter} from "node:events"
|
|
8
8
|
|
|
9
9
|
import Valid from "./Valid.js"
|
|
10
|
+
import Util from "./Util.js"
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* @typedef {object} NotifyEventOptions
|
|
@@ -33,12 +34,26 @@ export default new class Notify {
|
|
|
33
34
|
* @returns {void}
|
|
34
35
|
*/
|
|
35
36
|
emit(type, payload=undefined) {
|
|
36
|
-
Valid.type(type, "String")
|
|
37
|
-
Valid.assert(type.length > 0, "Event type cannot be an empty string.")
|
|
37
|
+
Valid.type(type, "String", {allowEmpty: false})
|
|
38
38
|
|
|
39
39
|
this.#emitter.emit(type, payload)
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Emits an event asynchronously and waits for all listeners to complete.
|
|
44
|
+
* Unlike emit() which is synchronous, this method properly handles async
|
|
45
|
+
* event listeners by waiting for all of them to resolve.
|
|
46
|
+
*
|
|
47
|
+
* @param {string} type - Event name to dispatch.
|
|
48
|
+
* @param {unknown} [payload] - Data to send with the event.
|
|
49
|
+
* @returns {Promise<void>} Resolves when all listeners have completed.
|
|
50
|
+
*/
|
|
51
|
+
async asyncEmit(type, payload) {
|
|
52
|
+
Valid.type(type, "String", {allowEmpty: false})
|
|
53
|
+
|
|
54
|
+
await Util.asyncEmit(this.#emitter, type, payload)
|
|
55
|
+
}
|
|
56
|
+
|
|
42
57
|
/**
|
|
43
58
|
* Emits an event and returns the payload for simple request/response flows.
|
|
44
59
|
* Listeners can mutate the payload object to provide responses.
|
|
@@ -48,8 +63,7 @@ export default new class Notify {
|
|
|
48
63
|
* @returns {unknown} The payload after listeners have processed it.
|
|
49
64
|
*/
|
|
50
65
|
request(type, payload={}) {
|
|
51
|
-
Valid.type(type, "String")
|
|
52
|
-
Valid.assert(type.length > 0, "Event type cannot be an empty string.")
|
|
66
|
+
Valid.type(type, "String", {allowEmpty: false})
|
|
53
67
|
|
|
54
68
|
this.#emitter.emit(type, payload)
|
|
55
69
|
|
|
@@ -66,8 +80,7 @@ export default new class Notify {
|
|
|
66
80
|
* @returns {() => void} Dispose function to unregister the handler.
|
|
67
81
|
*/
|
|
68
82
|
on(type, handler, emitter=this.#emitter, options=undefined) {
|
|
69
|
-
Valid.type(type, "String")
|
|
70
|
-
Valid.assert(type.length > 0, "Event type cannot be an empty string.")
|
|
83
|
+
Valid.type(type, "String", {allowEmpty: false})
|
|
71
84
|
Valid.type(handler, "Function")
|
|
72
85
|
|
|
73
86
|
if(options?.once) {
|
|
@@ -88,6 +101,8 @@ export default new class Notify {
|
|
|
88
101
|
* @returns {void}
|
|
89
102
|
*/
|
|
90
103
|
off(type, handler, emitter=this.#emitter) {
|
|
104
|
+
Valid.type(type, "String", {allowEmpty: false})
|
|
105
|
+
|
|
91
106
|
emitter.off(type, handler)
|
|
92
107
|
}
|
|
93
108
|
}
|
package/src/node/lib/Util.js
CHANGED
|
@@ -108,11 +108,6 @@ export default class Util extends BrowserUtil {
|
|
|
108
108
|
} catch(error) {
|
|
109
109
|
const argsDesc = args.length > 0 ? `with arguments: ${args.map(String).join(", ")}` : "with no arguments"
|
|
110
110
|
|
|
111
|
-
// If it's already a Sass error, just re-throw to avoid double-wrapping
|
|
112
|
-
if(error instanceof Sass) {
|
|
113
|
-
throw error
|
|
114
|
-
}
|
|
115
|
-
|
|
116
111
|
throw Sass.new(
|
|
117
112
|
`Processing '${event}' event ${argsDesc}.`,
|
|
118
113
|
error
|
|
@@ -144,11 +139,6 @@ export default class Util extends BrowserUtil {
|
|
|
144
139
|
} catch(error) {
|
|
145
140
|
const argsDesc = args.length > 0 ? `with arguments: ${args.map(String).join(", ")}` : "with no arguments"
|
|
146
141
|
|
|
147
|
-
// If it's already a Sass error, just re-throw to avoid double-wrapping
|
|
148
|
-
if(error instanceof Sass) {
|
|
149
|
-
throw error
|
|
150
|
-
}
|
|
151
|
-
|
|
152
142
|
throw Sass.new(
|
|
153
143
|
`Processing '${event}' event ${argsDesc}.`,
|
|
154
144
|
error
|
|
@@ -22,6 +22,19 @@ export default class FileObject extends FS {
|
|
|
22
22
|
static dataLoaderConfig: {
|
|
23
23
|
[key: string]: Array<typeof JSON5 | typeof YAML>;
|
|
24
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Creates a FileObject representing the current working file (the file
|
|
27
|
+
* that called this method). Parses the stack trace to determine the
|
|
28
|
+
* caller's file path.
|
|
29
|
+
*
|
|
30
|
+
* @returns {FileObject} A new FileObject instance for the calling file
|
|
31
|
+
* @throws {Sass} If unable to determine caller file from stack trace
|
|
32
|
+
* @example
|
|
33
|
+
* // In /home/user/project/src/app.js:
|
|
34
|
+
* const thisFile = FileObject.fromCwf()
|
|
35
|
+
* console.log(thisFile.path) // /home/user/project/src/app.js
|
|
36
|
+
*/
|
|
37
|
+
static fromCwf(): FileObject;
|
|
25
38
|
/**
|
|
26
39
|
* Constructs a FileObject instance.
|
|
27
40
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileObject.d.ts","sourceRoot":"","sources":["../../../src/node/lib/FileObject.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;GAaG;AAEH;IACE;;;;;OAKG;IACH,yBAFU;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,IAAI,CAAC,CAAA;KAAC,CAO1D;
|
|
1
|
+
{"version":3,"file":"FileObject.d.ts","sourceRoot":"","sources":["../../../src/node/lib/FileObject.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;GAaG;AAEH;IACE;;;;;OAKG;IACH,yBAFU;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,IAAI,CAAC,CAAA;KAAC,CAO1D;IA8bF;;;;;;;;;;;OAWG;IACH,kBAPa,UAAU,CAsCtB;IA/cD;;;;;OAKG;IACH,uBAHW,MAAM,WACN,eAAe,GAAC,MAAM,GAAC,IAAI,EA+DrC;IAWD;;;;OAIG;IACH,cAFa,OAAO,CAAC,OAAO,CAAC,CAI5B;IAED;;;;OAIG;IACH,gBAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,YAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,WAFa,GAAG,CAIf;IAED;;;;OAIG;IACH,YAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,cAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,iBAFa,MAAM,CAIlB;IACD;;;;OAIG;IACH,cAFa,OAAO,CAInB;IAED;;;;;;;;;;;;;;OAcG;IACH,cAFa,eAAe,CAI3B;IAED;;;;OAIG;IACH,kBAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,WAFa,OAAO,CAAC,OAAO,CAAC,CAU5B;IAED;;;;OAIG;IACH,YAFa,OAAO,CAAC,OAAO,CAAC,CAU5B;IAiBD;;;;OAIG;IACH,QAFa,OAAO,CAAC,MAAM,OAAC,CAAC,CAU5B;IAED;;;;;OAKG;IACH,YAFa,OAAO,CAAC,IAAI,OAAC,CAAC,CAU1B;IAED;;;;;OAKG;IACH,gBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAS3B;IAED;;;;;;;;;;;OAWG;IACH,cARa,OAAO,CAAC,MAAM,CAAC,CAe3B;IAED;;;;;;;;;;;OAWG;IACH,eARW,MAAM,aACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;;;;;;;;;;;OAeG;IACH,kBAXW,WAAW,GAAC,IAAI,GAAC,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAXW,MAAM,aACN,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAiC5B;IAED;;;;OAIG;IACH,UAFa,OAAO,CAAC,MAAM,CAAC,CAS3B;IAED;;;;;;;;;OASG;IACH,UAPa,OAAO,CAAC,IAAI,CAAC,CAczB;;CA8CF;eAzgBc,iBAAiB;4BADJ,sBAAsB;kBAPhC,OAAO;iBAER,MAAM"}
|
|
@@ -22,13 +22,15 @@ export default class FileSystem {
|
|
|
22
22
|
*/
|
|
23
23
|
static pathToUrl(pathName: string): string;
|
|
24
24
|
/**
|
|
25
|
-
* Convert a
|
|
25
|
+
* Convert a file URL to a path.
|
|
26
26
|
*
|
|
27
27
|
* @static
|
|
28
|
-
* @param {string}
|
|
29
|
-
* @returns {string} The path
|
|
28
|
+
* @param {string} fileUrl - The file URL to convert (e.g., import.meta.url)
|
|
29
|
+
* @returns {string} The file path
|
|
30
|
+
* @example
|
|
31
|
+
* const currentFile = FileSystem.urlToPath(import.meta.url)
|
|
30
32
|
*/
|
|
31
|
-
static urlToPath(
|
|
33
|
+
static urlToPath(fileUrl: string): string;
|
|
32
34
|
/**
|
|
33
35
|
* Computes the relative path from one file or directory to another.
|
|
34
36
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileSystem.d.ts","sourceRoot":"","sources":["../../../src/node/lib/FileSystem.js"],"names":[],"mappings":"AA2BA;;GAEG;AACH;IACE,kCAAwB;IACxB,uCAAkC;IAClC,mBAAsB;IAsBtB;;;;;;OAMG;IACH,4BAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,2BAHW,MAAM,GACJ,MAAM,CAQlB;IAED
|
|
1
|
+
{"version":3,"file":"FileSystem.d.ts","sourceRoot":"","sources":["../../../src/node/lib/FileSystem.js"],"names":[],"mappings":"AA2BA;;GAEG;AACH;IACE,kCAAwB;IACxB,uCAAkC;IAClC,mBAAsB;IAsBtB;;;;;;OAMG;IACH,4BAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,2BAHW,MAAM,GACJ,MAAM,CAQlB;IAED;;;;;;;;OAQG;IACH,0BALW,MAAM,GACJ,MAAM,CAUlB;IAED;;;;;;;;;;OAUG;IACH,gCAJW,UAAU,GAAC,eAAe,MAC1B,UAAU,GAAC,eAAe,GACxB,MAAM,CAYlB;IAED;;;;;;;;;;OAUG;IACH,oCAJW,MAAM,MACN,MAAM,GACJ,MAAM,CAQlB;IAED;;;;;;;;;OASG;IACH,oCALW,MAAM,SACN,MAAM,QACN,MAAM,GACJ,MAAM,CA0BlB;IAED;;;;;;;;OAQG;IACH,6BAJW,MAAM,UACN,MAAM,GACJ,MAAM,CAmClB;IAED;;;;;;;;;;;;OAYG;IACH,+BATW,MAAM,aACN,MAAM,GACJ,OAAO,CAcnB;IAED;;;;;;;;;;;;;;OAcG;IACH,4BATW,MAAM,MACN,MAAM,QACN,MAAM,GACJ,MAAM,GAAC,IAAI,CAwBvB;IAED;;;;;;;;;;;;;;;OAeG;IACH,+BAXW,MAAM,MACN,MAAM,QACN,MAAM,GACJ,MAAM,GAAC,IAAI,CA+BvB;IAED;;;;;;;OAOG;IAEH;;;;;;;OAOG;IACH,2BAJW,MAAM;;;;cAXH,MAAM;;;;aACN,MAAM;;;;aACN,MAAM;;;;cACN,MAAM;;;;cACN,MAAM;MAenB;IAED;;;;OAIG;IACH,kBAFa,MAAM,CAIlB;IAzTD;;;;;;;;;OASG;IACH,kCAJW,UAAU,GAAC,eAAe,GACxB,MAAM,CAWlB;CAwSF;yBA3Ua,OAAO,iBAAiB,EAAE,OAAO;8BACjC,OAAO,sBAAsB,EAAE,OAAO"}
|
|
@@ -11,6 +11,16 @@ declare const _default: {
|
|
|
11
11
|
* @returns {void}
|
|
12
12
|
*/
|
|
13
13
|
emit(type: string, payload?: unknown): void;
|
|
14
|
+
/**
|
|
15
|
+
* Emits an event asynchronously and waits for all listeners to complete.
|
|
16
|
+
* Unlike emit() which is synchronous, this method properly handles async
|
|
17
|
+
* event listeners by waiting for all of them to resolve.
|
|
18
|
+
*
|
|
19
|
+
* @param {string} type - Event name to dispatch.
|
|
20
|
+
* @param {unknown} [payload] - Data to send with the event.
|
|
21
|
+
* @returns {Promise<void>} Resolves when all listeners have completed.
|
|
22
|
+
*/
|
|
23
|
+
asyncEmit(type: string, payload?: unknown): Promise<void>;
|
|
14
24
|
/**
|
|
15
25
|
* Emits an event and returns the payload for simple request/response flows.
|
|
16
26
|
* Listeners can mutate the payload object to provide responses.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Notify.d.ts","sourceRoot":"","sources":["../../../src/node/lib/Notify.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"Notify.d.ts","sourceRoot":"","sources":["../../../src/node/lib/Notify.js"],"names":[],"mappings":";IAsBE,iDAAiD;UAAtC,MAAM;IAGjB,kDAAkD;2BAAvC,YAAY;IAGvB;;;;;;OAMG;eAHQ,MAAM,YACN,OAAO,GACL,IAAI;IAQjB;;;;;;;;OAQG;oBAHQ,MAAM,YACN,OAAO,GACL,OAAO,CAAC,IAAI,CAAC;IAQ1B;;;;;;;OAOG;kBAHQ,MAAM,YACN,OAAO,GACL,OAAO;IAUpB;;;;;;;;OAQG;aALQ,MAAM,WACN,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,YAC1B,YAAY,YACZ,kBAAkB,GAChB,MAAM,IAAI;IAevB;;;;;;;OAOG;cAJQ,MAAM,WACN,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,YAC1B,YAAY,GACV,IAAI;;;;;;;WAvFL,OAAO;;;;aACP,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Util.d.ts","sourceRoot":"","sources":["../../../src/node/lib/Util.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH;IACE;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,mCAHW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAazB;IAED;;;;;;;;OAQG;IACH,+CALW,MAAM,SACN,MAAM,WACH,OAAO,EAAA,GACR,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;;;;;;;;;;OAYG;IACH,0BALW,YAAY,SACZ,MAAM,WACH,OAAO,EAAA,GACR,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"Util.d.ts","sourceRoot":"","sources":["../../../src/node/lib/Util.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH;IACE;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,mCAHW,MAAM,GACJ,KAAK,CAAC,MAAM,CAAC,CAazB;IAED;;;;;;;;OAQG;IACH,+CALW,MAAM,SACN,MAAM,WACH,OAAO,EAAA,GACR,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;;;;;;;;;;OAYG;IACH,0BALW,YAAY,SACZ,MAAM,WACH,OAAO,EAAA,GACR,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;;;;;;;OAUG;IACH,+BALW,MAAM,SACN,MAAM,WACH,OAAO,EAAA,GACR,OAAO,CAAC,IAAI,CAAC,CAoBzB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,kBALW,MAAM,QACN,OAAO,GACL,OAAO,CAmBnB;CACF;oCA1LiC,wBAAwB"}
|