jazz-tools 0.18.23 → 0.18.25
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/.svelte-kit/__package__/Provider.svelte +2 -0
- package/.svelte-kit/__package__/Provider.svelte.d.ts.map +1 -1
- package/.turbo/turbo-build.log +65 -65
- package/CHANGELOG.md +25 -0
- package/dist/browser/index.js +9 -9
- package/dist/browser/index.js.map +1 -1
- package/dist/{chunk-D5L6ES2M.js → chunk-DOCEAUVD.js} +72 -35
- package/dist/chunk-DOCEAUVD.js.map +1 -0
- package/dist/{chunk-BOMSRY5H.js → chunk-M2HGBOXS.js} +2 -2
- package/dist/chunk-M2HGBOXS.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/inspector/{custom-element-XDJT5T57.js → custom-element-A7UAELEG.js} +3 -1
- package/dist/inspector/{custom-element-XDJT5T57.js.map → custom-element-A7UAELEG.js.map} +1 -1
- package/dist/inspector/index.js +2 -0
- package/dist/inspector/index.js.map +1 -1
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/inspector/viewer/use-open-inspector.d.ts.map +1 -1
- package/dist/inspector/viewer/use-page-path.d.ts.map +1 -1
- package/dist/react/hooks.d.ts +1 -1
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +17 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts +2 -1
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/ssr.js +1 -1
- package/dist/react/ssr.js.map +1 -1
- package/dist/react-core/hooks.d.ts +13 -0
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.d.ts +2 -0
- package/dist/react-core/index.d.ts.map +1 -1
- package/dist/react-core/index.js +104 -0
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/subscription-provider.d.ts +27 -0
- package/dist/react-core/subscription-provider.d.ts.map +1 -0
- package/dist/react-core/tests/subscription.bench.d.ts +2 -0
- package/dist/react-core/tests/subscription.bench.d.ts.map +1 -0
- package/dist/react-core/tests/useSubscriptionSelector.test.d.ts +2 -0
- package/dist/react-core/tests/useSubscriptionSelector.test.d.ts.map +1 -0
- package/dist/react-core/types.d.ts +10 -0
- package/dist/react-core/types.d.ts.map +1 -0
- package/dist/react-native-core/hooks.d.ts +1 -1
- package/dist/react-native-core/hooks.d.ts.map +1 -1
- package/dist/react-native-core/index.d.ts +1 -0
- package/dist/react-native-core/index.d.ts.map +1 -1
- package/dist/react-native-core/index.js +25 -12
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/provider.d.ts +2 -1
- package/dist/react-native-core/provider.d.ts.map +1 -1
- package/dist/svelte/Provider.svelte +2 -0
- package/dist/svelte/Provider.svelte.d.ts.map +1 -1
- package/dist/testing.js +4 -4
- package/dist/testing.js.map +1 -1
- package/dist/tools/auth/AuthSecretStorage.d.ts +3 -1
- package/dist/tools/auth/AuthSecretStorage.d.ts.map +1 -1
- package/dist/tools/coValues/account.d.ts +3 -3
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/group.d.ts +20 -1
- package/dist/tools/coValues/group.d.ts.map +1 -1
- package/dist/tools/coValues/interfaces.d.ts.map +1 -1
- package/dist/tools/implementation/ContextManager.d.ts +1 -0
- package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
- package/dist/tools/implementation/createContext.d.ts +7 -7
- package/dist/tools/implementation/createContext.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +3 -8
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts +5 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
- package/dist/tools/ssr.js +1 -1
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/worker/index.js +3 -3
- package/dist/worker/index.js.map +1 -1
- package/package.json +5 -4
- package/src/better-auth/database-adapter/tests/sync-utils.ts +1 -1
- package/src/browser/createBrowserContext.ts +9 -9
- package/src/browser/tests/utils.ts +2 -2
- package/src/inspector/viewer/use-open-inspector.ts +1 -0
- package/src/inspector/viewer/use-page-path.ts +1 -0
- package/src/react/hooks.tsx +3 -0
- package/src/react/index.ts +9 -0
- package/src/react/provider.tsx +3 -0
- package/src/react-core/hooks.ts +37 -5
- package/src/react-core/index.ts +2 -0
- package/src/react-core/subscription-provider.tsx +144 -0
- package/src/react-core/tests/subscription.bench.tsx +319 -0
- package/src/react-core/tests/useSubscriptionSelector.test.ts +250 -0
- package/src/react-core/types.ts +19 -0
- package/src/react-native-core/hooks.tsx +3 -0
- package/src/react-native-core/index.ts +6 -0
- package/src/react-native-core/platform.ts +9 -9
- package/src/react-native-core/provider.tsx +3 -1
- package/src/svelte/Provider.svelte +2 -0
- package/src/tools/auth/AuthSecretStorage.ts +16 -9
- package/src/tools/coValues/account.ts +5 -5
- package/src/tools/coValues/group.ts +33 -0
- package/src/tools/coValues/interfaces.ts +4 -1
- package/src/tools/implementation/ContextManager.ts +7 -3
- package/src/tools/implementation/createContext.ts +12 -12
- package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +5 -5
- package/src/tools/implementation/zodSchema/schemaTypes/GroupSchema.ts +7 -1
- package/src/tools/ssr/ssr.ts +1 -1
- package/src/tools/testing.ts +3 -3
- package/src/tools/tests/AuthSecretStorage.test.ts +59 -1
- package/src/tools/tests/ContextManager.test.ts +11 -1
- package/src/tools/tests/account.test.ts +16 -0
- package/src/tools/tests/coPlainText.test.ts +2 -2
- package/src/tools/tests/createContext.test.ts +19 -19
- package/src/tools/tests/deepLoading.test.ts +2 -2
- package/src/tools/tests/group.test.ts +59 -0
- package/src/tools/tests/inbox.test.ts +2 -2
- package/src/tools/tests/utils.ts +3 -3
- package/src/worker/index.ts +3 -3
- package/dist/chunk-BOMSRY5H.js.map +0 -1
- package/dist/chunk-D5L6ES2M.js.map +0 -1
@@ -51,7 +51,7 @@ describe("createContext methods", () => {
|
|
51
51
|
|
52
52
|
const context = await createJazzContextFromExistingCredentials({
|
53
53
|
credentials,
|
54
|
-
|
54
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
55
55
|
crypto: Crypto,
|
56
56
|
sessionProvider: randomSessionProvider,
|
57
57
|
asActiveAccount: true,
|
@@ -83,7 +83,7 @@ describe("createContext methods", () => {
|
|
83
83
|
|
84
84
|
const context = await createJazzContextFromExistingCredentials({
|
85
85
|
credentials,
|
86
|
-
|
86
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
87
87
|
crypto: Crypto,
|
88
88
|
AccountSchema: CustomAccount,
|
89
89
|
sessionProvider: randomSessionProvider,
|
@@ -107,7 +107,7 @@ describe("createContext methods", () => {
|
|
107
107
|
accountID: account.$jazz.id,
|
108
108
|
secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
|
109
109
|
},
|
110
|
-
|
110
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
111
111
|
crypto: Crypto,
|
112
112
|
sessionProvider: randomSessionProvider,
|
113
113
|
onLogOut,
|
@@ -131,7 +131,7 @@ describe("createContext methods", () => {
|
|
131
131
|
accountID: account.$jazz.id,
|
132
132
|
secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
|
133
133
|
},
|
134
|
-
|
134
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
135
135
|
crypto: Crypto,
|
136
136
|
sessionProvider: randomSessionProvider,
|
137
137
|
asActiveAccount: true,
|
@@ -152,7 +152,7 @@ describe("createContext methods", () => {
|
|
152
152
|
accountID: account.$jazz.id,
|
153
153
|
secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
|
154
154
|
},
|
155
|
-
|
155
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
156
156
|
crypto: Crypto,
|
157
157
|
sessionProvider: randomSessionProvider,
|
158
158
|
asActiveAccount: true,
|
@@ -171,7 +171,7 @@ describe("createContext methods", () => {
|
|
171
171
|
accountID: account.$jazz.id,
|
172
172
|
secret: account.$jazz.localNode.getCurrentAgent().agentSecret,
|
173
173
|
},
|
174
|
-
|
174
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
175
175
|
crypto: Crypto,
|
176
176
|
sessionProvider: randomSessionProvider,
|
177
177
|
asActiveAccount: false,
|
@@ -185,7 +185,7 @@ describe("createContext methods", () => {
|
|
185
185
|
test("creates new account with provided props", async () => {
|
186
186
|
const context = await createJazzContextForNewAccount({
|
187
187
|
creationProps: { name: "New User" },
|
188
|
-
|
188
|
+
peers: [],
|
189
189
|
crypto: Crypto,
|
190
190
|
});
|
191
191
|
|
@@ -199,7 +199,7 @@ describe("createContext methods", () => {
|
|
199
199
|
const context = await createJazzContextForNewAccount({
|
200
200
|
creationProps: { name: "New User" },
|
201
201
|
initialAgentSecret: initialSecret,
|
202
|
-
|
202
|
+
peers: [],
|
203
203
|
crypto: Crypto,
|
204
204
|
});
|
205
205
|
|
@@ -216,7 +216,7 @@ describe("createContext methods", () => {
|
|
216
216
|
|
217
217
|
const context = await createJazzContextForNewAccount({
|
218
218
|
creationProps: { name: "New User" },
|
219
|
-
|
219
|
+
peers: [],
|
220
220
|
crypto: Crypto,
|
221
221
|
AccountSchema: CustomAccount,
|
222
222
|
});
|
@@ -229,7 +229,7 @@ describe("createContext methods", () => {
|
|
229
229
|
test("sets the active account to the new account", async () => {
|
230
230
|
const context = await createJazzContextForNewAccount({
|
231
231
|
creationProps: { name: "New User" },
|
232
|
-
|
232
|
+
peers: [],
|
233
233
|
crypto: Crypto,
|
234
234
|
});
|
235
235
|
expect(activeAccountContext.get()).toBe(context.account);
|
@@ -239,7 +239,7 @@ describe("createContext methods", () => {
|
|
239
239
|
describe("createAnonymousJazzContext", () => {
|
240
240
|
test("creates anonymous context", async () => {
|
241
241
|
const context = await createAnonymousJazzContext({
|
242
|
-
|
242
|
+
peers: [],
|
243
243
|
crypto: Crypto,
|
244
244
|
});
|
245
245
|
|
@@ -257,7 +257,7 @@ describe("createContext methods", () => {
|
|
257
257
|
coMap.set("test", "test", "trusting");
|
258
258
|
|
259
259
|
const context = await createAnonymousJazzContext({
|
260
|
-
|
260
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
261
261
|
crypto: Crypto,
|
262
262
|
});
|
263
263
|
|
@@ -268,7 +268,7 @@ describe("createContext methods", () => {
|
|
268
268
|
|
269
269
|
test("sets the guest mode", async () => {
|
270
270
|
await createAnonymousJazzContext({
|
271
|
-
|
271
|
+
peers: [],
|
272
272
|
crypto: Crypto,
|
273
273
|
});
|
274
274
|
|
@@ -281,7 +281,7 @@ describe("createContext methods", () => {
|
|
281
281
|
describe("createJazzContext", () => {
|
282
282
|
test("creates new account when no credentials exist", async () => {
|
283
283
|
const context = await createJazzContext({
|
284
|
-
|
284
|
+
peers: [],
|
285
285
|
crypto: Crypto,
|
286
286
|
authSecretStorage,
|
287
287
|
sessionProvider: randomSessionProvider,
|
@@ -294,7 +294,7 @@ describe("createContext methods", () => {
|
|
294
294
|
test("uses existing credentials when available", async () => {
|
295
295
|
// First create an account and store credentials
|
296
296
|
const initialContext = await createJazzContext({
|
297
|
-
|
297
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
298
298
|
crypto: Crypto,
|
299
299
|
authSecretStorage,
|
300
300
|
sessionProvider: randomSessionProvider,
|
@@ -302,7 +302,7 @@ describe("createContext methods", () => {
|
|
302
302
|
|
303
303
|
// Create new context with same storage
|
304
304
|
const newContext = await createJazzContext({
|
305
|
-
|
305
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
306
306
|
crypto: Crypto,
|
307
307
|
authSecretStorage,
|
308
308
|
sessionProvider: randomSessionProvider,
|
@@ -316,7 +316,7 @@ describe("createContext methods", () => {
|
|
316
316
|
newAccountProps: {
|
317
317
|
creationProps: { name: "Custom User" },
|
318
318
|
},
|
319
|
-
|
319
|
+
peers: [],
|
320
320
|
crypto: Crypto,
|
321
321
|
authSecretStorage,
|
322
322
|
sessionProvider: randomSessionProvider,
|
@@ -341,7 +341,7 @@ describe("createContext methods", () => {
|
|
341
341
|
newAccountProps: {
|
342
342
|
secret: initialSecret,
|
343
343
|
},
|
344
|
-
|
344
|
+
peers: [],
|
345
345
|
crypto: Crypto,
|
346
346
|
authSecretStorage,
|
347
347
|
sessionProvider: randomSessionProvider,
|
@@ -365,7 +365,7 @@ describe("createContext methods", () => {
|
|
365
365
|
.withMigration(async () => {});
|
366
366
|
|
367
367
|
const context = await createJazzContext({
|
368
|
-
|
368
|
+
peers: [],
|
369
369
|
crypto: Crypto,
|
370
370
|
authSecretStorage,
|
371
371
|
sessionProvider: randomSessionProvider,
|
@@ -55,7 +55,7 @@ describe("Deep loading with depth arg", async () => {
|
|
55
55
|
secret: me.$jazz.localNode.getCurrentAgent().agentSecret,
|
56
56
|
},
|
57
57
|
sessionProvider: randomSessionProvider,
|
58
|
-
|
58
|
+
peers: [initialAsPeer],
|
59
59
|
crypto: Crypto,
|
60
60
|
asActiveAccount: true,
|
61
61
|
});
|
@@ -286,7 +286,7 @@ test("Deep loading a record-like coMap", async () => {
|
|
286
286
|
secret: me.$jazz.localNode.getCurrentAgent().agentSecret,
|
287
287
|
},
|
288
288
|
sessionProvider: randomSessionProvider,
|
289
|
-
|
289
|
+
peers: [initialAsPeer],
|
290
290
|
crypto: Crypto,
|
291
291
|
asActiveAccount: true,
|
292
292
|
});
|
@@ -30,6 +30,65 @@ describe("Group", () => {
|
|
30
30
|
expect(group.getRoleOf("everyone")).toBe("reader");
|
31
31
|
});
|
32
32
|
|
33
|
+
describe("Invitations", () => {
|
34
|
+
it("should create invitations as an instance method", () => {
|
35
|
+
const group = co.group().create();
|
36
|
+
const invite = group.$jazz.createInvite();
|
37
|
+
expect(invite.startsWith("inviteSecret_")).toBeTruthy();
|
38
|
+
});
|
39
|
+
|
40
|
+
it("should create invitations as an static method", async () => {
|
41
|
+
const group = co.group().create();
|
42
|
+
const groupId = group.$jazz.id;
|
43
|
+
const invite = await Group.createInvite(groupId);
|
44
|
+
expect(invite.startsWith("inviteSecret_")).toBeTruthy();
|
45
|
+
});
|
46
|
+
|
47
|
+
it("should correctly create invitations for users of different roles", async () => {
|
48
|
+
const currentUser = Account.getMe();
|
49
|
+
const group = co.group().create();
|
50
|
+
const invites = {
|
51
|
+
reader: group.$jazz.createInvite("reader"),
|
52
|
+
writeOnly: group.$jazz.createInvite("writeOnly"),
|
53
|
+
writer: group.$jazz.createInvite("writer"),
|
54
|
+
admin: group.$jazz.createInvite("admin"),
|
55
|
+
};
|
56
|
+
|
57
|
+
expect(group.getRoleOf(currentUser.$jazz.id)).toBe("admin");
|
58
|
+
|
59
|
+
for (const [role, inviteSecret] of Object.entries(invites)) {
|
60
|
+
const newUser = await createJazzTestAccount({
|
61
|
+
isCurrentActiveAccount: true,
|
62
|
+
});
|
63
|
+
expect(group.getRoleOf(newUser.$jazz.id)).toBeUndefined();
|
64
|
+
await newUser.acceptInvite(group.$jazz.id, inviteSecret);
|
65
|
+
expect(group.getRoleOf(newUser.$jazz.id)).toBe(role);
|
66
|
+
}
|
67
|
+
});
|
68
|
+
|
69
|
+
it("should create invitations with loadAs option", async () => {
|
70
|
+
const group = co.group().create();
|
71
|
+
const groupId = group.$jazz.id;
|
72
|
+
|
73
|
+
const otherAccount = await createJazzTestAccount();
|
74
|
+
group.addMember(otherAccount, "admin");
|
75
|
+
|
76
|
+
const invite = await Group.createInvite(groupId, {
|
77
|
+
role: "writer",
|
78
|
+
loadAs: otherAccount,
|
79
|
+
});
|
80
|
+
|
81
|
+
expect(invite.startsWith("inviteSecret_")).toBeTruthy();
|
82
|
+
});
|
83
|
+
|
84
|
+
it("should create invitations via co.group() schema wrapper", async () => {
|
85
|
+
const group = co.group().create();
|
86
|
+
const groupId = group.$jazz.id;
|
87
|
+
const invite = await co.group().createInvite(groupId, { role: "writer" });
|
88
|
+
expect(invite.startsWith("inviteSecret_")).toBeTruthy();
|
89
|
+
});
|
90
|
+
});
|
91
|
+
|
33
92
|
describe("TypeScript", () => {
|
34
93
|
it("should correctly type the resolve query", async () => {
|
35
94
|
const group = co.group().create();
|
@@ -424,7 +424,7 @@ describe("Inbox", () => {
|
|
424
424
|
const node = await LocalNode.withLoadedAccount({
|
425
425
|
accountID: accountId as any,
|
426
426
|
accountSecret: accountSecret,
|
427
|
-
|
427
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
428
428
|
crypto: receiver.$jazz.localNode.crypto,
|
429
429
|
sessionID: sessionID,
|
430
430
|
});
|
@@ -495,7 +495,7 @@ describe("Inbox", () => {
|
|
495
495
|
const node = await LocalNode.withLoadedAccount({
|
496
496
|
accountID: accountId as any,
|
497
497
|
accountSecret: accountSecret,
|
498
|
-
|
498
|
+
peers: [getPeerConnectedToTestSyncServer()],
|
499
499
|
crypto: receiver.$jazz.localNode.crypto,
|
500
500
|
sessionID: sessionID,
|
501
501
|
});
|
package/src/tools/tests/utils.ts
CHANGED
@@ -38,7 +38,7 @@ export async function setupAccount() {
|
|
38
38
|
secret: me.$jazz.localNode.getCurrentAgent().agentSecret,
|
39
39
|
},
|
40
40
|
sessionProvider: randomSessionProvider,
|
41
|
-
|
41
|
+
peers: [initialAsPeer],
|
42
42
|
crypto: Crypto,
|
43
43
|
asActiveAccount: true,
|
44
44
|
});
|
@@ -61,7 +61,7 @@ export async function setupTwoNodes(options?: {
|
|
61
61
|
);
|
62
62
|
|
63
63
|
const client = await LocalNode.withNewlyCreatedAccount({
|
64
|
-
|
64
|
+
peers: [serverAsPeer],
|
65
65
|
crypto: Crypto,
|
66
66
|
creationProps: { name: "Client" },
|
67
67
|
migration: async (rawAccount, _node, creationProps) => {
|
@@ -74,7 +74,7 @@ export async function setupTwoNodes(options?: {
|
|
74
74
|
});
|
75
75
|
|
76
76
|
const server = await LocalNode.withNewlyCreatedAccount({
|
77
|
-
|
77
|
+
peers: [clientAsPeer],
|
78
78
|
crypto: Crypto,
|
79
79
|
creationProps: { name: "Server" },
|
80
80
|
migration: async (rawAccount, _node, creationProps) => {
|
package/src/worker/index.ts
CHANGED
@@ -54,7 +54,7 @@ export async function startWorker<
|
|
54
54
|
|
55
55
|
let node: LocalNode | undefined = undefined;
|
56
56
|
|
57
|
-
const
|
57
|
+
const peers: Peer[] = [];
|
58
58
|
|
59
59
|
const wsPeer = new WebSocketPeerWithReconnection({
|
60
60
|
peer: syncServer,
|
@@ -63,7 +63,7 @@ export async function startWorker<
|
|
63
63
|
if (node) {
|
64
64
|
node.syncManager.addPeer(peer);
|
65
65
|
} else {
|
66
|
-
|
66
|
+
peers.push(peer);
|
67
67
|
}
|
68
68
|
},
|
69
69
|
removePeer: () => {},
|
@@ -92,7 +92,7 @@ export async function startWorker<
|
|
92
92
|
},
|
93
93
|
AccountSchema,
|
94
94
|
sessionProvider: randomSessionProvider,
|
95
|
-
|
95
|
+
peers,
|
96
96
|
crypto: options.crypto ?? (await WasmCrypto.create()),
|
97
97
|
asActiveAccount,
|
98
98
|
});
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../src/tools/ssr/ssr.ts"],"sourcesContent":["import { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport { createAnonymousJazzContext } from \"jazz-tools\";\n\nexport function createSSRJazzAgent(opts: { peer: string }) {\n const ssrNode = createAnonymousJazzContext({\n crypto: new PureJSCrypto(),\n peersToLoadFrom: [],\n });\n\n const wsPeer = new WebSocketPeerWithReconnection({\n peer: opts.peer,\n reconnectionTimeout: 100,\n addPeer: (peer) => {\n ssrNode.agent.node.syncManager.addPeer(peer);\n },\n removePeer: () => {},\n });\n\n wsPeer.enable();\n\n return ssrNode.agent;\n}\n"],"mappings":";AAAA,SAAS,qCAAqC;AAC9C,SAAS,oBAAoB;AAC7B,SAAS,kCAAkC;AAEpC,SAAS,mBAAmB,MAAwB;AACzD,QAAM,UAAU,2BAA2B;AAAA,IACzC,QAAQ,IAAI,aAAa;AAAA,IACzB,iBAAiB,CAAC;AAAA,EACpB,CAAC;AAED,QAAM,SAAS,IAAI,8BAA8B;AAAA,IAC/C,MAAM,KAAK;AAAA,IACX,qBAAqB;AAAA,IACrB,SAAS,CAAC,SAAS;AACjB,cAAQ,MAAM,KAAK,YAAY,QAAQ,IAAI;AAAA,IAC7C;AAAA,IACA,YAAY,MAAM;AAAA,IAAC;AAAA,EACrB,CAAC;AAED,SAAO,OAAO;AAEd,SAAO,QAAQ;AACjB;","names":[]}
|