@towns-protocol/encryption 0.0.252 → 0.0.255

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/index.d.ts CHANGED
@@ -4,7 +4,6 @@
4
4
  export * from './base';
5
5
  export * from './cryptoAesGcm';
6
6
  export * from './cryptoStore';
7
- export * from './decryptionExtensions';
8
7
  export * from './derivedEncryption';
9
8
  export * from './encryptionDelegate';
10
9
  export * from './encryptionDevice';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -4,7 +4,6 @@
4
4
  export * from './base';
5
5
  export * from './cryptoAesGcm';
6
6
  export * from './cryptoStore';
7
- export * from './decryptionExtensions';
8
7
  export * from './derivedEncryption';
9
8
  export * from './encryptionDelegate';
10
9
  export * from './encryptionDevice';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@towns-protocol/encryption",
3
- "version": "0.0.252",
3
+ "version": "0.0.255",
4
4
  "packageManager": "yarn@3.8.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,10 +22,10 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@bufbuild/protobuf": "^2.2.2",
25
- "@towns-protocol/dlog": "^0.0.252",
25
+ "@towns-protocol/dlog": "^0.0.255",
26
26
  "@towns-protocol/olm": "3.2.28",
27
- "@towns-protocol/proto": "^0.0.252",
28
- "@towns-protocol/web3": "^0.0.252",
27
+ "@towns-protocol/proto": "^0.0.255",
28
+ "@towns-protocol/web3": "^0.0.255",
29
29
  "debug": "^4.3.4",
30
30
  "dexie": "^4.0.7",
31
31
  "ethers": "^5.7.2",
@@ -49,5 +49,5 @@
49
49
  "files": [
50
50
  "dist"
51
51
  ],
52
- "gitHead": "5964df7345c00dfa0c2681b4cd04140777e96dcb"
52
+ "gitHead": "7c7eedeb938c78663bc892df4f505b909361517f"
53
53
  }
@@ -1,200 +0,0 @@
1
- import TypedEmitter from 'typed-emitter';
2
- import { Permission } from '@towns-protocol/web3';
3
- import { AddEventResponse_Error, EncryptedData, SessionKeys, UserInboxPayload_GroupEncryptionSessions } from '@towns-protocol/proto';
4
- import { DLogger } from '@towns-protocol/dlog';
5
- import { GroupEncryptionAlgorithmId, GroupEncryptionSession, UserDevice } from './olmLib';
6
- import { GroupEncryptionCrypto } from './groupEncryptionCrypto';
7
- export interface EntitlementsDelegate {
8
- isEntitled(spaceId: string | undefined, channelId: string | undefined, user: string, permission: Permission): Promise<boolean>;
9
- }
10
- export declare enum DecryptionStatus {
11
- initializing = "initializing",
12
- updating = "updating",
13
- working = "working",
14
- idle = "idle",
15
- done = "done"
16
- }
17
- export type DecryptionEvents = {
18
- decryptionExtStatusChanged: (status: DecryptionStatus) => void;
19
- };
20
- export interface NewGroupSessionItem {
21
- streamId: string;
22
- sessions: UserInboxPayload_GroupEncryptionSessions;
23
- }
24
- export interface EncryptedContentItem {
25
- streamId: string;
26
- eventId: string;
27
- kind: string;
28
- encryptedData: EncryptedData;
29
- }
30
- export interface KeySolicitationContent {
31
- deviceKey: string;
32
- fallbackKey: string;
33
- isNewDevice: boolean;
34
- sessionIds: string[];
35
- }
36
- export interface EventSignatureBundle {
37
- hash: Uint8Array;
38
- signature: Uint8Array | undefined;
39
- event: {
40
- creatorAddress: Uint8Array;
41
- delegateSig: Uint8Array;
42
- delegateExpiryEpochMs: bigint;
43
- };
44
- }
45
- export interface KeySolicitationItem {
46
- streamId: string;
47
- fromUserId: string;
48
- fromUserAddress: Uint8Array;
49
- solicitation: KeySolicitationContent;
50
- respondAfter: number;
51
- sigBundle: EventSignatureBundle;
52
- hashStr: string;
53
- }
54
- export interface KeySolicitationData {
55
- streamId: string;
56
- isNewDevice: boolean;
57
- missingSessionIds: string[];
58
- }
59
- export interface KeyFulfilmentData {
60
- streamId: string;
61
- userAddress: Uint8Array;
62
- deviceKey: string;
63
- sessionIds: string[];
64
- }
65
- export interface GroupSessionsData {
66
- streamId: string;
67
- item: KeySolicitationItem;
68
- sessions: GroupEncryptionSession[];
69
- algorithm: GroupEncryptionAlgorithmId;
70
- }
71
- export interface DecryptionSessionError {
72
- missingSession: boolean;
73
- kind: string;
74
- encryptedData: EncryptedData;
75
- error?: unknown;
76
- }
77
- /**
78
- *
79
- * Responsibilities:
80
- * 1. Download new to-device messages that happened while we were offline
81
- * 2. Decrypt new to-device messages
82
- * 3. Decrypt encrypted content
83
- * 4. Retry decryption failures, request keys for failed decryption
84
- * 5. Respond to key solicitations
85
- *
86
- *
87
- * Notes:
88
- * If in the future we started snapshotting the eventNum of the last message sent by every user,
89
- * we could use that to determine the order we send out keys, and the order that we reply to key solicitations.
90
- *
91
- * It should be easy to introduce a priority stream, where we decrypt messages from that stream first, before
92
- * anything else, so the messages show up quicky in the ui that the user is looking at.
93
- *
94
- * We need code to purge bad sessions (if someones sends us the wrong key, or a key that doesn't decrypt the message)
95
- */
96
- export declare abstract class BaseDecryptionExtensions {
97
- private _status;
98
- private mainQueues;
99
- private streamQueues;
100
- private upToDateStreams;
101
- private highPriorityIds;
102
- private recentStreamIds;
103
- private decryptionFailures;
104
- private inProgressTick?;
105
- private timeoutId?;
106
- private delayMs;
107
- private started;
108
- private numRecentStreamIds;
109
- private emitter;
110
- protected _onStopFn?: () => void;
111
- protected log: {
112
- debug: DLogger;
113
- info: DLogger;
114
- error: DLogger;
115
- };
116
- readonly crypto: GroupEncryptionCrypto;
117
- readonly entitlementDelegate: EntitlementsDelegate;
118
- readonly userDevice: UserDevice;
119
- readonly userId: string;
120
- constructor(emitter: TypedEmitter<DecryptionEvents>, crypto: GroupEncryptionCrypto, entitlementDelegate: EntitlementsDelegate, userDevice: UserDevice, userId: string, upToDateStreams: Set<string>, inLogId: string);
121
- abstract ackNewGroupSession(session: UserInboxPayload_GroupEncryptionSessions): Promise<void>;
122
- abstract decryptGroupEvent(streamId: string, eventId: string, kind: string, encryptedData: EncryptedData): Promise<void>;
123
- abstract downloadNewMessages(): Promise<void>;
124
- abstract getKeySolicitations(streamId: string): KeySolicitationContent[];
125
- abstract hasStream(streamId: string): boolean;
126
- abstract isUserEntitledToKeyExchange(streamId: string, userId: string, opts?: {
127
- skipOnChainValidation: boolean;
128
- }): Promise<boolean>;
129
- abstract isValidEvent(item: KeySolicitationItem): {
130
- isValid: boolean;
131
- reason?: string;
132
- };
133
- abstract isUserInboxStreamUpToDate(upToDateStreams: Set<string>): boolean;
134
- abstract onDecryptionError(item: EncryptedContentItem, err: DecryptionSessionError): void;
135
- abstract sendKeySolicitation(args: KeySolicitationData): Promise<void>;
136
- abstract sendKeyFulfillment(args: KeyFulfilmentData): Promise<{
137
- error?: AddEventResponse_Error;
138
- }>;
139
- abstract encryptAndShareGroupSessions(args: GroupSessionsData): Promise<void>;
140
- abstract shouldPauseTicking(): boolean;
141
- /**
142
- * uploadDeviceKeys
143
- * upload device keys to the server
144
- */
145
- abstract uploadDeviceKeys(): Promise<void>;
146
- abstract getPriorityForStream(streamId: string, highPriorityIds: Set<string>, recentStreamIds: Set<string>): number;
147
- enqueueNewGroupSessions(sessions: UserInboxPayload_GroupEncryptionSessions, _senderId: string): void;
148
- enqueueNewEncryptedContent(streamId: string, eventId: string, kind: string, // kind of encrypted data
149
- encryptedData: EncryptedData): void;
150
- enqueueInitKeySolicitations(streamId: string, eventHashStr: string, members: {
151
- userId: string;
152
- userAddress: Uint8Array;
153
- solicitations: KeySolicitationContent[];
154
- }[], sigBundle: EventSignatureBundle): void;
155
- enqueueKeySolicitation(streamId: string, eventHashStr: string, fromUserId: string, fromUserAddress: Uint8Array, keySolicitation: KeySolicitationContent, sigBundle: EventSignatureBundle): void;
156
- setStreamUpToDate(streamId: string): void;
157
- resetUpToDateStreams(): void;
158
- retryDecryptionFailures(streamId: string): void;
159
- start(): void;
160
- enqueueNewMessageDownload(): void;
161
- onStart(): void;
162
- stop(): Promise<void>;
163
- onStop(): Promise<void>;
164
- get status(): DecryptionStatus;
165
- private setStatus;
166
- private compareStreamIds;
167
- private lastPrintedAt;
168
- protected checkStartTicking(): void;
169
- private stopTicking;
170
- private getDelayMs;
171
- private tick;
172
- /**
173
- * processNewGroupSession
174
- * process new group sessions that were sent to our to device stream inbox
175
- * re-enqueue any decryption failures with matching session id
176
- */
177
- private processNewGroupSession;
178
- /**
179
- * processEncryptedContentItem
180
- * try to decrypt encrytped content
181
- */
182
- private processEncryptedContentItem;
183
- /**
184
- * processMissingKeys
185
- * process missing keys and send key solicitations to streams
186
- */
187
- private processMissingKeys;
188
- /**
189
- * processKeySolicitation
190
- * process incoming key solicitations and send keys and key fulfillments
191
- */
192
- private processKeySolicitation;
193
- /**
194
- * can be overridden to add a delay to the key solicitation response
195
- */
196
- getRespondDelayMSForKeySolicitation(_streamId: string, _userId: string): number;
197
- setHighPriorityStreams(streamIds: string[]): void;
198
- }
199
- export declare function makeSessionKeys(sessions: GroupEncryptionSession[]): SessionKeys;
200
- //# sourceMappingURL=decryptionExtensions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decryptionExtensions.d.ts","sourceRoot":"","sources":["../src/decryptionExtensions.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EACH,sBAAsB,EACtB,aAAa,EAEb,WAAW,EAEX,wCAAwC,EAC3C,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAIH,OAAO,EAGV,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACH,0BAA0B,EAC1B,sBAAsB,EAEtB,UAAU,EACb,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,MAAM,WAAW,oBAAoB;IACjC,UAAU,CACN,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACvB,OAAO,CAAC,OAAO,CAAC,CAAA;CACtB;AAED,oBAAY,gBAAgB;IACxB,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,0BAA0B,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CACjE,CAAA;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,wCAAwC,CAAA;CACrD;AAED,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,aAAa,CAAA;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;CACvB;AAGD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,UAAU,GAAG,SAAS,CAAA;IACjC,KAAK,EAAE;QACH,cAAc,EAAE,UAAU,CAAA;QAC1B,WAAW,EAAE,UAAU,CAAA;QACvB,qBAAqB,EAAE,MAAM,CAAA;KAChC,CAAA;CACJ;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,UAAU,CAAA;IAC3B,YAAY,EAAE,sBAAsB,CAAA;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,oBAAoB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,sBAAsB,EAAE,CAAA;IAClC,SAAS,EAAE,0BAA0B,CAAA;CACxC;AAED,MAAM,WAAW,sBAAsB;IACnC,cAAc,EAAE,OAAO,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,aAAa,CAAA;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AA4DD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAAsB,wBAAwB;IAC1C,OAAO,CAAC,OAAO,CAAkD;IACjE,OAAO,CAAC,UAAU,CAIjB;IACD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,kBAAkB,CAA6D;IACvF,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,OAAO,CAAgC;IAE/C,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IAChC,SAAS,CAAC,GAAG,EAAE;QACX,KAAK,EAAE,OAAO,CAAA;QACd,IAAI,EAAE,OAAO,CAAA;QACb,KAAK,EAAE,OAAO,CAAA;KACjB,CAAA;IAED,SAAgB,MAAM,EAAE,qBAAqB,CAAA;IAC7C,SAAgB,mBAAmB,EAAE,oBAAoB,CAAA;IACzD,SAAgB,UAAU,EAAE,UAAU,CAAA;IACtC,SAAgB,MAAM,EAAE,MAAM,CAAA;gBAG1B,OAAO,EAAE,YAAY,CAAC,gBAAgB,CAAC,EACvC,MAAM,EAAE,qBAAqB,EAC7B,mBAAmB,EAAE,oBAAoB,EACzC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,OAAO,EAAE,MAAM;aAqBH,kBAAkB,CAC9B,OAAO,EAAE,wCAAwC,GAClD,OAAO,CAAC,IAAI,CAAC;aACA,iBAAiB,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,aAAa,GAC7B,OAAO,CAAC,IAAI,CAAC;aACA,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;aACpC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,EAAE;aAC/D,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;aACpC,2BAA2B,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,qBAAqB,EAAE,OAAO,CAAA;KAAE,GAC1C,OAAO,CAAC,OAAO,CAAC;aACH,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;aAC9E,yBAAyB,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO;aAChE,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,sBAAsB,GAAG,IAAI;aAChF,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;aAC7D,kBAAkB,CAC9B,IAAI,EAAE,iBAAiB,GACxB,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC;aAC9B,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;aACpE,kBAAkB,IAAI,OAAO;IAC7C;;;OAGG;aACa,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;aACjC,oBAAoB,CAChC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,MAAM;IAEF,uBAAuB,CAC1B,QAAQ,EAAE,wCAAwC,EAClD,SAAS,EAAE,MAAM,GAClB,IAAI;IAOA,0BAA0B,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,yBAAyB;IACvC,aAAa,EAAE,aAAa,GAC7B,IAAI;IAiBA,2BAA2B,CAC9B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,EAAE,UAAU,CAAA;QACvB,aAAa,EAAE,sBAAsB,EAAE,CAAA;KAC1C,EAAE,EACH,SAAS,EAAE,oBAAoB,GAChC,IAAI;IAmCA,sBAAsB,CACzB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,UAAU,EAC3B,eAAe,EAAE,sBAAsB,EACvC,SAAS,EAAE,oBAAoB,GAChC,IAAI;IAqCA,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMzC,oBAAoB,IAAI,IAAI;IAK5B,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAe/C,KAAK,IAAI,IAAI;IAgBb,yBAAyB;IAIzB,OAAO,IAAI,IAAI;IAIT,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,IAAW,MAAM,IAAI,gBAAgB,CAEpC;IAED,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,aAAa,CAAI;IACzB,SAAS,CAAC,iBAAiB;YAsDb,WAAW;IAgBzB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,IAAI;IA2DZ;;;;OAIG;YACW,sBAAsB;IA8EpC;;;OAGG;YACW,2BAA2B;IA0CzC;;;OAGG;YACW,kBAAkB;IAuDhC;;;OAGG;YACW,sBAAsB;IAoGpC;;OAEG;IACI,mCAAmC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAI/E,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE;CAGpD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,sBAAsB,EAAE,GAAG,WAAW,CAK/E"}