@meshline/sdk 0.0.0-stage → 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +43 -2
- package/dist/channels/repository.d.ts +73 -0
- package/dist/channels/repository.d.ts.map +1 -0
- package/dist/channels/repository.js +367 -0
- package/dist/channels/repository.js.map +1 -0
- package/dist/client/account-operations.d.ts +41 -0
- package/dist/client/account-operations.d.ts.map +1 -0
- package/dist/client/account-operations.js +304 -0
- package/dist/client/account-operations.js.map +1 -0
- package/dist/client/conversations.d.ts +36 -0
- package/dist/client/conversations.d.ts.map +1 -0
- package/dist/client/conversations.js +144 -0
- package/dist/client/conversations.js.map +1 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +162 -0
- package/dist/client.js.map +1 -0
- package/dist/components/account.d.ts +38 -0
- package/dist/components/account.d.ts.map +1 -0
- package/dist/components/account.js +243 -0
- package/dist/components/account.js.map +1 -0
- package/dist/components/channel.d.ts +78 -0
- package/dist/components/channel.d.ts.map +1 -0
- package/dist/components/channel.js +475 -0
- package/dist/components/channel.js.map +1 -0
- package/dist/components/component.d.ts +49 -0
- package/dist/components/component.d.ts.map +1 -0
- package/dist/components/component.js +194 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/device.d.ts +60 -0
- package/dist/components/device.d.ts.map +1 -0
- package/dist/components/device.js +648 -0
- package/dist/components/device.js.map +1 -0
- package/dist/components/group.d.ts +141 -0
- package/dist/components/group.d.ts.map +1 -0
- package/dist/components/group.js +933 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/message.d.ts +63 -0
- package/dist/components/message.d.ts.map +1 -0
- package/dist/components/message.js +439 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/profile.d.ts +37 -0
- package/dist/components/profile.d.ts.map +1 -0
- package/dist/components/profile.js +232 -0
- package/dist/components/profile.js.map +1 -0
- package/dist/crypto/groups.d.ts +56 -0
- package/dist/crypto/groups.d.ts.map +1 -0
- package/dist/crypto/groups.js +163 -0
- package/dist/crypto/groups.js.map +1 -0
- package/dist/crypto/messages.d.ts +52 -0
- package/dist/crypto/messages.d.ts.map +1 -0
- package/dist/crypto/messages.js +180 -0
- package/dist/crypto/messages.js.map +1 -0
- package/dist/crypto/primitives.d.ts +30 -0
- package/dist/crypto/primitives.d.ts.map +1 -0
- package/dist/crypto/primitives.js +102 -0
- package/dist/crypto/primitives.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/groups/account-sync.d.ts +28 -0
- package/dist/groups/account-sync.d.ts.map +1 -0
- package/dist/groups/account-sync.js +235 -0
- package/dist/groups/account-sync.js.map +1 -0
- package/dist/groups/messages.d.ts +39 -0
- package/dist/groups/messages.d.ts.map +1 -0
- package/dist/groups/messages.js +141 -0
- package/dist/groups/messages.js.map +1 -0
- package/dist/groups/operations.d.ts +57 -0
- package/dist/groups/operations.d.ts.map +1 -0
- package/dist/groups/operations.js +225 -0
- package/dist/groups/operations.js.map +1 -0
- package/dist/groups/repository.d.ts +56 -0
- package/dist/groups/repository.d.ts.map +1 -0
- package/dist/groups/repository.js +254 -0
- package/dist/groups/repository.js.map +1 -0
- package/dist/groups/secrets.d.ts +67 -0
- package/dist/groups/secrets.d.ts.map +1 -0
- package/dist/groups/secrets.js +452 -0
- package/dist/groups/secrets.js.map +1 -0
- package/dist/groups/state.d.ts +39 -0
- package/dist/groups/state.d.ts.map +1 -0
- package/dist/groups/state.js +201 -0
- package/dist/groups/state.js.map +1 -0
- package/dist/identity/identifiers.d.ts +9 -0
- package/dist/identity/identifiers.d.ts.map +1 -0
- package/dist/identity/identifiers.js +37 -0
- package/dist/identity/identifiers.js.map +1 -0
- package/dist/identity/neo.d.ts +11 -0
- package/dist/identity/neo.d.ts.map +1 -0
- package/dist/identity/neo.js +77 -0
- package/dist/identity/neo.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions.d.ts +31 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +2 -0
- package/dist/interactions.js.map +1 -0
- package/dist/messages/account-sender.d.ts +9 -0
- package/dist/messages/account-sender.d.ts.map +1 -0
- package/dist/messages/account-sender.js +46 -0
- package/dist/messages/account-sender.js.map +1 -0
- package/dist/messages/contacts.d.ts +103 -0
- package/dist/messages/contacts.d.ts.map +1 -0
- package/dist/messages/contacts.js +525 -0
- package/dist/messages/contacts.js.map +1 -0
- package/dist/messages/outbox.d.ts +66 -0
- package/dist/messages/outbox.d.ts.map +1 -0
- package/dist/messages/outbox.js +167 -0
- package/dist/messages/outbox.js.map +1 -0
- package/dist/messages/receiver.d.ts +35 -0
- package/dist/messages/receiver.d.ts.map +1 -0
- package/dist/messages/receiver.js +113 -0
- package/dist/messages/receiver.js.map +1 -0
- package/dist/messages/repository.d.ts +89 -0
- package/dist/messages/repository.d.ts.map +1 -0
- package/dist/messages/repository.js +295 -0
- package/dist/messages/repository.js.map +1 -0
- package/dist/models/authentication.d.ts +37 -0
- package/dist/models/authentication.d.ts.map +1 -0
- package/dist/models/authentication.js +53 -0
- package/dist/models/authentication.js.map +1 -0
- package/dist/models/channels.d.ts +141 -0
- package/dist/models/channels.d.ts.map +1 -0
- package/dist/models/channels.js +258 -0
- package/dist/models/channels.js.map +1 -0
- package/dist/models/contacts.d.ts +68 -0
- package/dist/models/contacts.d.ts.map +1 -0
- package/dist/models/contacts.js +186 -0
- package/dist/models/contacts.js.map +1 -0
- package/dist/models/content.d.ts +37 -0
- package/dist/models/content.d.ts.map +1 -0
- package/dist/models/content.js +137 -0
- package/dist/models/content.js.map +1 -0
- package/dist/models/device-state.d.ts +8 -0
- package/dist/models/device-state.d.ts.map +1 -0
- package/dist/models/device-state.js +22 -0
- package/dist/models/device-state.js.map +1 -0
- package/dist/models/group-admission.d.ts +111 -0
- package/dist/models/group-admission.d.ts.map +1 -0
- package/dist/models/group-admission.js +153 -0
- package/dist/models/group-admission.js.map +1 -0
- package/dist/models/group-keys.d.ts +30 -0
- package/dist/models/group-keys.d.ts.map +1 -0
- package/dist/models/group-keys.js +52 -0
- package/dist/models/group-keys.js.map +1 -0
- package/dist/models/group-management.d.ts +190 -0
- package/dist/models/group-management.d.ts.map +1 -0
- package/dist/models/group-management.js +263 -0
- package/dist/models/group-management.js.map +1 -0
- package/dist/models/groups.d.ts +81 -0
- package/dist/models/groups.d.ts.map +1 -0
- package/dist/models/groups.js +127 -0
- package/dist/models/groups.js.map +1 -0
- package/dist/models/identity.d.ts +47 -0
- package/dist/models/identity.d.ts.map +1 -0
- package/dist/models/identity.js +136 -0
- package/dist/models/identity.js.map +1 -0
- package/dist/models/messages.d.ts +104 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/messages.js +168 -0
- package/dist/models/messages.js.map +1 -0
- package/dist/models/profile.d.ts +24 -0
- package/dist/models/profile.d.ts.map +1 -0
- package/dist/models/profile.js +47 -0
- package/dist/models/profile.js.map +1 -0
- package/dist/models/relay.d.ts +39 -0
- package/dist/models/relay.d.ts.map +1 -0
- package/dist/models/relay.js +160 -0
- package/dist/models/relay.js.map +1 -0
- package/dist/protocol/codec.d.ts +36 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/codec.js +144 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/context.d.ts +14 -0
- package/dist/protocol/context.d.ts.map +1 -0
- package/dist/protocol/context.js +43 -0
- package/dist/protocol/context.js.map +1 -0
- package/dist/protocol/encoding.d.ts +15 -0
- package/dist/protocol/encoding.d.ts.map +1 -0
- package/dist/protocol/encoding.js +133 -0
- package/dist/protocol/encoding.js.map +1 -0
- package/dist/protocol/json.d.ts +16 -0
- package/dist/protocol/json.d.ts.map +1 -0
- package/dist/protocol/json.js +172 -0
- package/dist/protocol/json.js.map +1 -0
- package/dist/protocol/validation.d.ts +4 -0
- package/dist/protocol/validation.d.ts.map +1 -0
- package/dist/protocol/validation.js +18 -0
- package/dist/protocol/validation.js.map +1 -0
- package/dist/runtime/abort.d.ts +6 -0
- package/dist/runtime/abort.d.ts.map +1 -0
- package/dist/runtime/abort.js +32 -0
- package/dist/runtime/abort.js.map +1 -0
- package/dist/runtime/async-gate.d.ts +6 -0
- package/dist/runtime/async-gate.d.ts.map +1 -0
- package/dist/runtime/async-gate.js +15 -0
- package/dist/runtime/async-gate.js.map +1 -0
- package/dist/runtime/async-pulse.d.ts +7 -0
- package/dist/runtime/async-pulse.d.ts.map +1 -0
- package/dist/runtime/async-pulse.js +23 -0
- package/dist/runtime/async-pulse.js.map +1 -0
- package/dist/runtime/clock.d.ts +16 -0
- package/dist/runtime/clock.d.ts.map +1 -0
- package/dist/runtime/clock.js +62 -0
- package/dist/runtime/clock.js.map +1 -0
- package/dist/runtime/events.d.ts +11 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +45 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/url.d.ts +3 -0
- package/dist/runtime/url.d.ts.map +1 -0
- package/dist/runtime/url.js +23 -0
- package/dist/runtime/url.js.map +1 -0
- package/dist/storage/signed-request.d.ts +14 -0
- package/dist/storage/signed-request.d.ts.map +1 -0
- package/dist/storage/signed-request.js +26 -0
- package/dist/storage/signed-request.js.map +1 -0
- package/dist/storage/store.d.ts +58 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +52 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/transaction.d.ts +7 -0
- package/dist/storage/transaction.d.ts.map +1 -0
- package/dist/storage/transaction.js +22 -0
- package/dist/storage/transaction.js.map +1 -0
- package/dist/transport/client.d.ts +61 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +392 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/discovery.d.ts +19 -0
- package/dist/transport/discovery.d.ts.map +1 -0
- package/dist/transport/discovery.js +75 -0
- package/dist/transport/discovery.js.map +1 -0
- package/dist/transport/endpoint.d.ts +6 -0
- package/dist/transport/endpoint.d.ts.map +1 -0
- package/dist/transport/endpoint.js +35 -0
- package/dist/transport/endpoint.js.map +1 -0
- package/dist/transport/http.d.ts +52 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +128 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/pool.d.ts +31 -0
- package/dist/transport/pool.d.ts.map +1 -0
- package/dist/transport/pool.js +137 -0
- package/dist/transport/pool.js.map +1 -0
- package/dist/transport/relay-error.d.ts +23 -0
- package/dist/transport/relay-error.d.ts.map +1 -0
- package/dist/transport/relay-error.js +47 -0
- package/dist/transport/relay-error.js.map +1 -0
- package/dist/transport/rpc.d.ts +31 -0
- package/dist/transport/rpc.d.ts.map +1 -0
- package/dist/transport/rpc.js +56 -0
- package/dist/transport/rpc.js.map +1 -0
- package/dist/transport/session.d.ts +49 -0
- package/dist/transport/session.d.ts.map +1 -0
- package/dist/transport/session.js +169 -0
- package/dist/transport/session.js.map +1 -0
- package/dist/transport/socket.d.ts +55 -0
- package/dist/transport/socket.d.ts.map +1 -0
- package/dist/transport/socket.js +266 -0
- package/dist/transport/socket.js.map +1 -0
- package/dist/transport/subscription.d.ts +36 -0
- package/dist/transport/subscription.d.ts.map +1 -0
- package/dist/transport/subscription.js +169 -0
- package/dist/transport/subscription.js.map +1 -0
- package/package.json +35 -4
- package/src/channels/repository.ts +244 -0
- package/src/client/account-operations.ts +183 -0
- package/src/client/conversations.ts +95 -0
- package/src/client.ts +108 -0
- package/src/components/account.ts +206 -0
- package/src/components/channel.ts +253 -0
- package/src/components/component.ts +151 -0
- package/src/components/device.ts +455 -0
- package/src/components/group.ts +546 -0
- package/src/components/message.ts +253 -0
- package/src/components/profile.ts +179 -0
- package/src/crypto/groups.ts +107 -0
- package/src/crypto/messages.ts +129 -0
- package/src/crypto/primitives.ts +103 -0
- package/src/errors.ts +13 -0
- package/src/groups/account-sync.ts +144 -0
- package/src/groups/messages.ts +89 -0
- package/src/groups/operations.ts +145 -0
- package/src/groups/repository.ts +161 -0
- package/src/groups/secrets.ts +256 -0
- package/src/groups/state.ts +138 -0
- package/src/identity/identifiers.ts +41 -0
- package/src/identity/neo.ts +72 -0
- package/src/index.ts +52 -0
- package/src/interactions.ts +35 -0
- package/src/messages/account-sender.ts +33 -0
- package/src/messages/contacts.ts +379 -0
- package/src/messages/outbox.ts +152 -0
- package/src/messages/receiver.ts +86 -0
- package/src/messages/repository.ts +230 -0
- package/src/models/authentication.ts +63 -0
- package/src/models/channels.ts +155 -0
- package/src/models/contacts.ts +141 -0
- package/src/models/content.ts +105 -0
- package/src/models/device-state.ts +18 -0
- package/src/models/group-admission.ts +110 -0
- package/src/models/group-keys.ts +34 -0
- package/src/models/group-management.ts +182 -0
- package/src/models/groups.ts +100 -0
- package/src/models/identity.ts +164 -0
- package/src/models/messages.ts +139 -0
- package/src/models/profile.ts +46 -0
- package/src/models/relay.ts +151 -0
- package/src/protocol/codec.ts +144 -0
- package/src/protocol/context.ts +39 -0
- package/src/protocol/encoding.ts +106 -0
- package/src/protocol/json.ts +140 -0
- package/src/protocol/validation.ts +13 -0
- package/src/runtime/abort.ts +27 -0
- package/src/runtime/async-gate.ts +16 -0
- package/src/runtime/async-pulse.ts +20 -0
- package/src/runtime/clock.ts +63 -0
- package/src/runtime/events.ts +31 -0
- package/src/runtime/url.ts +17 -0
- package/src/storage/signed-request.ts +26 -0
- package/src/storage/store.ts +90 -0
- package/src/storage/transaction.ts +17 -0
- package/src/transport/client.ts +328 -0
- package/src/transport/discovery.ts +64 -0
- package/src/transport/endpoint.ts +32 -0
- package/src/transport/http.ts +129 -0
- package/src/transport/pool.ts +115 -0
- package/src/transport/relay-error.ts +46 -0
- package/src/transport/rpc.ts +56 -0
- package/src/transport/session.ts +154 -0
- package/src/transport/socket.ts +248 -0
- package/src/transport/subscription.ts +117 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Meshline contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,44 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @meshline/sdk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Build Meshline applications with accounts, devices, profiles, contacts, encrypted
|
|
4
|
+
direct/group messages, public channels, and local conversations. `MeshlineClient`
|
|
5
|
+
coordinates six managers. The core has no Node.js, React, or Expo runtime dependency.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
This ESM alpha includes TypeScript declarations. Install the core:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install @meshline/sdk@0.1.0-alpha.1
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Also install the matching adapters for your application:
|
|
16
|
+
|
|
17
|
+
| Runtime | Additional packages |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| Node.js 24+ | `@meshline/storage-node`, `@meshline/transport-node` |
|
|
20
|
+
| Browser | `@meshline/storage-browser` |
|
|
21
|
+
| Native Expo | `@meshline/expo` |
|
|
22
|
+
|
|
23
|
+
See [installation commands](https://github.com/meshline-network/sdk/blob/main/typescript/docs/guides/quick-start.md)
|
|
24
|
+
and [platform requirements](https://github.com/meshline-network/sdk/blob/main/typescript/docs/platforms.md).
|
|
25
|
+
|
|
26
|
+
## Open a client
|
|
27
|
+
|
|
28
|
+
Supply a trusted `NetworkContext`, `accountId`, `RelayRegistry`,
|
|
29
|
+
`SecretProtector`, platform store, and `RelayClientPool`. Account-authorized
|
|
30
|
+
operations also require an `AccountSigner`; the SDK does not request account
|
|
31
|
+
private keys.
|
|
32
|
+
|
|
33
|
+
Migrate the store explicitly, initialize the client, establish or recover account
|
|
34
|
+
authorization when needed, then start. Ordinary restarts reuse the same database
|
|
35
|
+
and protector and do not require account recovery.
|
|
36
|
+
|
|
37
|
+
The client owns its managers; the application owns the store, pool, and signing/
|
|
38
|
+
protection integrations. Dispose the client before the pool and store.
|
|
39
|
+
A successful direct `sendMessage` queues a durable request; observe send status
|
|
40
|
+
for remote acceptance. Models use camelCase fields and explicit wire codecs.
|
|
41
|
+
Operations return promises and accept cancellation signals.
|
|
42
|
+
|
|
43
|
+
Start with the [application guide](https://github.com/meshline-network/sdk/blob/main/typescript/docs/README.md)
|
|
44
|
+
and [platform examples](https://github.com/meshline-network/sdk/blob/main/typescript/examples/README.md).
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type ChannelDescriptor, type ChannelPayload, type ChannelPost, type ChannelPostRef, type ChannelReadPage, type ChannelReadQuery, type ChannelRef, type ChannelResolveResult } from '../models/channels.js';
|
|
2
|
+
import type { ContentReference, MessageBody } from '../models/content.js';
|
|
3
|
+
import type { NetworkContext } from '../protocol/context.js';
|
|
4
|
+
import { type JsonObject } from '../protocol/json.js';
|
|
5
|
+
import type { MeshlineStore, QueryReader, RecordKey, StoredRecord } from '../storage/store.js';
|
|
6
|
+
export interface ChannelInfo {
|
|
7
|
+
readonly ref: ChannelRef;
|
|
8
|
+
readonly descriptor?: ChannelDescriptor;
|
|
9
|
+
readonly isFollowed: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ChannelPostInfo {
|
|
12
|
+
readonly ref: ChannelPostRef;
|
|
13
|
+
readonly messageId: string;
|
|
14
|
+
readonly author: string;
|
|
15
|
+
readonly acceptedAt: number;
|
|
16
|
+
readonly body?: MessageBody;
|
|
17
|
+
readonly attachments?: readonly ContentReference[];
|
|
18
|
+
}
|
|
19
|
+
export interface ChannelPostChange {
|
|
20
|
+
readonly ref: ChannelPostRef;
|
|
21
|
+
readonly kind: 'added' | 'edited' | 'deleted';
|
|
22
|
+
readonly info?: ChannelPostInfo;
|
|
23
|
+
}
|
|
24
|
+
export interface ChannelChanges {
|
|
25
|
+
readonly channel?: ChannelInfo;
|
|
26
|
+
readonly posts: readonly ChannelPostChange[];
|
|
27
|
+
}
|
|
28
|
+
export interface ChannelRecord {
|
|
29
|
+
readonly channel: ChannelRef;
|
|
30
|
+
readonly descriptor?: ChannelDescriptor;
|
|
31
|
+
readonly syncSequence: number;
|
|
32
|
+
readonly isFollowed: boolean;
|
|
33
|
+
}
|
|
34
|
+
export type ChannelOperationMethod = 'channel.create' | 'channel.update' | 'channel.close' | 'channel.post' | 'channel.post.edit' | 'channel.post.delete';
|
|
35
|
+
export interface ChannelOperation {
|
|
36
|
+
readonly channel: ChannelRef;
|
|
37
|
+
readonly method: ChannelOperationMethod;
|
|
38
|
+
readonly payload: ChannelPayload;
|
|
39
|
+
readonly acceptedSequence?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ChannelReader {
|
|
42
|
+
read(query: ChannelReadQuery, signal?: AbortSignal): Promise<ChannelReadPage>;
|
|
43
|
+
resolve(revision: number, signal?: AbortSignal): Promise<ChannelResolveResult>;
|
|
44
|
+
}
|
|
45
|
+
export declare function channelOperationKey(operation: ChannelOperation): RecordKey;
|
|
46
|
+
export declare function encodeChannelOperation(operation: ChannelOperation): JsonObject;
|
|
47
|
+
export declare function readChannelOperation(row: StoredRecord): ChannelOperation;
|
|
48
|
+
/** Verified evidence and projections commit together; all network reads occur before the CAS transaction. */
|
|
49
|
+
export declare class ChannelRepository {
|
|
50
|
+
#private;
|
|
51
|
+
readonly store: MeshlineStore;
|
|
52
|
+
readonly context: NetworkContext;
|
|
53
|
+
readonly accountId: string;
|
|
54
|
+
constructor(store: MeshlineStore, context: NetworkContext, accountId: string);
|
|
55
|
+
get(channel: ChannelRef, signal?: AbortSignal): Promise<ChannelRecord>;
|
|
56
|
+
post(post: ChannelPostRef, signal?: AbortSignal): Promise<ChannelPostInfo | undefined>;
|
|
57
|
+
posts(channelId?: string, author?: string, signal?: AbortSignal): Promise<QueryReader<ChannelPostInfo>>;
|
|
58
|
+
followed(relayId?: string, signal?: AbortSignal): Promise<readonly ChannelRecord[]>;
|
|
59
|
+
follow(channel: ChannelRef, followed: boolean, signal?: AbortSignal): Promise<boolean>;
|
|
60
|
+
saveDescriptor(channel: ChannelRef, result: ChannelResolveResult, operation?: ChannelOperation, signal?: AbortSignal): Promise<ChannelInfo | undefined>;
|
|
61
|
+
saveOperation(operation: ChannelOperation, signal?: AbortSignal): Promise<void>;
|
|
62
|
+
operations(signal?: AbortSignal): Promise<readonly ChannelOperation[]>;
|
|
63
|
+
hasOperation(operation: ChannelOperation, signal?: AbortSignal): Promise<boolean>;
|
|
64
|
+
acknowledgePublication(operation: ChannelOperation, sequence: number): Promise<ChannelOperation>;
|
|
65
|
+
confirmPublication(channel: ChannelRef, sequence: number, request: ChannelPost, signal?: AbortSignal): Promise<void>;
|
|
66
|
+
completeOperation(operation: ChannelOperation, deletion?: boolean, signal?: AbortSignal): Promise<ChannelPostChange | undefined>;
|
|
67
|
+
publication(channel: ChannelRef, request: ChannelPost, signal?: AbortSignal): Promise<number | undefined>;
|
|
68
|
+
readPage(channel: ChannelRef, query: ChannelReadQuery, reader: ChannelReader, advance: boolean, signal?: AbortSignal): Promise<{
|
|
69
|
+
page: ChannelReadPage;
|
|
70
|
+
changes: ChannelChanges;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/channels/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { ProtocolError, StateConflictError } from '../errors.js';
|
|
2
|
+
import { applyChannelPostEdit, channelDescriptorCodec, channelEventCodec, channelPayloadCodec, channelPostCodec, channelReadPageCodec, channelResolveResultCodec, validateChannelPayload, validateChannelReadPage, validateChannelReadQuery, validateChannelRef, validateChannelPostRef, verifyChannelDescriptor, verifyChannelEvent, } from '../models/channels.js';
|
|
3
|
+
import { canonicalJson, requireObject, requireSafeInteger } from '../protocol/json.js';
|
|
4
|
+
import { updateStore } from '../storage/transaction.js';
|
|
5
|
+
import { snapshotReader } from '../messages/repository.js';
|
|
6
|
+
const prefix = (channel) => `${channel.channelId}|`;
|
|
7
|
+
const index = (number) => { requireSafeInteger(number, 0); return String(number).padStart(16, '0'); };
|
|
8
|
+
const channelKey = (channel) => ({ collection: 'channels', key: channel.channelId });
|
|
9
|
+
const postKey = (channel, sequence) => ({ collection: 'channel_posts', key: `${prefix(channel)}${index(sequence)}` });
|
|
10
|
+
const descriptorKey = (channel, revision) => ({ collection: 'channel_descriptors', key: `${prefix(channel)}${index(revision)}` });
|
|
11
|
+
const eventKey = (channel, sequence) => ({ collection: 'channel_events', key: `${prefix(channel)}${index(sequence)}` });
|
|
12
|
+
const put = (key, value) => ({ ...key, kind: 'put', value });
|
|
13
|
+
const fingerprint = (value) => canonicalJson(value ?? null);
|
|
14
|
+
const sameRows = (a, b) => a.length === b.length && a.every((row, i) => row.key === b[i].key && fingerprint(row.value) === fingerprint(b[i].value));
|
|
15
|
+
export function channelOperationKey(operation) {
|
|
16
|
+
const target = operation.payload.kind === 'edit' || operation.payload.kind === 'delete' ? `post:${index(operation.payload.value.targetSequence)}` : 'channel';
|
|
17
|
+
return { collection: 'channel_operations', key: `${prefix(operation.channel)}${target}` };
|
|
18
|
+
}
|
|
19
|
+
export function encodeChannelOperation(operation) { return { channelId: operation.channel.channelId, relayId: operation.channel.relayId, method: operation.method, payload: channelPayloadCodec.encode(operation.payload), ...(operation.acceptedSequence === undefined ? {} : { acceptedSequence: operation.acceptedSequence }) }; }
|
|
20
|
+
export function readChannelOperation(row) {
|
|
21
|
+
const value = row.value;
|
|
22
|
+
const channel = { channelId: String(value.channelId), relayId: String(value.relayId) };
|
|
23
|
+
validateChannelRef(channel);
|
|
24
|
+
const payload = channelPayloadCodec.decode(value.payload);
|
|
25
|
+
const method = value.method;
|
|
26
|
+
const expected = payload.kind === 'descriptor' ? ['channel.create', 'channel.update', 'channel.close'] : payload.kind === 'post' ? ['channel.post'] : [`channel.post.${payload.kind}`];
|
|
27
|
+
if (value.acceptedSequence !== undefined) {
|
|
28
|
+
requireSafeInteger(value.acceptedSequence, 1);
|
|
29
|
+
if (method !== 'channel.post')
|
|
30
|
+
throw new ProtocolError('invalid_storage', 'Only a publication has an accepted sequence.');
|
|
31
|
+
}
|
|
32
|
+
const result = { channel, method, payload, ...(value.acceptedSequence === undefined ? {} : { acceptedSequence: value.acceptedSequence }) };
|
|
33
|
+
if (!expected.includes(method) || payload.value.channelId !== channel.channelId || channelOperationKey(result).key !== row.key)
|
|
34
|
+
throw new ProtocolError('invalid_storage', 'Stored channel operation has inconsistent method or resource binding.');
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
function decodeChannel(value, channel) {
|
|
38
|
+
if (!value)
|
|
39
|
+
return { channel, syncSequence: -1, isFollowed: false };
|
|
40
|
+
if (value.relayId !== channel.relayId || typeof value.isFollowed !== 'boolean')
|
|
41
|
+
throw new ProtocolError('invalid_binding', 'Stored channel belongs to another relay or is malformed.');
|
|
42
|
+
requireSafeInteger(value.syncSequence, -1);
|
|
43
|
+
return { channel, syncSequence: value.syncSequence, isFollowed: value.isFollowed, ...(value.descriptor ? { descriptor: channelDescriptorCodec.decode(value.descriptor) } : {}) };
|
|
44
|
+
}
|
|
45
|
+
function encodeChannel(value) { return { relayId: value.channel.relayId, syncSequence: value.syncSequence, isFollowed: value.isFollowed, ...(value.descriptor ? { descriptor: channelDescriptorCodec.encode(value.descriptor) } : {}) }; }
|
|
46
|
+
function channelInfo(value) { return { ref: value.channel, isFollowed: value.isFollowed, ...(value.descriptor ? { descriptor: value.descriptor } : {}) }; }
|
|
47
|
+
function decodePost(value) {
|
|
48
|
+
requireSafeInteger(value.sequence, 1);
|
|
49
|
+
requireSafeInteger(value.appliedThrough, 0);
|
|
50
|
+
if (typeof value.isDeleted !== 'boolean')
|
|
51
|
+
throw new ProtocolError('invalid_storage', 'Malformed channel post deletion marker.');
|
|
52
|
+
if (value.acceptedAt !== undefined)
|
|
53
|
+
requireSafeInteger(value.acceptedAt, 0);
|
|
54
|
+
return { sequence: value.sequence, appliedThrough: value.appliedThrough, isDeleted: value.isDeleted,
|
|
55
|
+
...(value.messageId === undefined ? {} : { messageId: String(value.messageId), author: String(value.author), acceptedAt: value.acceptedAt }),
|
|
56
|
+
...(value.original ? { original: channelPostCodec.decode(value.original) } : {}), ...(value.post ? { post: channelPostCodec.decode(value.post) } : {}) };
|
|
57
|
+
}
|
|
58
|
+
function encodePost(value) {
|
|
59
|
+
return { sequence: value.sequence, appliedThrough: value.appliedThrough, isDeleted: value.isDeleted,
|
|
60
|
+
...(value.messageId === undefined ? {} : { messageId: value.messageId, author: value.author, acceptedAt: value.acceptedAt }),
|
|
61
|
+
...(value.original ? { original: channelPostCodec.encode(value.original) } : {}), ...(value.post ? { post: channelPostCodec.encode(value.post) } : {}) };
|
|
62
|
+
}
|
|
63
|
+
function postInfo(record, channel) {
|
|
64
|
+
if (record.isDeleted || !record.post)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (!record.messageId || !record.author || record.acceptedAt === undefined)
|
|
67
|
+
throw new ProtocolError('invalid_storage', 'Visible post lacks its original publication metadata.');
|
|
68
|
+
return { ref: { channel, sequence: record.sequence }, messageId: record.messageId, author: record.author, acceptedAt: record.acceptedAt,
|
|
69
|
+
...(record.post.body ? { body: record.post.body } : {}), ...(record.post.attachments ? { attachments: record.post.attachments } : {}) };
|
|
70
|
+
}
|
|
71
|
+
function target(event) { return event.payload.kind === 'post' ? event.sequence : event.payload.kind === 'edit' || event.payload.kind === 'delete' ? event.payload.value.targetSequence : undefined; }
|
|
72
|
+
function storeDescriptor(record, result, known) {
|
|
73
|
+
const next = result.descriptor;
|
|
74
|
+
const old = known.get(next.revision);
|
|
75
|
+
if (old && channelDescriptorCodec.stringify(old.descriptor) !== channelDescriptorCodec.stringify(next))
|
|
76
|
+
throw new ProtocolError('conflicting_revision', 'Channel descriptor conflicts with an already verified revision.');
|
|
77
|
+
const previous = record.descriptor;
|
|
78
|
+
if (previous && (previous.creator !== next.creator || previous.createdAt !== next.createdAt || canonicalJson([...previous.nonce]) !== canonicalJson([...next.nonce])))
|
|
79
|
+
throw new ProtocolError('immutable_field', 'Immutable channel fields changed.');
|
|
80
|
+
if (previous?.status === 'closed' && next.revision > previous.revision)
|
|
81
|
+
throw new ProtocolError('closed_channel', 'A closed channel cannot have a later descriptor revision.');
|
|
82
|
+
known.set(next.revision, result);
|
|
83
|
+
return previous && next.revision <= previous.revision ? record : { ...record, descriptor: next };
|
|
84
|
+
}
|
|
85
|
+
/** Verified evidence and projections commit together; all network reads occur before the CAS transaction. */
|
|
86
|
+
export class ChannelRepository {
|
|
87
|
+
store;
|
|
88
|
+
context;
|
|
89
|
+
accountId;
|
|
90
|
+
constructor(store, context, accountId) {
|
|
91
|
+
this.store = store;
|
|
92
|
+
this.context = context;
|
|
93
|
+
this.accountId = accountId;
|
|
94
|
+
}
|
|
95
|
+
async get(channel, signal) { validateChannelRef(channel); return decodeChannel((await this.store.read([channelKey(channel)], signal)).sets[0][0]?.value, channel); }
|
|
96
|
+
async post(post, signal) {
|
|
97
|
+
validateChannelPostRef(post);
|
|
98
|
+
const rows = await this.store.read([channelKey(post.channel), postKey(post.channel, post.sequence)], signal);
|
|
99
|
+
decodeChannel(rows.sets[0][0]?.value, post.channel);
|
|
100
|
+
const row = rows.sets[1][0];
|
|
101
|
+
return row && postInfo(decodePost(row.value), post.channel);
|
|
102
|
+
}
|
|
103
|
+
async posts(channelId, author, signal) {
|
|
104
|
+
const rows = await this.store.read([{ collection: 'channel_posts', ...(channelId ? { prefix: `${channelId}|` } : {}) }, { collection: 'channels' }], signal);
|
|
105
|
+
const channels = new Map(rows.sets[1].map(row => [row.key, { channelId: row.key, relayId: String(row.value.relayId) }]));
|
|
106
|
+
const values = rows.sets[0].map(row => postInfo(decodePost(row.value), channels.get(row.key.split('|')[0]))).filter((value) => value !== undefined && (author === undefined || value.author === author));
|
|
107
|
+
return snapshotReader(values);
|
|
108
|
+
}
|
|
109
|
+
async followed(relayId, signal) {
|
|
110
|
+
const rows = (await this.store.read([{ collection: 'channels' }], signal)).sets[0];
|
|
111
|
+
return rows.filter(row => row.value.isFollowed && (relayId === undefined || row.value.relayId === relayId)).map(row => decodeChannel(row.value, { channelId: row.key, relayId: String(row.value.relayId) }));
|
|
112
|
+
}
|
|
113
|
+
async follow(channel, followed, signal) {
|
|
114
|
+
return updateStore(this.store, [channelKey(channel)], snapshot => {
|
|
115
|
+
const row = snapshot.sets[0][0];
|
|
116
|
+
if (!row)
|
|
117
|
+
return { mutations: [], result: false };
|
|
118
|
+
const current = decodeChannel(row.value, channel);
|
|
119
|
+
return { mutations: current.isFollowed === followed ? [] : [put(channelKey(channel), encodeChannel({ ...current, isFollowed: followed }))], result: current.isFollowed !== followed };
|
|
120
|
+
}, signal);
|
|
121
|
+
}
|
|
122
|
+
async saveDescriptor(channel, result, operation, signal) {
|
|
123
|
+
verifyChannelDescriptor(result, this.context, channel);
|
|
124
|
+
const key = descriptorKey(channel, result.descriptor.revision);
|
|
125
|
+
return updateStore(this.store, [channelKey(channel), key, ...(operation ? [channelOperationKey(operation)] : [])], snapshot => {
|
|
126
|
+
const before = decodeChannel(snapshot.sets[0][0]?.value, channel);
|
|
127
|
+
const known = new Map();
|
|
128
|
+
if (snapshot.sets[1][0])
|
|
129
|
+
known.set(result.descriptor.revision, channelResolveResultCodec.decode(snapshot.sets[1][0].value));
|
|
130
|
+
const current = storeDescriptor(before, result, known);
|
|
131
|
+
const mutations = [put(channelKey(channel), encodeChannel(current)), put(key, channelResolveResultCodec.encode(result))];
|
|
132
|
+
if (operation && fingerprint(snapshot.sets[2][0]?.value) === canonicalJson(encodeChannelOperation(operation)))
|
|
133
|
+
mutations.push({ kind: 'delete', ...channelOperationKey(operation) });
|
|
134
|
+
return { mutations, result: current !== before ? channelInfo(current) : undefined };
|
|
135
|
+
}, signal);
|
|
136
|
+
}
|
|
137
|
+
async saveOperation(operation, signal) {
|
|
138
|
+
validateChannelRef(operation.channel);
|
|
139
|
+
validateChannelPayload(operation.payload, this.context);
|
|
140
|
+
const key = channelOperationKey(operation);
|
|
141
|
+
await updateStore(this.store, [key], snapshot => {
|
|
142
|
+
if (snapshot.sets[0].length)
|
|
143
|
+
throw new StateConflictError('An earlier operation on this channel resource remains unfinished. Start the component to recover it.');
|
|
144
|
+
return { mutations: [put(key, encodeChannelOperation(operation))], result: undefined };
|
|
145
|
+
}, signal);
|
|
146
|
+
}
|
|
147
|
+
async operations(signal) { return (await this.store.read([{ collection: 'channel_operations' }], signal)).sets[0].map(readChannelOperation); }
|
|
148
|
+
async hasOperation(operation, signal) { return fingerprint((await this.store.read([channelOperationKey(operation)], signal)).sets[0][0]?.value) === canonicalJson(encodeChannelOperation(operation)); }
|
|
149
|
+
async acknowledgePublication(operation, sequence) {
|
|
150
|
+
requireSafeInteger(sequence, 1);
|
|
151
|
+
if (operation.method !== 'channel.post')
|
|
152
|
+
throw new ProtocolError('invalid_operation', 'Only publications return sequence acknowledgements.');
|
|
153
|
+
const accepted = { ...operation, acceptedSequence: sequence };
|
|
154
|
+
const key = channelOperationKey(operation);
|
|
155
|
+
await updateStore(this.store, [key], snapshot => {
|
|
156
|
+
if (fingerprint(snapshot.sets[0][0]?.value) !== canonicalJson(encodeChannelOperation(operation)))
|
|
157
|
+
throw new StateConflictError('Publication changed before acknowledgement could be saved.');
|
|
158
|
+
return { mutations: [put(key, encodeChannelOperation(accepted))], result: undefined };
|
|
159
|
+
});
|
|
160
|
+
return accepted;
|
|
161
|
+
}
|
|
162
|
+
async confirmPublication(channel, sequence, request, signal) {
|
|
163
|
+
const value = (await this.store.read([postKey(channel, sequence)], signal)).sets[0][0]?.value;
|
|
164
|
+
if (!value)
|
|
165
|
+
throw new ProtocolError('missing_publication', 'Accepted publication is absent from the verified timeline.');
|
|
166
|
+
const post = decodePost(value);
|
|
167
|
+
if (post.messageId !== undefined && (post.messageId !== request.messageId || post.author !== this.accountId || post.original && channelPostCodec.stringify(post.original) !== channelPostCodec.stringify(request)))
|
|
168
|
+
throw new ProtocolError('conflicting_publication', 'Acknowledged sequence identifies another publication.');
|
|
169
|
+
}
|
|
170
|
+
async completeOperation(operation, deletion = false, signal) {
|
|
171
|
+
const channel = operation.channel;
|
|
172
|
+
const sequence = deletion && operation.payload.kind === 'delete' ? operation.payload.value.targetSequence : undefined;
|
|
173
|
+
return updateStore(this.store, [channelOperationKey(operation), channelKey(channel), ...(sequence ? [postKey(channel, sequence)] : [])], snapshot => {
|
|
174
|
+
const mutations = [];
|
|
175
|
+
let result;
|
|
176
|
+
if (fingerprint(snapshot.sets[0][0]?.value) !== canonicalJson(encodeChannelOperation(operation)))
|
|
177
|
+
return { mutations, result };
|
|
178
|
+
mutations.push({ kind: 'delete', ...channelOperationKey(operation) }, put(channelKey(channel), encodeChannel(decodeChannel(snapshot.sets[1][0]?.value, channel))));
|
|
179
|
+
if (sequence !== undefined) {
|
|
180
|
+
const previous = snapshot.sets[2][0]?.value;
|
|
181
|
+
const post = previous ? decodePost(previous) : { sequence, appliedThrough: sequence, isDeleted: false };
|
|
182
|
+
if (!post.isDeleted && post.post)
|
|
183
|
+
result = { ref: { channel, sequence }, kind: 'deleted' };
|
|
184
|
+
post.isDeleted = true;
|
|
185
|
+
delete post.post;
|
|
186
|
+
mutations.push(put(postKey(channel, sequence), encodePost(post)));
|
|
187
|
+
}
|
|
188
|
+
return { mutations, result };
|
|
189
|
+
}, signal);
|
|
190
|
+
}
|
|
191
|
+
async publication(channel, request, signal) {
|
|
192
|
+
const rows = (await this.store.read([{ collection: 'channel_posts', prefix: prefix(channel) }], signal)).sets[0];
|
|
193
|
+
const post = rows.map(row => decodePost(row.value)).find(value => value.messageId === request.messageId && value.author === this.accountId);
|
|
194
|
+
if (post?.original && channelPostCodec.stringify(post.original) !== channelPostCodec.stringify(request))
|
|
195
|
+
throw new ProtocolError('conflicting_publication', 'Synchronized publication differs from the exact pending request.');
|
|
196
|
+
return post?.sequence;
|
|
197
|
+
}
|
|
198
|
+
async readPage(channel, query, reader, advance, signal) {
|
|
199
|
+
validateChannelRef(channel);
|
|
200
|
+
validateChannelReadQuery(query);
|
|
201
|
+
if (query.channelId !== channel.channelId)
|
|
202
|
+
throw new ProtocolError('invalid_binding', 'History query belongs to another channel.');
|
|
203
|
+
const queries = [channelKey(channel), ...['channel_posts', 'channel_descriptors', 'channel_events', 'channel_operations'].map(collection => ({ collection, prefix: prefix(channel) }))];
|
|
204
|
+
const snapshot = await this.store.read(queries, signal);
|
|
205
|
+
let record = decodeChannel(snapshot.sets[0][0]?.value, channel);
|
|
206
|
+
const beforeChannel = record;
|
|
207
|
+
const known = new Map(snapshot.sets[2].map(row => { const result = channelResolveResultCodec.decode(row.value); verifyChannelDescriptor(result, this.context, channel); return [result.descriptor.revision, result]; }));
|
|
208
|
+
const descriptors = new Map();
|
|
209
|
+
const evidence = new Map();
|
|
210
|
+
const applied = new Set();
|
|
211
|
+
const read = async (selection) => {
|
|
212
|
+
const page = channelReadPageCodec.decode(channelReadPageCodec.encode(await reader.read(selection, signal)));
|
|
213
|
+
const certificates = validateChannelReadPage(page, selection, this.context);
|
|
214
|
+
for (const entry of page.events)
|
|
215
|
+
if (entry.payload.kind === 'descriptor') {
|
|
216
|
+
const resolved = { descriptor: entry.payload.value, signerCertificate: certificates.get(entry.signerDeviceId) };
|
|
217
|
+
verifyChannelDescriptor(resolved, this.context, channel);
|
|
218
|
+
const previous = descriptors.get(entry.descriptorRev) ?? known.get(entry.descriptorRev);
|
|
219
|
+
if (previous && channelDescriptorCodec.stringify(previous.descriptor) !== channelDescriptorCodec.stringify(resolved.descriptor))
|
|
220
|
+
throw new ProtocolError('conflicting_revision', 'Timeline descriptor conflicts with verified evidence.');
|
|
221
|
+
descriptors.set(entry.descriptorRev, resolved);
|
|
222
|
+
}
|
|
223
|
+
for (const entry of page.events) {
|
|
224
|
+
let resolved = descriptors.get(entry.descriptorRev) ?? known.get(entry.descriptorRev);
|
|
225
|
+
if (!resolved) {
|
|
226
|
+
resolved = await reader.resolve(entry.descriptorRev, signal);
|
|
227
|
+
verifyChannelDescriptor(resolved, this.context, channel);
|
|
228
|
+
if (resolved.descriptor.revision !== entry.descriptorRev)
|
|
229
|
+
throw new ProtocolError('invalid_revision', 'Relay returned a different descriptor revision.');
|
|
230
|
+
}
|
|
231
|
+
descriptors.set(entry.descriptorRev, resolved);
|
|
232
|
+
const certificate = certificates.get(entry.signerDeviceId);
|
|
233
|
+
verifyChannelEvent(entry, certificate, resolved.descriptor, this.context, channel);
|
|
234
|
+
const previous = evidence.get(entry.sequence)?.event ?? (snapshot.sets[3].find(row => row.key === eventKey(channel, entry.sequence).key)?.value.event ? channelEventCodec.decode(snapshot.sets[3].find(row => row.key === eventKey(channel, entry.sequence).key).value.event) : undefined);
|
|
235
|
+
if (previous && channelEventCodec.stringify(previous) !== channelEventCodec.stringify(entry))
|
|
236
|
+
throw new ProtocolError('conflicting_event', 'Timeline sequence conflicts with previously verified evidence.');
|
|
237
|
+
evidence.set(entry.sequence, { event: entry, certificate });
|
|
238
|
+
}
|
|
239
|
+
return page;
|
|
240
|
+
};
|
|
241
|
+
const page = await read(query);
|
|
242
|
+
const posts = new Map();
|
|
243
|
+
const originals = new Map();
|
|
244
|
+
const boundary = query.after ?? (page.events[0]?.sequence ?? 0) - 1;
|
|
245
|
+
for (const event of page.events) {
|
|
246
|
+
const sequence = target(event);
|
|
247
|
+
if (sequence === undefined || posts.has(sequence))
|
|
248
|
+
continue;
|
|
249
|
+
const saved = snapshot.sets[1].find(row => row.key === postKey(channel, sequence).key)?.value;
|
|
250
|
+
const before = saved && decodePost(saved);
|
|
251
|
+
originals.set(sequence, before);
|
|
252
|
+
const post = saved ? decodePost(saved) : { sequence, appliedThrough: sequence - 1, isDeleted: false };
|
|
253
|
+
posts.set(sequence, post);
|
|
254
|
+
const related = page.events.filter(entry => target(entry) === sequence);
|
|
255
|
+
const deletion = related.find(entry => entry.payload.kind === 'delete');
|
|
256
|
+
if (deletion) {
|
|
257
|
+
post.isDeleted = true;
|
|
258
|
+
delete post.post;
|
|
259
|
+
post.appliedThrough = Math.max(post.appliedThrough, deletion.sequence);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (post.isDeleted)
|
|
263
|
+
continue;
|
|
264
|
+
if (post.post)
|
|
265
|
+
post.appliedThrough = Math.max(post.appliedThrough, record.syncSequence);
|
|
266
|
+
if (related.some(entry => entry.payload.kind === 'edit' && entry.sequence > post.appliedThrough) && !related.some(entry => entry.payload.kind === 'post') && post.appliedThrough < boundary) {
|
|
267
|
+
let after = post.appliedThrough;
|
|
268
|
+
for (;;) {
|
|
269
|
+
const caught = await read({ channelId: channel.channelId, after });
|
|
270
|
+
for (const entry of caught.events)
|
|
271
|
+
if (target(entry) === sequence && (entry.sequence <= boundary || entry.payload.kind === 'delete')) {
|
|
272
|
+
this.#apply(post, entry, evidence.get(entry.sequence).certificate);
|
|
273
|
+
applied.add(entry.sequence);
|
|
274
|
+
}
|
|
275
|
+
if (!caught.hasMore || caught.events.at(-1).sequence >= boundary)
|
|
276
|
+
break;
|
|
277
|
+
after = caught.events.at(-1).sequence;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
for (const entry of page.events) {
|
|
282
|
+
const sequence = target(entry);
|
|
283
|
+
if (sequence !== undefined) {
|
|
284
|
+
this.#apply(posts.get(sequence), entry, evidence.get(entry.sequence).certificate);
|
|
285
|
+
applied.add(entry.sequence);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const changes = [];
|
|
289
|
+
const mutations = [];
|
|
290
|
+
for (const post of posts.values()) {
|
|
291
|
+
if (!post.isDeleted && !post.post)
|
|
292
|
+
throw new ProtocolError('missing_original', 'Original channel post is unavailable; the page remains uncommitted.');
|
|
293
|
+
post.appliedThrough = Math.max(post.appliedThrough, page.events.at(-1).sequence);
|
|
294
|
+
const before = originals.get(post.sequence);
|
|
295
|
+
const info = postInfo(post, channel);
|
|
296
|
+
if (!before?.isDeleted) {
|
|
297
|
+
if (post.isDeleted && before?.post)
|
|
298
|
+
changes.push({ ref: { channel, sequence: post.sequence }, kind: 'deleted' });
|
|
299
|
+
else if (info && fingerprint(before?.post && channelPostCodec.encode(before.post)) !== fingerprint(post.post && channelPostCodec.encode(post.post)))
|
|
300
|
+
changes.push({ ref: info.ref, kind: before?.post ? 'edited' : 'added', info });
|
|
301
|
+
}
|
|
302
|
+
mutations.push(put(postKey(channel, post.sequence), encodePost(post)));
|
|
303
|
+
}
|
|
304
|
+
for (const result of [...descriptors.values()].sort((a, b) => a.descriptor.revision - b.descriptor.revision)) {
|
|
305
|
+
record = storeDescriptor(record, result, known);
|
|
306
|
+
mutations.push(put(descriptorKey(channel, result.descriptor.revision), channelResolveResultCodec.encode(result)));
|
|
307
|
+
}
|
|
308
|
+
if (advance && page.events.length)
|
|
309
|
+
record = { ...record, syncSequence: Math.max(record.syncSequence, page.events.at(-1).sequence) };
|
|
310
|
+
mutations.push(put(channelKey(channel), encodeChannel(record)));
|
|
311
|
+
for (const { event, certificate } of evidence.values()) {
|
|
312
|
+
mutations.push(put(eventKey(channel, event.sequence), { event: channelEventCodec.encode(event) }));
|
|
313
|
+
// Catch-up verifies whole pages, but may project only an earlier subset
|
|
314
|
+
// for selected posts. Confirmation must commit with the affected projection.
|
|
315
|
+
if (!applied.has(event.sequence))
|
|
316
|
+
continue;
|
|
317
|
+
for (const row of snapshot.sets[4]) {
|
|
318
|
+
const operation = readChannelOperation(row);
|
|
319
|
+
const payload = operation.payload;
|
|
320
|
+
if (payload.kind === 'post' && event.payload.kind === 'post' && payload.value.messageId === event.payload.value.messageId && certificate.account === this.accountId) {
|
|
321
|
+
if (operation.acceptedSequence !== undefined && operation.acceptedSequence !== event.sequence)
|
|
322
|
+
throw new ProtocolError('invalid_sequence', 'Publication acknowledgement differs from its verified timeline sequence.');
|
|
323
|
+
if (canonicalJson(channelPayloadCodec.encode(payload)) !== canonicalJson(channelPayloadCodec.encode(event.payload)))
|
|
324
|
+
throw new ProtocolError('conflicting_publication', 'Synchronized post conflicts with the pending publication.');
|
|
325
|
+
mutations.push({ ...channelOperationKey(operation), kind: 'delete' });
|
|
326
|
+
}
|
|
327
|
+
else if ((payload.kind === 'edit' || payload.kind === 'delete') && payload.kind === event.payload.kind && target(event) === payload.value.targetSequence
|
|
328
|
+
&& (payload.kind === 'delete' || canonicalJson(channelPayloadCodec.encode(payload)) === canonicalJson(channelPayloadCodec.encode(event.payload))))
|
|
329
|
+
mutations.push({ ...channelOperationKey(operation), kind: 'delete' });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const unique = [...new Map(mutations.map(mutation => [`${mutation.collection}|${mutation.key}`, mutation])).values()];
|
|
333
|
+
await updateStore(this.store, queries, current => {
|
|
334
|
+
if (snapshot.sets.some((rows, i) => !sameRows(rows, current.sets[i])))
|
|
335
|
+
throw new StateConflictError('Channel state changed while history was being verified; retry with current state.');
|
|
336
|
+
return { mutations: unique, result: undefined };
|
|
337
|
+
}, signal);
|
|
338
|
+
return { page, changes: { posts: changes, ...(record.descriptor !== beforeChannel.descriptor ? { channel: channelInfo(record) } : {}) } };
|
|
339
|
+
}
|
|
340
|
+
#apply(post, entry, certificate) {
|
|
341
|
+
const payload = entry.payload;
|
|
342
|
+
if (payload.kind === 'post') {
|
|
343
|
+
if (post.messageId !== undefined) {
|
|
344
|
+
if (post.messageId !== payload.value.messageId || post.author !== certificate.account || post.original && channelPostCodec.stringify(post.original) !== channelPostCodec.stringify(payload.value))
|
|
345
|
+
throw new ProtocolError('conflicting_post', 'Original channel publication changed.');
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
post.messageId = payload.value.messageId;
|
|
349
|
+
post.author = certificate.account;
|
|
350
|
+
post.acceptedAt = entry.acceptedAt;
|
|
351
|
+
post.original = payload.value;
|
|
352
|
+
if (!post.isDeleted)
|
|
353
|
+
post.post = payload.value;
|
|
354
|
+
}
|
|
355
|
+
else if (payload.kind === 'delete') {
|
|
356
|
+
post.isDeleted = true;
|
|
357
|
+
delete post.post;
|
|
358
|
+
}
|
|
359
|
+
else if (payload.kind === 'edit' && !post.isDeleted && entry.sequence > post.appliedThrough) {
|
|
360
|
+
if (!post.post)
|
|
361
|
+
throw new ProtocolError('missing_original', 'Original channel post is unavailable; the page remains uncommitted.');
|
|
362
|
+
post.post = applyChannelPostEdit(post.post, payload.value);
|
|
363
|
+
}
|
|
364
|
+
post.appliedThrough = Math.max(post.appliedThrough, entry.sequence);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/channels/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EACH,oBAAoB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,yBAAyB,EACvJ,sBAAsB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,kBAAkB,GAErK,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAmB,MAAM,qBAAqB,CAAC;AAExG,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAW3D,MAAM,MAAM,GAAG,CAAC,OAAmB,EAAU,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC;AACxE,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtH,MAAM,UAAU,GAAG,CAAC,OAAmB,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAC5G,MAAM,OAAO,GAAG,CAAC,OAAmB,EAAE,QAAgB,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AACrJ,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,QAAgB,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,qBAAqB,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AACjK,MAAM,QAAQ,GAAG,CAAC,OAAmB,EAAE,QAAgB,EAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AACvJ,MAAM,GAAG,GAAG,CAAC,GAAc,EAAE,KAAiB,EAAiB,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACnG,MAAM,WAAW,GAAG,CAAC,KAA6B,EAAU,EAAE,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AAC5F,MAAM,QAAQ,GAAG,CAAC,CAA0B,EAAE,CAA0B,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACjN,MAAM,UAAU,mBAAmB,CAAC,SAA2B;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9J,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;AAC9F,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,SAA2B,IAAgB,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACnW,MAAM,UAAU,oBAAoB,CAAC,GAAiB;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAAC,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7I,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAQ,CAAC,CAAC;IAAC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAgC,CAAC;IAClH,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvL,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAAC,kBAAkB,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAAC,IAAI,MAAM,KAAK,cAAc;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,8CAA8C,CAAC,CAAC;IAAC,CAAC;IACvN,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;IAC3I,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG;QAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,uEAAuE,CAAC,CAAC;IACpP,OAAO,MAAM,CAAC;AAClB,CAAC;AACD,SAAS,aAAa,CAAC,KAA6B,EAAE,OAAmB;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,0DAA0D,CAAC,CAAC;IACvL,kBAAkB,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACrL,CAAC;AACD,SAAS,aAAa,CAAC,KAAoB,IAAgB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACrQ,SAAS,WAAW,CAAC,KAAoB,IAAiB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACvL,SAAS,UAAU,CAAC,KAAiB;IACjC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAAC,kBAAkB,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACnF,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,yCAAyC,CAAC,CAAC;IAChI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;QAC/F,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAoB,EAAE,CAAC;QACtJ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACjK,CAAC;AACD,SAAS,UAAU,CAAC,KAAiB;IAAgB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;QACpJ,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAW,EAAE,CAAC;QAC9H,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAAC,CAAC;AAC/J,SAAS,QAAQ,CAAC,MAAkB,EAAE,OAAmB;IACrD,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,uDAAuD,CAAC,CAAC;IAChL,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU;QACnI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAChJ,CAAC;AACD,SAAS,MAAM,CAAC,KAAmB,IAAwB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvO,SAAS,eAAe,CAAC,MAAqB,EAAE,MAA4B,EAAE,KAAwC;IAClH,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IAAC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrE,IAAI,GAAG,IAAI,sBAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,EAAE,iEAAiE,CAAC,CAAC;IAC3N,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;IACnC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,mCAAmC,CAAC,CAAC;IACvP,IAAI,QAAQ,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ;QAAE,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,2DAA2D,CAAC,CAAC;IAC/K,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACvI,CAAC;AAED,6GAA6G;AAC7G,MAAM,OAAO,iBAAiB;IACL,KAAK;IAA0B,OAAO;IAA2B,SAAS;IAA/F,YAAqB,KAAoB,EAAW,OAAuB,EAAW,SAAiB;qBAAlF,KAAK;uBAA0B,OAAO;yBAA2B,SAAS;IAAW,CAAC;IAC3G,KAAK,CAAC,GAAG,CAAC,OAAmB,EAAE,MAAoB,IAA4B,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACvN,KAAK,CAAC,IAAI,CAAC,IAAoB,EAAE,MAAoB;QACjD,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9F,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,SAAkB,EAAE,MAAe,EAAE,MAAoB;QACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7J,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA4B,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;QACtO,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,OAAgB,EAAE,MAAoB;QACjD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QACpF,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACjN,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAAmB,EAAE,QAAiB,EAAE,MAAoB;QACrE,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;YAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAAC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACvI,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1L,CAAC,EAAE,MAAM,CAAC,CAAC;IACf,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,OAAmB,EAAE,MAA4B,EAAE,SAA4B,EAAE,MAAoB;QACtH,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvH,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;YAC1H,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;YAC1H,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,yBAAyB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/H,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAAC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjL,IAAI,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,aAAa,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACtL,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACxF,CAAC,EAAE,MAAM,CAAC,CAAC;IACf,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,SAA2B,EAAE,MAAoB;QACjE,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,GAAG,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC3I,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE;YAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,MAAM;gBAAE,MAAM,IAAI,kBAAkB,CAAC,sGAAsG,CAAC,CAAC;YACnK,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC3F,CAAC,EAAE,MAAM,CAAC,CAAC;IACf,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,MAAoB,IAA0C,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACnM,KAAK,CAAC,YAAY,CAAC,SAA2B,EAAE,MAAoB,IAAsB,OAAO,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,aAAa,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1P,KAAK,CAAC,sBAAsB,CAAC,SAA2B,EAAE,QAAgB;QACtE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAAC,IAAI,SAAS,CAAC,MAAM,KAAK,cAAc;YAAE,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,qDAAqD,CAAC,CAAC;QAC9K,MAAM,QAAQ,GAAG,EAAE,GAAG,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAAC,MAAM,GAAG,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC1G,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE;YAC5C,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,aAAa,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,4DAA4D,CAAC,CAAC;YAC9L,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC1F,CAAC,CAAC,CAAC;QAAC,OAAO,QAAQ,CAAC;IACxB,CAAC;IACD,KAAK,CAAC,kBAAkB,CAAC,OAAmB,EAAE,QAAgB,EAAE,OAAoB,EAAE,MAAoB;QACtG,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QAC/F,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,aAAa,CAAC,qBAAqB,EAAE,4DAA4D,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACzJ,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,yBAAyB,EAAE,uDAAuD,CAAC,CAAC;IACpU,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,SAA2B,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAoB;QACvF,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAAC,MAAM,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QACzJ,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;YAChJ,MAAM,SAAS,GAAoB,EAAE,CAAC;YAAC,IAAI,MAAqC,CAAC;YACjF,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,aAAa,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;gBAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YAChI,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACpK,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtJ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI;oBAAE,MAAM,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAC3F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,IAAI,CAAC;gBAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/G,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACjC,CAAC,EAAE,MAAM,CAAC,CAAC;IACf,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,OAAmB,EAAE,OAAoB,EAAE,MAAoB;QAC7E,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAClH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5I,IAAI,IAAI,EAAE,QAAQ,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,yBAAyB,EAAE,kEAAkE,CAAC,CAAC;QAAC,OAAO,IAAI,EAAE,QAAQ,CAAC;IAC3P,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,OAAmB,EAAE,KAAuB,EAAE,MAAqB,EAAE,OAAgB,EAAE,MAAoB;QACtH,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAAC,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,2CAA2C,CAAC,CAAC;QACjM,MAAM,OAAO,GAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,aAAa,GAAG,MAAM,CAAC;QACxJ,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnO,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;QAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmE,CAAC;QACzJ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,EAAE,SAA2B,EAA4B,EAAE;YACzE,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACzL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACvE,MAAM,QAAQ,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAE,EAAE,CAAC;oBAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC3K,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACxF,IAAI,QAAQ,IAAI,sBAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,sBAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;wBAAE,MAAM,IAAI,aAAa,CAAC,sBAAsB,EAAE,uDAAuD,CAAC,CAAC;oBAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAC9R,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,IAAI,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;oBAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,KAAK,KAAK,CAAC,aAAa;wBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,iDAAiD,CAAC,CAAC;gBAAC,CAAC;gBACpS,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAAC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC;gBAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChM,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAE,CAAC,KAAK,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC/R,IAAI,QAAQ,IAAI,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,gEAAgE,CAAC,CAAC;gBAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9Q,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;QAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;QACzI,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACpE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;YAAC,MAAM,MAAM,GAAG,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3K,MAAM,IAAI,GAAe,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7I,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACxE,IAAI,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,IAAI,CAAC;gBAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC5I,IAAI,IAAI,CAAC,SAAS;gBAAE,SAAS;YAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACtH,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,GAAG,QAAQ,EAAE,CAAC;gBAC1L,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;gBAChC,SAAS,CAAC;oBAAC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;wBAAE,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;4BACnI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,WAAW,CAAC,CAAC;4BAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBACrG,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,IAAI,QAAQ;wBAAE,MAAM;oBAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC;gBACrH,CAAC;YACL,CAAC;QACL,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,WAAW,CAAC,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;QAAC,CAAC;QACtN,MAAM,OAAO,GAAwB,EAAE,CAAC;QAAC,MAAM,SAAS,GAAoB,EAAE,CAAC;QAC/E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,qEAAqE,CAAC,CAAC;YACtJ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC;YAAC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACrK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;gBAAC,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;qBAClI,IAAI,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YAC1O,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAC,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACrR,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACrD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACnG,wEAAwE;YACxE,6EAA6E;YAC7E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC3C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBAAC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;oBAClK,IAAI,SAAS,CAAC,gBAAgB,KAAK,SAAS,IAAI,SAAS,CAAC,gBAAgB,KAAK,KAAK,CAAC,QAAQ;wBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,0EAA0E,CAAC,CAAC;oBACvN,IAAI,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAAE,MAAM,IAAI,aAAa,CAAC,yBAAyB,EAAE,2DAA2D,CAAC,CAAC;oBAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChT,CAAC;qBAAM,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,cAAc;uBACnJ,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjO,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtH,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;YAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,mFAAmF,CAAC,CAAC;YAC1L,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACpD,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IAC9I,CAAC;IACD,MAAM,CAAC,IAAgB,EAAE,KAAmB,EAAE,WAA8B;QACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,uCAAuC,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACtU,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;YAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;QACnM,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,IAAI,CAAC;QAAC,CAAC;aAC7E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,qEAAqE,CAAC,CAAC;YAAC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACnM,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC;CACJ"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AccountManager } from '../components/account.js';
|
|
2
|
+
import type { DeviceManager } from '../components/device.js';
|
|
3
|
+
import type { ProfileManager } from '../components/profile.js';
|
|
4
|
+
import type { BackgroundFailure } from '../components/component.js';
|
|
5
|
+
import { type AccountDeviceState } from '../models/identity.js';
|
|
6
|
+
import type { NetworkContext } from '../protocol/context.js';
|
|
7
|
+
import { type RuntimeClock } from '../runtime/clock.js';
|
|
8
|
+
import type { MeshlineStore } from '../storage/store.js';
|
|
9
|
+
import type { RelayClientPool } from '../transport/pool.js';
|
|
10
|
+
export interface AccountEstablishmentOptions {
|
|
11
|
+
readonly relayId?: string;
|
|
12
|
+
readonly certificateValiditySeconds?: number;
|
|
13
|
+
readonly routeValiditySeconds?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface AccountRecoveryOptions extends AccountEstablishmentOptions {
|
|
16
|
+
readonly previousDeviceState?: AccountDeviceState;
|
|
17
|
+
readonly deviceStateRevision?: number;
|
|
18
|
+
readonly routeRevision?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface AccountOperationsOptions {
|
|
21
|
+
readonly store: MeshlineStore;
|
|
22
|
+
readonly pool: RelayClientPool;
|
|
23
|
+
readonly account: AccountManager;
|
|
24
|
+
readonly device: DeviceManager;
|
|
25
|
+
readonly profile: ProfileManager;
|
|
26
|
+
readonly context: NetworkContext;
|
|
27
|
+
readonly accountId: string;
|
|
28
|
+
readonly clock: RuntimeClock;
|
|
29
|
+
report(failure: BackgroundFailure): void;
|
|
30
|
+
}
|
|
31
|
+
/** Called under the owning client's account-operation gate. Child publications retain their exact signed requests. */
|
|
32
|
+
export declare class ClientAccountOperations {
|
|
33
|
+
#private;
|
|
34
|
+
readonly host: AccountOperationsOptions;
|
|
35
|
+
constructor(host: AccountOperationsOptions);
|
|
36
|
+
establish(source: AccountEstablishmentOptions, signal: AbortSignal): Promise<void>;
|
|
37
|
+
recover(source: AccountRecoveryOptions, signal: AbortSignal): Promise<void>;
|
|
38
|
+
resumeMigration(signal: AbortSignal): Promise<void>;
|
|
39
|
+
migrate(relayId: string, signal: AbortSignal): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=account-operations.d.ts.map
|