@m2k-5f/pgtx 2.6.0 → 2.6.2
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 +214 -480
- package/dist/batch.d.ts +3 -2
- package/dist/batch.d.ts.map +1 -1
- package/dist/batch.js +9 -9
- package/dist/clauses/abstract.clause.d.ts.map +1 -1
- package/dist/connection.d.ts +42 -175
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +205 -290
- package/dist/error.d.ts +5 -0
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/pool.d.ts +35 -192
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +70 -202
- package/dist/protocol/connection-response-reader.d.ts +3 -4
- package/dist/protocol/connection-response-reader.d.ts.map +1 -1
- package/dist/protocol/connection-response-reader.js +4 -2
- package/dist/protocol/socket-authorization.d.ts +1 -10
- package/dist/protocol/socket-authorization.d.ts.map +1 -1
- package/dist/protocol/socket-authorization.js +1 -4
- package/dist/protocol/socket-connector.d.ts +5 -5
- package/dist/protocol/socket-connector.d.ts.map +1 -1
- package/dist/protocol/socket-connector.js +24 -17
- package/dist/query.d.ts +17 -26
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +24 -27
- package/dist/transaction.d.ts +11 -4
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +24 -11
- package/dist/types.d.ts +59 -11
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/batch.d.ts
CHANGED
|
@@ -5,10 +5,11 @@ export declare class Batch {
|
|
|
5
5
|
private _queryQueue;
|
|
6
6
|
private _buffer;
|
|
7
7
|
constructor(buffer: ConnectionRequestWriter);
|
|
8
|
-
|
|
8
|
+
registerParse(query: PostgresQuery): void;
|
|
9
|
+
registerQuery(query: PostgresQuery): void;
|
|
9
10
|
end(): ConnectionRequestWriter;
|
|
10
11
|
get current(): PostgresQuery;
|
|
11
12
|
next(): void;
|
|
12
|
-
reject(cause: PostgresError):
|
|
13
|
+
reject(cause: PostgresError): number;
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=batch.d.ts.map
|
package/dist/batch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,qBAAa,KAAK;IACd,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,uBAAuB;IAM3C,aAAa,CAAC,KAAK,EAAE,aAAa;IAOlC,aAAa,CAAC,KAAK,EAAE,aAAa;IAQlC,GAAG;IAIH,IAAI,OAAO,kBAEV;IAED,IAAI;IAIJ,MAAM,CAAC,KAAK,EAAE,aAAa;CAS9B"}
|
package/dist/batch.js
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
import { ParseQuery } from "./query";
|
|
2
1
|
import { Queue } from "./queue";
|
|
3
2
|
export class Batch {
|
|
4
3
|
constructor(buffer) {
|
|
5
4
|
this._queryQueue = new Queue();
|
|
6
5
|
this._buffer = buffer;
|
|
7
6
|
}
|
|
8
|
-
|
|
7
|
+
registerParse(query) {
|
|
8
|
+
this._buffer
|
|
9
|
+
.writeParse(query.statement, query.text)
|
|
10
|
+
.writeDescribe(query.statement);
|
|
11
|
+
}
|
|
12
|
+
registerQuery(query) {
|
|
9
13
|
this._queryQueue.push(query);
|
|
10
|
-
query.startTimeout(timeout);
|
|
11
|
-
if (query instanceof ParseQuery) {
|
|
12
|
-
this._buffer
|
|
13
|
-
.writeParse(query.statement, query.text)
|
|
14
|
-
.writeDescribe(query.statement);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
14
|
this._buffer
|
|
18
15
|
.writeBind("", query.statement, query.args)
|
|
19
16
|
.writeExecute("");
|
|
@@ -28,8 +25,11 @@ export class Batch {
|
|
|
28
25
|
this._queryQueue.next();
|
|
29
26
|
}
|
|
30
27
|
reject(cause) {
|
|
28
|
+
let counter = 0;
|
|
31
29
|
while (this._queryQueue.hasMore) {
|
|
30
|
+
counter++;
|
|
32
31
|
this._queryQueue.shift.reject(cause);
|
|
33
32
|
}
|
|
33
|
+
return counter;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.clause.d.ts","sourceRoot":"","sources":["../../src/clauses/abstract.clause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"abstract.clause.d.ts","sourceRoot":"","sources":["../../src/clauses/abstract.clause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,8BAAsB,MAAM;IACxB,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAC5D"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,62 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ConnectionPartialConfig, Row } from "./types";
|
|
2
2
|
import { Transaction } from "./transaction";
|
|
3
3
|
import { Future } from 'fluent-future';
|
|
4
4
|
import { PostgresError } from "./error";
|
|
5
|
-
type LogLevel = "none" | "error" | "notice" | "query";
|
|
6
|
-
export type ConnectionParams = {
|
|
7
|
-
user: string;
|
|
8
|
-
password?: string;
|
|
9
|
-
host: string;
|
|
10
|
-
port: number;
|
|
11
|
-
database: string;
|
|
12
|
-
logLevel?: LogLevel;
|
|
13
|
-
int8toBigint?: boolean;
|
|
14
|
-
queryTimeout?: number;
|
|
15
|
-
batchCapacity?: number;
|
|
16
|
-
flushShedule?: "nextTick" | "Immediate";
|
|
17
|
-
};
|
|
18
|
-
export type StatementName = Branded<string, 'StatementName'>;
|
|
19
|
-
export type QueryText = Branded<string, 'QueryText'>;
|
|
20
|
-
export type ChannelName = Branded<string, "ChannelName">;
|
|
21
|
-
export type QueryMeta = {
|
|
22
|
-
statement: StatementName;
|
|
23
|
-
columns: ColumnDescription[];
|
|
24
|
-
};
|
|
25
5
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* Supports:
|
|
29
|
-
* - Tagged template queries with automatic parameter binding
|
|
30
|
-
* - Prepared statements with caching
|
|
31
|
-
* - Transaction management with savepoints
|
|
32
|
-
* - Pipeline execution for concurrent queries
|
|
6
|
+
* A dedicated connection to PostgreSQL: tagged-template queries, prepared
|
|
7
|
+
* statement caching, transactions with savepoints, and pipelined execution.
|
|
33
8
|
*
|
|
34
9
|
* @example
|
|
35
|
-
*
|
|
36
|
-
* const conn = await Connection.new({
|
|
37
|
-
* host: 'localhost',
|
|
38
|
-
* user: 'postgres',
|
|
39
|
-
* password: 'postgres',
|
|
40
|
-
* database: 'test'
|
|
41
|
-
* })
|
|
42
|
-
*
|
|
43
|
-
* // Simple query
|
|
10
|
+
* const conn = await Connection.new({ host: 'localhost', user: 'postgres', password: 'postgres', database: 'test' })
|
|
44
11
|
* const users = await conn.query`SELECT * FROM users WHERE id = ${1}`
|
|
45
|
-
*
|
|
46
|
-
* // Transaction
|
|
47
|
-
* await conn.begin(async tx => {
|
|
48
|
-
* await tx.query`INSERT INTO users ...`
|
|
49
|
-
* })
|
|
50
|
-
*
|
|
51
|
-
* // Close connection
|
|
12
|
+
* await conn.begin(async tx => tx.query`INSERT INTO users ...`)
|
|
52
13
|
* conn.close()
|
|
53
|
-
* ```
|
|
54
14
|
*/
|
|
55
15
|
export declare class Connection {
|
|
56
|
-
private readonly
|
|
16
|
+
private readonly config;
|
|
57
17
|
private _activeBatch;
|
|
58
|
-
private
|
|
59
|
-
private
|
|
18
|
+
private _closing;
|
|
19
|
+
private _closed;
|
|
20
|
+
private _reconnecting;
|
|
60
21
|
private _cachedBuffer;
|
|
61
22
|
private _socket;
|
|
62
23
|
private _batchQueue;
|
|
@@ -64,163 +25,69 @@ export declare class Connection {
|
|
|
64
25
|
private _parsing;
|
|
65
26
|
private _listeningCallbacks;
|
|
66
27
|
private _stmtCounter;
|
|
67
|
-
private _logLevel;
|
|
68
28
|
private _nextStatement;
|
|
69
29
|
private constructor();
|
|
70
30
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* @param params - Connection parameters
|
|
74
|
-
* @returns A new Connection instance
|
|
75
|
-
* @throws {PostgresError} If authentication fails or connection cannot be established
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* ```ts
|
|
79
|
-
* const conn = await Connection.new({
|
|
80
|
-
* host: 'localhost',
|
|
81
|
-
* port: 5432,
|
|
82
|
-
* user: 'postgres',
|
|
83
|
-
* password: 'secret',
|
|
84
|
-
* database: 'myapp'
|
|
85
|
-
* })
|
|
86
|
-
* ```
|
|
31
|
+
* Opens a new connection and authenticates.
|
|
32
|
+
* @throws {PostgresError} if authentication fails or the connection can't be established
|
|
87
33
|
*/
|
|
88
|
-
static new(
|
|
34
|
+
static new(config: ConnectionPartialConfig): Future<Connection, PostgresError>;
|
|
89
35
|
private _registerBatch;
|
|
90
36
|
private _sync;
|
|
91
37
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* Parameters are automatically bound to `$1, $2, ...` placeholders.
|
|
95
|
-
* Queries with parameters use prepared statements for performance.
|
|
96
|
-
*
|
|
97
|
-
* @param templates - Tagged template string with SQL
|
|
98
|
-
* @param args - Query parameters
|
|
99
|
-
* @returns Array of rows with proper typing
|
|
100
|
-
* @throws {Error} If connection is dead or query fails
|
|
38
|
+
* Runs a query, binding template values as `$1, $2, ...`.
|
|
39
|
+
* Parameterized queries are cached as prepared statements.
|
|
101
40
|
*
|
|
102
41
|
* @example
|
|
103
|
-
*
|
|
104
|
-
* // Simple query
|
|
105
|
-
* const users = await conn.query`SELECT * FROM users`
|
|
106
|
-
*
|
|
107
|
-
* // With parameters
|
|
108
|
-
* const user = await conn.query`SELECT * FROM users WHERE id = ${1}`
|
|
109
|
-
*
|
|
110
|
-
* // With typed result
|
|
111
|
-
* type User = { id: number, name: string }
|
|
112
|
-
* const users = await conn.query<User>`SELECT * FROM users`
|
|
113
|
-
* ```
|
|
42
|
+
* const users = await conn.query<User>`SELECT * FROM users WHERE id = ${1}`
|
|
114
43
|
*/
|
|
115
|
-
query<T extends
|
|
44
|
+
query<T extends Row>(templates: TemplateStringsArray, ...params: any[]): Future<T[], PostgresError>;
|
|
45
|
+
private _performQuery;
|
|
116
46
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* Automatically handles:
|
|
120
|
-
* - `BEGIN` before the callback
|
|
121
|
-
* - `COMMIT` on successful completion
|
|
122
|
-
* - `ROLLBACK` if an error is thrown
|
|
123
|
-
*
|
|
124
|
-
* @param txCallback - Async function that receives a `Transaction` instance
|
|
125
|
-
* @returns The value returned from the callback
|
|
126
|
-
* @throws {Error} If connection is dead or transaction fails
|
|
47
|
+
* Like {@link query}, but for statements that don't return rows (INSERT/UPDATE/DDL/etc).
|
|
127
48
|
*
|
|
128
49
|
* @example
|
|
129
|
-
*
|
|
130
|
-
* const result = await conn.begin(async tx => {
|
|
131
|
-
* await tx.query`INSERT INTO accounts (id, balance) VALUES (1, 100)`
|
|
132
|
-
* await tx.query`UPDATE accounts SET balance = balance - 10 WHERE id = 1`
|
|
133
|
-
* return { success: true }
|
|
134
|
-
* })
|
|
135
|
-
* ```
|
|
50
|
+
* await conn.execute`UPDATE users SET name = ${name} WHERE id = ${id}`
|
|
136
51
|
*/
|
|
137
|
-
|
|
52
|
+
execute(templates: TemplateStringsArray, ...params: any[]): Future<void, PostgresError>;
|
|
53
|
+
private _performExecute;
|
|
138
54
|
/**
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* @param channelName - The channel identifier
|
|
142
|
-
* @param payload - Optional string data (max 8000 bytes)
|
|
55
|
+
* Runs `txCallback` inside `BEGIN`/`COMMIT`, rolling back on error.
|
|
143
56
|
*
|
|
144
57
|
* @example
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*/
|
|
149
|
-
notify(channelName: string, payload?: string): Future<Record<string, any>[], PostgresError>;
|
|
150
|
-
/**
|
|
151
|
-
* Subscribes a callback to a channel. Sends `LISTEN` on the first subscription.
|
|
152
|
-
*
|
|
153
|
-
* @param channelName - The channel identifier
|
|
154
|
-
* @param callback - Function invoked when a notification arrives
|
|
155
|
-
*
|
|
156
|
-
* @example
|
|
157
|
-
* ```ts
|
|
158
|
-
* await conn.listen('events', data => console.log(data))
|
|
159
|
-
* ```
|
|
58
|
+
* await conn.begin(async tx => {
|
|
59
|
+
* await tx.query`UPDATE accounts SET balance = balance - 10 WHERE id = 1`
|
|
60
|
+
* })
|
|
160
61
|
*/
|
|
62
|
+
begin<T>(txCallback: (transaction: Transaction) => Promise<T>): Future<T, unknown>;
|
|
63
|
+
/** Sends a `pg_notify` message on `channelName` (payload ≤ 8000 bytes). */
|
|
64
|
+
notify(channelName: string, payload?: string): Future<void, PostgresError>;
|
|
65
|
+
/** Subscribes `callback` to `channelName`, issuing `LISTEN` on first subscription. */
|
|
161
66
|
listen(channelName: string, callback: (payload: string) => void): Future<void, PostgresError>;
|
|
162
|
-
/**
|
|
163
|
-
* Unsubscribes a callback. Sends `UNLISTEN` if no callbacks remain for the channel.
|
|
164
|
-
*
|
|
165
|
-
* @param channelName - The channel identifier
|
|
166
|
-
* @param callback - The registered callback to remove
|
|
167
|
-
*
|
|
168
|
-
* @example
|
|
169
|
-
* ```ts
|
|
170
|
-
* await conn.unlisten('events', callback)
|
|
171
|
-
* ```
|
|
172
|
-
*/
|
|
67
|
+
/** Unsubscribes `callback`, issuing `UNLISTEN` once no callbacks remain. */
|
|
173
68
|
unlisten(channelName: string, callback: (payload: string) => void): Future<void, PostgresError>;
|
|
174
69
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
* Data is streamed directly from the PostgreSQL binary network buffer into the Web Streams API
|
|
178
|
-
* (`ReadableStream`), bypassing any intermediate array allocation or row accumulation in the JS heap.
|
|
179
|
-
* This pattern provides a true Zero-Memory Footprint and is ideal for exporting massive tables
|
|
180
|
-
* or piping database payloads directly into HTTP responses (e.g., via `Bun.serve` or fetch `Response`).
|
|
181
|
-
*
|
|
182
|
-
* @template T The expected shape of a single row interface.
|
|
183
|
-
* @param {TemplateStringsArray} templates The SQL string parts from the tagged template literal.
|
|
184
|
-
* @param {...any} args The parameterized query arguments.
|
|
185
|
-
* @returns {ReadableStream<T>} Synchronously returns a native Web ReadableStream instance.
|
|
186
|
-
*
|
|
187
|
-
* @example
|
|
188
|
-
* // Streaming a giant table directly to an HTTP response (Bun.serve)
|
|
189
|
-
* const userStream = conn.stream<User>`SELECT id, name FROM users`;
|
|
190
|
-
* return new Response(userStream, { headers: { 'Content-Type': 'application/json' } });
|
|
70
|
+
* Streams query results as a `ReadableStream`, without buffering rows in memory.
|
|
71
|
+
* Ideal for large result sets or piping straight into an HTTP response.
|
|
191
72
|
*
|
|
192
73
|
* @example
|
|
193
|
-
*
|
|
194
|
-
* const stream = conn.stream<User>`SELECT * FROM orders WHERE status = ${'processed'}`;
|
|
195
|
-
* for await (const row of stream) {
|
|
196
|
-
* console.log(row.id, row.amount); // Row object is eligible for GC immediately after iteration
|
|
197
|
-
* }
|
|
74
|
+
* for await (const row of conn.stream<User>`SELECT * FROM orders`) { ... }
|
|
198
75
|
*/
|
|
199
|
-
stream<T extends
|
|
200
|
-
private
|
|
201
|
-
private _registerReconnect;
|
|
202
|
-
private _resetConnectionState;
|
|
76
|
+
stream<T extends Row>(templates: TemplateStringsArray, ...params: any[]): ReadableStream<T>;
|
|
77
|
+
private _performStream;
|
|
203
78
|
private _reconnect;
|
|
79
|
+
private _performReconnect;
|
|
204
80
|
private _restoreSubscriptions;
|
|
205
81
|
private _getCurrentQuery;
|
|
206
|
-
private _rejectAllBatches;
|
|
207
82
|
private _handlePacket;
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
* Returns `false` if the socket is destroyed or connection is dead.
|
|
211
|
-
*/
|
|
83
|
+
private get _hasQueries();
|
|
84
|
+
/** Whether the connection is alive and usable. */
|
|
212
85
|
get isOpened(): boolean;
|
|
86
|
+
/** Whether the connection is closed or closing. */
|
|
87
|
+
get isClosed(): boolean;
|
|
213
88
|
/**
|
|
214
|
-
* Closes the connection
|
|
215
|
-
* All pending queries will be rejected with an error.
|
|
216
|
-
* The connection cannot be used after this call.
|
|
217
|
-
*
|
|
218
|
-
* @example
|
|
219
|
-
* ```ts
|
|
220
|
-
* conn.close()
|
|
221
|
-
* ```
|
|
89
|
+
* Closes the connection, awaiting for all pending queries. Not usable afterward.
|
|
222
90
|
*/
|
|
223
|
-
close(): void
|
|
91
|
+
close(): Future<void, PostgresError>;
|
|
224
92
|
}
|
|
225
|
-
export {};
|
|
226
93
|
//# sourceMappingURL=connection.d.ts.map
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiC,uBAAuB,EAAmC,GAAG,EAAiB,MAAM,SAAS,CAAA;AACrI,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAK3C,OAAO,EAAS,MAAM,EAAM,MAAM,eAAe,CAAA;AACjD,OAAO,EAAkD,aAAa,EAAE,MAAM,SAAS,CAAA;AAavF;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAsD;IACtE,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,aAAa,CAAgC;IAErD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAsC;IAEtD,OAAO,CAAC,mBAAmB,CAAyD;IACpF,OAAO,CAAC,YAAY,CAAI;IAGxB,OAAO,CAAC,cAAc;IAKtB,OAAO;IAYP;;;OAGG;IACH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,uBAAuB;IAe1C,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,KAAK;IASb;;;;;;OAMG;IACH,KAAK,CAAC,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;IAStE,OAAO,CAAC,aAAa;IA4CrB;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;IASzD,OAAO,CAAC,eAAe;IAsCvB;;;;;;;OAOG;IACH,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC;IAoB7D,2EAA2E;IAC3E,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW;IAOhD,sFAAsF;IACtF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAe/D,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAoB/F;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;IAyBvE,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IA2HrB,OAAO,KAAK,WAAW,GAEtB;IAGD,kDAAkD;IAClD,IAAI,QAAQ,YAEX;IAGD,mDAAmD;IACnD,IAAI,QAAQ,YAEX;IAGD;;OAEG;IACH,KAAK;CAwBR"}
|