@dbos-inc/postgres-datasource 3.0.6-preview

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.
@@ -0,0 +1,14 @@
1
+ import postgres from 'postgres';
2
+ import { PGIsolationLevel as IsolationLevel, PGTransactionConfig as PostgresTransactionOptions, DBOSDataSource } from '@dbos-inc/dbos-sdk/datasource';
3
+ export { IsolationLevel, PostgresTransactionOptions };
4
+ export declare class PostgresDataSource implements DBOSDataSource<PostgresTransactionOptions> {
5
+ #private;
6
+ static get client(): postgres.TransactionSql<{}>;
7
+ static initializeInternalSchema(options?: postgres.Options<{}>): Promise<void>;
8
+ readonly name: string;
9
+ constructor(name: string, options?: postgres.Options<{}>);
10
+ runTransaction<T>(callback: () => Promise<T>, name: string, config?: PostgresTransactionOptions): Promise<T>;
11
+ registerTransaction<This, Args extends unknown[], Return>(func: (this: This, ...args: Args) => Promise<Return>, name: string, config?: PostgresTransactionOptions): (this: This, ...args: Args) => Promise<Return>;
12
+ transaction(config?: PostgresTransactionOptions): <This, Args extends unknown[], Return>(_target: object, propertyKey: string, descriptor: TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>) => TypedPropertyDescriptor<(this: This, ...args: Args) => Promise<Return>>;
13
+ }
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAEA,OAAO,QAAsB,MAAM,UAAU,CAAC;AAE9C,OAAO,EAQL,gBAAgB,IAAI,cAAc,EAClC,mBAAmB,IAAI,0BAA0B,EACjD,cAAc,EAEf,MAAM,+BAA+B,CAAC;AAIvC,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC;AA0JtD,qBAAa,kBAAmB,YAAW,cAAc,CAAC,0BAA0B,CAAC;;IAEnF,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAS/C;WAGY,wBAAwB,CAAC,OAAO,GAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAIV,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAM;IAMtD,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,0BAA0B;IAIrG,mBAAmB,CAAC,IAAI,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,EACtD,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,EACpD,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,0BAA0B,GAClC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC;IAIjD,WAAW,CAAC,MAAM,CAAC,EAAE,0BAA0B,mDAIlC,MAAM,eACF,MAAM,cACP,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,MAAM,CAAC,CAAC,oCAAxC,IAAI,WAAW,IAAI,KAAK,QAAQ,MAAM,CAAC;CAWvF"}
package/dist/index.js ADDED
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ // using https://github.com/porsager/postgres
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PostgresDataSource = exports.IsolationLevel = void 0;
8
+ const postgres_1 = __importDefault(require("postgres"));
9
+ const dbos_sdk_1 = require("@dbos-inc/dbos-sdk");
10
+ const datasource_1 = require("@dbos-inc/dbos-sdk/datasource");
11
+ Object.defineProperty(exports, "IsolationLevel", { enumerable: true, get: function () { return datasource_1.PGIsolationLevel; } });
12
+ const node_async_hooks_1 = require("node:async_hooks");
13
+ const superjson_1 = require("superjson");
14
+ const asyncLocalCtx = new node_async_hooks_1.AsyncLocalStorage();
15
+ class PostgresTransactionHandler {
16
+ name;
17
+ dsType = 'PostgresDataSource';
18
+ #db;
19
+ constructor(name,
20
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
21
+ options = {}) {
22
+ this.name = name;
23
+ this.#db = (0, postgres_1.default)(options);
24
+ }
25
+ initialize() {
26
+ return Promise.resolve();
27
+ }
28
+ destroy() {
29
+ return this.#db.end();
30
+ }
31
+ async #checkExecution(workflowID, functionNum) {
32
+ const result = await this.#db `
33
+ SELECT output, error FROM dbos.transaction_completion
34
+ WHERE workflow_id = ${workflowID} AND function_num = ${functionNum}`;
35
+ if (result.length === 0) {
36
+ return undefined;
37
+ }
38
+ const { output, error } = result[0];
39
+ return error !== null ? { error } : { output };
40
+ }
41
+ static async #recordOutput(
42
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
43
+ client, workflowID, functionNum, output) {
44
+ try {
45
+ await client /*sql*/ `
46
+ INSERT INTO dbos.transaction_completion (workflow_id, function_num, output)
47
+ VALUES (${workflowID}, ${functionNum}, ${output})`;
48
+ }
49
+ catch (error) {
50
+ if ((0, datasource_1.isPGKeyConflictError)(error)) {
51
+ throw new dbos_sdk_1.DBOSWorkflowConflictError(workflowID);
52
+ }
53
+ else {
54
+ throw error;
55
+ }
56
+ }
57
+ }
58
+ async #recordError(workflowID, functionNum, error) {
59
+ try {
60
+ await this.#db /*sql*/ `
61
+ INSERT INTO dbos.transaction_completion (workflow_id, function_num, error)
62
+ VALUES (${workflowID}, ${functionNum}, ${error})`;
63
+ }
64
+ catch (error) {
65
+ if ((0, datasource_1.isPGKeyConflictError)(error)) {
66
+ throw new dbos_sdk_1.DBOSWorkflowConflictError(workflowID);
67
+ }
68
+ else {
69
+ throw error;
70
+ }
71
+ }
72
+ }
73
+ async invokeTransactionFunction(config, target, func, ...args) {
74
+ const workflowID = dbos_sdk_1.DBOS.workflowID;
75
+ if (workflowID === undefined) {
76
+ throw new Error('Workflow ID is not set.');
77
+ }
78
+ const functionNum = dbos_sdk_1.DBOS.stepID;
79
+ if (functionNum === undefined) {
80
+ throw new Error('Function Number is not set.');
81
+ }
82
+ const isolationLevel = config?.isolationLevel ? `ISOLATION LEVEL ${config.isolationLevel}` : '';
83
+ const readOnly = config?.readOnly ?? false;
84
+ const accessMode = config?.readOnly === undefined ? '' : readOnly ? 'READ ONLY' : 'READ WRITE';
85
+ const saveResults = !readOnly && workflowID;
86
+ let retryWaitMS = 1;
87
+ const backoffFactor = 1.5;
88
+ const maxRetryWaitMS = 2000;
89
+ while (true) {
90
+ // Check to see if this tx has already been executed
91
+ const previousResult = saveResults ? await this.#checkExecution(workflowID, functionNum) : undefined;
92
+ if (previousResult) {
93
+ dbos_sdk_1.DBOS.span?.setAttribute('cached', true);
94
+ if ('error' in previousResult) {
95
+ throw superjson_1.SuperJSON.parse(previousResult.error);
96
+ }
97
+ return (previousResult.output ? superjson_1.SuperJSON.parse(previousResult.output) : null);
98
+ }
99
+ try {
100
+ const result = await this.#db.begin(`${isolationLevel} ${accessMode}`, async (client) => {
101
+ // execute user's transaction function
102
+ const result = await asyncLocalCtx.run({ client }, async () => {
103
+ return (await func.call(target, ...args));
104
+ });
105
+ // save the output of read/write transactions
106
+ if (saveResults) {
107
+ await PostgresTransactionHandler.#recordOutput(client, workflowID, functionNum, superjson_1.SuperJSON.stringify(result));
108
+ }
109
+ return result;
110
+ });
111
+ return result;
112
+ }
113
+ catch (error) {
114
+ if ((0, datasource_1.isPGRetriableTransactionError)(error)) {
115
+ // 400001 is a serialization failure in PostgreSQL
116
+ dbos_sdk_1.DBOS.span?.addEvent('TXN SERIALIZATION FAILURE', { retryWaitMillis: retryWaitMS }, performance.now());
117
+ await new Promise((resolve) => setTimeout(resolve, retryWaitMS));
118
+ retryWaitMS = Math.min(retryWaitMS * backoffFactor, maxRetryWaitMS);
119
+ continue;
120
+ }
121
+ else {
122
+ if (saveResults) {
123
+ const message = superjson_1.SuperJSON.stringify(error);
124
+ await this.#recordError(workflowID, functionNum, message);
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ class PostgresDataSource {
133
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
134
+ static get client() {
135
+ if (!dbos_sdk_1.DBOS.isInTransaction()) {
136
+ throw new Error('invalid use of PostgresDataSource.client outside of a DBOS transaction.');
137
+ }
138
+ const ctx = asyncLocalCtx.getStore();
139
+ if (!ctx) {
140
+ throw new Error('No async local context found.');
141
+ }
142
+ return ctx.client;
143
+ }
144
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
145
+ static async initializeInternalSchema(options = {}) {
146
+ const pg = (0, postgres_1.default)({ ...options, onnotice: () => { } });
147
+ try {
148
+ await pg.unsafe(datasource_1.createTransactionCompletionSchemaPG);
149
+ await pg.unsafe(datasource_1.createTransactionCompletionTablePG);
150
+ }
151
+ finally {
152
+ await pg.end();
153
+ }
154
+ }
155
+ name;
156
+ #provider;
157
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
158
+ constructor(name, options = {}) {
159
+ this.name = name;
160
+ this.#provider = new PostgresTransactionHandler(name, options);
161
+ (0, datasource_1.registerDataSource)(this.#provider);
162
+ }
163
+ async runTransaction(callback, name, config) {
164
+ return await (0, datasource_1.runTransaction)(callback, name, { dsName: this.name, config });
165
+ }
166
+ registerTransaction(func, name, config) {
167
+ return (0, datasource_1.registerTransaction)(this.name, func, { name }, config);
168
+ }
169
+ transaction(config) {
170
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
171
+ const ds = this;
172
+ return function decorator(_target, propertyKey, descriptor) {
173
+ if (!descriptor.value) {
174
+ throw Error('Use of decorator when original method is undefined');
175
+ }
176
+ descriptor.value = ds.registerTransaction(descriptor.value, propertyKey.toString(), config);
177
+ return descriptor;
178
+ };
179
+ }
180
+ }
181
+ exports.PostgresDataSource = PostgresDataSource;
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA,6CAA6C;;;;;;AAE7C,wDAA8C;AAC9C,iDAAqE;AACrE,8DAYuC;AAI9B,+FARa,6BAAc,OAQb;AAHvB,uDAAqD;AACrD,yCAAsC;AAStC,MAAM,aAAa,GAAG,IAAI,oCAAiB,EAA6B,CAAC;AAEzE,MAAM,0BAA0B;IAKnB;IAJF,MAAM,GAAG,oBAAoB,CAAC;IAC9B,GAAG,CAAM;IAElB,YACW,IAAY;IACrB,mEAAmE;IACnE,UAAgC,EAAE;QAFzB,SAAI,GAAJ,IAAI,CAAQ;QAIrB,IAAI,CAAC,GAAG,GAAG,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,UAAU;QACR,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,UAAkB,EAClB,WAAmB;QAGnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAkB;;4BAEvB,UAAU,uBAAuB,WAAW,EAAE,CAAC;QACvE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa;IACxB,mEAAmE;IACnE,MAAmC,EACnC,UAAkB,EAClB,WAAmB,EACnB,MAAqB;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,CAAA,OAAO,CAAC;;kBAER,UAAU,KAAK,WAAW,KAAK,MAAM,GAAG,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAA,iCAAoB,EAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,oCAAyB,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,WAAmB,EAAE,KAAa;QACvE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAA,OAAO,CAAC;;kBAEV,UAAU,KAAK,WAAW,KAAK,KAAK,GAAG,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAA,iCAAoB,EAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,oCAAyB,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,yBAAyB,CAC7B,MAA8C,EAC9C,MAAY,EACZ,IAAoD,EACpD,GAAG,IAAU;QAEb,MAAM,UAAU,GAAG,eAAI,CAAC,UAAU,CAAC;QACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,WAAW,GAAG,eAAI,CAAC,MAAM,CAAC;QAChC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,mBAAmB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAC/F,MAAM,WAAW,GAAG,CAAC,QAAQ,IAAI,UAAU,CAAC;QAE5C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,aAAa,GAAG,GAAG,CAAC;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC;QAE5B,OAAO,IAAI,EAAE,CAAC;YACZ,oDAAoD;YACpD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrG,IAAI,cAAc,EAAE,CAAC;gBACnB,eAAI,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAExC,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC;oBAC9B,MAAM,qBAAS,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC9C,CAAC;gBACD,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAS,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAW,CAAC;YAC3F,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAS,GAAG,cAAc,IAAI,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;oBAC9F,sCAAsC;oBACtC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;wBAC5D,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAW,CAAC;oBACtD,CAAC,CAAC,CAAC;oBAEH,6CAA6C;oBAC7C,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,0BAA0B,CAAC,aAAa,CAC5C,MAAM,EACN,UAAU,EACV,WAAW,EACX,qBAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAC5B,CAAC;oBACJ,CAAC;oBAED,OAAO,MAAM,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,OAAO,MAAgB,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,IAAA,0CAA6B,EAAC,KAAK,CAAC,EAAE,CAAC;oBACzC,kDAAkD;oBAClD,eAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,2BAA2B,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;oBACtG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;oBACjE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,aAAa,EAAE,cAAc,CAAC,CAAC;oBACpE,SAAS;gBACX,CAAC;qBAAM,CAAC;oBACN,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,OAAO,GAAG,qBAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;oBAC5D,CAAC;oBAED,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAa,kBAAkB;IAC7B,mEAAmE;IACnE,MAAM,KAAK,MAAM;QACf,IAAI,CAAC,eAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,mEAAmE;IACnE,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,UAAgC,EAAE;QACtE,MAAM,EAAE,GAAG,IAAA,kBAAQ,EAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,gDAAmC,CAAC,CAAC;YACrD,MAAM,EAAE,CAAC,MAAM,CAAC,+CAAkC,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAEQ,IAAI,CAAS;IACtB,SAAS,CAA6B;IAEtC,mEAAmE;IACnE,YAAY,IAAY,EAAE,UAAgC,EAAE;QAC1D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAA,+BAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,cAAc,CAAI,QAA0B,EAAE,IAAY,EAAE,MAAmC;QACnG,OAAO,MAAM,IAAA,2BAAc,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,mBAAmB,CACjB,IAAoD,EACpD,IAAY,EACZ,MAAmC;QAEnC,OAAO,IAAA,gCAAmB,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,WAAW,CAAC,MAAmC;QAC7C,4DAA4D;QAC5D,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,OAAO,SAAS,SAAS,CACvB,OAAe,EACf,WAAmB,EACnB,UAAmF;YAEnF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,CAAC;YAED,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;YAE5F,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC;CACF;AA/DD,gDA+DC"}