@notionhq/custom-blocks 0.1.33 → 0.1.35
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/dist/bridge/SandboxBridge.d.ts +3 -1
- package/dist/bridge/SandboxBridge.d.ts.map +1 -1
- package/dist/bridge/SandboxBridge.js +55 -47
- package/dist/bridge/dataSources/query.d.ts +27 -0
- package/dist/bridge/dataSources/query.d.ts.map +1 -0
- package/dist/bridge/dataSources/query.js +512 -0
- package/dist/bridge/hostState.d.ts +4 -3
- package/dist/bridge/hostState.d.ts.map +1 -1
- package/dist/bridge/hostState.js +7 -3
- package/dist/bridge/sandboxClient.d.ts +4 -2
- package/dist/bridge/sandboxClient.d.ts.map +1 -1
- package/dist/bridge/sandboxClient.js +10 -4
- package/dist/protocol/dataSources/propertySchema.d.ts +7 -0
- package/dist/protocol/dataSources/propertySchema.d.ts.map +1 -1
- package/dist/protocol/dataSources/propertySchema.js +17 -0
- package/dist/protocol/messages/queryDataSource.d.ts +970 -0
- package/dist/protocol/messages/queryDataSource.d.ts.map +1 -1
- package/dist/protocol/messages/queryDataSource.js +108 -0
- package/dist/protocol/messages/queryDataSourceResult.d.ts +1 -1
- package/dist/protocol/messages/queryDataSourceResult.d.ts.map +1 -1
- package/dist/protocol/messages/sandboxToHost.d.ts +353 -0
- package/dist/protocol/messages/sandboxToHost.d.ts.map +1 -1
- package/dist/react/useDataSource.d.ts +1 -1
- package/dist/react/useDataSource.d.ts.map +1 -1
- package/dist/react/useDataSource.js +11 -6
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/docs/data-sources.md +51 -3
- package/package.json +1 -1
- package/src/bridge/SandboxBridge.ts +66 -57
- package/src/bridge/dataSources/query.ts +694 -0
- package/src/bridge/hostState.ts +11 -3
- package/src/bridge/sandboxClient.ts +20 -4
- package/src/react/useDataSource.ts +17 -6
- package/src/types.ts +55 -0
|
@@ -65,8 +65,10 @@ export declare class SandboxBridge {
|
|
|
65
65
|
* iframe covered throughout this frame, so it can apply the measured height before first paint.
|
|
66
66
|
*/
|
|
67
67
|
private scheduleInitResult;
|
|
68
|
-
|
|
68
|
+
createDataSourceSubscriptionId(): string;
|
|
69
|
+
queryDataSource(subscriptionId: string, key: string, options?: UseDataSourceOptions): void;
|
|
69
70
|
private setDataSourceQueryError;
|
|
71
|
+
releaseDataSourceSubscription(subscriptionId: string): void;
|
|
70
72
|
postResize(height: number): void;
|
|
71
73
|
createPage(args: CreatePageArgs): Promise<CreatePageResult>;
|
|
72
74
|
getPage(pageId: NotionPageId): Promise<GetPageResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SandboxBridge.d.ts","sourceRoot":"","sources":["../../../../home/runner/work/custom-blocks/custom-blocks/sdk/src/bridge/SandboxBridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,gBAAgB,EAEhB,MAAM,4DAA4D,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAW3E,OAAO,EAEN,KAAK,WAAW,EAEhB,MAAM,mDAAmD,CAAA;AAc1D,OAAO,KAAK,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"SandboxBridge.d.ts","sourceRoot":"","sources":["../../../../home/runner/work/custom-blocks/custom-blocks/sdk/src/bridge/SandboxBridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,gBAAgB,EAEhB,MAAM,4DAA4D,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAW3E,OAAO,EAEN,KAAK,WAAW,EAEhB,MAAM,mDAAmD,CAAA;AAc1D,OAAO,KAAK,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,aAAa,CAAA;AAUpB,OAAO,EACN,KAAK,oBAAoB,EAGzB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAG3D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,UAAU,CAAA;IAC9B,IAAI,EAAE,OAAO,CAAA;CACb,CAAA;AAID,qBAAa,aAAa;IACzB,OAAO,CAAC,SAAS,CAIhB;IACD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,mBAAmB,CAAwB;IACnD,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEjC;IACD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE9B;IACD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE9B;IACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAEhC;IACD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEjC;IACD,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,uBAAuB,CAAgB;IAC/C,OAAO,CAAC,wBAAwB,CAA+B;IAC/D,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAK3B;IAED,cAAc;IAQd,OAAO,CAAC,MAAM,CAAC,eAAe,CAAM;IAEpC,OAAO,CAAC,UAAU;IAclB,aAAa,IAAI,SAAS,eAAe,EAAE;IAI3C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI;IAK1C,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9C,WAAW,CAAC,cAAc,EAAE,kBAAkB;IAkC9C,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,MAAM,CAIb;IAED,OAAO,CAAC,aAAa,CAgRpB;IAED,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI;IAK9B,YAAY,IAAI,oBAAoB;IAIpC;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,WAAW;IAKjC,sBAAsB;IAmBtB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,SAAS;IAkEjB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyB1B,8BAA8B,IAAI,MAAM;IAIxC,eAAe,CACd,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB;IAgFnC,OAAO,CAAC,uBAAuB;IAwB/B,6BAA6B,CAAC,cAAc,EAAE,MAAM;IAepD,UAAU,CAAC,MAAM,EAAE,MAAM;IAazB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8B3D,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAYrD,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAYrD,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IAa7D,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2C3D;;;;OAIG;IACH,oBAAoB,CAAC,IAAI,EAAE;QAC1B,UAAU,EAAE,gBAAgB,CAAA;QAC5B,MAAM,EAAE,YAAY,CAAA;QACpB,cAAc,EAAE,8BAA8B,CAAA;KAC9C,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuB7B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;CAkE/B"}
|
|
@@ -7,6 +7,7 @@ import * as v from "valibot";
|
|
|
7
7
|
import { unreachable } from "../utils.js";
|
|
8
8
|
import { CUSTOM_BLOCKS_SDK_VERSION } from "../version.js";
|
|
9
9
|
import { NOTION_DARK_BACKGROUND_BASE, NOTION_LIGHT_BACKGROUND_BASE, } from "./appearance.js";
|
|
10
|
+
import { resolveDataSourceQuery } from "./dataSources/query.js";
|
|
10
11
|
import { resolveDataSources } from "./dataSources/resolve.js";
|
|
11
12
|
import { resolvePropertyWriteMapForDataSource } from "./dataSources/resolveProperty.js";
|
|
12
13
|
import { createEmptyDataSourceQueryState, } from "./hostState.js";
|
|
@@ -169,12 +170,12 @@ export class SandboxBridge {
|
|
|
169
170
|
nextBindings,
|
|
170
171
|
});
|
|
171
172
|
this.latestDataSourceBindings = nextBindings;
|
|
172
|
-
// Drop cached query state for
|
|
173
|
+
// Drop cached query state for subscriptions whose key no longer exists.
|
|
173
174
|
const nextKeys = new Set(dataSources.map(s => s.key));
|
|
174
175
|
const prunedState = {};
|
|
175
|
-
for (const [
|
|
176
|
-
if (nextKeys.has(
|
|
177
|
-
prunedState[
|
|
176
|
+
for (const [subscriptionId, state] of Object.entries(hostState.dataSourceState)) {
|
|
177
|
+
if (nextKeys.has(state.dataSourceKey)) {
|
|
178
|
+
prunedState[subscriptionId] = state;
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
this.hostState = {
|
|
@@ -231,11 +232,10 @@ export class SandboxBridge {
|
|
|
231
232
|
return;
|
|
232
233
|
}
|
|
233
234
|
case "queryDataSourceResult": {
|
|
234
|
-
const
|
|
235
|
-
if (
|
|
235
|
+
const currentState = hostState.dataSourceState[message.subscriptionId];
|
|
236
|
+
if (currentState === undefined) {
|
|
236
237
|
return;
|
|
237
238
|
}
|
|
238
|
-
const [key, currentState] = queryEntry;
|
|
239
239
|
const queryResult = message.status === "error"
|
|
240
240
|
? {
|
|
241
241
|
items: [],
|
|
@@ -251,13 +251,14 @@ export class SandboxBridge {
|
|
|
251
251
|
...hostState,
|
|
252
252
|
dataSourceState: {
|
|
253
253
|
...hostState.dataSourceState,
|
|
254
|
-
[
|
|
254
|
+
[message.subscriptionId]: {
|
|
255
|
+
dataSourceKey: currentState.dataSourceKey,
|
|
255
256
|
items: queryResult.items,
|
|
256
257
|
isLoading: false,
|
|
257
258
|
hasMore: queryResult.hasMore,
|
|
258
259
|
error: queryResult.error,
|
|
259
|
-
subscriptionId: message.subscriptionId,
|
|
260
260
|
latestLimit: currentState.latestLimit,
|
|
261
|
+
latestQueryIdentity: currentState.latestQueryIdentity,
|
|
261
262
|
},
|
|
262
263
|
},
|
|
263
264
|
};
|
|
@@ -512,14 +513,20 @@ export class SandboxBridge {
|
|
|
512
513
|
requestAnimationFrame(acknowledge);
|
|
513
514
|
}
|
|
514
515
|
}
|
|
515
|
-
|
|
516
|
+
createDataSourceSubscriptionId() {
|
|
517
|
+
return `data-source:${globalThis.crypto.randomUUID()}`;
|
|
518
|
+
}
|
|
519
|
+
queryDataSource(subscriptionId, key, options = {}) {
|
|
516
520
|
if (this.hostState.status !== "initialized") {
|
|
517
521
|
return;
|
|
518
522
|
}
|
|
519
523
|
const dataSource = this.hostState.dataSources.find(entry => entry.key === key);
|
|
520
|
-
const
|
|
524
|
+
const subscriptionState = this.hostState.dataSourceState[subscriptionId];
|
|
525
|
+
const currentState = subscriptionState?.dataSourceKey === key
|
|
526
|
+
? subscriptionState
|
|
527
|
+
: createEmptyDataSourceQueryState(key);
|
|
521
528
|
if (dataSource === undefined) {
|
|
522
|
-
this.setDataSourceQueryError(
|
|
529
|
+
this.setDataSourceQueryError(subscriptionId, currentState, {
|
|
523
530
|
code: "unknown_data_source_key",
|
|
524
531
|
message: `Unknown data source key "${key}". Known keys: [${this.hostState.dataSources.map(entry => entry.key).join(", ")}].`,
|
|
525
532
|
isRetryable: false,
|
|
@@ -527,32 +534,42 @@ export class SandboxBridge {
|
|
|
527
534
|
return;
|
|
528
535
|
}
|
|
529
536
|
if (dataSource.collectionPointer === undefined) {
|
|
530
|
-
this.setDataSourceQueryError(
|
|
537
|
+
this.setDataSourceQueryError(subscriptionId, currentState, {
|
|
531
538
|
code: "unmapped_data_source",
|
|
532
539
|
message: `Data source "${key}" has not been mapped to a database yet.`,
|
|
533
540
|
isRetryable: false,
|
|
534
541
|
});
|
|
535
542
|
return;
|
|
536
543
|
}
|
|
537
|
-
const
|
|
538
|
-
|
|
544
|
+
const resolvedQuery = resolveDataSourceQuery({
|
|
545
|
+
dataSources: this.hostState.dataSources,
|
|
539
546
|
key,
|
|
547
|
+
options,
|
|
540
548
|
});
|
|
549
|
+
if (resolvedQuery.status === "error") {
|
|
550
|
+
this.setDataSourceQueryError(subscriptionId, currentState, {
|
|
551
|
+
code: "invalid_data_source_query",
|
|
552
|
+
message: resolvedQuery.error,
|
|
553
|
+
isRetryable: false,
|
|
554
|
+
});
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
const query = resolvedQuery.query;
|
|
541
558
|
if (currentState.isLoading &&
|
|
542
|
-
currentState.
|
|
543
|
-
currentState.latestLimit === limit) {
|
|
559
|
+
currentState.latestQueryIdentity === query.identity) {
|
|
544
560
|
return;
|
|
545
561
|
}
|
|
546
562
|
this.hostState = {
|
|
547
563
|
...this.hostState,
|
|
548
564
|
dataSourceState: {
|
|
549
565
|
...this.hostState.dataSourceState,
|
|
550
|
-
[
|
|
566
|
+
[subscriptionId]: {
|
|
551
567
|
...currentState,
|
|
568
|
+
dataSourceKey: key,
|
|
552
569
|
isLoading: true,
|
|
553
570
|
error: undefined,
|
|
554
|
-
|
|
555
|
-
|
|
571
|
+
latestLimit: query.limit,
|
|
572
|
+
latestQueryIdentity: query.identity,
|
|
556
573
|
},
|
|
557
574
|
},
|
|
558
575
|
};
|
|
@@ -560,12 +577,14 @@ export class SandboxBridge {
|
|
|
560
577
|
const outbound = {
|
|
561
578
|
type: "queryDataSource",
|
|
562
579
|
subscriptionId,
|
|
563
|
-
dataSourceId:
|
|
564
|
-
limit,
|
|
580
|
+
dataSourceId: query.dataSourceId,
|
|
581
|
+
limit: query.limit,
|
|
582
|
+
...(query.filter !== undefined ? { filter: query.filter } : {}),
|
|
583
|
+
...(query.sorts !== undefined ? { sorts: query.sorts } : {}),
|
|
565
584
|
};
|
|
566
585
|
this.postToHost(outbound);
|
|
567
586
|
}
|
|
568
|
-
setDataSourceQueryError(
|
|
587
|
+
setDataSourceQueryError(subscriptionId, currentState, error) {
|
|
569
588
|
if (this.hostState.status !== "initialized") {
|
|
570
589
|
return;
|
|
571
590
|
}
|
|
@@ -573,17 +592,28 @@ export class SandboxBridge {
|
|
|
573
592
|
...this.hostState,
|
|
574
593
|
dataSourceState: {
|
|
575
594
|
...this.hostState.dataSourceState,
|
|
576
|
-
[
|
|
595
|
+
[subscriptionId]: {
|
|
577
596
|
...currentState,
|
|
578
597
|
isLoading: false,
|
|
579
598
|
error,
|
|
580
|
-
subscriptionId: undefined,
|
|
581
599
|
latestLimit: undefined,
|
|
600
|
+
latestQueryIdentity: undefined,
|
|
582
601
|
},
|
|
583
602
|
},
|
|
584
603
|
};
|
|
585
604
|
this.notify();
|
|
586
605
|
}
|
|
606
|
+
releaseDataSourceSubscription(subscriptionId) {
|
|
607
|
+
if (this.hostState.status !== "initialized" ||
|
|
608
|
+
this.hostState.dataSourceState[subscriptionId] === undefined) {
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
const { [subscriptionId]: _, ...dataSourceState } = this.hostState.dataSourceState;
|
|
612
|
+
this.hostState = {
|
|
613
|
+
...this.hostState,
|
|
614
|
+
dataSourceState,
|
|
615
|
+
};
|
|
616
|
+
}
|
|
587
617
|
postResize(height) {
|
|
588
618
|
if (typeof window === "undefined") {
|
|
589
619
|
return;
|
|
@@ -833,28 +863,6 @@ function reuseDataSourcesForUnchangedBindings(args) {
|
|
|
833
863
|
return dataSource;
|
|
834
864
|
});
|
|
835
865
|
}
|
|
836
|
-
// The default number of items to return in a live snapshot response if no limit is provided.
|
|
837
|
-
const DEFAULT_DATA_SOURCE_QUERY_LIMIT = 20;
|
|
838
|
-
// The maximum number of items to return in a single live snapshot response.
|
|
839
|
-
const MAX_DATA_SOURCE_QUERY_LIMIT = 999;
|
|
840
|
-
function resolveDataSourceQueryLimit(limit) {
|
|
841
|
-
if (limit === undefined) {
|
|
842
|
-
return DEFAULT_DATA_SOURCE_QUERY_LIMIT;
|
|
843
|
-
}
|
|
844
|
-
if (!Number.isFinite(limit) || !Number.isInteger(limit) || limit < 1) {
|
|
845
|
-
console.warn(`[custom-blocks-sdk] useDataSource limit must be a positive integer; using ${DEFAULT_DATA_SOURCE_QUERY_LIMIT}.`);
|
|
846
|
-
return DEFAULT_DATA_SOURCE_QUERY_LIMIT;
|
|
847
|
-
}
|
|
848
|
-
if (limit > MAX_DATA_SOURCE_QUERY_LIMIT) {
|
|
849
|
-
console.warn(`[custom-blocks-sdk] useDataSource limit is capped at ${MAX_DATA_SOURCE_QUERY_LIMIT}.`);
|
|
850
|
-
return MAX_DATA_SOURCE_QUERY_LIMIT;
|
|
851
|
-
}
|
|
852
|
-
return limit;
|
|
853
|
-
}
|
|
854
|
-
function makeDataSourceSubscriptionId(args) {
|
|
855
|
-
const { key } = args;
|
|
856
|
-
return `data-source:${encodeURIComponent(key)}`;
|
|
857
|
-
}
|
|
858
866
|
function invalidInitPayloadError(issues) {
|
|
859
867
|
return {
|
|
860
868
|
code: "invalid_init_payload",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { NotionDataSource } from "../../protocol/dataSources/dataSource.js";
|
|
2
|
+
import type { NotionDataSourceId } from "../../protocol/ids.js";
|
|
3
|
+
import { type ResolvedCustomBlockDataSourceFilter, type ResolvedCustomBlockDataSourceSort } from "../../protocol/messages/queryDataSource.js";
|
|
4
|
+
import type { UseDataSourceOptions } from "../../types.js";
|
|
5
|
+
export type ResolvedDataSourceQuery = {
|
|
6
|
+
dataSourceId: NotionDataSourceId;
|
|
7
|
+
limit: number;
|
|
8
|
+
filter?: ResolvedCustomBlockDataSourceFilter;
|
|
9
|
+
sorts?: ResolvedCustomBlockDataSourceSort[];
|
|
10
|
+
identity: string;
|
|
11
|
+
};
|
|
12
|
+
export type ResolveDataSourceQueryResult = {
|
|
13
|
+
status: "error";
|
|
14
|
+
error: string;
|
|
15
|
+
} | {
|
|
16
|
+
status: "ok";
|
|
17
|
+
dataSource: NotionDataSource;
|
|
18
|
+
query: ResolvedDataSourceQuery;
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveDataSourceQuery(args: {
|
|
21
|
+
dataSources: NotionDataSource[];
|
|
22
|
+
key: string;
|
|
23
|
+
options?: unknown;
|
|
24
|
+
warn?: (message: string) => void;
|
|
25
|
+
}): ResolveDataSourceQueryResult;
|
|
26
|
+
export declare function getDataSourceQueryOptionsIdentity(options: UseDataSourceOptions | undefined): string;
|
|
27
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../home/runner/work/custom-blocks/custom-blocks/sdk/src/bridge/dataSources/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4DAA4D,CAAA;AAElG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAQN,KAAK,mCAAmC,EAExC,KAAK,iCAAiC,EACtC,MAAM,8DAA8D,CAAA;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAU1D,MAAM,MAAM,uBAAuB,GAAG;IACrC,YAAY,EAAE,kBAAkB,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,mCAAmC,CAAA;IAC5C,KAAK,CAAC,EAAE,iCAAiC,EAAE,CAAA;IAC3C,QAAQ,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,4BAA4B,GACrC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IACA,MAAM,EAAE,IAAI,CAAA;IACZ,UAAU,EAAE,gBAAgB,CAAA;IAC5B,KAAK,EAAE,uBAAuB,CAAA;CAC7B,CAAA;AAYJ,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC5C,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC,GAAG,4BAA4B,CAmD/B;AAiFD,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,oBAAoB,GAAG,SAAS,GACvC,MAAM,CAMR"}
|