@asgard-js/core 0.3.65 → 0.3.67
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/README.md +62 -0
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +887 -736
- package/dist/index.mjs.map +1 -1
- package/dist/lib/source-set-client.d.ts +53 -0
- package/dist/lib/source-set-client.d.ts.map +1 -0
- package/dist/lib/source-set-client.spec.d.ts +2 -0
- package/dist/lib/source-set-client.spec.d.ts.map +1 -0
- package/dist/lib/source-set-path.d.ts +13 -0
- package/dist/lib/source-set-path.d.ts.map +1 -0
- package/dist/lib/source-set-path.spec.d.ts +2 -0
- package/dist/lib/source-set-path.spec.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/source-set-fs.d.ts +130 -0
- package/dist/types/source-set-fs.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SourceSetClientConfig, SourceSetCopyMoveOptions, SourceSetCopyResult, SourceSetListAllOptions, SourceSetListAllResult, SourceSetListOptions, SourceSetListResult, SourceSetReadOptions, SourceSetReadResult, SourceSetStatResult, SourceSetWriteOptions, SourceSetWriteResult } from '../types/source-set-fs';
|
|
2
|
+
|
|
3
|
+
/** The server rejects anything larger (`page_size` max 1000), so clamp rather than let it 400. */
|
|
4
|
+
export declare const SOURCE_SET_MAX_PAGE_SIZE = 1000;
|
|
5
|
+
/**
|
|
6
|
+
* Default ceiling for {@link AsgardSourceSetClient.listAll}.
|
|
7
|
+
*
|
|
8
|
+
* Ten pages of the maximum page size. Past this a file-tree node is not something anyone scrolls, and
|
|
9
|
+
* the walk is sequential, so the cost of going further is paid in round trips for entries nobody reads.
|
|
10
|
+
* It is a ceiling, not a silent truncation: the result reports `total` and `truncatedAtCap` so the UI
|
|
11
|
+
* can say how many were left out, and a caller who genuinely needs more raises `maxEntries`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const SOURCE_SET_DEFAULT_MAX_ENTRIES = 10000;
|
|
14
|
+
export default class AsgardSourceSetClient {
|
|
15
|
+
private readonly endpoint;
|
|
16
|
+
private readonly apiKey?;
|
|
17
|
+
private readonly customHeaders?;
|
|
18
|
+
constructor(config: SourceSetClientConfig);
|
|
19
|
+
/** Auth + caller headers for every request, including the multipart upload and the binary download. */
|
|
20
|
+
private headers;
|
|
21
|
+
/** Issue one volume request, turning any non-2xx into {@link HttpError} (409 included, see R8). */
|
|
22
|
+
private request;
|
|
23
|
+
/** One page of a directory (`GET volume/list?path=[&page&page_size]`). `path` may be the root `''`. */
|
|
24
|
+
list(path: string, options?: SourceSetListOptions): Promise<SourceSetListResult>;
|
|
25
|
+
/**
|
|
26
|
+
* F-026 — every entry in a directory, paging until `paging.total` or the cap.
|
|
27
|
+
*
|
|
28
|
+
* A failed page rejects rather than returning what it managed to collect: handing back half a
|
|
29
|
+
* directory that looks whole is the failure this exists to prevent.
|
|
30
|
+
*/
|
|
31
|
+
listAll(path: string, options?: SourceSetListAllOptions): Promise<SourceSetListAllResult>;
|
|
32
|
+
/** Stat a path (`GET volume/stat?path=`). A missing path is 200 with `exists: false`, not a 404. */
|
|
33
|
+
stat(path: string): Promise<SourceSetStatResult>;
|
|
34
|
+
/** Read a file (`GET volume/file?path=[&offset_bytes&limit_bytes]`) as raw bytes. */
|
|
35
|
+
read(path: string, options?: SourceSetReadOptions): Promise<SourceSetReadResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Write a file (`PUT volume/file?path=[&mode&create_only]`, `multipart/form-data` with a `file` field).
|
|
38
|
+
* With `createOnly`, an existing path is a 409 rather than an overwrite.
|
|
39
|
+
*/
|
|
40
|
+
write(path: string, content: Blob | string, options?: SourceSetWriteOptions): Promise<SourceSetWriteResult>;
|
|
41
|
+
/** Create a directory and any missing parents (`POST volume/mkdir?path=`). */
|
|
42
|
+
mkdir(path: string): Promise<void>;
|
|
43
|
+
/** Delete a file or empty directory (`DELETE volume/item?path=`). */
|
|
44
|
+
remove(path: string): Promise<void>;
|
|
45
|
+
/** Recursively delete a directory (`DELETE volume/all?path=`). The volume root is not a valid target. */
|
|
46
|
+
removeAll(path: string): Promise<void>;
|
|
47
|
+
/** Copy a file or directory tree (`POST volume/copy?src=&dst=[&overwrite]`). */
|
|
48
|
+
copy(src: string, dst: string, options?: SourceSetCopyMoveOptions): Promise<SourceSetCopyResult>;
|
|
49
|
+
/** Move or rename (`POST volume/move?src=&dst=[&overwrite]`) — also how the UI renames. */
|
|
50
|
+
move(src: string, dst: string, options?: SourceSetCopyMoveOptions): Promise<void>;
|
|
51
|
+
private copyMoveQuery;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=source-set-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-set-client.d.ts","sourceRoot":"","sources":["../../src/lib/source-set-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,EAEnB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EAEnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAehC,kGAAkG;AAClG,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,QAAS,CAAC;AAcrD,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAyB;gBAE5C,MAAM,EAAE,qBAAqB;IAMzC,uGAAuG;IACvG,OAAO,CAAC,OAAO;IASf,mGAAmG;YACrF,OAAO;IAarB,uGAAuG;IACjG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmBtF;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAqD/F,oGAAoG;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAetD,qFAAqF;IAC/E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBtF;;;OAGG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgBjH,8EAA8E;IACxE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,qEAAqE;IAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,yGAAyG;IACnG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,gFAAgF;IAC1E,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAStG,2FAA2F;IACrF,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvF,OAAO,CAAC,aAAa;CAMtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-set-client.spec.d.ts","sourceRoot":"","sources":["../../src/lib/source-set-client.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The volume root. Only `list` / `listAll` accept it; every mutation needs a real path. */
|
|
2
|
+
export declare const SOURCE_SET_VOLUME_ROOT = "";
|
|
3
|
+
/**
|
|
4
|
+
* Validate a volume-relative path, returning it unchanged so it can be inlined into a query.
|
|
5
|
+
*
|
|
6
|
+
* @param path Volume-relative, e.g. `notes/todo.md`.
|
|
7
|
+
* @param options `allowRoot` permits the empty-string root — set it only for listing.
|
|
8
|
+
* @throws Error when the path has a leading or trailing slash, a doubled slash, or a `.` / `..` segment.
|
|
9
|
+
*/
|
|
10
|
+
export declare function assertVolumePath(path: string, options?: {
|
|
11
|
+
allowRoot?: boolean;
|
|
12
|
+
}): string;
|
|
13
|
+
//# sourceMappingURL=source-set-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-set-path.d.ts","sourceRoot":"","sources":["../../src/lib/source-set-path.ts"],"names":[],"mappings":"AAOA,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAKzC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAwBxF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-set-path.spec.d.ts","sourceRoot":"","sources":["../../src/lib/source-set-path.spec.ts"],"names":[],"mappings":""}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export type * from './subagent';
|
|
|
7
7
|
export type * from './event-emitter';
|
|
8
8
|
export type * from './blob';
|
|
9
9
|
export type * from './sandbox-fs';
|
|
10
|
+
export type * from './source-set-fs';
|
|
10
11
|
export { HttpError, isHttpError } from './http-error';
|
|
11
12
|
export { ChannelBusyError, isChannelBusyError } from './channel-busy-error';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,UAAU,CAAC;AAC9B,mBAAmB,WAAW,CAAC;AAC/B,mBAAmB,gBAAgB,CAAC;AACpC,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,cAAc,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,UAAU,CAAC;AAC9B,mBAAmB,WAAW,CAAC;AAC/B,mBAAmB,gBAAgB,CAAC;AACpC,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,QAAQ,CAAC;AAC5B,mBAAmB,cAAc,CAAC;AAClC,mBAAmB,iBAAiB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the client needs. `sourceSetEndpoint` points at `…/volume` directly, mirroring how
|
|
3
|
+
* `botProviderEndpoint` is passed whole rather than assembled from parts.
|
|
4
|
+
*/
|
|
5
|
+
export interface SourceSetClientConfig {
|
|
6
|
+
/**
|
|
7
|
+
* The volume endpoint, e.g. `{EDGE}/ns/{ns}/source-set/{name}/volume` or a BFF relay such as
|
|
8
|
+
* `{PLATFORM_API}/v1/source-set/{id}/volume`. A trailing slash is tolerated.
|
|
9
|
+
*/
|
|
10
|
+
sourceSetEndpoint: string;
|
|
11
|
+
/**
|
|
12
|
+
* Sent as `X-API-KEY`. Omit when the endpoint is a BFF relay — the relay holds the volume key, and
|
|
13
|
+
* it should never reach the browser.
|
|
14
|
+
*/
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
/** Merged into every request, e.g. `{ Authorization: 'Bearer …' }` for a BFF relay. */
|
|
17
|
+
customHeaders?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/** One directory entry from `GET volume/list`. */
|
|
20
|
+
export interface SourceSetDirEntry {
|
|
21
|
+
/** Basename only — the backend sends no path prefix; absolute paths are the caller's to assemble. */
|
|
22
|
+
name: string;
|
|
23
|
+
isDir: boolean;
|
|
24
|
+
/** File size in bytes (0 for directories). */
|
|
25
|
+
sizeBytes: number;
|
|
26
|
+
/** Modification time, unix seconds. */
|
|
27
|
+
mtimeUnix: number;
|
|
28
|
+
/** Unix file mode (e.g. 420 = 0644). */
|
|
29
|
+
mode: number;
|
|
30
|
+
}
|
|
31
|
+
/** Pagination cursor returned alongside a listing. Real paging — there is no `truncated` here. */
|
|
32
|
+
export interface SourceSetPaging {
|
|
33
|
+
/** 0-based page index. */
|
|
34
|
+
index: number;
|
|
35
|
+
/** Entries per page. */
|
|
36
|
+
size: number;
|
|
37
|
+
/** Total entries in the directory across all pages. */
|
|
38
|
+
total: number;
|
|
39
|
+
}
|
|
40
|
+
/** Query options for `GET volume/list`. */
|
|
41
|
+
export interface SourceSetListOptions {
|
|
42
|
+
/** 0-based page index; defaults to 0 server-side. */
|
|
43
|
+
page?: number;
|
|
44
|
+
/** Entries per page. Clamped to the server maximum of 1000. */
|
|
45
|
+
pageSize?: number;
|
|
46
|
+
}
|
|
47
|
+
/** `GET volume/list` result. */
|
|
48
|
+
export interface SourceSetListResult {
|
|
49
|
+
entries: SourceSetDirEntry[];
|
|
50
|
+
/**
|
|
51
|
+
* `null` when the response carried no paging at either layer.
|
|
52
|
+
*
|
|
53
|
+
* Deliberately not synthesized from `entries.length`: a made-up total is indistinguishable from a
|
|
54
|
+
* real one, and {@link AsgardSourceSetClient.listAll} would read it as "that was the whole
|
|
55
|
+
* directory" — the silent truncation F-026 exists to prevent.
|
|
56
|
+
*/
|
|
57
|
+
paging: SourceSetPaging | null;
|
|
58
|
+
}
|
|
59
|
+
/** Options for the auto-paging walk (F-026). */
|
|
60
|
+
export interface SourceSetListAllOptions {
|
|
61
|
+
/** Per-request page size; clamped to the server maximum of 1000. */
|
|
62
|
+
pageSize?: number;
|
|
63
|
+
/** Stop after this many entries. Defaults to `SOURCE_SET_DEFAULT_MAX_ENTRIES`. */
|
|
64
|
+
maxEntries?: number;
|
|
65
|
+
}
|
|
66
|
+
/** Result of the auto-paging walk (F-026). */
|
|
67
|
+
export interface SourceSetListAllResult {
|
|
68
|
+
entries: SourceSetDirEntry[];
|
|
69
|
+
/**
|
|
70
|
+
* What the backend says the directory holds, or **0 when it never said**. Compare against
|
|
71
|
+
* `entries.length` for the shortfall; a 0 here with `complete: false` means the shortfall exists but
|
|
72
|
+
* its size is unknown.
|
|
73
|
+
*/
|
|
74
|
+
total: number;
|
|
75
|
+
/**
|
|
76
|
+
* False when `entries` is either known not to be the whole directory, or cannot be shown to be.
|
|
77
|
+
*
|
|
78
|
+
* Three things set it false, and the caller cannot tell them apart on purpose — all three mean the
|
|
79
|
+
* same thing to a user: the cap stopped the walk; the backend sent no paging and a full page, so
|
|
80
|
+
* "is there more?" is unanswerable; or a page came back indexed differently from the one requested,
|
|
81
|
+
* which makes every further page untrustworthy.
|
|
82
|
+
*/
|
|
83
|
+
complete: boolean;
|
|
84
|
+
}
|
|
85
|
+
/** Optional byte range for `GET volume/file`. */
|
|
86
|
+
export interface SourceSetReadOptions {
|
|
87
|
+
offsetBytes?: number;
|
|
88
|
+
limitBytes?: number;
|
|
89
|
+
}
|
|
90
|
+
/** `GET volume/file` result: raw bytes plus the `X-Total-Bytes` / `X-Truncated` headers. */
|
|
91
|
+
export interface SourceSetReadResult {
|
|
92
|
+
content: Blob;
|
|
93
|
+
/** Full file size in bytes (`X-Total-Bytes`), independent of any range limit. */
|
|
94
|
+
totalBytes: number;
|
|
95
|
+
/**
|
|
96
|
+
* `X-Truncated` — whether content remains **past** what was returned. Reading to EOF with only an
|
|
97
|
+
* offset is therefore not a truncation.
|
|
98
|
+
*/
|
|
99
|
+
truncated: boolean;
|
|
100
|
+
}
|
|
101
|
+
/** Options for `PUT volume/file`. */
|
|
102
|
+
export interface SourceSetWriteOptions {
|
|
103
|
+
/** Unix file mode in decimal (default 420 = 0644). */
|
|
104
|
+
mode?: number;
|
|
105
|
+
/** Fail with 409 instead of overwriting when the path already exists. */
|
|
106
|
+
createOnly?: boolean;
|
|
107
|
+
}
|
|
108
|
+
/** `PUT volume/file` result. */
|
|
109
|
+
export interface SourceSetWriteResult {
|
|
110
|
+
bytesWritten: number;
|
|
111
|
+
}
|
|
112
|
+
/** `GET volume/stat` result. A missing path is 200 with `exists: false`, not a 404. */
|
|
113
|
+
export interface SourceSetStatResult {
|
|
114
|
+
exists: boolean;
|
|
115
|
+
isDir: boolean;
|
|
116
|
+
sizeBytes: number;
|
|
117
|
+
mtimeUnix: number;
|
|
118
|
+
mode: number;
|
|
119
|
+
etag?: string;
|
|
120
|
+
}
|
|
121
|
+
/** Options for `POST volume/copy` and `POST volume/move`. */
|
|
122
|
+
export interface SourceSetCopyMoveOptions {
|
|
123
|
+
/** Replace an existing destination; without it an occupied destination is a 409. */
|
|
124
|
+
overwrite?: boolean;
|
|
125
|
+
}
|
|
126
|
+
/** `POST volume/copy` result. */
|
|
127
|
+
export interface SourceSetCopyResult {
|
|
128
|
+
bytesCopied: number;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=source-set-fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-set-fs.d.ts","sourceRoot":"","sources":["../../src/types/source-set-fs.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kGAAkG;AAClG,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;;OAMG;IACH,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CAChC;AAED,gDAAgD;AAChD,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,gCAAgC;AAChC,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,uFAAuF;AACvF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6DAA6D;AAC7D,MAAM,WAAW,wBAAwB;IACvC,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB"}
|