From 038bcce51aca5bb145d4976a2c9703bd2956fe8f Mon Sep 17 00:00:00 2001 From: Robin Berjon Date: Thu, 27 Aug 2026 10:40:39 +0200 Subject: [PATCH] switch to spaces --- deno.json | 7 +- deno.lock | 21 + docs/SYNC-DESIGN.md | 5 + docs/SYNC-SPACES.md | 143 +++- lexicons/space/ziran/checkpoint.json | 39 + lexicons/space/ziran/doc.json | 36 + lexicons/space/ziran/inbox.json | 15 + lexicons/space/ziran/info.json | 27 + lexicons/space/ziran/invite.json | 43 ++ lexicons/space/ziran/op.json | 51 ++ lexicons/space/ziran/presence.json | 27 + lexicons/space/ziran/workspace.json | 19 + main.ts | 168 +++-- src/components/zn-base-window.ts | 139 +++- src/components/zn-connections.ts | 137 +++- src/server/api.ts | 43 +- src/server/atsession.ts | 23 + src/server/deeplink.test.ts | 1 + src/server/paths.ts | 2 + src/server/sync.ts | 28 +- src/server/tilefile.ts | 11 + src/state/backend.ts | 4 +- src/state/desk.ts | 18 +- src/sync/e2e.test.ts | 1 + src/sync/newcomer.test.ts | 1 + src/sync/protocol.ts | 4 + src/sync/provider.ts | 93 +++ src/sync/reconnect.test.ts | 1 + src/sync/restart-invite.test.ts | 1 + src/sync/richtext-crdt.test.ts | 142 ++++ src/sync/signedout.test.ts | 1 + src/sync/spaces/causal.ts | 82 ++ src/sync/spaces/checkpoint.ts | 103 +++ src/sync/spaces/client.ts | 58 +- src/sync/spaces/fake.ts | 50 +- src/sync/spaces/provider.test.ts | 342 +++++++++ src/sync/spaces/provider.ts | 1041 ++++++++++++++++++++++++++ src/sync/spaces/registry.ts | 99 +++ src/sync/tiles-logic.test.ts | 156 ++++ src/types.ts | 21 +- static/app.js | 279 ++++++- tiles/built/checklist.tile | Bin 6716 -> 8497 bytes tiles/built/richtext.tile | Bin 264429 -> 381992 bytes tiles/built/tictactoe.tile | Bin 8518 -> 11652 bytes tiles/checklist/index.html | 42 +- tiles/checklist/logic.js | 49 ++ tiles/richtext/index.html | 142 ++-- tiles/richtext/vendor/pm.js | 22 +- tiles/tictactoe/index.html | 84 +-- tiles/tictactoe/logic.js | 85 +++ tools/entries/pm-entry.ts | 4 + tools/spaces-publish-lexicons.ts | 191 +++++ website/site/account/index.html | 236 ++++++ website/site/index.html | 19 +- 54 files changed, 4069 insertions(+), 287 deletions(-) create mode 100644 lexicons/space/ziran/checkpoint.json create mode 100644 lexicons/space/ziran/doc.json create mode 100644 lexicons/space/ziran/inbox.json create mode 100644 lexicons/space/ziran/info.json create mode 100644 lexicons/space/ziran/invite.json create mode 100644 lexicons/space/ziran/op.json create mode 100644 lexicons/space/ziran/presence.json create mode 100644 lexicons/space/ziran/workspace.json create mode 100644 src/sync/provider.ts create mode 100644 src/sync/richtext-crdt.test.ts create mode 100644 src/sync/spaces/causal.ts create mode 100644 src/sync/spaces/checkpoint.ts create mode 100644 src/sync/spaces/provider.test.ts create mode 100644 src/sync/spaces/provider.ts create mode 100644 src/sync/spaces/registry.ts create mode 100644 src/sync/tiles-logic.test.ts create mode 100644 tiles/checklist/logic.js create mode 100644 tiles/tictactoe/logic.js create mode 100644 tools/spaces-publish-lexicons.ts create mode 100644 website/site/account/index.html diff --git a/deno.json b/deno.json index bf2f717..a40bc13 100644 --- a/deno.json +++ b/deno.json @@ -16,9 +16,11 @@ "build:icons": "deno run -A tools/make-icons.ts", "dev": "deno task build:ui && deno run -A --watch main.ts", "relay": "deno run -A relay/main.ts", - "test:spaces": "deno run -A src/sync/spaces/client.test.ts", + "test:spaces": "deno run -A src/sync/spaces/client.test.ts && deno run -A src/sync/spaces/provider.test.ts", "devnet:spaces": "bash tools/spaces-devnet.sh", - "test:sync": "deno run -A src/sync/spaces/client.test.ts && deno run -A relay/test.ts && deno run -A src/sync/mls.test.ts && deno run -A src/sync/mls-transport.test.ts && deno run -A src/sync/atproto.test.ts && deno run -A src/sync/e2e.test.ts && deno run -A src/sync/newcomer.test.ts && deno run -A src/sync/reconnect.test.ts && deno run -A src/sync/restart-invite.test.ts && deno run -A src/sync/signedout.test.ts && deno run -A src/server/keeper.test.ts && deno run -A src/server/deeplink.test.ts", + "lex:publish": "deno run -A tools/spaces-publish-lexicons.ts", + "test:tiles": "deno run -A src/sync/tiles-logic.test.ts && deno run -A src/sync/richtext-crdt.test.ts", + "test:sync": "deno run -A src/sync/spaces/client.test.ts && deno run -A src/sync/spaces/provider.test.ts && deno run -A src/sync/tiles-logic.test.ts && deno run -A src/sync/richtext-crdt.test.ts && deno run -A relay/test.ts && deno run -A src/sync/mls.test.ts && deno run -A src/sync/mls-transport.test.ts && deno run -A src/sync/atproto.test.ts && deno run -A src/sync/e2e.test.ts && deno run -A src/sync/newcomer.test.ts && deno run -A src/sync/reconnect.test.ts && deno run -A src/sync/restart-invite.test.ts && deno run -A src/sync/signedout.test.ts && deno run -A src/server/keeper.test.ts && deno run -A src/server/deeplink.test.ts", "desktop": "deno task build:ui && deno desktop --hmr -A --include static --include vendor --include tiles --include build main.ts", "build": "deno task build:ui && deno desktop -A --include static --include vendor --include tiles --include build --icon build/icon-mac-1024.png --output dist/Ziran.app main.ts && deno run -A tools/mac-bundle.ts dist/Ziran.app", "build:mac": "deno task build:ui && deno desktop -A --include static --include vendor --include tiles --include build --icon build/icon-mac-1024.png --target aarch64-apple-darwin --output dist/Ziran-arm64.app main.ts && deno run -A tools/mac-bundle.ts dist/Ziran-arm64.app", @@ -79,6 +81,7 @@ "@atproto/oauth-client-node": "npm:@atproto/oauth-client-node@^0.5.2", "@atproto/api": "npm:@atproto/api@^0.17.0", "yjs": "npm:yjs@^13.6.27", + "y-prosemirror": "npm:y-prosemirror@^1.3.7", "prosemirror-state": "npm:prosemirror-state@^1.4.3", "prosemirror-view": "npm:prosemirror-view@^1.34.0", "prosemirror-model": "npm:prosemirror-model@^1.22.0", diff --git a/deno.lock b/deno.lock index 5ba0286..21fe407 100644 --- a/deno.lock +++ b/deno.lock @@ -2,6 +2,7 @@ "version": "5", "specifiers": { "jsr:@std/internal@^1.0.14": "1.0.14", + "jsr:@std/path@1": "1.1.6", "jsr:@std/path@^1.1.0": "1.1.6", "npm:@atcute/car@^6.0.2": "6.0.2_@atcute+cbor@2.3.5__@atcute+cid@2.4.2_@atcute+cid@2.4.2", "npm:@atcute/cbor@^2.3.5": "2.3.5_@atcute+cid@2.4.2", @@ -40,6 +41,7 @@ "npm:prosemirror-transform@^1.9.0": "1.12.0", "npm:prosemirror-view@^1.34.0": "1.42.2", "npm:ts-mls@^1.6.2": "1.6.2_@noble+curves@2.3.0", + "npm:y-prosemirror@^1.3.7": "1.3.7_prosemirror-model@1.25.11_prosemirror-state@1.4.4_prosemirror-view@1.42.2_y-protocols@1.0.7__yjs@13.6.32_yjs@13.6.32", "npm:yjs@^13.6.27": "13.6.32" }, "jsr": { @@ -1318,6 +1320,24 @@ "wrappy@1.0.2": { "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "y-prosemirror@1.3.7_prosemirror-model@1.25.11_prosemirror-state@1.4.4_prosemirror-view@1.42.2_y-protocols@1.0.7__yjs@13.6.32_yjs@13.6.32": { + "integrity": "sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==", + "dependencies": [ + "lib0", + "prosemirror-model", + "prosemirror-state", + "prosemirror-view", + "y-protocols", + "yjs" + ] + }, + "y-protocols@1.0.7_yjs@13.6.32": { + "integrity": "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==", + "dependencies": [ + "lib0", + "yjs" + ] + }, "yjs@13.6.32": { "integrity": "sha512-lfiJIIC4Xayt5ItynE407ehlE03pCjeOc4hkR4yxxvvNJ4kuiN25B0g+Qp8XagYz361LLL7DCzR5bvFJ81QKtQ==", "dependencies": [ @@ -1364,6 +1384,7 @@ "npm:prosemirror-transform@^1.9.0", "npm:prosemirror-view@^1.34.0", "npm:ts-mls@^1.6.2", + "npm:y-prosemirror@^1.3.7", "npm:yjs@^13.6.27" ] } diff --git a/docs/SYNC-DESIGN.md b/docs/SYNC-DESIGN.md index afd4913..3455c0e 100644 --- a/docs/SYNC-DESIGN.md +++ b/docs/SYNC-DESIGN.md @@ -3,6 +3,11 @@ Decisions confirmed by Robin, 2026-08-06. Chosen direction: **Option C** (relay substrate + MLS E2EE). See SYNC-OPTIONS.md for the research behind it. +> **Status (2026-08-25):** this stack is built, tested, and **parked** behind +> `ZIRAN_SYNC=relay`. The shipping provider is AT Proto Spaces +> (SYNC-SPACES.md) — no E2EE, credible exit. This design remains the E2EE +> return path once Spaces has taught us what the needs really are. + ## Confirmed decisions - **Relay**: one relay at `ziran.space`, single-tenant. Federation and diff --git a/docs/SYNC-SPACES.md b/docs/SYNC-SPACES.md index 3a2b40e..302422d 100644 --- a/docs/SYNC-SPACES.md +++ b/docs/SYNC-SPACES.md @@ -262,14 +262,135 @@ documents survive Ziran-the-service entirely. `src/sync/spaces/fake.ts` (in-memory network: PLC + PDS + space host), `src/sync/spaces/client.test.ts` — 22 offline checks green (`deno task test:spaces`, also first in `test:sync`). -- **D. Lexicons + record schemas** — `space.ziran.*` set, publish script, - `_lexicon` DNS TXT. -- **E. SpacesProvider** — provider seam extraction, registry v2, go-live - space picker, manifest `at` field + stripping, lazy checkpoints, causal - delivery, polling scheduler. -- **F. Invites + UI** — inbox space auto-create, invite listening/accept, - Documents column with location grouping, per-space membership UI. -- **G. Tiles** — verify checklist commutativity, tictactoe parent discipline, - richtext → y-prosemirror port, presence records. -- **H. Docs + cross-device verification** on Robin's machines; flip default - provider; record follow-ups for the post-alpha protocol. +- **D. Lexicons + record schemas — DONE (2026-08-25)** except DNS. + `lexicons/space/ziran/*.json`: the `space.ziran.workspace` + `space.ziran.inbox` + space types and the info/doc/op/checkpoint/presence/invite records. + Published as `com.atproto.lexicon.schema` records (rkey = NSID, bulletin's + pattern; the spaces-alpha PDS validates the `space` def type natively) in + the authority repo `lexicons.pds.ziran.space` + (`did:plc:axdexdy7p7yvuunn2mvuvy32`) via `deno task lex:publish` — + idempotent (canonical-digest upsert); credentials in the gitignored + `.env.lex-authority` (recoverable via the PDS admin API if lost). + **Remaining Robin action:** DNS TXT `_lexicon.ziran.space` → + `"did=did:plc:axdexdy7p7yvuunn2mvuvy32"` (the publish script reports its + status). Clients keep `validate:false` regardless (alpha PDSes don't + resolve space-type NSIDs at createSpace time). +- **E. SpacesProvider — DONE (2026-08-25).** The `CollabProvider` seam + (`src/sync/provider.ts`) now sits above both stacks: `RelayProvider` + (`src/server/sync.ts`, the whole relay+MLS stack, still the default) and + `SpacesProvider` (`src/sync/spaces/provider.ts`, behind `ZIRAN_SYNC=spaces` + until Phase H flips it). Landed: registry v2 (`sync/spaces.json`); causal + delivery (`causal.ts` — settled-set parent predicate, NOT a per-author + rkey watermark: one DID is many devices writing one repo, so rkeys are not + monotonic per author and only revs order a repo; dedup is per-doc rev + watermarks + an own-echo list); atile-style checkpoints (`checkpoint.ts`, + go-live mandatory + ~500-op/512KB threshold at most 1/hr + explicit + publish via `/api/docs/:id/sync/publish`); adoption (newest checkpoint → + verified blobs → tile writer → cursor-rewind replay); op batching via + `space.applyWrites` with client-assigned TIDs so intra-batch parent chains + are correct as written; polling (hot 2s / warm 30s, immediate after own + write, listSpaces sweep 60s); manifest `at` stamping (`setTileAt`) and + stripping in `writeModelTile`; the go-live space picker in zn-connections + (per-space membership + no-E2EE copy). Auth: `ZIRAN_SPACES_HANDLE/_PASSWORD/ + _PDS` env password session (dev identity), else the OAuth session's fetch + (scope acceptance on space endpoints still unverified). Tests: + `src/sync/spaces/provider.test.ts` (28 checks vs the fake, in + `test:spaces`/`test:sync`) plus a live two-device smoke against + pds.ziran.space (share → discover → adopt → exchange, all green). + Recorded follow-up: the per-doc settled-rkey set grows with history — + compaction post-alpha. Ephemerals are a no-op until presence records (G); + spaces invites error politely until F. +- **F. Invites + UI — DONE (2026-08-25).** Inbox space auto-created on + connect (`space.ziran.inbox/self`, public policy; the real PDS answers + `SpaceAlreadyExists` on the re-run). invite() = owner-only addMember + + role assignment on the doc record (author-authoritative) + a + `space.ziran.invite` delivered into the invitee's inbox; an identity with + no inbox yet gets membership anyway and the invite reports `pending` with + the link as the only path. `ziran://space?ref=…&doc=…` links adopt + directly (deeplink API + CLI args). Inbox polled ~60s; invitations + surface in the existing strip; accept = adopt (auto-dismissing any + matching invite however adoption happens); dismissals are app-local and + persisted (`dismissedInvites` — the record belongs to the inviter). UI: + the base window's Recent column is now **Documents**, sortable Most + recent | By location (foldable Local Device + per-space groups; a space + doc not on this machine shows with a fetch affordance that adopts); + zn-connections gains the spaces invite form (owner-only messaging, + per-space membership copy) and both sign-in prompts link to the + create-account page. `website/site/account/` is a static signup page for + pds.ziran.space (invite-code createAccount, CORS verified open). + **Wire-truth fix caught live:** `space.listRecords` returns + `{collection, rkey, cid, value}` — NO `uri` (fake + client updated to the + real shape; the earlier assumption came from the fake). Tests: provider + suite now 36 checks; live smoke covers share → second-device adopt → + cross-account invite → inbox discovery → accept → replay, all green + against pds.ziran.space. +- **G. Tiles — DONE (2026-08-25).** + **Presence:** the provider putRecords `space.ziran.presence` (rkey = doc + rkey) every ~60s for every open shared doc; peers read beacons off the + oplog and mark a member present while theirs is younger than ~150s. + Roster members now carry `present`; the panel dims the dot for away + members. `sendEphemeral` stays a no-op — no cursors, as decided. + **Checklist:** op logic extracted to `tiles/checklist/logic.js` and made + genuinely convergent — `set` is LWW on an (at, author) stamp (concurrent + opposite toggles agree everywhere), item order is (at, id) rather than + arrival order, and ops apply optimistically (echoes are no-ops), which + also removes the own-action lag reducer tiles had. + **Tictactoe:** rewritten around `tiles/tictactoe/logic.js` — state is the + SET of ops seen and the board a deterministic fold (per slot, smallest-id + legal candidate wins), the parent-chain discipline taken to its fixed + point: any delivery order, echoes included, derives the same board; + optimistic local moves recompute if a concurrent claim wins. Legacy + `games` saves convert to ops on load. + **Richtext:** ported to Yjs via y-prosemirror (vendored into pm.js) — the + steps-with-arbiter machinery wanted a sequencer and is gone; updates ride + the causal log (`{t:'y'}` frames beside the existing comment op-CRDT), + persistence is the Y update form (`ydoc` + `comments` keys), legacy + ProseMirror-JSON saves migrate once (sharing travels the migrated file, + so peers never migrate separately), and on ready the tile ships its full + state once so offline-restart edits reach the log (a state-vector + handshake is the recorded refinement). Suggestion marks and comments + survive the port; richtext is no longer solo-only under Spaces. + **Tests:** `deno task test:tiles` — delivery-order permutation proofs for + both reducer tiles and a headless y-prosemirror pipeline check + (migration, mark preservation, cross-peer convergence, schema validity); + presence has fake-network coverage in the provider suite. All wired into + `test:sync`. +- **H. Docs + verification + default flip — software side DONE (2026-08-25).** + `SpacesProvider` is now the **default**; the relay stack sits behind + `ZIRAN_SYNC=relay` (its suites pin that env; SYNC-DESIGN.md carries the + parked-status note). Whole-app verification: two real Ziran processes + (default config, env credentials, real pds.ziran.space account) driven + through the HTTP API — boot online, create from model, go live into a new + space, autonomous second-device discovery, adopt, bidirectional ops, + presence — all green. Website copy de-E2EE'd honestly (own-PDS sync + + credible exit is the story; encryption is labeled roadmap) and pointed at + the /account/ signup. Remaining for Robin: the human pass on his actual + machines (UI feel, echo latency under typing, invite flow between his + accounts), and the website deploy. + +## Post-alpha follow-ups (recorded, deliberately not now) + +- **E2EE return:** the relay+MLS stack (SYNC-DESIGN.md) — revisit once + Spaces alpha experience settles what the protocol needs really are. +- **Settled-set compaction:** each doc's per-author delivered-rkey set grows + with history; compact once ops can be safely summarized (e.g. below the + newest universal checkpoint frontier). +- **State-vector handshake for Yjs tiles:** richtext (and livetext) ship + their full Y state on ready so offline-restart edits reach the log; + replace with a persisted sent-vector diff to stop op-log growth. +- **OAuth `space:` scopes:** move atsession.ts to the alpha OAuth packages + so real sign-ins reach the space endpoints; env-password sessions are the + proven interim path. +- **Invitation privacy:** the public-policy inbox is enumerable — revisit + via `appAccess: allowList` once Ziran has a hosted OAuth client identity, + or via the E2EE return. +- **Push:** a `notify.ziran.space` fan-out bridge as an accelerator over + polling (never a dependency). +- **Oplog hygiene:** presence beacons and full-state ready-frames bloat the + oplog; lean on server-side compaction when it lands (the record set is the + durable truth), or prune client cadence. +- **Cross-PDS vs the hosted alpha:** one live run against + `spaces-alpha.bsky.network` (Robin's account) to confirm nothing in the + hosted build surprises us; rate-limit ceilings under real typing load. +- **Per-doc membership + protocol write-gates:** accepted losses vs the + relay; candidates for protocol proposals once the alpha has evidence. diff --git a/lexicons/space/ziran/checkpoint.json b/lexicons/space/ziran/checkpoint.json new file mode 100644 index 0000000..a1b8262 --- /dev/null +++ b/lexicons/space/ziran/checkpoint.json @@ -0,0 +1,39 @@ +{ + "lexicon": 1, + "id": "space.ziran.checkpoint", + "defs": { + "main": { + "type": "record", + "description": "An atile-style published snapshot of a document, written by any member into their own repo (rkey = the doc's rkey; putRecord replaces the author's previous checkpoint). Carries the tile manifest with every resource's src replaced by an atproto blob ref, so an invitee can instantiate the document without replaying history, then apply ops past the frontier. Checkpoints are rare: go-live, a size threshold, or an explicit publish.", + "key": "tid", + "record": { + "type": "object", + "required": ["doc", "tile", "frontier", "createdAt"], + "properties": { + "doc": { + "type": "string", + "format": "tid", + "description": "rkey of the space.ziran.doc record this checkpoint snapshots." + }, + "tile": { + "type": "unknown", + "description": "The tile manifest, with each resource's src replaced by an atproto blob ref." + }, + "cid": { + "type": "string", + "format": "cid", + "description": "DRISL CID of the manifest, for end-to-end integrity verification." + }, + "frontier": { + "type": "unknown", + "description": "Map from member DID to the last repo rev whose ops this checkpoint incorporates." + }, + "createdAt": { + "type": "string", + "format": "datetime" + } + } + } + } + } +} diff --git a/lexicons/space/ziran/doc.json b/lexicons/space/ziran/doc.json new file mode 100644 index 0000000..cdc4c02 --- /dev/null +++ b/lexicons/space/ziran/doc.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "space.ziran.doc", + "defs": { + "main": { + "type": "record", + "description": "A live document in a workspace, written by the document's creator: the partial manifest linking a Ziran tile to its online identity. Document discovery in a space is the union of these records across member repos. The record's author is the sole authority for the document's role assignments; roles are enforced by tiles, not by the protocol.", + "key": "tid", + "record": { + "type": "object", + "required": ["name", "model", "createdAt"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable document name.", + "maxGraphemes": 200, + "maxLength": 2000 + }, + "model": { + "type": "string", + "format": "nsid", + "description": "Identifier of the tile model this document instantiates." + }, + "roles": { + "type": "unknown", + "description": "Per-document role assignments in the tile's own vocabulary: a map from DID (or the key 'default') to a role name." + }, + "createdAt": { + "type": "string", + "format": "datetime" + } + } + } + } + } +} diff --git a/lexicons/space/ziran/inbox.json b/lexicons/space/ziran/inbox.json new file mode 100644 index 0000000..a380587 --- /dev/null +++ b/lexicons/space/ziran/inbox.json @@ -0,0 +1,15 @@ +{ + "lexicon": 1, + "id": "space.ziran.inbox", + "defs": { + "main": { + "type": "space", + "key": "literal:self", + "name": "Ziran Invitation Inbox", + "description": "A public-policy space through which anyone can deliver a Ziran workspace invitation to this account. Invites are written into the sender's own repo; the recipient polls the space to discover them.", + "collections": [ + "space.ziran.invite" + ] + } + } +} diff --git a/lexicons/space/ziran/info.json b/lexicons/space/ziran/info.json new file mode 100644 index 0000000..9ff3944 --- /dev/null +++ b/lexicons/space/ziran/info.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "space.ziran.info", + "defs": { + "main": { + "type": "record", + "description": "Workspace metadata, written by the space authority (rkey self). Holds what simplespace itself has no field for.", + "key": "literal:self", + "record": { + "type": "object", + "required": ["name", "createdAt"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable workspace name.", + "maxGraphemes": 200, + "maxLength": 2000 + }, + "createdAt": { + "type": "string", + "format": "datetime" + } + } + } + } + } +} diff --git a/lexicons/space/ziran/invite.json b/lexicons/space/ziran/invite.json new file mode 100644 index 0000000..376c2bf --- /dev/null +++ b/lexicons/space/ziran/invite.json @@ -0,0 +1,43 @@ +{ + "lexicon": 1, + "id": "space.ziran.invite", + "defs": { + "main": { + "type": "record", + "description": "An invitation to a Ziran workspace, written by the inviter into their own repo inside the invitee's public-policy inbox space. The inviter must already have added the invitee as a member of the workspace; this record only makes that membership discoverable. Dismissal is app-local: the record belongs to the inviter.", + "key": "tid", + "record": { + "type": "object", + "required": ["space", "name", "createdAt"], + "properties": { + "space": { + "type": "string", + "format": "at-uri", + "description": "The workspace space the invitee has been added to." + }, + "name": { + "type": "string", + "description": "Human-readable workspace name, so the invite renders without a credential mint.", + "maxGraphemes": 200, + "maxLength": 2000 + }, + "doc": { + "type": "string", + "format": "tid", + "description": "Optional rkey of a specific space.ziran.doc record to highlight." + }, + "message": { + "type": "string", + "description": "Optional message from the inviter.", + "maxGraphemes": 1000, + "maxLength": 10000 + }, + "createdAt": { + "type": "string", + "format": "datetime" + } + } + } + } + } +} diff --git a/lexicons/space/ziran/op.json b/lexicons/space/ziran/op.json new file mode 100644 index 0000000..36c1146 --- /dev/null +++ b/lexicons/space/ziran/op.json @@ -0,0 +1,51 @@ +{ + "lexicon": 1, + "id": "space.ziran.op", + "defs": { + "main": { + "type": "record", + "description": "One tp-sync frame for a document, written by any member into their own repo. Ops are never deleted: a document is always rebuildable from an initial checkpoint plus the full op history. Per-author order is the repo's rev order; cross-author order is causal via parents, with deterministic (rev, author) tiebreak between concurrent siblings.", + "key": "tid", + "record": { + "type": "object", + "required": ["doc", "parents", "bytes"], + "properties": { + "doc": { + "type": "string", + "format": "tid", + "description": "rkey of the space.ziran.doc record this op belongs to." + }, + "parents": { + "type": "array", + "description": "Op-DAG heads the author had seen when this op was created. Empty for a document's first op.", + "items": { + "type": "ref", + "ref": "#parent" + } + }, + "bytes": { + "type": "bytes", + "description": "The tp-sync frame payload.", + "maxLength": 1000000 + } + } + } + }, + "parent": { + "type": "object", + "required": ["author", "rkey"], + "properties": { + "author": { + "type": "string", + "format": "did", + "description": "DID of the parent op's author." + }, + "rkey": { + "type": "string", + "format": "tid", + "description": "rkey of the parent op record in the author's repo." + } + } + } + } +} diff --git a/lexicons/space/ziran/presence.json b/lexicons/space/ziran/presence.json new file mode 100644 index 0000000..80c3a7a --- /dev/null +++ b/lexicons/space/ziran/presence.json @@ -0,0 +1,27 @@ +{ + "lexicon": 1, + "id": "space.ziran.presence", + "defs": { + "main": { + "type": "record", + "description": "Liveness beacon, written by any member into their own repo while they have the document open (rkey = the doc's rkey; refreshed by putRecord roughly every minute). Peers treat the author as present while the timestamp is recent.", + "key": "tid", + "record": { + "type": "object", + "required": ["doc", "at"], + "properties": { + "doc": { + "type": "string", + "format": "tid", + "description": "rkey of the space.ziran.doc record the author has open." + }, + "at": { + "type": "string", + "format": "datetime", + "description": "Time of the author's most recent liveness refresh." + } + } + } + } + } +} diff --git a/lexicons/space/ziran/workspace.json b/lexicons/space/ziran/workspace.json new file mode 100644 index 0000000..5440a2f --- /dev/null +++ b/lexicons/space/ziran/workspace.json @@ -0,0 +1,19 @@ +{ + "lexicon": 1, + "id": "space.ziran.workspace", + "defs": { + "main": { + "type": "space", + "key": "tid", + "name": "Ziran Workspace", + "description": "A shared workspace of live Ziran documents. Membership is space-wide: every member sees every document in the workspace, and each member's contributions are written to their own repo.", + "collections": [ + "space.ziran.info", + "space.ziran.doc", + "space.ziran.op", + "space.ziran.checkpoint", + "space.ziran.presence" + ] + } + } +} diff --git a/main.ts b/main.ts index 33397f4..1e39fd3 100644 --- a/main.ts +++ b/main.ts @@ -8,10 +8,13 @@ import { join } from '@std/path'; import { createHandler } from './src/server/api.ts'; import { ZiranStore } from './src/server/store.ts'; -import { SyncManager } from './src/server/sync.ts'; +import { RelayProvider } from './src/server/sync.ts'; +import type { CollabProvider } from './src/sync/provider.ts'; +import { SpacesProvider } from './src/sync/spaces/provider.ts'; +import { passwordSession, type SessionAuth, SpaceClient } from './src/sync/spaces/client.ts'; import { startTileServer } from './src/server/tileserver.ts'; import { focusWindow, hasDesktopWindows, openDocWindow, setupMainWindow } from './src/server/windows.ts'; -import { apiKeyFile, appDataDir, appPortFile } from './src/server/paths.ts'; +import { apiKeyFile, appDataDir, appPortFile, documentsDir, spacesRegistryFile } from './src/server/paths.ts'; // Deep links (ziran://…) and .tile files invoke the app as a NEW process // (that is how OS file/URL associations work). When an instance is already @@ -58,12 +61,73 @@ if (store.desktop) { store.focusOsWindow = focusWindow; } -const sync = new SyncManager(store); +const { AtSession } = await import('./src/server/atsession.ts'); +const at = new AtSession(); + +// The collaboration provider (docs/SYNC-SPACES.md): AT Proto Spaces by +// default — every member's contribution lives in their own PDS under a +// standard protocol, no Ziran infrastructure in the critical path. The +// relay+MLS stack stays intact behind ZIRAN_SYNC=relay (the E2EE return +// path; see SYNC-DESIGN.md). +const syncMode = Deno.env.get('ZIRAN_SYNC') === 'relay' ? 'relay' : 'spaces'; +const sync: CollabProvider = syncMode === 'spaces' ? makeSpacesProvider() : new RelayProvider(store); store.syncSummary = () => sync.summary(); store.onDocMoved = (oldId, newId, newPath) => sync.moved(oldId, newId, newPath); -const { AtSession } = await import('./src/server/atsession.ts'); -const at = new AtSession(); +function makeSpacesProvider(): SpacesProvider { + // Env credentials (dev, tests, alpha machines): a legacy password session — + // the space endpoints accept ACCESS_FULL tokens. Otherwise the OAuth + // sign-in's session signs own-PDS calls (its scope may not cover the space + // endpoints yet; a refusal shows up in the panel rather than crashing). + const envHandle = Deno.env.get('ZIRAN_SPACES_HANDLE'); + const envPassword = Deno.env.get('ZIRAN_SPACES_PASSWORD'); + const envPds = Deno.env.get('ZIRAN_SPACES_PDS'); + const envAuth = Boolean(envHandle && envPassword && envPds); + let cached: { auth: SessionAuth; at: number } | null = null; + let oauthFetch: typeof fetch | undefined; + return new SpacesProvider({ + host: { + doc: (id) => store.doc(id), + openPath: (p) => store.openPath(p), + isOpen: (id) => store.open.has(id), + broadcast: () => store.broadcast(), + broadcastEvent: (e) => store.broadcastEvent(e), + }, + auth: async () => { + if (envAuth) { + // Access JWTs age out (~2h): re-mint well inside that. + if (!cached || Date.now() - cached.at > 45 * 60 * 1000) { + cached = { auth: await passwordSession(envPds!, envHandle!, envPassword!), at: Date.now() }; + } + oauthFetch = undefined; + return cached.auth; + } + if (at.signedIn && at.did && at.pds) { + const fetchImpl = at.spacesFetch(); + if (fetchImpl) { + oauthFetch = fetchImpl; + return { did: at.did, pds: at.pds.replace(/\/+$/, ''), headers: () => Promise.resolve({}) }; + } + } + return null; + }, + clientFor: (auth) => new SpaceClient({ auth, fetch: oauthFetch }), + registryFile: spacesRegistryFile(), + documentsDir: documentsDir(), + atInfo: () => + at.signedIn + ? { + signedIn: true, + handle: at.handle ?? undefined, + did: at.did ?? undefined, + displayName: at.displayName ?? undefined, + hasAvatar: Boolean(at.avatar), + } + : { signedIn: false }, + devIdentity: () => envAuth, + handle: () => envHandle ?? at.handle ?? undefined, + }); +} // Bearer token: 127.0.0.1 is reachable by every local process, so the API // only answers requests carrying this key. It reaches the UI exclusively @@ -141,49 +205,55 @@ store.tileServerPort = await startTileServer(); store.broadcast(); console.log(`tile server on http://load.localhost:${store.tileServerPort}/`); -// Collaboration relay. Signed in, you talk to the hosted relay — an invite -// link is only shareable when it points somewhere the invitee can also -// reach. Signed out (dev identities), a local embedded relay keeps solo and -// same-machine work going. ZIRAN_RELAY overrides both. -const HOSTED_RELAY = 'wss://relay.ziran.space/ws'; -const localRelayUrl = await (async () => { - const port = 4191; - const url = `ws://127.0.0.1:${port}/ws`; - if (Deno.env.get('ZIRAN_RELAY')) return url; // overridden; don't bind ports - try { - const { startRelay, standardVerifier } = await import('./relay/main.ts'); - await startRelay({ - port, - dataDir: join(appDataDir(), 'relay'), - // The same door the hosted relay uses: atproto service-auth JWTs for - // signed-in people, dev HMAC tokens otherwise. - verifier: standardVerifier(), - }); - console.log(`embedded relay on ${url}`); - } catch { - // Port busy: usually a second Ziran (which is how same-machine - // collaboration works). Confirm it really is a relay before saying so. - const relay = await fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1500) }) - .then((r) => r.ok, () => false); - console.log( - relay - ? `joining the relay already running on ${url}` - : `port ${port} is taken by something that is not a Ziran relay — live sessions are paused`, - ); - } - return url; -})(); // AT sign-in restores any previous session before sync connects, so the -// relay handshake uses the real identity when there is one. +// backend handshake uses the real identity when there is one. try { await at.init(port); } catch (err) { console.warn('AT sign-in unavailable:', (err as Error).message); } -sync.init( - () => Deno.env.get('ZIRAN_RELAY') ?? (at.signedIn ? HOSTED_RELAY : localRelayUrl), - at, -).catch((err) => console.warn('sync init failed:', (err as Error).message)); + +if (sync instanceof RelayProvider) { + // Collaboration relay. Signed in, you talk to the hosted relay — an invite + // link is only shareable when it points somewhere the invitee can also + // reach. Signed out (dev identities), a local embedded relay keeps solo and + // same-machine work going. ZIRAN_RELAY overrides both. + const HOSTED_RELAY = 'wss://relay.ziran.space/ws'; + const localRelayUrl = await (async () => { + const relayPort = 4191; + const url = `ws://127.0.0.1:${relayPort}/ws`; + if (Deno.env.get('ZIRAN_RELAY')) return url; // overridden; don't bind ports + try { + const { startRelay, standardVerifier } = await import('./relay/main.ts'); + await startRelay({ + port: relayPort, + dataDir: join(appDataDir(), 'relay'), + // The same door the hosted relay uses: atproto service-auth JWTs for + // signed-in people, dev HMAC tokens otherwise. + verifier: standardVerifier(), + }); + console.log(`embedded relay on ${url}`); + } catch { + // Port busy: usually a second Ziran (which is how same-machine + // collaboration works). Confirm it really is a relay before saying so. + const relay = await fetch(`http://127.0.0.1:${relayPort}/health`, { signal: AbortSignal.timeout(1500) }) + .then((r) => r.ok, () => false); + console.log( + relay + ? `joining the relay already running on ${url}` + : `port ${relayPort} is taken by something that is not a Ziran relay — live sessions are paused`, + ); + } + return url; + })(); + sync.init( + () => Deno.env.get('ZIRAN_RELAY') ?? (at.signedIn ? HOSTED_RELAY : localRelayUrl), + at, + ).catch((err) => console.warn('sync init failed:', (err as Error).message)); +} else if (sync instanceof SpacesProvider) { + at.onChange = () => sync.retryNow(); + sync.init().catch((err) => console.warn('spaces sync init failed:', (err as Error).message)); +} // Reopen last session's document windows (desktop mode only; in a browser, // popup rules make silent restores hostile). @@ -210,6 +280,20 @@ for (const arg of Deno.args) { .catch((err) => console.warn('could not accept invitation:', (err as Error).message)); continue; } + if (arg.startsWith('ziran://space?') && sync instanceof SpacesProvider) { + const params = new URL(arg).searchParams; + const ref = params.get('ref'); + const docRkey = params.get('doc'); + if (ref && docRkey) { + sync.adopt(ref, docRkey) + .then(async ({ path }) => { + const info = await store.openPath(path); + store.createWindow([info.id]); + }) + .catch((err) => console.warn('could not fetch from the space link:', (err as Error).message)); + } + continue; + } if (!arg.endsWith('.tile')) continue; try { const info = await store.openPath(await Deno.realPath(arg)); diff --git a/src/components/zn-base-window.ts b/src/components/zn-base-window.ts index cdc1974..acc8d7a 100644 --- a/src/components/zn-base-window.ts +++ b/src/components/zn-base-window.ts @@ -13,17 +13,20 @@ export class ZnBaseWindow extends LitElement { query: { state: true }, dropping: { state: true }, menuRecent: { state: true }, + docSort: { state: true }, }; declare private query: string; declare private dropping: boolean; declare private menuRecent: RecentEntry | undefined; + declare private docSort: 'recent' | 'location'; constructor() { super(); this.query = ''; this.dropping = false; this.menuRecent = undefined; + this.docSort = 'recent'; } private onStore = () => this.requestUpdate(); @@ -369,6 +372,62 @@ export class ZnBaseWindow extends LitElement { margin: 0 0 var(--sp-2); padding-left: var(--sp-2); } + .region-head { + display: flex; + align-items: baseline; + gap: var(--sp-3); + } + .region-head h2 { + flex: 1; + } + .sort { + display: inline-flex; + gap: 2px; + border: 1px solid var(--line-soft); + border-radius: var(--r-full); + padding: 2px; + } + .sort button { + font: inherit; + font-size: var(--text-xs); + color: var(--ink-muted); + border: none; + background: none; + border-radius: var(--r-full); + padding: 2px 10px; + cursor: pointer; + } + .sort button[aria-pressed='true'] { + background: var(--panel); + color: var(--ink); + font-weight: var(--w-medium); + } + .sort button:focus-visible { + outline: 2px solid var(--signal); + outline-offset: 1px; + } + details.loc { + margin-bottom: var(--sp-1); + } + details.loc summary { + cursor: pointer; + font-size: var(--text-sm); + font-weight: var(--w-semibold); + color: var(--ink-muted); + padding: 6px var(--sp-2); + border-radius: var(--r-sm); + user-select: none; + } + details.loc summary:hover { + background: var(--panel); + } + details.loc summary:focus-visible { + outline: 2px solid var(--signal); + outline-offset: -2px; + } + details.loc summary .loc-count { + font-weight: var(--w-regular); + } .region { display: flex; flex-direction: column; @@ -650,8 +709,20 @@ export class ZnBaseWindow extends LitElement { ${this.renderInvitations()}
-
-

Recent

+
+
+

Documents

+
+ + +
+
${!desk.recents.length && !q ? html` @@ -660,15 +731,16 @@ export class ZnBaseWindow extends LitElement {

Ziran documents are tiles: they carry their own editor and live on this machine, with no cloud and no account. Invite someone and a document - syncs end-to-end encrypted, everyone keeping their own copy. Start from - a model to make your first one, or drop a .tile file anywhere on this - window. + syncs live, everyone keeping their own copy. Start from a model to make + your first one, or drop a .tile file anywhere on this window.

` - : recents.length - ? recents.map((d) => this.renderRow(d, open.has(d.id), d === enterDoc)) - : html`

Nothing called “${this.query}” — try a model instead?

`} + : this.docSort === 'location' + ? this.renderByLocation(recents, open) + : recents.length + ? recents.map((d) => this.renderRow(d, open.has(d.id), d === enterDoc)) + : html`

Nothing called “${this.query}” — try a model instead?

`}
@@ -718,7 +790,10 @@ export class ZnBaseWindow extends LitElement { if (sync && !sync.relayOk && shared.length) { return html`
- Live sync is paused — the relay is unreachable; Ziran keeps trying + + Live sync is paused — + ${sync.provider === 'spaces' ? 'your PDS' : 'the relay'} is unreachable; Ziran keeps trying +
`; } @@ -726,7 +801,11 @@ export class ZnBaseWindow extends LitElement { return html`
${icons.check} - ${liveCount} ${liveCount === 1 ? 'document' : 'documents'} live, end-to-end encrypted + + ${liveCount} ${liveCount === 1 ? 'document' : 'documents'} live${sync?.provider === 'spaces' + ? ' in your spaces' + : ', end-to-end encrypted'} +
`; } @@ -809,6 +888,8 @@ export class ZnBaseWindow extends LitElement {
@@ -860,6 +941,44 @@ export class ZnBaseWindow extends LitElement { : html`${icons.tile}`; } + /** By location: where each document actually lives — this machine alone, + or one of your spaces (whose documents you can fetch from here). */ + private renderByLocation(recents: RecentEntry[], open: Set) { + const sync = desk.sync; + const inSpace = new Map(); + for (const [id, d] of Object.entries(sync?.docs ?? {})) { + if (d.space) inSpace.set(id, d.space); + } + const q = this.query.trim().toLowerCase(); + const local = recents.filter((r) => !inSpace.has(r.id)); + const spaces = sync?.spaces ?? []; + return html` +
+ Local Device · ${local.length} + ${local.length + ? local.map((d) => this.renderRow(d, open.has(d.id))) + : html`

Nothing lives only on this machine.

`} +
+ ${spaces.map((s) => { + const here = recents.filter((r) => inSpace.get(r.id) === s.ref); + const away = s.available.filter((a) => !q || a.name.toLowerCase().includes(q)); + return html` +
+ ${s.name || 'unnamed space'} · ${here.length + away.length} + ${here.map((d) => this.renderRow(d, open.has(d.id)))} + ${away.map((a) => html` + + `)} + ${!here.length && !away.length ? html`

No documents in this space yet.

` : nothing} +
+ `; + })} + `; + } + private renderRow(d: RecentEntry, isOpen: boolean, enterTarget = false) { return html` + + ${this.renderLastSpacesInvite()} + ` + : html`

Only the space owner can invite people to this space.

`} + `; + } if (s.live === false) { return html`

@@ -401,18 +453,69 @@ export class ZnConnections extends LitElement { `; } + /** Going live into a space (Spaces provider): pick one of yours, or name a + new one. Membership is per-space, so the copy says exactly that. */ + private renderGoLiveSpaces() { + const spaces = desk.sync?.spaces ?? []; + const wantsNew = this.shareSpaceRef === ''; + return html` +

+ Only on this machine +
+
{ + e.preventDefault(); + const form = e.target as HTMLFormElement; + const name = (form.elements.namedItem('spaceName') as HTMLInputElement | null)?.value.trim(); + if (wantsNew && !name) return; + desk.startSharing(this.doc.id, wantsNew ? { newSpaceName: name } : { space: this.shareSpaceRef }); + }} + > + + ${wantsNew + ? html`` + : nothing} + +
+

+ Going live puts this document in a space on your PDS. Everyone in a space — + every device, every person invited later — sees every document in it, and it + is not end-to-end encrypted: your PDS operator could read it. +

+ `; + } + /** The relay is down: say which relay, why (when known), and offer to try right now — a shrug with no handle on it is what "in shambles" feels like from the outside. */ private renderRelayDown(shared: boolean) { const sync = desk.sync; + const spaces = sync?.provider === 'spaces'; const relay = sync?.relay?.replace(/^wss?:\/\//, '').replace(/\/ws$/, ''); const detail = [relay, sync?.relayError].filter(Boolean).join(' — '); + const backendName = spaces ? 'your PDS' : 'the relay'; return html`

${shared - ? 'Live sharing is paused: Ziran can’t reach the relay. Your edits stay on this machine and flow to the others when it reconnects.' - : 'The relay is unreachable right now — Ziran keeps trying and will reconnect on its own. This document keeps working on this machine either way.'} + ? `Live sharing is paused: Ziran can’t reach ${backendName}. Your edits stay on this machine and flow to the others when it reconnects.` + : `${spaces ? 'Your PDS is' : 'The relay is'} unreachable right now — Ziran keeps trying and will reconnect on its own. This document keeps working on this machine either way.`}

${detail ? html`

${detail}

` : nothing}
@@ -444,6 +547,30 @@ export class ZnConnections extends LitElement { `; } + /** The spaces invite outcome: inviting into the space grants membership + immediately; the record in their inbox (or this link) is how they find + out about it. */ + private renderLastSpacesInvite() { + if (!this.lastInvite) { + return html`

+ Inviting adds them to the whole space — they’ll see every document in it, + starting with this one. +

`; + } + const { link, pending } = this.lastInvite; + return html` + +

+ ${pending + ? 'They can’t receive invitations yet — send them this link; it works the moment they sign in to Ziran.' + : 'They’re in: the invitation shows up in their Ziran, and this link is a second way there.'} +

+ `; + } + /** Inline sign-in, so the way forward is right where the intent is. */ private renderSignInPrompt(reason: string) { return html` @@ -465,7 +592,11 @@ export class ZnConnections extends LitElement { /> -

Ziran opens your provider in the browser — no new account, no password here.

+

+ Ziran opens your provider in the browser — no new account, no password here. + No AT identity yet? + Create one. +

`; } diff --git a/src/server/api.ts b/src/server/api.ts index 6505e9b..7e03a3a 100644 --- a/src/server/api.ts +++ b/src/server/api.ts @@ -6,7 +6,7 @@ import mime from 'mime'; import { parseTile, readResource, readTileData, renameTile, writeTileData } from './tilefile.ts'; import { pickOpen, pickSave, revealInFolder } from './dialogs.ts'; import type { ZiranStore } from './store.ts'; -import type { SyncManager } from './sync.ts'; +import type { CollabProvider } from '../sync/provider.ts'; import type { AtSession } from './atsession.ts'; const staticRoots = [ @@ -125,7 +125,7 @@ function safeEqual(a: string, b: string): boolean { return diff === 0; } -export function createHandler(store: ZiranStore, sync?: SyncManager, at?: AtSession): (req: Request) => Promise { +export function createHandler(store: ZiranStore, sync?: CollabProvider, at?: AtSession): (req: Request) => Promise { return async (req: Request): Promise => { const url = new URL(req.url); const { pathname } = url; @@ -229,6 +229,18 @@ export function createHandler(store: ZiranStore, sync?: SyncManager, at?: AtSess const { path } = await sync.accept(invite[1]!); return windowed(await store.openPath(path)); } + // A space link (Spaces provider): adopt the doc straight from its ref. + if (arg.startsWith('ziran://space?')) { + if (!sync || !('adopt' in sync)) return err('space links need the Spaces provider', 503); + const params = new URL(arg).searchParams; + const ref = params.get('ref'); + const docRkey = params.get('doc'); + if (!ref || !docRkey) return err('malformed space link'); + const { path } = await (sync as unknown as { + adopt(space: string, docRkey: string): Promise<{ path: string }>; + }).adopt(ref, docRkey); + return windowed(await store.openPath(path)); + } if (arg.endsWith('.tile')) { return windowed(await store.openPath(await Deno.realPath(arg))); } @@ -361,7 +373,17 @@ export function createHandler(store: ZiranStore, sync?: SyncManager, at?: AtSess // ——— collaboration (the UI bridge; tiles never reach these) ——— if (rest === 'sync/share' && req.method === 'POST') { if (!sync) return err('sync unavailable', 503); - await sync.share(id!); + // Spaces: which space to go live into (or a new one's name). + const body = await req.json().catch(() => ({})); + await sync.share(id!, { + space: typeof body.space === 'string' ? body.space : undefined, + newSpaceName: typeof body.newSpaceName === 'string' ? body.newSpaceName : undefined, + }); + return json({ ok: true }); + } + if (rest === 'sync/publish' && req.method === 'POST') { + if (!sync || !('publish' in sync)) return err('publishing is not available here', 503); + await (sync as unknown as { publish(id: string): Promise }).publish(id!); return json({ ok: true }); } if (rest === 'sync/invite' && req.method === 'POST') { @@ -396,6 +418,18 @@ export function createHandler(store: ZiranStore, sync?: SyncManager, at?: AtSess return json({ ok: true }); } + // Instantiate a document discovered in a space (another member's — or + // another of this account's devices'). Spaces provider only. + if (pathname === '/api/sync/adopt' && req.method === 'POST') { + if (!sync || !('adopt' in sync)) return err('adopting from a space is not available here', 503); + const { space, docRkey } = await req.json(); + if (typeof space !== 'string' || typeof docRkey !== 'string') return err('space and docRkey required'); + const { path } = await (sync as unknown as { + adopt(space: string, docRkey: string): Promise<{ path: string }>; + }).adopt(space, docRkey); + return windowed(await store.openPath(path)); + } + if (pathname === '/api/at/signin' && req.method === 'POST') { if (!at) return err('sign-in unavailable', 503); const { identifier } = await req.json(); @@ -415,7 +449,8 @@ export function createHandler(store: ZiranStore, sync?: SyncManager, at?: AtSess return json({ ok: true }); } - const inviteAct = pathname.match(/^\/api\/invitations\/([0-9a-f]+)\/(accept|dismiss)$/); + // Tokens are hex (relay) or record rkeys (spaces TIDs). + const inviteAct = pathname.match(/^\/api\/invitations\/([\w.~-]+)\/(accept|dismiss)$/); if (inviteAct && req.method === 'POST') { if (!sync) return err('sync unavailable', 503); const token = inviteAct[1]!; diff --git a/src/server/atsession.ts b/src/server/atsession.ts index 932881b..b6ae5b4 100644 --- a/src/server/atsession.ts +++ b/src/server/atsession.ts @@ -136,6 +136,7 @@ export class AtSession { } catch { this.handle = null; } + this.pds = pds; await this.#loadProfile(did, pds).catch(() => {}); } @@ -201,6 +202,7 @@ export class AtSession { this.handle = null; this.displayName = null; this.avatar = null; + this.pds = null; this.#agent = undefined; this.#session = undefined; await Deno.remove(this.#currentFile).catch(() => {}); @@ -208,6 +210,27 @@ export class AtSession { await this.onChange?.(); } + /** The signed-in account's PDS endpoint, when known. */ + pds: string | null = null; + + /** A fetch that signs own-PDS requests with the OAuth session (DPoP per + request) and passes everything else through untouched — the SpaceClient + injection point. Whether the session's scope satisfies the space + endpoints is the PDS's call; a 403 there surfaces in the sync summary. */ + spacesFetch(): typeof fetch | null { + const session = this.#session; + const pds = this.pds; + if (!session || !pds) return null; + const base = pds.replace(/\/+$/, ''); + return ((input: RequestInfo | URL, init?: RequestInit) => { + const url = String(input instanceof Request ? input.url : input); + if (url.startsWith(base)) { + return session.fetchHandler(url.slice(base.length), init); + } + return fetch(input as URL, init); + }) as typeof fetch; + } + /** Mint a relay token at the user's PDS (service-auth, ~60s, DID-signed). */ async relayToken(relayDid: string): Promise { if (!this.#agent) throw new Error('not signed in'); diff --git a/src/server/deeplink.test.ts b/src/server/deeplink.test.ts index 60136da..ccca6ba 100644 --- a/src/server/deeplink.test.ts +++ b/src/server/deeplink.test.ts @@ -21,6 +21,7 @@ function spawnApp(port: number, args: string[] = []): Deno.ChildProcess { return new Deno.Command(Deno.execPath(), { args: ['run', '-A', 'main.ts', ...args], env: { + ZIRAN_SYNC: 'relay', // these suites exercise the relay stack ZIRAN_DATA_DIR: join(tmp, 'app'), ZIRAN_KEY: KEY, ZIRAN_PORT: String(port), diff --git a/src/server/paths.ts b/src/server/paths.ts index 664597c..4b36b23 100644 --- a/src/server/paths.ts +++ b/src/server/paths.ts @@ -38,6 +38,8 @@ export const identityFile = () => join(syncDir(), 'identity.json'); the dev identity and the AT identity each keep their own. */ export const mlsIdentityFile = (did: string) => join(syncDir(), 'identities', `${encodeURIComponent(did)}.json`); export const syncRegistryFile = () => join(syncDir(), 'docs.json'); +/** Registry v2 — the Spaces provider's spaces + docs (docs/SYNC-SPACES.md). */ +export const spacesRegistryFile = () => join(syncDir(), 'spaces.json'); export async function ensureDirs(): Promise { for (const dir of [documentsDir(), modelsDir(), importsDir(), groupsDir()]) { diff --git a/src/server/sync.ts b/src/server/sync.ts index 162f1b4..5d87c68 100644 --- a/src/server/sync.ts +++ b/src/server/sync.ts @@ -9,6 +9,7 @@ // only this file's identity block and the relay's Verifier). import { dirname, join } from '@std/path'; +import type { CollabProvider, ProviderSummary } from '../sync/provider.ts'; import type { Invitation, Member, Session, SyncManifest } from '../sync/protocol.ts'; import { fromB64, toB64 } from '../sync/protocol.ts'; import { RelaySyncTransport } from '../sync/relay-client.ts'; @@ -57,31 +58,9 @@ interface LiveDoc { roster: Member[]; } -export interface SyncSummary { - identity: { did: string; handle: string }; - devIdentity: boolean; - at: { signedIn: boolean; handle?: string; did?: string; displayName?: string; hasAvatar?: boolean }; - relayOk: boolean; - /** The relay this runtime is (trying to be) on, ws(s) URL. */ - relay: string; - /** Why the relay is unreachable, when it is — so the UI can say something - truer than a shrug. */ - relayError?: string; - invitations: Array>; - docs: Record; - }>; -} +export type SyncSummary = ProviderSummary; -export class SyncManager { +export class RelayProvider implements CollabProvider { did = ''; handle = ''; relayUrl = ''; @@ -646,6 +625,7 @@ export class SyncManager { }; } return { + provider: 'relay', identity: { did: this.did, handle: this.handle }, // An explicit ZIRAN_DID is developer mode: local dev identities may // invite each other without AT sign-in. Without it, inviting requires diff --git a/src/server/tilefile.ts b/src/server/tilefile.ts index 8184e28..10f8f87 100644 --- a/src/server/tilefile.ts +++ b/src/server/tilefile.ts @@ -249,6 +249,15 @@ export async function readTileData(path: string, name: string): Promise { + const tile = await parseTile(path, { verify: false }); + if (at) tile.manifest.at = at; + else delete tile.manifest.at; + await writeTile(tile.manifest, allResources(tile), path); +} + /** Rename: set masl.name and rewrite in place. */ export async function renameTile(path: string, name: string): Promise { const tile = await parseTile(path, { verify: false }); @@ -269,6 +278,8 @@ export async function writeModelTile(srcPath: string, destPath: string): Promise const model = tile.manifest.model; if (!model?.id?.trim()) throw new Error('tile has no model.id; only model-backed tiles can become models'); const masl = structuredClone(tile.manifest) as Masl; + // A model is a fresh starting point: its online identity does not follow. + delete masl.at; for (const key of ['name', 'description', 'short_name', 'theme_color', 'background_color'] as const) { if (model[key] !== undefined) masl[key] = model[key]; } diff --git a/src/state/backend.ts b/src/state/backend.ts index ae22e89..289c4df 100644 --- a/src/state/backend.ts +++ b/src/state/backend.ts @@ -116,7 +116,9 @@ export const backend = { }, /* ——— collaboration ——— */ - syncShare: (docId: string): Promise => post(`/api/docs/${docId}/sync/share`), + syncShare: (docId: string, opts?: { space?: string; newSpaceName?: string }): Promise => + post(`/api/docs/${docId}/sync/share`, opts ?? {}), + syncAdopt: (space: string, docRkey: string): Promise => post('/api/sync/adopt', { space, docRkey }), syncRetry: (): Promise => post('/api/sync/retry'), syncInvite: ( docId: string, diff --git a/src/state/desk.ts b/src/state/desk.ts index 43d8ecc..c601fb7 100644 --- a/src/state/desk.ts +++ b/src/state/desk.ts @@ -310,15 +310,27 @@ class DeskStore extends EventTarget { return this.sync?.docs?.[docId]; } - async startSharing(docId: string): Promise { + async startSharing(docId: string, opts?: { space?: string; newSpaceName?: string }): Promise { try { - await backend.syncShare(docId); - this.toast('This document is now live — invite people from this panel'); + await backend.syncShare(docId, opts); + this.toast(this.sync?.provider === 'spaces' + ? 'This document is live in its space — your other devices will see it' + : 'This document is now live — invite people from this panel'); } catch (err) { this.toast(`Could not start sharing: ${(err as Error).message}`); } } + /** Instantiate a document another device (or member) put in a space. */ + async adoptDoc(space: string, docRkey: string, name: string): Promise { + try { + this.handleOpened(await backend.syncAdopt(space, docRkey)); + this.toast(`“${name}” is on this machine now — synced with its space`); + } catch (err) { + this.toast(`Could not fetch “${name}”: ${(err as Error).message}`); + } + } + /** Ask the runtime to try the relay right now instead of waiting out the backoff timer. */ async syncRetry(): Promise { diff --git a/src/sync/e2e.test.ts b/src/sync/e2e.test.ts index c51c2b6..7a4fd0c 100644 --- a/src/sync/e2e.test.ts +++ b/src/sync/e2e.test.ts @@ -34,6 +34,7 @@ async function startApp(name: string, did: string, port: number): Promise { const child = new Deno.Command(Deno.execPath(), { args: ['run', '-A', 'main.ts'], env: { + ZIRAN_SYNC: 'relay', // these suites exercise the relay stack ZIRAN_DATA_DIR: join(tmp, name), ZIRAN_KEY: key, ZIRAN_PORT: String(port), diff --git a/src/sync/newcomer.test.ts b/src/sync/newcomer.test.ts index c6198d3..63c7058 100644 --- a/src/sync/newcomer.test.ts +++ b/src/sync/newcomer.test.ts @@ -24,6 +24,7 @@ async function startApp(name: string, did: string, port: number): Promise { const child = new Deno.Command(Deno.execPath(), { args: ['run', '-A', 'main.ts'], env: { + ZIRAN_SYNC: 'relay', // these suites exercise the relay stack ZIRAN_DATA_DIR: join(tmp, name), ZIRAN_KEY: `${name}-key`, ZIRAN_PORT: String(port), ZIRAN_DID: did, ZIRAN_HANDLE: `${name}.test`, ZIRAN_RELAY: relayUrl, ZIRAN_RELAY_SECRET: 'dev-secret', diff --git a/src/sync/protocol.ts b/src/sync/protocol.ts index c0e11b9..5ae4785 100644 --- a/src/sync/protocol.ts +++ b/src/sync/protocol.ts @@ -9,6 +9,10 @@ export interface Member { did: string; handle?: string; role: string; + /** False when the member is known but not currently around (Spaces + presence records aging out). Absent = presence is implicit (relay + rosters only list connected members). */ + present?: boolean; } /** A role's runtime-enforceable capabilities, declared in the tile manifest diff --git a/src/sync/provider.ts b/src/sync/provider.ts new file mode 100644 index 0000000..77a72f0 --- /dev/null +++ b/src/sync/provider.ts @@ -0,0 +1,93 @@ +// The CollabProvider seam: everything the runtime (API layer, store, UI +// summary) needs from a collaboration backend, one level above SyncTransport. +// Two implementations exist: RelayProvider (src/server/sync.ts — the +// relay+MLS stack, behind ZIRAN_SYNC=relay) and SpacesProvider +// (src/sync/spaces/provider.ts — AT Proto Spaces, docs/SYNC-SPACES.md). +// main.ts picks one; api.ts and the UI program against this interface only. + +import type { Invitation, Member } from './protocol.ts'; + +/** A decrypted/delivered frame waiting for a (re)attached tile. `seq` is the + provider's local delivery order for the doc — total on the relay, + per-machine causal order under Spaces — and is what `ackedSeq` snapshots. */ +export interface BufferedFrame { + seq: number; + author: string; + role: string; + b64: string; +} + +export interface AttachState { + me: Member; + roster: Member[]; + buffered: BufferedFrame[]; +} + +export interface DocSummary { + syncId: string; + role: string; + /** False when the doc is shared but its session isn't running right now + (backend unreachable, or rejoin failed); the chrome says "paused". */ + live: boolean; + members: Member[]; + inviteBase: string; + /** The document's own roles, as the chrome should offer them. */ + roles: Array<{ name: string; label: string; invitable: boolean; full: boolean }>; + /** Spaces only: the space this doc lives in. */ + space?: string; +} + +export interface SpaceSummary { + ref: string; + name: string; + /** True when this identity owns the space (owner-only invites). */ + mine: boolean; + /** Docs discovered in the space that are not instantiated locally yet + (the Documents column's "By location" raw material). */ + available: Array<{ docRkey: string; name: string; creator: string }>; +} + +export interface ProviderSummary { + provider: 'relay' | 'spaces'; + identity: { did: string; handle: string }; + devIdentity: boolean; + at: { signedIn: boolean; handle?: string; did?: string; displayName?: string; hasAvatar?: boolean }; + /** The collaboration backend is reachable (relay socket up / PDS session + live). Field names kept from the relay era; the UI treats them as + "backend ok / backend address / why not". */ + relayOk: boolean; + relay: string; + relayError?: string; + invitations: Array>; + docs: Record; + /** Spaces only: the identity's known spaces, for the go-live picker and + the Documents column. */ + spaces?: SpaceSummary[]; +} + +export interface ShareOptions { + /** Spaces: an existing space ref to add the doc to. */ + space?: string; + /** Spaces: create a new space with this name and add the doc to it. */ + newSpaceName?: string; +} + +/** The seam. All methods are keyed by the path-derived local doc id. */ +export interface CollabProvider { + summary(): ProviderSummary; + /** A file move re-keyed the path-derived id (store's move hook). */ + moved(oldId: string, newId: string, newPath: string): void; + /** Start sharing an open document ("go live"). */ + share(localId: string, opts?: ShareOptions): Promise; + invite(localId: string, identifier: string, role: string): Promise<{ invitation: Invitation; link: string }>; + accept(token: string): Promise<{ path: string }>; + dismiss(token: string): void; + /** Tile (re)announced itself: session state + frames past its ackedSeq. */ + attach(localId: string): AttachState | null; + send(localId: string, b64: string): Promise; + ephemeral(localId: string, b64: string): void; + /** The tile persisted its state (putData): advance the snapshot point. */ + onLocalDataWrite(localId: string): Promise; + /** A person asked to reconnect right now: skip any backoff. */ + retryNow(): void; +} diff --git a/src/sync/reconnect.test.ts b/src/sync/reconnect.test.ts index 92b65dc..1d5cb3d 100644 --- a/src/sync/reconnect.test.ts +++ b/src/sync/reconnect.test.ts @@ -23,6 +23,7 @@ const startTheRelay = (): Promise => const app = new Deno.Command(Deno.execPath(), { args: ['run', '-A', 'main.ts'], env: { + ZIRAN_SYNC: 'relay', // these suites exercise the relay stack ZIRAN_DATA_DIR: join(tmp, 'app'), ZIRAN_KEY: 'k', ZIRAN_PORT: '4872', ZIRAN_DID: 'did:ziran:rc-a', ZIRAN_HANDLE: 'rc.test', ZIRAN_RELAY: relayUrl, ZIRAN_RELAY_SECRET: 'dev-secret', diff --git a/src/sync/restart-invite.test.ts b/src/sync/restart-invite.test.ts index 334fb3c..69256aa 100644 --- a/src/sync/restart-invite.test.ts +++ b/src/sync/restart-invite.test.ts @@ -36,6 +36,7 @@ function spawnApp(name: string, did: string, port: number): Deno.ChildProcess { return new Deno.Command(Deno.execPath(), { args: ['run', '-A', 'main.ts'], env: { + ZIRAN_SYNC: 'relay', // these suites exercise the relay stack ZIRAN_DATA_DIR: join(tmp, name), ZIRAN_KEY: `${name}-key`, ZIRAN_PORT: String(port), diff --git a/src/sync/richtext-crdt.test.ts b/src/sync/richtext-crdt.test.ts new file mode 100644 index 0000000..a421edb --- /dev/null +++ b/src/sync/richtext-crdt.test.ts @@ -0,0 +1,142 @@ +// The richtext tile's CRDT layer, headless (Phase G): the y-prosemirror +// pipeline the tile rides — legacy ProseMirror-JSON migration, mark +// preservation, and convergence of concurrent Y updates exchanged in +// different orders. The EditorView half is browser-only and is exercised by +// opening the tile; everything the causal log touches is covered here. +// Run: deno run -A src/sync/richtext-crdt.test.ts + +import * as Y from 'yjs'; +import { prosemirrorJSONToYDoc, yDocToProsemirrorJSON } from 'y-prosemirror'; +import { Schema } from 'prosemirror-model'; +import { schema as basic } from 'prosemirror-schema-basic'; +import { addListNodes } from 'prosemirror-schema-list'; + +let failures = 0; +const check = (label: string, ok: boolean, detail = '') => { + console.log(`${ok ? 'PASS' : 'FAIL'} ${label}${detail ? ` — ${detail}` : ''}`); + if (!ok) failures++; +}; + +// The tile's schema: basic + lists + comment & suggestion marks (same +// definitions as tiles/richtext/index.html). +const schema = new Schema({ + nodes: addListNodes(basic.spec.nodes, 'paragraph block*', 'block'), + marks: basic.spec.marks.append({ + comment: { + attrs: { id: {} }, + inclusive: false, + toDOM: (m) => ['span', { 'data-cmt': m.attrs.id }, 0], + }, + sug_ins: { + attrs: { id: {}, who: { default: '' } }, + inclusive: true, + toDOM: (m) => ['ins', { 'data-sug': m.attrs.id }, 0], + }, + sug_del: { + attrs: { id: {}, who: { default: '' } }, + inclusive: false, + toDOM: (m) => ['del', { 'data-sug': m.attrs.id }, 0], + }, + }), +}); + +// A legacy save: heading, list, and marked-up text (comment + suggestion). +const legacyDoc = { + type: 'doc', + content: [ + { type: 'heading', attrs: { level: 1 }, content: [{ type: 'text', text: 'Title' }] }, + { + type: 'paragraph', + content: [ + { type: 'text', text: 'plain ' }, + { type: 'text', text: 'bold', marks: [{ type: 'strong' }] }, + { type: 'text', text: ' noted', marks: [{ type: 'comment', attrs: { id: 'c1' } }] }, + { type: 'text', text: ' added', marks: [{ type: 'sug_ins', attrs: { id: 's1', who: 'robin' } }] }, + ], + }, + { + type: 'bullet_list', + content: [{ type: 'list_item', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'item' }] }] }], + }, + ], +}; + +/* ——— migration round-trip ——— */ +const migrated = prosemirrorJSONToYDoc(schema, legacyDoc, 'prosemirror'); +const roundTrip = yDocToProsemirrorJSON(migrated, 'prosemirror'); +check( + 'legacy ProseMirror JSON migrates to Yjs and back intact', + JSON.stringify(schema.nodeFromJSON(roundTrip)) === JSON.stringify(schema.nodeFromJSON(legacyDoc)), +); +check( + 'comment and suggestion marks survive migration', + JSON.stringify(roundTrip).includes('"c1"') && JSON.stringify(roundTrip).includes('"s1"'), +); + +/* ——— the tile's persistence form: update bytes → fresh doc ——— */ +const stored = Y.encodeStateAsUpdate(migrated); +const reloaded = new Y.Doc(); +Y.applyUpdate(reloaded, stored, 'load'); +check( + 'ydoc persists as an update and reloads identically', + JSON.stringify(yDocToProsemirrorJSON(reloaded, 'prosemirror')) === JSON.stringify(roundTrip), +); + +/* ——— convergence: concurrent edits exchanged in both orders ——— */ +function fork(from: Y.Doc): Y.Doc { + const doc = new Y.Doc(); + Y.applyUpdate(doc, Y.encodeStateAsUpdate(from)); + return doc; +} +function firstText(doc: Y.Doc): Y.XmlText { + const frag = doc.getXmlFragment('prosemirror'); + for (let i = 0; i < frag.length; i++) { + const node = frag.get(i); + if (node instanceof Y.XmlElement && node.length && node.get(0) instanceof Y.XmlText) { + return node.get(0) as Y.XmlText; + } + } + throw new Error('no text node'); +} + +const peerA = fork(migrated); +const peerB = fork(migrated); +const updates: Array<{ from: string; u: Uint8Array }> = []; +peerA.on('update', (u: Uint8Array, origin: unknown) => { + if (origin !== 'remote') updates.push({ from: 'a', u }); +}); +peerB.on('update', (u: Uint8Array, origin: unknown) => { + if (origin !== 'remote') updates.push({ from: 'b', u }); +}); +firstText(peerA).insert(0, 'A-was-here '); +firstText(peerB).insert(0, 'B-was-here '); +// Deliver A's updates to B and B's to A — and once more in reverse order, +// echoes included, into a third replica: everything must converge. +const peerC = fork(migrated); +for (const { from, u } of updates) { + Y.applyUpdate(from === 'a' ? peerB : peerA, u, 'remote'); +} +for (const { u } of [...updates].reverse()) Y.applyUpdate(peerC, u, 'remote'); +for (const { u } of updates) Y.applyUpdate(peerC, u, 'remote'); // echo double-apply +const jsonA = JSON.stringify(yDocToProsemirrorJSON(peerA, 'prosemirror')); +const jsonB = JSON.stringify(yDocToProsemirrorJSON(peerB, 'prosemirror')); +const jsonC = JSON.stringify(yDocToProsemirrorJSON(peerC, 'prosemirror')); +check('concurrent edits converge across peers', jsonA === jsonB, 'A vs B differ'); +check('delivery order and echoes do not matter', jsonA === jsonC, 'C (reversed + echoed) differs'); +check( + 'both concurrent insertions survive the merge', + jsonA.includes('A-was-here') && jsonA.includes('B-was-here'), +); + +/* ——— the merged doc still validates against the tile schema ——— */ +let valid = true; +try { + schema.nodeFromJSON(yDocToProsemirrorJSON(peerA, 'prosemirror')).check(); +} catch (err) { + valid = false; + console.error(err); +} +check('merged document validates against the schema', valid); + +console.log(failures ? `\n${failures} FAILED` : '\nall green'); +Deno.exit(failures ? 1 : 0); diff --git a/src/sync/signedout.test.ts b/src/sync/signedout.test.ts index 82adce9..d6ef3c4 100644 --- a/src/sync/signedout.test.ts +++ b/src/sync/signedout.test.ts @@ -24,6 +24,7 @@ const KEY = 'so-key'; function spawnApp(withDevIdentity: boolean): Deno.ChildProcess { const env: Record = { + ZIRAN_SYNC: 'relay', // this suite exercises the relay stack ZIRAN_DATA_DIR: join(tmp, 'app'), ZIRAN_KEY: KEY, ZIRAN_PORT: String(PORT), diff --git a/src/sync/spaces/causal.ts b/src/sync/spaces/causal.ts new file mode 100644 index 0000000..74041da --- /dev/null +++ b/src/sync/spaces/causal.ts @@ -0,0 +1,82 @@ +// Causal delivery for space.ziran.op records (docs/SYNC-SPACES.md, Ordering). +// +// Repos advance independently — there is no total order across authors. The +// contract this buffer enforces: +// - per-repo FIFO (repos are rev-ordered; we deliver each repo's ops in +// fetch order, never skipping ahead); +// - an op waits until every parent it names has been SETTLED — delivered to +// the tile, echoed locally, or absorbed by the checkpoint we instantiated +// from. The caller owns that knowledge (a persisted per-doc set) and +// lends it to the buffer as a predicate; +// - concurrent ready ops deliver in deterministic (rev, author) order. +// +// Membership is by exact (author, rkey), never a watermark: one DID can be +// several devices writing the same repo with independently generated rkeys, +// so rkeys are not monotonic per author, and a parent can be written after +// our last fetch of its author — absence must hold the op, not satisfy it. + +export interface OpParent { + author: string; + rkey: string; +} + +export interface CausalOp { + author: string; + rkey: string; + rev: string; + parents: OpParent[]; + /** The op record value (doc, bytes, …), opaque to the buffer. */ + value: Record; +} + +export class CausalBuffer { + #settled: (author: string, rkey: string) => boolean; + #pending = new Map(); + + constructor(settled: (author: string, rkey: string) => boolean) { + this.#settled = settled; + } + + /** Queue a fetched op. Ops must arrive per-author in ascending rev order + (which listRepoOps guarantees); the caller has already deduplicated. */ + push(op: CausalOp): void { + const queue = this.#pending.get(op.author) ?? []; + if (queue.some((q) => q.rkey === op.rkey)) return; + queue.push(op); + this.#pending.set(op.author, queue); + } + + /** Every op that can be delivered now, in deterministic (rev, author) + order. The caller settles each delivered op (so its children unlock); + the scan repeats until quiescent. */ + drain(onDeliver: (op: CausalOp) => void): CausalOp[] { + const out: CausalOp[] = []; + for (;;) { + const ready: CausalOp[] = []; + for (const queue of this.#pending.values()) { + const head = queue[0]; + if (head && head.parents.every((p) => this.#settled(p.author, p.rkey))) ready.push(head); + } + if (ready.length === 0) return out; + ready.sort((a, b) => (a.rev < b.rev ? -1 : a.rev > b.rev ? 1 : a.author < b.author ? -1 : 1)); + const op = ready[0]!; + const queue = this.#pending.get(op.author)!; + queue.shift(); + if (queue.length === 0) this.#pending.delete(op.author); + onDeliver(op); + out.push(op); + } + } + + /** True while this exact op sits undelivered in a queue. */ + pendingHas(author: string, rkey: string): boolean { + return this.#pending.get(author)?.some((q) => q.rkey === rkey) ?? false; + } + + /** Ops fetched but not yet deliverable (missing parents). */ + pendingCount(): number { + let n = 0; + for (const queue of this.#pending.values()) n += queue.length; + return n; + } +} diff --git a/src/sync/spaces/checkpoint.ts b/src/sync/spaces/checkpoint.ts new file mode 100644 index 0000000..c3d10f1 --- /dev/null +++ b/src/sync/spaces/checkpoint.ts @@ -0,0 +1,103 @@ +// Atile-style checkpoints (docs/SYNC-SPACES.md, Data model): a published +// snapshot of a document is its tile manifest with every resource — tile code +// AND the self-storage data files — uploaded as a blob and the manifest `src` +// replaced by an atproto blob ref. Never a full-.tile blob. The same artifact +// a future "publish for static consumption" needs. +// +// Conventions follow @dasl/atile (tile-at.ts): blob CIDs are CIDv1/raw/sha-256 +// — identical to tile resource CIDs, so dedup and verification are string +// comparisons — and the recorded `cid` is the DRISL (dCBOR) CID of the +// manifest itself. + +import { encode as encodeCbor } from '@atcute/cbor'; +import { CODEC_DCBOR, create, toString as stringifyCID } from '@atcute/cid'; +import { type Masl, parseTile, readResource, writeTile } from '../../server/tilefile.ts'; +import { type BlobRef, rawCid, type SpaceClient } from './client.ts'; + +export interface CheckpointRecord { + $type: 'space.ziran.checkpoint'; + doc: string; + tile: Masl; + cid: string; + frontier: Record; + createdAt: string; +} + +const blobCidOf = (entry: Record): string | undefined => { + const src = entry.src as { $link?: string; ref?: { $link?: string } } | undefined; + return src?.ref?.$link ?? src?.$link; +}; + +/** Publish the tile at `path` as this author's checkpoint for the doc + (rkey = the doc's rkey; putRecord replaces any previous own checkpoint). + Blobs whose CID is in `uploadedCids` are not re-uploaded — CIDs match by + construction. Returns the full set of blob CIDs now backing the record. */ +export async function publishCheckpoint( + client: SpaceClient, + space: string, + docRkey: string, + path: string, + frontier: Record, + uploadedCids: ReadonlySet, +): Promise<{ blobCids: string[] }> { + const tile = await parseTile(path, { verify: false }); + const manifest = structuredClone(tile.manifest) as Masl; + const blobCids: string[] = []; + for (const [resPath, entry] of Object.entries(manifest.resources)) { + const bytes = readResource(tile, resPath); + if (!bytes) throw new Error(`resource ${resPath} is missing from ${path}`); + const cid = await rawCid(bytes); + if (!uploadedCids.has(cid)) { + const blob = await client.uploadBlob( + bytes, + (entry as Record)['content-type'] ?? 'application/octet-stream', + ); + if (blob.ref.$link !== cid) { + throw new Error(`PDS blob CID ${blob.ref.$link} does not match resource CID ${cid} for ${resPath}`); + } + } + blobCids.push(cid); + const ref: BlobRef = { + $type: 'blob', + ref: { $link: cid }, + mimeType: (entry as Record)['content-type'] ?? 'application/octet-stream', + size: bytes.length, + }; + manifest.resources[resPath] = { ...entry, src: ref as unknown as { $link: string } }; + } + const manifestCid = stringifyCID(await create(CODEC_DCBOR, encodeCbor(manifest))); + const record: CheckpointRecord = { + $type: 'space.ziran.checkpoint', + doc: docRkey, + tile: manifest, + cid: manifestCid, + frontier, + createdAt: new Date().toISOString(), + }; + await client.putRecord(space, 'space.ziran.checkpoint', docRkey, record as unknown as Record); + return { blobCids }; +} + +/** Rebuild a .tile file from a checkpoint: download every resource blob from + the checkpoint author's repo, verify each against its CID, and assemble + with the normal tile writer (which recomputes and re-verifies CIDs). */ +export async function instantiateFromCheckpoint( + client: SpaceClient, + space: string, + author: string, + checkpoint: CheckpointRecord, + destPath: string, +): Promise { + const manifest = structuredClone(checkpoint.tile) as Masl; + const resources = new Map(); + for (const [resPath, entry] of Object.entries(manifest.resources)) { + const cid = blobCidOf(entry); + if (!cid) throw new Error(`checkpoint resource ${resPath} has no blob ref`); + const bytes = await client.getBlob(space, author, cid); + if ((await rawCid(bytes)) !== cid) { + throw new Error(`blob for ${resPath} does not match its address ${cid}`); + } + resources.set(resPath, bytes); + } + await writeTile(manifest, resources, destPath); +} diff --git a/src/sync/spaces/client.ts b/src/sync/spaces/client.ts index c124247..9babda8 100644 --- a/src/sync/spaces/client.ts +++ b/src/sync/spaces/client.ts @@ -63,6 +63,13 @@ export class XrpcError extends Error { export type SpacePolicy = 'memberList' | 'public'; +export interface SpaceWrite { + action: 'create' | 'update' | 'delete'; + collection: string; + rkey?: string; + record?: Record; +} + export interface RepoHead { did: string; rev: string; @@ -241,6 +248,26 @@ export class SpaceClient { return cred; } + /* ——— space discovery (the caller's own PDS) ——— */ + + /** Spaces this account holds a repo in (i.e. has written into) — the + same-account multi-device discovery path. */ + async listSpaces(): Promise { + const out: string[] = []; + let cursor: string | undefined; + do { + const page = await this.#ownCall('com.atproto.space.listSpaces', { + params: cursor ? { cursor } : {}, + }); + for (const s of page.spaces ?? []) { + const uri = typeof s === 'string' ? s : (s.uri ?? s.space); + if (typeof uri === 'string') out.push(uri); + } + cursor = page.cursor; + } while (cursor); + return out; + } + /* ——— space management (simplespace, at the caller's own PDS) ——— */ async createSpace(type: string, opts: { skey?: string; policy: SpacePolicy; appAllowed?: string[] } ): Promise { @@ -297,6 +324,26 @@ export class SpaceClient { }); } + /** Batched writes in one commit — one rate-limit charge per record but a + single round-trip; op batching rides on this (adaptive batching is + load-bearing against the 1 MB JSON cap and write rate limits). */ + async applyWrites(space: string, writes: SpaceWrite[]): Promise> { + const res = await this.#ownCall('com.atproto.space.applyWrites', { + body: { + space, + repo: this.auth.did, + validate: false, + writes: writes.map((w) => ({ + $type: `com.atproto.space.applyWrites#${w.action}`, + collection: w.collection, + ...(w.rkey ? { rkey: w.rkey } : {}), + ...(w.record ? { value: w.record } : {}), + })), + }, + }); + return res.results ?? []; + } + async uploadBlob(bytes: Uint8Array, mimeType: string): Promise { const res = await this.#ownCall('com.atproto.repo.uploadBlob', { rawBody: bytes, encoding: mimeType }); return res.blob as BlobRef; @@ -341,15 +388,20 @@ export class SpaceClient { } } - async listRecords(space: string, repo: string, collection: string): Promise }>> { + /** Live wire truth: entries carry `{collection, rkey, cid, value}` — no + uri (verified against pds.ziran.space); rkey is normalized here in case + other builds send a uri instead. */ + async listRecords(space: string, repo: string, collection: string): Promise }>> { const base = await this.resolvePds(repo); - const out: Array<{ uri: string; cid: string; value: Record }> = []; + const out: Array<{ rkey: string; cid: string; value: Record }> = []; let cursor: string | undefined; do { const params: Record = { space, repo, collection }; if (cursor) params.cursor = cursor; const page = await this.#credCall(space, base, 'com.atproto.space.listRecords', params); - out.push(...(page.records ?? [])); + for (const r of page.records ?? []) { + out.push({ ...r, rkey: r.rkey ?? String(r.uri ?? '').split('/').pop() ?? '' }); + } cursor = page.cursor; } while (cursor); return out; diff --git a/src/sync/spaces/fake.ts b/src/sync/spaces/fake.ts index ae75664..1f0274e 100644 --- a/src/sync/spaces/fake.ts +++ b/src/sync/spaces/fake.ts @@ -206,6 +206,52 @@ export class FakeSpacesNetwork { return json({ credential: token }); } + case 'com.atproto.space.listSpaces': { + const did = this.#authedDid(req); + if (!did) return err(401, 'AuthMissing'); + const spaces = [...this.#spaces.entries()] + .filter(([, s]) => s.repos.has(did)) + .map(([uri]) => ({ uri })); + return json({ spaces }); + } + + case 'com.atproto.space.applyWrites': { + const did = this.#authedDid(req); + if (!did) return err(401, 'AuthMissing'); + const body = await req.json(); + if (body.repo !== did) return err(403, 'Forbidden', 'repo must match authenticated user'); + const space = this.#spaces.get(body.space); + if (!space) return err(400, 'SpaceNotFound'); + const repo = this.#repo(space, did); + const results: Array> = []; + for (const w of body.writes ?? []) { + const kind = String(w.$type ?? '').split('#')[1]; + const rev = tid(); + if (kind === 'delete') { + if (repo.records.delete(`${w.collection}/${w.rkey}`)) { + repo.ops.push({ action: 'delete', collection: w.collection, rkey: w.rkey, rev }); + repo.rev = rev; + } + results.push({ $type: 'com.atproto.space.applyWrites#deleteResult' }); + continue; + } + const rkey = w.rkey ?? tid(); + const key = `${w.collection}/${rkey}`; + const existed = repo.records.has(key); + if (kind === 'create' && existed) return err(400, 'InvalidRequest', 'record already exists'); + const cid = `fakecid-${rev}`; + repo.records.set(key, { value: w.value, cid, rev }); + repo.ops.push({ action: existed ? 'update' : 'create', collection: w.collection, rkey, rev, value: w.value }); + repo.rev = rev; + results.push({ + uri: `${body.space}/${did}/${w.collection}/${rkey}`, + cid, + $type: `com.atproto.space.applyWrites#${kind}Result`, + }); + } + return json({ results }); + } + case 'com.atproto.space.createRecord': case 'com.atproto.space.putRecord': { const did = this.#authedDid(req); @@ -296,10 +342,12 @@ export class FakeSpacesNetwork { if (who instanceof Response) return who; const repo = space.repos.get(p.repo ?? ''); if (!repo) return err(400, 'RepoNotFound'); + // Live wire truth: {collection, rkey, cid, value} — no uri. const records = [...repo.records.entries()] .filter(([k]) => k.startsWith(`${p.collection}/`)) .map(([k, r]) => ({ - uri: `${p.space}/${p.repo}/${k}`, + collection: p.collection, + rkey: k.slice(p.collection!.length + 1), cid: r.cid, value: r.value, })); diff --git a/src/sync/spaces/provider.test.ts b/src/sync/spaces/provider.test.ts new file mode 100644 index 0000000..855b7c3 --- /dev/null +++ b/src/sync/spaces/provider.test.ts @@ -0,0 +1,342 @@ +// SpacesProvider against the in-memory fake network: the full Phase E loop — +// share (go live), checkpoint, same-account second-device adoption, op +// exchange with causal delivery, cross-member flow, restart persistence. +// Run: deno run -A src/sync/spaces/provider.test.ts + +import { join } from '@std/path'; +import { CausalBuffer } from './causal.ts'; +import { passwordSession, SpaceClient } from './client.ts'; +import { FakeSpacesNetwork } from './fake.ts'; +import { SpacesProvider, type SpacesHost } from './provider.ts'; +import { docIdForPath, parseTile, writeTile } from '../../server/tilefile.ts'; + +let failures = 0; +const check = (label: string, ok: boolean, detail = '') => { + console.log(`${ok ? 'PASS' : 'FAIL'} ${label}${detail ? ` — ${detail}` : ''}`); + if (!ok) failures++; +}; +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); +const b64 = (s: string) => btoa(s).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); +const unb64 = (s: string) => atob(s.replace(/-/g, '+').replace(/_/g, '/')); + +/* ——— causal buffer unit checks ——— */ +{ + const settled = new Set(); + const buf = new CausalBuffer((a, r) => settled.has(`${a}/${r}`)); + const drain = () => buf.drain((op) => settled.add(`${op.author}/${op.rkey}`)); + // b2 depends on a1, which arrives later. + buf.push({ author: 'did:b', rkey: 'b2', rev: 'r4', parents: [{ author: 'did:a', rkey: 'a1' }], value: {} }); + check('op waits for its parent', drain().length === 0 && buf.pendingCount() === 1); + buf.push({ author: 'did:a', rkey: 'a1', rev: 'r1', parents: [], value: {} }); + const order = drain().map((o) => o.rkey); + check('parent unlocks the child, parent first', order.join(',') === 'a1,b2', order.join(',')); + // Concurrent siblings deliver in (rev, author) order. + buf.push({ author: 'did:b', rkey: 'b9', rev: 'r9', parents: [], value: {} }); + buf.push({ author: 'did:a', rkey: 'a5', rev: 'r5', parents: [], value: {} }); + check( + 'concurrent siblings in deterministic (rev, author) order', + drain().map((o) => o.rkey).join(',') === 'a5,b9', + ); + // A checkpoint-absorbed parent is settled by the caller before replay. + settled.add('did:b/ancient'); + buf.push({ author: 'did:a', rkey: 'a6', rev: 'r6', parents: [{ author: 'did:b', rkey: 'ancient' }], value: {} }); + check('checkpoint-absorbed parent is satisfied', drain().length === 1); + // An unknown parent holds the op — even if written after our last fetch. + buf.push({ author: 'did:a', rkey: 'a7', rev: 'r7', parents: [{ author: 'did:c', rkey: 'c1' }], value: {} }); + check('an unknown parent holds the op', drain().length === 0); +} + +/* ——— provider fixtures ——— */ + +const net = new FakeSpacesNetwork(); +const resolver = { plcDirectory: net.url }; + +interface Fixture { + provider: SpacesProvider; + events: Array>; + dir: string; + did: string; + openPath(path: string): Promise<{ id: string }>; +} + +async function fixture(account: string, dirLabel: string): Promise { + const acct = net.account(account); + const dir = await Deno.makeTempDir({ prefix: `spaces-${dirLabel}-` }); + const docs = new Map } }>(); + const events: Array> = []; + const openPath = async (path: string) => { + const tile = await parseTile(path); + if (tile.damaged) throw new Error(`damaged tile: ${tile.damage}`); + const id = await docIdForPath(path); + docs.set(id, { + info: { path, name: (tile.manifest.name as string) ?? 'doc' }, + tile: { manifest: tile.manifest as Record }, + }); + return { id }; + }; + const host: SpacesHost = { + doc: (id) => docs.get(id), + openPath, + isOpen: () => true, + broadcast: () => {}, + broadcastEvent: (e) => events.push(e), + }; + const provider = new SpacesProvider({ + host, + auth: async () => await passwordSession(net.url, acct.handle, acct.password), + clientFor: (auth) => new SpaceClient({ auth, resolver }), + registryFile: join(dir, 'spaces.json'), + documentsDir: join(dir, 'documents'), + autoPoll: false, + }); + await provider.init(); + return { provider, events, dir, did: acct.did, openPath }; +} + +async function makeTile(dir: string, name: string): Promise { + const path = join(dir, `${name.replace(/\s+/g, '-')}.tile`); + await writeTile( + { name, model: { id: 'com.berjon.ziran.testtile' }, resources: {} }, + new Map([ + ['/', new TextEncoder().encode('t')], + ['/.well-known/web-tiles-storage/state', new TextEncoder().encode('{}')], + ]), + path, + ); + return path; +} + +const msgs = (events: Array>, docId: string) => + events.filter((e) => e.type === 'sync-msg' && e.docId === docId); + +/* ——— share on device A ——— */ + +const a = await fixture('alice', 'deviceA'); +const tilePath = await makeTile(a.dir, 'Shared Doc'); +const { id: aDocId } = await a.openPath(tilePath); +const rec = await a.provider.share(aDocId, { newSpaceName: 'Test Space' }); +check('share created a workspace space', rec.space.includes('/space/space.ziran.workspace/'), rec.space); +check('doc record uri stamped into the tile manifest', (await parseTile(tilePath)).manifest.at === rec.at); + +const inspector = new SpaceClient({ + auth: await passwordSession(net.url, net.account('alice').handle, net.account('alice').password), + resolver, +}); +const cp = await inspector.getRecord(rec.space, a.did, 'space.ziran.checkpoint', rec.docRkey); +check('go-live checkpoint published', cp.value.$type === 'space.ziran.checkpoint'); +const cpResources = (cp.value.tile as { resources: Record }).resources; +check( + 'checkpoint resources are blob refs (atile-style, never a full tile)', + Object.values(cpResources).every((r) => r.src.$type === 'blob'), +); + +await a.provider.send(aDocId, b64('one')); +await a.provider.send(aDocId, b64('two')); +await sleep(500); // quiet-flush window +const aEcho = msgs(a.events, aDocId); +check('own frames echo back with local seqs', aEcho.length === 2 && aEcho[0]!.seq === 1 && aEcho[1]!.seq === 2); +check('echoed frames carry the owner role', aEcho.every((m) => m.author === a.did && m.role === 'author')); + +/* ——— same-account second device: discovery + adoption ——— */ + +const b = await fixture('alice', 'deviceB'); +await b.provider.pollNow(true); +const bSummary = b.provider.summary(); +check('device B discovers the space via listSpaces', bSummary.spaces?.some((s) => s.ref === rec.space) === true); +const avail = bSummary.spaces?.find((s) => s.ref === rec.space)?.available ?? []; +check('device B sees the doc as available', avail.some((d) => d.docRkey === rec.docRkey), JSON.stringify(avail)); +check('space name traveled via space.ziran.info', bSummary.spaces?.find((s) => s.ref === rec.space)?.name === 'Test Space'); + +const adopted = await b.provider.adopt(rec.space, rec.docRkey); +const bTile = await parseTile(adopted.path); +check('adopted tile instantiates verified', !bTile.damaged, bTile.damage ?? ''); +check('adopted tile carries the doc at-uri', bTile.manifest.at === rec.at); +const bMsgs = msgs(b.events, adopted.localId); +check( + 'post-checkpoint ops backfilled to device B in order', + bMsgs.length === 2 && unb64(String(bMsgs[0]!.b64)) === 'one' && unb64(String(bMsgs[1]!.b64)) === 'two', + JSON.stringify(bMsgs.map((m) => m.seq)), +); + +/* ——— cross-device exchange, same DID (rkeys interleave in one repo) ——— */ + +await b.provider.send(adopted.localId, b64('three')); +await sleep(500); +await a.provider.pollNow(true); +const aAll = msgs(a.events, aDocId); +check('device A receives device B’s op exactly once', aAll.length === 3 && unb64(String(aAll[2]!.b64)) === 'three'); +await a.provider.pollNow(true); +check('a second poll delivers nothing twice', msgs(a.events, aDocId).length === 3); +await b.provider.pollNow(true); +check('device B does not re-deliver its own echo', msgs(b.events, adopted.localId).length === 3); + +/* ——— cross-member flow ——— */ + +const bobFx = await fixture('bob', 'bob'); +await inspector.addMember(rec.space, bobFx.did); +await bobFx.provider.pollNow(true); // listSpaces won't show it: bob never wrote +const bobAdopted = await bobFx.provider.adopt(rec.space, rec.docRkey); +check( + 'a member adopts by ref before ever writing', + msgs(bobFx.events, bobAdopted.localId).length === 3, + String(msgs(bobFx.events, bobAdopted.localId).length), +); +await bobFx.provider.send(bobAdopted.localId, b64('four')); +await sleep(500); +await a.provider.pollNow(true); +const aAfterBob = msgs(a.events, aDocId); +check( + 'bob’s op reaches device A with his role', + aAfterBob.length === 4 && aAfterBob[3]!.author === bobFx.did && aAfterBob[3]!.role === 'editor', + JSON.stringify(aAfterBob[3] ?? {}), +); + +// Causal wiring: bob's op should name known heads as parents (his provider +// had delivered three ops before sending). +const bobOps = await inspector.listRecords(rec.space, bobFx.did, 'space.ziran.op'); +const bobParents = (bobOps[0]?.value.parents ?? []) as Array<{ author: string }>; +check('ops carry causal parents', bobParents.length > 0 && bobParents.every((p) => p.author === a.did)); + +/* ——— acked state + restart persistence ——— */ + +await a.provider.onLocalDataWrite(aDocId); +const att = a.provider.attach(aDocId); +check('after putData the buffered backlog is trimmed', att !== null && att.buffered.length === 0); + +const a2 = await fixture2Restart(); +async function fixture2Restart(): Promise { + a.provider.close(); + const acct = net.account('alice'); + const docs = new Map } }>(); + const events: Array> = []; + const openPath = async (path: string) => { + const tile = await parseTile(path); + const id = await docIdForPath(path); + docs.set(id, { + info: { path, name: (tile.manifest.name as string) ?? 'doc' }, + tile: { manifest: tile.manifest as Record }, + }); + return { id }; + }; + await openPath(tilePath); + const provider = new SpacesProvider({ + host: { doc: (id) => docs.get(id), openPath, isOpen: () => true, broadcast: () => {}, broadcastEvent: (e) => events.push(e) }, + auth: async () => await passwordSession(net.url, acct.handle, acct.password), + clientFor: (auth) => new SpaceClient({ auth, resolver }), + registryFile: join(a.dir, 'spaces.json'), + documentsDir: join(a.dir, 'documents'), + autoPoll: false, + }); + await provider.init(); + return { provider, events, dir: a.dir, did: acct.did, openPath }; +} +await a2.provider.pollNow(true); +check('restart re-delivers nothing already processed', msgs(a2.events, aDocId).length === 0); +const att2 = a2.provider.attach(aDocId); +check('restarted registry still knows the doc', att2 !== null && att2.me.role === 'author'); +await a2.provider.send(aDocId, b64('five')); +await sleep(500); +await b.provider.pollNow(true); +// Device B has not polled since bob's op: it now catches both 'four' and 'five'. +const bFinal = msgs(b.events, adopted.localId); +check( + 'post-restart ops still flow to other devices', + bFinal.length === 5 && unb64(String(bFinal[3]!.b64)) === 'four' && unb64(String(bFinal[4]!.b64)) === 'five', + String(bFinal.length), +); + +/* ——— explicit publish (third checkpoint trigger) ——— */ + +await a2.provider.publish(aDocId); +const cp2 = await inspector.getRecord(rec.space, a.did, 'space.ziran.checkpoint', rec.docRkey); +check('explicit publish refreshes the checkpoint', String(cp2.value.createdAt) >= String(cp.value.createdAt)); + +/* ——— presence (Phase G): beacons while open, aging out ——— */ + +await a2.provider.pollNow(true); // fixture hosts report every doc open → beacon written +const presence = await inspector.getRecord(rec.space, a.did, 'space.ziran.presence', rec.docRkey); +check('presence beacon written while the doc is open', presence.value.$type === 'space.ziran.presence'); +await b.provider.pollNow(true); +const bRoster = b.provider.attach(adopted.localId)?.roster ?? []; +check( + 'fresh presence marks the member present', + bRoster.find((m) => m.did === a.did)?.present === true, + JSON.stringify(bRoster), +); +// A member whose beacon has aged past the freshness window reads as away. +const bobClient = new SpaceClient({ + auth: await passwordSession(net.url, net.account('bob').handle, net.account('bob').password), + resolver, +}); +await bobClient.putRecord(rec.space, 'space.ziran.presence', rec.docRkey, { + $type: 'space.ziran.presence', + doc: rec.docRkey, + at: new Date(Date.now() - 10 * 60 * 1000).toISOString(), +}); +await b.provider.pollNow(true); +const bRoster2 = b.provider.attach(adopted.localId)?.roster ?? []; +check( + 'a stale beacon reads as away', + bRoster2.find((m) => m.did === bobFx.did)?.present === false, + JSON.stringify(bRoster2), +); + +/* ——— invitations: inbox delivery, accept, dismissal persistence ——— */ + +const carol = await fixture('carol', 'carol'); // init auto-creates her inbox +const invited = await a2.provider.invite(aDocId, carol.did, 'editor'); +check('invite returns a space link', invited.link.startsWith('ziran://space?ref='), invited.link); +check('invite delivered to an existing inbox', invited.invitation.pending !== true); + +const notOwner = await bobFx.provider.invite(bobAdopted.localId, 'did:plc:fakedave', 'editor').catch((e) => e); +check('non-owner invite is refused', notOwner instanceof Error && /owner/.test(notOwner.message), String(notOwner)); + +await carol.provider.pollNow(true); +const carolInv = carol.provider.summary().invitations; +check( + 'carol sees the invitation with the space name', + carolInv.length === 1 && carolInv[0]!.title === 'Test Space' && carolInv[0]!.inviterDid === a.did, + JSON.stringify(carolInv), +); +const { path: carolPath } = await carol.provider.accept(carolInv[0]!.token); +check('accept instantiates the doc', (await parseTile(carolPath)).manifest.at === rec.at); +const carolMsgs = msgs(carol.events, (await carol.openPath(carolPath)).id); +check( + 'accept replays ops past the checkpoint frontier', + carolMsgs.length >= 1 && carolMsgs.some((m) => unb64(String(m.b64)) === 'five'), + JSON.stringify(carolMsgs.map((m) => unb64(String(m.b64)))), +); +check('accepting consumed the invitation', carol.provider.summary().invitations.length === 0); + +// Dismissal survives restart: the record still sits in the inbox (it belongs +// to the inviter), but a fresh provider must not resurrect it. +carol.provider.close(); +const carolAgain = new SpacesProvider({ + host: { + doc: () => undefined, + openPath: async (p) => ({ id: await docIdForPath(p) }), + isOpen: () => true, + broadcast: () => {}, + broadcastEvent: () => {}, + }, + auth: async () => await passwordSession(net.url, net.account('carol').handle, net.account('carol').password), + clientFor: (auth) => new SpaceClient({ auth, resolver }), + registryFile: join(carol.dir, 'spaces.json'), + documentsDir: join(carol.dir, 'documents'), + autoPoll: false, +}); +await carolAgain.init(); +await carolAgain.pollNow(true); +check('a handled invitation stays handled after restart', carolAgain.summary().invitations.length === 0); +carolAgain.close(); + +// Inviting someone with no inbox yet: membership lands, delivery cannot. +const inboxless = await a2.provider.invite(aDocId, net.account('dave').did, 'editor'); +check('inviting an inboxless identity reports pending + link', inboxless.invitation.pending === true); + +b.provider.close(); +bobFx.provider.close(); +a2.provider.close(); +await net.close(); +console.log(failures ? `\n${failures} FAILED` : '\nall green'); +Deno.exit(failures ? 1 : 0); diff --git a/src/sync/spaces/provider.ts b/src/sync/spaces/provider.ts new file mode 100644 index 0000000..a44b7d5 --- /dev/null +++ b/src/sync/spaces/provider.ts @@ -0,0 +1,1041 @@ +// SpacesProvider: the CollabProvider built on AT Proto Spaces +// (docs/SYNC-SPACES.md). No relay, no MLS, no E2EE — every member's +// contribution lives in their own PDS repo under a standard protocol, and the +// runtime pulls: listRepos for change detection, listRepoOps for increments, +// checkpoints + blobs for instantiation. Ordering is causal (parents on ops), +// not total; ephemerals are presence records (Phase G) — sendEphemeral is a +// no-op here. +// +// The tile-facing contract is identical to the relay's: attributed frames +// with a local delivery seq, `sync-msg`/`sync-ready`/`sync-roster` events +// over the store's sockets, ackedSeq advanced when the tile persists. Tiles +// cannot tell which provider is underneath. + +import { join } from '@std/path'; +import type { + AttachState, + BufferedFrame, + CollabProvider, + ProviderSummary, + ShareOptions, + SpaceSummary, +} from '../provider.ts'; +import type { Invitation, Member, SyncManifest } from '../protocol.ts'; +import { fromB64, toB64 } from '../protocol.ts'; +import { authorityOf, fromBytesJson, type RepoOp, type SessionAuth, SpaceClient, toBytesJson, type XrpcError } from './client.ts'; +import { CausalBuffer, type CausalOp, type OpParent } from './causal.ts'; +import { type DocRec, loadRegistry, saveRegistry, type SpaceRec, type SpacesRegistry } from './registry.ts'; +import { type CheckpointRecord, instantiateFromCheckpoint, publishCheckpoint } from './checkpoint.ts'; +import { setTileAt } from '../../server/tilefile.ts'; +import { resolveIdentity } from '../atproto.ts'; + +/** Runtime-enforced defaults when a tile's manifest declares no sync roles. */ +const DEFAULT_MANIFEST: SyncManifest = { + owner: 'author', + roles: { + author: { write: true, admin: true }, + editor: { write: true }, + watcher: { write: false }, + }, +}; + +/** Client-side TID (13-char base32-sortable, atproto's rkey scheme): op + batches need their rkeys BEFORE the write so the intra-batch parent chain + is correct in the records as written. */ +let tidLast = 0; +function tid(): string { + let us = Date.now() * 1000; + if (us <= tidLast) us = tidLast + 1; + tidLast = us; + const value = BigInt(us) * 1024n + BigInt(Math.floor(Math.random() * 1024)); + const alphabet = '234567abcdefghijklmnopqrstuvwxyz'; + let out = ''; + for (let shift = 60n; shift >= 0n; shift -= 5n) { + out += alphabet[Number((value >> shift) & 31n)]; + } + return out; +} + +/** Every signed-in identity gets a public-policy inbox space at a ref anyone + can construct from the DID alone — that is how invites travel, since + addMember does not notify the member. */ +const inboxRef = (did: string) => `at://${did}/space/space.ziran.inbox/self`; + +const HOT_POLL_MS = 2_000; +const WARM_POLL_MS = 30_000; +const LIST_SPACES_MS = 60_000; +const INBOX_POLL_MS = 60_000; +/** Presence: a timestamp record refreshed while a doc is open; peers count + an author present while it is younger than the freshness window. One + write per minute per member — the whole ephemeral story under Spaces + (cursor streaming is deliberately off). */ +const PRESENCE_WRITE_MS = 60_000; +const PRESENCE_FRESH_MS = 150_000; +const FLUSH_QUIET_MS = 300; +const FLUSH_MAX_MS = 2_500; +const CHECKPOINT_OPS = 500; +const CHECKPOINT_BYTES = 512 * 1024; +const CHECKPOINT_MIN_MS = 60 * 60 * 1000; + +export interface SpacesHost { + doc(localId: string): { info: { path: string; name: string }; tile: { manifest: Record } } | undefined; + openPath(path: string): Promise<{ id: string }>; + /** True when the doc is open in some window — drives hot polling. */ + isOpen(localId: string): boolean; + broadcast(): void; + broadcastEvent(event: Record): void; +} + +export interface SpacesProviderOptions { + host: SpacesHost; + /** The authenticated session, when there is one — consulted on every + (re)connect, so signing in/out swaps identities like the relay does. */ + auth: () => Promise; + registryFile: string; + documentsDir: string; + clientFor?: (auth: SessionAuth) => SpaceClient; + /** AT block for the summary (sign-in state as the UI shows it). */ + atInfo?: () => ProviderSummary['at']; + /** True when identity comes from developer/env credentials rather than a + real sign-in (the UI's invite gate treats it like ZIRAN_DID). */ + devIdentity?: () => boolean; + handle?: () => string | undefined; + /** Tests: disable timers and drive polls with pollNow(). */ + autoPoll?: boolean; +} + +interface DiscoveredDoc { + docRkey: string; + name: string; + creator: string; + roles: Record; + at: string; +} + +interface LiveDoc { + rec: DocRec; + causal: CausalBuffer; + /** In-memory mirror of rec.delivered, for O(1) settled checks. */ + settled: Map>; + buffer: BufferedFrame[]; + outbox: Uint8Array[]; + flushTimer?: number; + firstQueuedAt?: number; + flushing: boolean; +} + +export class SpacesProvider implements CollabProvider { + #opts: SpacesProviderOptions; + #registry: SpacesRegistry = { spaces: [], docs: [], dismissedInvites: [] }; + #live = new Map(); // by localId + #client: SpaceClient | null = null; + #error: string | undefined; + /** Per space: discovered docs (adopted or not) and last seen writer set. */ + #catalog = new Map>(); + #writers = new Map(); + #nextPoll = new Map(); + #invitations = new Map; space: string; doc?: string }>(); + /** `${space}/${docRkey}` → member did → last presence timestamp (ms). */ + #presence = new Map>(); + #lastPresenceWrite = new Map(); // by localId + #lastListSpaces = 0; + #lastInboxPoll = 0; + #inboxReady = false; + #tick: number | undefined; + #polling = false; + + constructor(opts: SpacesProviderOptions) { + this.#opts = opts; + } + + /* ——— boot / connection ——— */ + + async init(): Promise { + this.#registry = await loadRegistry(this.#opts.registryFile); + for (const rec of this.#registry.docs) this.#reviveDoc(rec); + await this.#connect(); + if (this.#opts.autoPoll !== false) { + this.#tick = setInterval(() => { + this.pollNow().catch(() => {}); + }, 1000) as unknown as number; + } + } + + close(): void { + if (this.#tick !== undefined) clearInterval(this.#tick); + } + + #reviveDoc(rec: DocRec): void { + const settled = new Map>( + Object.entries(rec.delivered).map(([author, rkeys]) => [author, new Set(rkeys)]), + ); + this.#live.set(rec.localId, { + rec, + causal: new CausalBuffer((author, rkey) => settled.get(author)?.has(rkey) ?? false), + settled, + buffer: [], + outbox: [], + flushing: false, + }); + } + + /** Mark an op settled — delivered, echoed, or checkpoint-absorbed — in both + the in-memory predicate and the persisted registry record. */ + #settle(live: LiveDoc, author: string, rkey: string): void { + let set = live.settled.get(author); + if (!set) { + set = new Set(); + live.settled.set(author, set); + } + if (set.has(rkey)) return; + set.add(rkey); + (live.rec.delivered[author] ??= []).push(rkey); + } + + async #connect(): Promise { + try { + const auth = await this.#opts.auth(); + if (!auth) { + this.#client = null; + this.#error = undefined; + this.#opts.host.broadcast(); + return; + } + if (this.#client?.auth.did !== auth.did) this.#inboxReady = false; + this.#client = this.#opts.clientFor?.(auth) ?? new SpaceClient({ auth }); + this.#error = undefined; + await this.#refreshSpaces(); + await this.#ensureInbox(); + } catch (err) { + this.#client = null; + this.#error = (err as Error).message; + } + this.#opts.host.broadcast(); + } + + /** Create this identity's invitation inbox (public policy: anyone can mint + a credential and write an invite into their own repo there). Losing this + race to another device of ours is fine — either way it exists. */ + async #ensureInbox(): Promise { + if (this.#inboxReady || !this.#client) return; + try { + await this.#client.createSpace('space.ziran.inbox', { skey: 'self', policy: 'public' }); + this.#inboxReady = true; + } catch (err) { + const name = (err as XrpcError).error ?? ''; + if (/exists/i.test(name) || /exists/i.test((err as Error).message)) { + this.#inboxReady = true; + return; + } + console.warn('spaces: could not create the invitation inbox:', (err as Error).message); + } + } + + /** Same-account multi-device discovery: every space this DID has written + into, merged into the registry (names fill in from space.ziran.info as + polling reaches each authority repo). */ + async #refreshSpaces(): Promise { + if (!this.#client) return; + this.#lastListSpaces = Date.now(); + const refs = await this.#client.listSpaces(); + let changed = false; + for (const ref of refs) { + if (!ref.includes('/space/space.ziran.workspace/')) continue; + if (!this.#registry.spaces.some((s) => s.ref === ref)) { + this.#registry.spaces.push({ + ref, + name: '', + mine: ref.startsWith(`at://${this.#client.auth.did}/`), + repoCursors: {}, + }); + changed = true; + } + } + if (changed) await this.#persist(); + } + + /* ——— polling ——— */ + + /** One scheduler pass: refresh the space list occasionally, poll every due + space. Also the test entrypoint (autoPoll: false + await pollNow()). */ + async pollNow(force = false): Promise { + if (this.#polling) return; + this.#polling = true; + try { + if (!this.#client) await this.#connect(); + if (!this.#client) return; + if (force || Date.now() - this.#lastListSpaces > LIST_SPACES_MS) { + await this.#refreshSpaces().catch(() => {}); + } + for (const space of this.#registry.spaces) { + const due = this.#nextPoll.get(space.ref) ?? 0; + if (!force && Date.now() < due) continue; + try { + await this.#pollSpace(space); + this.#error = undefined; + } catch (err) { + this.#error = (err as Error).message; + } + const hot = this.#registry.docs.some((d) => d.space === space.ref && this.#opts.host.isOpen(d.localId)); + this.#nextPoll.set(space.ref, Date.now() + (hot ? HOT_POLL_MS : WARM_POLL_MS)); + } + // Frames stranded by an earlier failed flush retry on the poll beat. + for (const [localId, live] of this.#live) { + if (live.outbox.length && !live.flushTimer && !live.flushing) { + await this.#flush(localId).catch(() => {}); + } + } + await this.#writePresence().catch(() => {}); + if (force || Date.now() - this.#lastInboxPoll > INBOX_POLL_MS) { + await this.#pollInbox().catch(() => {}); + } + } finally { + this.#polling = false; + } + } + + /** Sweep the own inbox space for invites written by other people (each in + the inviter's repo). Dismissals are app-local and persisted. */ + async #pollInbox(): Promise { + const client = this.#client; + if (!client) return; + await this.#ensureInbox(); + this.#lastInboxPoll = Date.now(); + const inbox = inboxRef(client.auth.did); + let repos; + try { + repos = await client.listRepos(inbox); + } catch { + return; // no inbox yet (creation failed above); retried next sweep + } + let changed = false; + for (const repo of repos) { + if (repo.did === client.auth.did) continue; + const records = await client.listRecords(inbox, repo.did, 'space.ziran.invite').catch(() => []); + for (const record of records) { + const token = record.rkey; + if (this.#registry.dismissedInvites.includes(token) || this.#invitations.has(token)) continue; + const v = record.value as { space?: string; name?: string; doc?: string; createdAt?: string }; + if (typeof v.space !== 'string') continue; + const doc = typeof v.doc === 'string' ? v.doc : undefined; + // Already here (adopted, or a known space when no doc is named)? + if (doc && this.#registry.docs.some((d) => d.space === v.space && d.docRkey === doc)) continue; + if (!doc && this.#registry.spaces.some((s) => s.ref === v.space)) continue; + this.#invitations.set(token, { + space: v.space, + doc, + inv: { + token, + docId: doc ?? '', + title: v.name ?? 'a shared space', + inviterDid: repo.did, + inviteeDid: client.auth.did, + role: 'member', + createdAt: Date.parse(v.createdAt ?? '') || Date.now(), + }, + }); + changed = true; + } + } + if (changed) this.#opts.host.broadcast(); + } + + async #pollSpace(space: SpaceRec): Promise { + const client = this.#client!; + const heads = await client.listRepos(space.ref); + this.#writers.set(space.ref, heads.map((h) => h.did)); + let rosterChanged = false; + for (const head of heads) { + const cursor = space.repoCursors[head.did]; + if (cursor && cursor === head.rev) continue; + const { ops } = await client.allRepoOps(space.ref, head.did, cursor); + const advancedTo = this.#processRepoOps(space, head.did, ops); + if (advancedTo !== undefined) space.repoCursors[head.did] = advancedTo; + rosterChanged = true; + } + if (rosterChanged) { + await this.#persist(); + for (const rec of this.#registry.docs) { + if (rec.space !== space.ref) continue; + this.#opts.host.broadcastEvent({ type: 'sync-roster', docId: rec.localId, roster: this.#roster(rec) }); + } + this.#opts.host.broadcast(); + } + } + + /** Feed one author's fetched oplog tail through discovery and causal + delivery. Returns the rev the cursor may advance to: past everything + delivered or irrelevant, stopping before the first op still held for a + missing parent (it will be refetched). */ + #processRepoOps(space: SpaceRec, author: string, ops: RepoOp[]): string | undefined { + const catalog = this.#catalog.get(space.ref) ?? new Map(); + this.#catalog.set(space.ref, catalog); + const docs = this.#registry.docs.filter((d) => d.space === space.ref); + const byRkey = new Map(docs.map((d) => [d.docRkey, d])); + + for (const op of ops) { + if (op.collection === 'space.ziran.info' && op.value) { + const spaceRec = this.#registry.spaces.find((s) => s.ref === space.ref); + if (spaceRec && typeof op.value.name === 'string') spaceRec.name = op.value.name; + continue; + } + if (op.collection === 'space.ziran.presence' && op.value && op.action !== 'delete') { + // rkey = doc rkey; one record per member per doc, refreshed in place. + const at = Date.parse(String(op.value.at ?? '')); + if (Number.isFinite(at)) { + const key = `${space.ref}/${op.rkey}`; + const perDoc = this.#presence.get(key) ?? new Map(); + this.#presence.set(key, perDoc); + if ((perDoc.get(author) ?? 0) < at) perDoc.set(author, at); + } + continue; + } + if (op.collection === 'space.ziran.doc' && op.value && op.action !== 'delete') { + catalog.set(op.rkey, { + docRkey: op.rkey, + name: String(op.value.name ?? 'untitled'), + creator: author, + roles: (op.value.roles as Record) ?? {}, + at: `${space.ref}/${author}/space.ziran.doc/${op.rkey}`, + }); + continue; + } + if (op.collection !== 'space.ziran.op' || !op.value || op.action === 'delete') continue; + const rec = byRkey.get(String(op.value.doc ?? '')); + if (!rec) continue; // not instantiated here; adoption backfills later + const live = this.#live.get(rec.localId); + if (!live) continue; + const processed = rec.processedRevs[author]; + if (processed && op.rev <= processed) { + // Behind this doc's dedup line: absorbed by the checkpoint we came + // from, or refetched — either way settled history for the DAG. + this.#settle(live, author, op.rkey); + continue; + } + if (live.settled.get(author)?.has(op.rkey)) continue; // own echo etc. + live.causal.push({ + author, + rkey: op.rkey, + rev: op.rev, + parents: (op.value.parents as OpParent[]) ?? [], + value: op.value, + }); + } + + for (const live of this.#live.values()) { + live.causal.drain((op) => { + this.#settle(live, op.author, op.rkey); + this.#deliver(live, op); + }); + } + + // Walk the stream in rev order, advancing the space cursor and each + // doc's processed-rev line past everything settled (delivered, deduped, + // or our own echo); stop before the first op still held for a missing + // parent, so it is refetched next poll. + let advancedTo: string | undefined; + for (const op of ops) { + if (op.collection === 'space.ziran.op' && op.value && op.action !== 'delete') { + const rec = byRkey.get(String(op.value.doc ?? '')); + const live = rec && this.#live.get(rec.localId); + if (rec && live) { + if (live.causal.pendingHas(author, op.rkey)) break; // held: refetch next poll + const processed = rec.processedRevs[author]; + if (rec.unconfirmedOwn.includes(op.rkey)) { + rec.unconfirmedOwn = rec.unconfirmedOwn.filter((k) => k !== op.rkey); + if (!rec.deliveredRevs[author] || op.rev > rec.deliveredRevs[author]!) { + rec.deliveredRevs[author] = op.rev; + } + } + if (!processed || op.rev > processed) rec.processedRevs[author] = op.rev; + } + } + advancedTo = op.rev; + } + return advancedTo; + } + + #deliver(live: LiveDoc, op: CausalOp): void { + const rec = live.rec; + const bytes = fromBytesJson(op.value.bytes); + const seq = ++rec.seq; + rec.deliveredRevs[op.author] = op.rev; + rec.heads = [ + ...rec.heads.filter((h) => !op.parents.some((p) => p.author === h.author && p.rkey === h.rkey)), + { author: op.author, rkey: op.rkey }, + ]; + const frame: BufferedFrame = { + seq, + author: op.author, + role: this.#roleOf(rec, op.author), + b64: toB64(bytes), + }; + live.buffer.push(frame); + this.#opts.host.broadcastEvent({ type: 'sync-msg', docId: rec.localId, ...frame }); + } + + #roleOf(rec: DocRec, did: string): string { + return rec.roles[did] ?? rec.roles.default ?? 'editor'; + } + + #roster(rec: DocRec): Member[] { + const writers = this.#writers.get(rec.space) ?? []; + const dids = new Set(writers); + const me = this.#client?.auth.did; + if (me) dids.add(me); + dids.add(rec.creator); + const perDoc = this.#presence.get(`${rec.space}/${rec.docRkey}`); + const now = Date.now(); + return [...dids].map((did) => ({ + did, + role: this.#roleOf(rec, did), + // This device is trivially here; everyone else is present while their + // presence record stays fresh. + present: did === me || now - (perDoc?.get(did) ?? 0) < PRESENCE_FRESH_MS, + })); + } + + /** Refresh this device's presence record for every open shared doc (rkey = + the doc's rkey; putRecord replaces the previous beacon). */ + async #writePresence(): Promise { + const client = this.#client; + if (!client) return; + const now = Date.now(); + for (const rec of this.#registry.docs) { + if (!this.#opts.host.isOpen(rec.localId)) continue; + if (now - (this.#lastPresenceWrite.get(rec.localId) ?? 0) < PRESENCE_WRITE_MS) continue; + this.#lastPresenceWrite.set(rec.localId, now); + await client.putRecord(rec.space, 'space.ziran.presence', rec.docRkey, { + $type: 'space.ziran.presence', + doc: rec.docRkey, + at: new Date().toISOString(), + }).catch(() => { + this.#lastPresenceWrite.delete(rec.localId); // retried next beat + }); + } + } + + /* ——— sharing (go live) ——— */ + + async share(localId: string, opts: ShareOptions = {}): Promise { + const client = this.#requireClient(); + const doc = this.#opts.host.doc(localId); + if (!doc) throw new Error('document is not open'); + const existing = this.#registry.docs.find((d) => d.localId === localId); + if (existing) return existing; + + // The space: an existing one I'm in, or a new named one created here. + let spaceRef = opts.space; + if (!spaceRef) { + const name = opts.newSpaceName?.trim(); + if (!name) throw new Error('pick a space, or name a new one'); + spaceRef = await client.createSpace('space.ziran.workspace', { policy: 'memberList' }); + await client.putRecord(spaceRef, 'space.ziran.info', 'self', { + $type: 'space.ziran.info', + name, + createdAt: new Date().toISOString(), + }); + this.#registry.spaces.push({ ref: spaceRef, name, mine: true, repoCursors: {} }); + } else if (!this.#registry.spaces.some((s) => s.ref === spaceRef)) { + throw new Error('that space is not one of yours'); + } + + const sync = (doc.tile.manifest as { sync?: { roles?: SyncManifest['roles']; owner?: string } }).sync; + const manifest: SyncManifest = sync?.roles + ? { owner: sync.owner ?? Object.keys(sync.roles)[0]!, roles: sync.roles } + : DEFAULT_MANIFEST; + const defaultRole = Object.entries(manifest.roles) + .find(([name, spec]) => name !== manifest.owner && spec.write)?.[0] ?? manifest.owner; + const roles: Record = { [client.auth.did]: manifest.owner, default: defaultRole }; + + const model = (doc.tile.manifest as { model?: { id?: string } }).model?.id ?? 'com.berjon.ziran.unknown'; + const { uri } = await client.createRecord(spaceRef, 'space.ziran.doc', { + $type: 'space.ziran.doc', + name: doc.info.name, + model, + roles, + createdAt: new Date().toISOString(), + }); + const docRkey = uri.split('/').pop()!; + + // The durable link between the .tile on disk and its online identity. + await setTileAt(doc.info.path, uri); + + const rec: DocRec = { + localId, + path: doc.info.path, + at: uri, + space: spaceRef, + docRkey, + creator: client.auth.did, + role: manifest.owner, + roles, + manifest, + seq: 0, + ackedSeq: 0, + processedRevs: {}, + unconfirmedOwn: [], + delivered: {}, + deliveredRevs: {}, + ackedRevs: {}, + heads: [], + ownOpsSince: 0, + ownBytesSince: 0, + }; + this.#registry.docs.push(rec); + this.#reviveDoc(rec); + await this.#persist(); + + // Go-live checkpoint (mandatory): carries the tile's resources so + // invitees and other devices can instantiate. + await this.#checkpoint(rec).catch((err) => + console.warn(`spaces: go-live checkpoint failed for ${doc.info.name}:`, (err as Error).message) + ); + + this.#nextPoll.set(spaceRef, 0); + this.#opts.host.broadcastEvent({ + type: 'sync-ready', + docId: localId, + me: this.#me(rec), + roster: this.#roster(rec), + }); + this.#opts.host.broadcast(); + return rec; + } + + #me(rec: DocRec): Member { + const did = this.#client?.auth.did ?? rec.creator; + return { did, handle: this.#opts.handle?.(), role: this.#roleOf(rec, did) }; + } + + /* ——— adoption (instantiate a doc discovered in a space) ——— */ + + /** Instantiate a document another member (or another of this account's + devices) put in a space: newest checkpoint → blobs → verified .tile in + documents/ → registered and syncing from the checkpoint's frontier. */ + async adopt(spaceRef: string, docRkey: string): Promise<{ path: string; localId: string }> { + const client = this.#requireClient(); + const already = this.#registry.docs.find((d) => d.space === spaceRef && d.docRkey === docRkey); + if (already) return { path: already.path, localId: already.localId }; + const catalog = this.#catalog.get(spaceRef); + let entry = catalog?.get(docRkey); + if (!entry) { + // Not seen by polling yet (fresh adopt by rkey): sweep member repos. + const repos = await client.listRepos(spaceRef); + for (const repo of repos) { + const records = await client.listRecords(spaceRef, repo.did, 'space.ziran.doc').catch(() => []); + const hit = records.find((r) => r.rkey === docRkey); + if (hit) { + entry = { + docRkey, + name: String(hit.value.name ?? 'untitled'), + creator: repo.did, + roles: (hit.value.roles as Record) ?? {}, + at: `${spaceRef}/${repo.did}/space.ziran.doc/${docRkey}`, + }; + break; + } + } + if (!entry) throw new Error('that document is not in the space'); + } + + // Newest checkpoint wins, from any author. + const repos = await client.listRepos(spaceRef); + let best: { author: string; checkpoint: CheckpointRecord } | undefined; + for (const repo of repos) { + try { + const { value } = await client.getRecord(spaceRef, repo.did, 'space.ziran.checkpoint', docRkey); + const checkpoint = value as unknown as CheckpointRecord; + if (!best || String(checkpoint.createdAt) > String(best.checkpoint.createdAt)) { + best = { author: repo.did, checkpoint }; + } + } catch { + // this member never checkpointed the doc + } + } + if (!best) throw new Error('no checkpoint to instantiate from — ask the sharer to publish one'); + + const stem = entry.name.replace(/[^\w.-]+/g, '-').replace(/^-+|-+$/g, '') || 'shared'; + await Deno.mkdir(this.#opts.documentsDir, { recursive: true }); + let path = join(this.#opts.documentsDir, `${stem}.tile`); + try { + await Deno.stat(path); + path = join(this.#opts.documentsDir, `${stem}-${docRkey.slice(-6)}.tile`); + } catch { + // free name + } + await instantiateFromCheckpoint(client, spaceRef, best.author, best.checkpoint, path); + await setTileAt(path, entry.at); + + const info = await this.#opts.host.openPath(path); + const frontier = best.checkpoint.frontier ?? {}; + // The tile's own declared roles (for labels); assignments still come from + // the doc record's author. + const opened = this.#opts.host.doc(info.id); + const sync = (opened?.tile.manifest as { sync?: { roles?: SyncManifest['roles']; owner?: string } })?.sync; + const manifest: SyncManifest = sync?.roles + ? { owner: sync.owner ?? Object.keys(sync.roles)[0]!, roles: sync.roles } + : DEFAULT_MANIFEST; + const rec: DocRec = { + localId: info.id, + path, + at: entry.at, + space: spaceRef, + docRkey, + creator: entry.creator, + role: entry.roles[client.auth.did] ?? entry.roles.default ?? 'editor', + roles: entry.roles, + manifest, + seq: 0, + ackedSeq: 0, + // Everything at or behind the checkpoint frontier is inside the tile + // we just instantiated: processed, delivered, and acked. The replay + // below settles those ops' rkeys as it re-encounters them. + processedRevs: { ...frontier }, + unconfirmedOwn: [], + delivered: {}, + deliveredRevs: { ...frontier }, + ackedRevs: { ...frontier }, + heads: [], + ownOpsSince: 0, + ownBytesSince: 0, + }; + this.#registry.docs.push(rec); + this.#reviveDoc(rec); + + // Backfill by rewinding the space cursors and letting the normal poll + // replay the oplog: this doc's post-frontier ops deliver, every other + // doc's ops fall to their processed-rev dedup line. + let spaceRec = this.#registry.spaces.find((s) => s.ref === spaceRef); + if (!spaceRec) { + spaceRec = { ref: spaceRef, name: '', mine: false, repoCursors: {} }; + this.#registry.spaces.push(spaceRec); + } + spaceRec.repoCursors = {}; + await this.#pollSpace(spaceRec); + // An invitation this adoption answers is done, however it was accepted. + for (const [token, entry] of this.#invitations) { + if (entry.space === spaceRef && (!entry.doc || entry.doc === docRkey)) { + this.#invitations.delete(token); + this.#registry.dismissedInvites.push(token); + } + } + await this.#persist(); + this.#opts.host.broadcast(); + return { path, localId: info.id }; + } + + /* ——— tile traffic ——— */ + + attach(localId: string): AttachState | null { + const live = this.#live.get(localId); + if (!live) return null; + return { + me: this.#me(live.rec), + roster: this.#roster(live.rec), + buffered: live.buffer.filter((m) => m.seq > live.rec.ackedSeq), + }; + } + + send(localId: string, b64: string): Promise { + const live = this.#live.get(localId); + if (!live) return Promise.reject(new Error('document is not in a live session')); + live.outbox.push(fromB64(b64)); + live.firstQueuedAt ??= Date.now(); + // Coalesce: a quiet flush after 300 ms, but never hold a frame past the + // max window under sustained typing. + if (live.flushTimer !== undefined) clearTimeout(live.flushTimer); + const overdue = Date.now() - live.firstQueuedAt >= FLUSH_MAX_MS; + live.flushTimer = setTimeout( + () => { + live.flushTimer = undefined; + this.#flush(localId).catch((err) => { + console.warn('spaces: op flush failed (kept for retry):', (err as Error).message); + }); + }, + overdue ? 0 : FLUSH_QUIET_MS, + ) as unknown as number; + return Promise.resolve(0); + } + + /** Flush the doc's queued frames as one applyWrites batch, then deliver our + own echo through the same path every other frame takes. */ + async #flush(localId: string): Promise { + const live = this.#live.get(localId); + if (!live || live.flushing || live.outbox.length === 0) return; + const client = this.#client; + if (!client) return; // parked; retried on the poll beat + live.flushing = true; + const frames = live.outbox.splice(0); + live.firstQueuedAt = undefined; + try { + const rec = live.rec; + const me = client.auth.did; + // Client-assigned rkeys, so the intra-batch parent chain is correct in + // the records as written: the first op carries the doc's current heads, + // each next op has the previous one as its sole parent. + const rkeys = frames.map(() => tid()); + const writes = frames.map((bytes, i) => ({ + action: 'create' as const, + collection: 'space.ziran.op', + rkey: rkeys[i]!, + record: { + $type: 'space.ziran.op', + doc: rec.docRkey, + parents: i === 0 ? rec.heads : [{ author: me, rkey: rkeys[i - 1]! }], + bytes: toBytesJson(bytes), + }, + })); + await client.applyWrites(rec.space, writes); + // Own echo, through the same delivery path every other frame takes. + // Settling now (a) lets children reference these ops immediately and + // (b) makes the poll that surfaces them in the oplog drop them as + // duplicates; the unconfirmed list drives the frontier bookkeeping. + rec.unconfirmedOwn.push(...rkeys); + rkeys.forEach((rkey) => this.#settle(live, me, rkey)); + frames.forEach((bytes, i) => { + const seq = ++rec.seq; + const frame: BufferedFrame = { seq, author: me, role: rec.role, b64: toB64(bytes) }; + live.buffer.push(frame); + this.#opts.host.broadcastEvent({ type: 'sync-msg', docId: rec.localId, ...frame }); + rec.ownOpsSince += 1; + rec.ownBytesSince += bytes.length; + }); + rec.heads = [{ author: me, rkey: rkeys[rkeys.length - 1]! }]; + await this.#persist(); + await this.#maybeCheckpoint(rec); + this.#nextPoll.set(rec.space, 0); // pull others' work opportunistically + } catch (err) { + live.outbox.unshift(...frames); // kept; the poll beat retries + live.firstQueuedAt ??= Date.now(); + throw err; + } finally { + live.flushing = false; + } + } + + ephemeral(_localId: string, _b64: string): void { + // Presence records replace the ephemeral lane under Spaces (Phase G); + // cursor streaming is deliberately off. + } + + async onLocalDataWrite(localId: string): Promise { + const live = this.#live.get(localId); + if (!live) return; + const rec = live.rec; + rec.ackedSeq = rec.seq; + rec.ackedRevs = { ...rec.deliveredRevs }; + live.buffer = live.buffer.filter((m) => m.seq > rec.ackedSeq); + await this.#persist(); + await this.#maybeCheckpoint(rec).catch(() => {}); + } + + /* ——— checkpoints (rare + lazy) ——— */ + + async #maybeCheckpoint(rec: DocRec): Promise { + const since = Date.now() - (rec.checkpoint?.at ?? 0); + const due = rec.ownOpsSince >= CHECKPOINT_OPS || rec.ownBytesSince >= CHECKPOINT_BYTES; + if (!due || since < CHECKPOINT_MIN_MS) return; + await this.#checkpoint(rec); + } + + /** Publish this machine's checkpoint for the doc: the on-disk tile, whose + content is exactly ackedRevs' worth of ops — that snapshot is the + frontier a joiner replays from. */ + async #checkpoint(rec: DocRec): Promise { + const client = this.#requireClient(); + const { blobCids } = await publishCheckpoint( + client, + rec.space, + rec.docRkey, + rec.path, + rec.ackedRevs, + new Set(rec.checkpoint?.blobCids ?? []), + ); + rec.checkpoint = { at: Date.now(), blobCids }; + rec.ownOpsSince = 0; + rec.ownBytesSince = 0; + await this.#persist(); + } + + /** An explicit "publish now" (the design's third checkpoint trigger). */ + async publish(localId: string): Promise { + const rec = this.#registry.docs.find((d) => d.localId === localId); + if (!rec) throw new Error('document is not shared'); + await this.#checkpoint(rec); + } + + /* ——— invitations ——— */ + + /** Invite an identity into the doc's space: addMember (owner-only — the + simplespace restriction), record their per-doc role if we authored the + doc record, then deliver a space.ziran.invite into THEIR public inbox + space. The ziran:// link is a co-equal out-of-band path. */ + async invite(localId: string, identifier: string, role: string): Promise<{ invitation: Invitation; link: string }> { + const client = this.#requireClient(); + const rec = this.#registry.docs.find((d) => d.localId === localId); + if (!rec) throw new Error('go live first — pick a space for this document, then invite people to it'); + if (!rec.manifest.roles[role]) throw new Error(`this document has no “${role}” role`); + if (authorityOf(rec.space) !== client.auth.did) { + throw new Error('only the space owner can invite people — membership belongs to the space, not the document'); + } + let did = identifier.trim(); + if (!did.startsWith('did:')) did = (await resolveIdentity(did)).did; + if (did === client.auth.did) throw new Error('that is your own identity'); + await client.addMember(rec.space, did); + // The doc record's author is the sole authority for role assignments. + if (rec.creator === client.auth.did) { + try { + const { value } = await client.getRecord(rec.space, client.auth.did, 'space.ziran.doc', rec.docRkey); + const roles = { ...((value.roles as Record) ?? {}), [did]: role }; + await client.putRecord(rec.space, 'space.ziran.doc', rec.docRkey, { ...value, roles }); + rec.roles = roles; + await this.#persist(); + } catch (err) { + console.warn('spaces: could not record the role assignment:', (err as Error).message); + } + } + const spaceName = this.#registry.spaces.find((s) => s.ref === rec.space)?.name || 'a shared space'; + const link = `ziran://space?ref=${encodeURIComponent(rec.space)}&doc=${rec.docRkey}`; + let pending = false; + try { + await client.createRecord(inboxRef(did), 'space.ziran.invite', { + $type: 'space.ziran.invite', + space: rec.space, + name: spaceName, + doc: rec.docRkey, + createdAt: new Date().toISOString(), + }); + } catch { + // No inbox to deliver into (they have not run Ziran signed-in yet). + // Membership is already granted; the link works the moment they do. + pending = true; + } + this.#opts.host.broadcast(); + return { + invitation: { + token: rec.docRkey, + docId: rec.docRkey, + title: this.#opts.host.doc(localId)?.info.name ?? 'document', + inviterDid: client.auth.did, + inviteeDid: did, + role, + createdAt: Date.now(), + pending, + }, + link, + }; + } + + async accept(token: string): Promise<{ path: string }> { + const entry = this.#invitations.get(token); + if (!entry) throw new Error('invitation not found — it may have been withdrawn'); + const result = entry.doc + ? await this.adopt(entry.space, entry.doc) + : await this.#adoptFirstAvailable(entry.space); + this.dismiss(token); + return { path: result.path }; + } + + /** An invite naming only a space: register it, sweep it, take what's there. */ + async #adoptFirstAvailable(space: string): Promise<{ path: string; localId: string }> { + let spaceRec = this.#registry.spaces.find((s) => s.ref === space); + if (!spaceRec) { + spaceRec = { ref: space, name: '', mine: false, repoCursors: {} }; + this.#registry.spaces.push(spaceRec); + } + await this.#pollSpace(spaceRec); + const first = [...(this.#catalog.get(space)?.values() ?? [])][0]; + if (!first) throw new Error('nothing in that space yet — ask them to go live with a document first'); + return await this.adopt(space, first.docRkey); + } + + dismiss(token: string): void { + if (!this.#invitations.delete(token)) return; + this.#registry.dismissedInvites.push(token); + this.#persist().catch(() => {}); + this.#opts.host.broadcast(); + } + + /* ——— bookkeeping ——— */ + + moved(oldId: string, newId: string, newPath: string): void { + const rec = this.#registry.docs.find((d) => d.localId === oldId); + if (!rec) return; + const live = this.#live.get(oldId); + rec.localId = newId; + rec.path = newPath; + if (live) { + this.#live.delete(oldId); + this.#live.set(newId, live); + } + this.#persist().catch(() => {}); + } + + retryNow(): void { + this.#error = undefined; + this.#connect() + .then(() => this.pollNow(true)) + .catch(() => {}); + } + + async #persist(): Promise { + await saveRegistry(this.#opts.registryFile, this.#registry); + } + + #requireClient(): SpaceClient { + if (!this.#client) { + throw new Error( + this.#error + ? `your PDS is unreachable (${this.#error}) — collaboration is paused` + : 'going live needs your AT identity — sign in first', + ); + } + return this.#client; + } + + /* ——— state for the UI ——— */ + + summary(): ProviderSummary { + const did = this.#client?.auth.did ?? ''; + const docs: ProviderSummary['docs'] = {}; + for (const rec of this.#registry.docs) { + // Only the space owner can invite (simplespace restriction). + const canInvite = Boolean(did) && authorityOf(rec.space) === did; + docs[rec.localId] = { + syncId: rec.at, + role: rec.role, + live: Boolean(this.#client) && !this.#error, + members: this.#roster(rec), + inviteBase: '', + space: rec.space, + roles: Object.entries(rec.manifest.roles).map(([name, spec]) => ({ + name, + label: spec.label ?? name.charAt(0).toUpperCase() + name.slice(1), + invitable: canInvite && name !== rec.manifest.owner, + full: false, + })), + }; + } + const spaces: SpaceSummary[] = this.#registry.spaces.map((s) => ({ + ref: s.ref, + name: s.name || 'unnamed space', + mine: s.mine, + available: [...(this.#catalog.get(s.ref)?.values() ?? [])] + .filter((d) => !this.#registry.docs.some((r) => r.space === s.ref && r.docRkey === d.docRkey)) + .map((d) => ({ docRkey: d.docRkey, name: d.name, creator: d.creator })), + })); + return { + provider: 'spaces', + identity: { did, handle: this.#opts.handle?.() ?? did }, + devIdentity: this.#opts.devIdentity?.() ?? false, + at: this.#opts.atInfo?.() ?? { signedIn: false }, + relayOk: Boolean(this.#client) && !this.#error, + relay: this.#client ? new URL(this.#client.auth.pds).host : 'your PDS', + relayError: this.#error, + invitations: [...this.#invitations.values()].map((entry) => entry.inv), + docs, + spaces, + }; + } +} diff --git a/src/sync/spaces/registry.ts b/src/sync/spaces/registry.ts new file mode 100644 index 0000000..d3cf90d --- /dev/null +++ b/src/sync/spaces/registry.ts @@ -0,0 +1,99 @@ +// Registry v2 (docs/SYNC-SPACES.md, Code architecture): the durable local +// state of the Spaces provider — known spaces and each shared doc's identity, +// delivery cursors, and checkpoint bookkeeping. One JSON file, written +// atomically; everything in it is reconstructible from the network except +// localId/path bindings and ackedSeq (which mirror this machine's files). + +import { dirname, join } from '@std/path'; +import type { SyncManifest } from '../protocol.ts'; +import type { OpParent } from './causal.ts'; + +export interface SpaceRec { + ref: string; + name: string; + mine: boolean; + /** member did → last fully processed oplog rev for this space (advanced + only past ops that were delivered or irrelevant, so a held op is + refetched next poll). */ + repoCursors: Record; +} + +export interface DocRec { + /** Path-derived local doc id (re-keyed on move). */ + localId: string; + path: string; + /** at-uri of the space.ziran.doc record — the doc's online identity + (mirrored in the tile manifest's `at` field). */ + at: string; + space: string; + docRkey: string; + /** DID of the doc record's author (sole authority for role assignments). */ + creator: string; + /** My role, in the tile's vocabulary. */ + role: string; + /** The doc record's role assignments: DID (or 'default') → role name. The + record's author is the sole authority for these; tiles enforce meaning. */ + roles: Record; + manifest: SyncManifest; + /** Last local delivery seq handed to the tile bridge. */ + seq: number; + /** Seq the tile's persisted state is known to reflect. */ + ackedSeq: number; + /** author did → rev up to which this doc's slice of the oplog is fully + processed (delivered or deduplicated, contiguously). The dedup line: a + refetched op at or behind it is a duplicate. Rev-based because one DID + can be several devices writing the same repo — revs are the only + per-repo total order. */ + processedRevs: Record; + /** Own op rkeys flushed and locally echoed, not yet observed coming back + in the oplog — the own-echo dedup set. */ + unconfirmedOwn: string[]; + /** author did → rkeys of every op settled for this doc (delivered, echoed, + or checkpoint-absorbed) — the causal buffer's parent predicate. Grows + with history; compaction is a recorded post-alpha follow-up. */ + delivered: Record; + /** author did → rev of the last op delivered to the tile. */ + deliveredRevs: Record; + /** deliveredRevs snapshotted at the tile's last putData — exactly what the + on-disk tile file reflects, hence the checkpoint frontier. */ + ackedRevs: Record; + /** Current op-DAG frontier: parents for my next op. */ + heads: OpParent[]; + /** Own-checkpoint bookkeeping: threshold triggers + blob dedup. */ + checkpoint?: { + at: number; + /** Blob CIDs the last own checkpoint uploaded (skip re-upload). */ + blobCids: string[]; + }; + /** Own ops / bytes written since the last own checkpoint. */ + ownOpsSince: number; + ownBytesSince: number; +} + +export interface SpacesRegistry { + spaces: SpaceRec[]; + docs: DocRec[]; + /** Invite tokens (record rkeys) handled or dismissed — dismissal is + app-local: the record belongs to the inviter and cannot be deleted. */ + dismissedInvites: string[]; +} + +export async function loadRegistry(file: string): Promise { + try { + const parsed = JSON.parse(await Deno.readTextFile(file)); + return { + spaces: parsed.spaces ?? [], + docs: parsed.docs ?? [], + dismissedInvites: parsed.dismissedInvites ?? [], + }; + } catch { + return { spaces: [], docs: [], dismissedInvites: [] }; + } +} + +export async function saveRegistry(file: string, registry: SpacesRegistry): Promise { + await Deno.mkdir(dirname(file), { recursive: true }); + const tmp = join(dirname(file), `.${crypto.randomUUID().slice(0, 8)}.tmp`); + await Deno.writeTextFile(tmp, JSON.stringify(registry, null, 2)); + await Deno.rename(tmp, file); +} diff --git a/src/sync/tiles-logic.test.ts b/src/sync/tiles-logic.test.ts new file mode 100644 index 0000000..a8ef810 --- /dev/null +++ b/src/sync/tiles-logic.test.ts @@ -0,0 +1,156 @@ +// Convergence proofs-by-permutation for the reducer tiles' pure logic +// (Phase G, docs/SYNC-SPACES.md): under Spaces there is no total order, only +// causal delivery — so every causally-valid delivery order of the same ops +// must land every peer in the same state, echoes and optimistic local +// applies included. +// Run: deno run -A src/sync/tiles-logic.test.ts + +import { applyOp, upgrade } from '../../tiles/checklist/logic.js'; +import { derive, opsFromLegacyGames, recordOp, winnerOf } from '../../tiles/tictactoe/logic.js'; + +let failures = 0; +const check = (label: string, ok: boolean, detail = '') => { + console.log(`${ok ? 'PASS' : 'FAIL'} ${label}${detail ? ` — ${detail}` : ''}`); + if (!ok) failures++; +}; + +function permutations(items: T[]): T[][] { + if (items.length <= 1) return [items]; + const out: T[][] = []; + items.forEach((item, i) => { + for (const rest of permutations([...items.slice(0, i), ...items.slice(i + 1)])) { + out.push([item, ...rest]); + } + }); + return out; +} + +/* ——— checklist ——— */ + +interface COp { + author: string; + op: Record; + /** Ops this one causally depends on (delivery must respect this). */ + after?: number[]; +} + +const causallyValid = (order: number[], ops: COp[]) => + order.every((idx, at) => (ops[idx]!.after ?? []).every((dep) => order.indexOf(dep) < at)); + +function checklistOutcomes(ops: COp[]): Set { + const outcomes = new Set(); + for (const order of permutations(ops.map((_, i) => i))) { + if (!causallyValid(order, ops)) continue; + let items: Array> = []; + for (const idx of order) items = applyOp(items, ops[idx]!.op, ops[idx]!.author); + outcomes.add(JSON.stringify(items.map((i) => [i.id, i.text, i.done]))); + } + return outcomes; +} + +{ + // Concurrent adds from two authors: same order everywhere (at, id), not + // arrival order. + const adds: COp[] = [ + { author: 'a', op: { op: 'add', id: 'x1', text: 'one', at: 100 } }, + { author: 'b', op: { op: 'add', id: 'x2', text: 'two', at: 50 } }, + { author: 'a', op: { op: 'add', id: 'x3', text: 'three', at: 100 } }, + ]; + const outcomes = checklistOutcomes(adds); + check('checklist: concurrent adds converge to one order', outcomes.size === 1, `${outcomes.size} outcomes`); + + // Concurrent opposite toggles on one item: LWW stamp decides, not arrival. + const toggles: COp[] = [ + { author: 'a', op: { op: 'add', id: 'i', text: 't', at: 1 } }, + { author: 'a', op: { op: 'set', id: 'i', done: true, at: 10 }, after: [0] }, + { author: 'b', op: { op: 'set', id: 'i', done: false, at: 10 }, after: [0] }, + ]; + const toggled = checklistOutcomes(toggles); + check('checklist: concurrent set-set converges', toggled.size === 1, [...toggled].join(' vs ')); + + // Remove concurrent with a toggle: gone either way. + const removes: COp[] = [ + { author: 'a', op: { op: 'add', id: 'i', text: 't', at: 1 } }, + { author: 'a', op: { op: 'remove', id: 'i' }, after: [0] }, + { author: 'b', op: { op: 'set', id: 'i', done: true, at: 5 }, after: [0] }, + ]; + const removed = checklistOutcomes(removes); + check('checklist: remove vs concurrent set converges to removed', removed.size === 1 && removed.has('[]')); + + // Echo double-apply (optimistic local + echo) is a no-op. + let items: Array> = []; + const op = { op: 'add', id: 'e', text: 'echo', at: 9 }; + items = applyOp(items, op, 'a'); + items = applyOp(items, op, 'a'); + items = applyOp(items, { op: 'set', id: 'e', done: true, at: 10 }, 'a'); + items = applyOp(items, { op: 'set', id: 'e', done: true, at: 10 }, 'a'); + check('checklist: echoes are no-ops', items.length === 1 && items[0]!.done === true); + + // Legacy saves gain ids and stamps without reordering. + const legacy = upgrade([{ text: 'old', done: false }, { text: 'older', done: true }], () => 'minted'); + check('checklist: legacy items upgrade in place', legacy.length === 2 && legacy[0]!.id === 'minted'); +} + +/* ——— tictactoe ——— */ + +{ + // The fold is over a set: ANY ingestion order gives the same games. + const ops = [ + { id: 'm1', op: 'move', game: 0, n: 0, cell: 4 }, + { id: 'm2', op: 'move', game: 0, n: 1, cell: 0 }, + { id: 'm3', op: 'move', game: 0, n: 2, cell: 8 }, + { id: 'm4', op: 'move', game: 0, n: 3, cell: 2 }, + ]; + const roles = ['x', 'o', 'x', 'o']; + const boards = new Set(); + for (const order of permutations(ops.map((_, i) => i))) { + let set: Array> = []; + for (const idx of order) set = recordOp(set, ops[idx]!, roles[idx]!); + boards.add(JSON.stringify(derive(set))); + } + check('tictactoe: any delivery order derives the same board', boards.size === 1, `${boards.size}`); + + // Concurrent claims on the same slot: smallest op id wins everywhere, and + // a peer that optimistically applied the loser recomputes to the winner. + let a: Array> = []; + a = recordOp(a, { id: 'zz-late', op: 'move', game: 0, n: 0, cell: 8 }, 'x'); // optimistic loser first + a = recordOp(a, { id: 'aa-early', op: 'move', game: 0, n: 0, cell: 4 }, 'x'); + let b: Array> = []; + b = recordOp(b, { id: 'aa-early', op: 'move', game: 0, n: 0, cell: 4 }, 'x'); + b = recordOp(b, { id: 'zz-late', op: 'move', game: 0, n: 0, cell: 8 }, 'x'); + check( + 'tictactoe: concurrent slot claims resolve identically', + JSON.stringify(derive(a)) === JSON.stringify(derive(b)) && derive(a)[0]![0] === 4, + JSON.stringify([derive(a), derive(b)]), + ); + + // Off-turn and watcher ops never win a slot. + let c: Array> = []; + c = recordOp(c, { id: 'w1', op: 'move', game: 0, n: 0, cell: 0 }, 'watcher'); + c = recordOp(c, { id: 'o1', op: 'move', game: 0, n: 0, cell: 1 }, 'o'); + check('tictactoe: watcher and off-turn moves are inert', derive(c)[0]!.length === 0); + + // Echo dedup by id. + let d: Array> = []; + d = recordOp(d, { id: 'm', op: 'move', game: 0, n: 0, cell: 4 }, 'x'); + d = recordOp(d, { id: 'm', op: 'move', game: 0, n: 0, cell: 4 }, 'x'); + check('tictactoe: echoes are no-ops', d.length === 1); + + // A win is still a win, and again opens the next game. + let e: Array> = []; + [[0, 'x'], [3, 'o'], [1, 'x'], [4, 'o'], [2, 'x']].forEach(([cell, role], n) => { + e = recordOp(e, { id: `g${n}`, op: 'move', game: 0, n, cell }, role as string); + }); + const won = derive(e); + check('tictactoe: winner detected through the fold', winnerOf(won[0]!)?.role === 'x'); + e = recordOp(e, { id: 'ag', op: 'again', game: 0 }, 'o'); + check('tictactoe: again opens a fresh game', derive(e).length === 2 && derive(e)[1]!.length === 0); + + // Legacy games convert and derive back to themselves. + const legacyGames = [[4, 0, 8, 2, 6], []]; + const converted = derive(opsFromLegacyGames(legacyGames) as Array>); + check('tictactoe: legacy saves convert faithfully', JSON.stringify(converted) === JSON.stringify(legacyGames)); +} + +console.log(failures ? `\n${failures} FAILED` : '\nall green'); +Deno.exit(failures ? 1 : 0); diff --git a/src/types.ts b/src/types.ts index aa4f9e8..c3cd347 100644 --- a/src/types.ts +++ b/src/types.ts @@ -57,15 +57,26 @@ export interface PendingInvitation { pending?: boolean; } +export interface SyncSpace { + ref: string; + name: string; + /** This identity owns the space (owner-only invites). */ + mine: boolean; + /** Docs in the space that are not instantiated on this machine yet. */ + available: Array<{ docRkey: string; name: string; creator: string }>; +} + export interface SyncState { + /** Which collaboration backend is running (relay+MLS, or AT Proto Spaces). */ + provider?: 'relay' | 'spaces'; identity: { did: string; handle: string }; - /** True only under an explicit ZIRAN_DID (developer mode). */ + /** True under an explicit ZIRAN_DID or env Spaces credentials (dev mode). */ devIdentity?: boolean; at: { signedIn: boolean; handle?: string; did?: string; displayName?: string; hasAvatar?: boolean }; + /** The collaboration backend is reachable (field names kept from the relay + era: read as "backend ok / backend address / why not"). */ relayOk: boolean; - /** The relay this runtime targets (ws/wss URL). */ relay?: string; - /** Why the relay is unreachable, when it is. */ relayError?: string; invitations: PendingInvitation[]; docs: Record; + /** Spaces: the space this document lives in. */ + space?: string; }>; + /** Spaces: this identity's known spaces (go-live picker, Documents column). */ + spaces?: SyncSpace[]; } export interface ServerState { diff --git a/static/app.js b/static/app.js index 1844a87..e2137ab 100644 --- a/static/app.js +++ b/static/app.js @@ -733,7 +733,11 @@ var backend = { return data; }, /* ——— collaboration ——— */ - syncShare: (docId) => post(`/api/docs/${docId}/sync/share`), + syncShare: (docId, opts) => post(`/api/docs/${docId}/sync/share`, opts ?? {}), + syncAdopt: (space, docRkey) => post("/api/sync/adopt", { + space, + docRkey + }), syncRetry: () => post("/api/sync/retry"), syncInvite: (docId, did, role) => post(`/api/docs/${docId}/sync/invite`, { did, @@ -1088,14 +1092,23 @@ var DeskStore = class extends EventTarget { syncDoc(docId) { return this.sync?.docs?.[docId]; } - async startSharing(docId) { + async startSharing(docId, opts) { try { - await backend.syncShare(docId); - this.toast("This document is now live \u2014 invite people from this panel"); + await backend.syncShare(docId, opts); + this.toast(this.sync?.provider === "spaces" ? "This document is live in its space \u2014 your other devices will see it" : "This document is now live \u2014 invite people from this panel"); } catch (err) { this.toast(`Could not start sharing: ${err.message}`); } } + /** Instantiate a document another device (or member) put in a space. */ + async adoptDoc(space, docRkey, name) { + try { + this.handleOpened(await backend.syncAdopt(space, docRkey)); + this.toast(`\u201C${name}\u201D is on this machine now \u2014 synced with its space`); + } catch (err) { + this.toast(`Could not fetch \u201C${name}\u201D: ${err.message}`); + } + } /** Ask the runtime to try the relay right now instead of waiting out the backoff timer. */ async syncRetry() { @@ -1395,6 +1408,9 @@ var ZnBaseWindow = class extends i4 { }, menuRecent: { state: true + }, + docSort: { + state: true } }; constructor() { @@ -1402,6 +1418,7 @@ var ZnBaseWindow = class extends i4 { this.query = ""; this.dropping = false; this.menuRecent = void 0; + this.docSort = "recent"; } onStore = () => this.requestUpdate(); connectedCallback() { @@ -1743,6 +1760,62 @@ var ZnBaseWindow = class extends i4 { margin: 0 0 var(--sp-2); padding-left: var(--sp-2); } + .region-head { + display: flex; + align-items: baseline; + gap: var(--sp-3); + } + .region-head h2 { + flex: 1; + } + .sort { + display: inline-flex; + gap: 2px; + border: 1px solid var(--line-soft); + border-radius: var(--r-full); + padding: 2px; + } + .sort button { + font: inherit; + font-size: var(--text-xs); + color: var(--ink-muted); + border: none; + background: none; + border-radius: var(--r-full); + padding: 2px 10px; + cursor: pointer; + } + .sort button[aria-pressed='true'] { + background: var(--panel); + color: var(--ink); + font-weight: var(--w-medium); + } + .sort button:focus-visible { + outline: 2px solid var(--signal); + outline-offset: 1px; + } + details.loc { + margin-bottom: var(--sp-1); + } + details.loc summary { + cursor: pointer; + font-size: var(--text-sm); + font-weight: var(--w-semibold); + color: var(--ink-muted); + padding: 6px var(--sp-2); + border-radius: var(--r-sm); + user-select: none; + } + details.loc summary:hover { + background: var(--panel); + } + details.loc summary:focus-visible { + outline: 2px solid var(--signal); + outline-offset: -2px; + } + details.loc summary .loc-count { + font-weight: var(--w-regular); + } .region { display: flex; flex-direction: column; @@ -2021,8 +2094,20 @@ var ZnBaseWindow = class extends i4 { ${this.renderInvitations()}
-
-

Recent

+
+
+

Documents

+
+ + +
+
${!desk.recents.length && !q ? b2`
@@ -2030,12 +2115,11 @@ var ZnBaseWindow = class extends i4 {

Ziran documents are tiles: they carry their own editor and live on this machine, with no cloud and no account. Invite someone and a document - syncs end-to-end encrypted, everyone keeping their own copy. Start from - a model to make your first one, or drop a .tile file anywhere on this - window. + syncs live, everyone keeping their own copy. Start from a model to make + your first one, or drop a .tile file anywhere on this window.

- ` : recents.length ? recents.map((d3) => this.renderRow(d3, open.has(d3.id), d3 === enterDoc)) : b2`

Nothing called “${this.query}” — try a model instead?

`} + ` : this.docSort === "location" ? this.renderByLocation(recents, open) : recents.length ? recents.map((d3) => this.renderRow(d3, open.has(d3.id), d3 === enterDoc)) : b2`

Nothing called “${this.query}” — try a model instead?

`}
@@ -2080,7 +2164,10 @@ var ZnBaseWindow = class extends i4 { if (sync && !sync.relayOk && shared.length) { return b2`
- Live sync is paused — the relay is unreachable; Ziran keeps trying + + Live sync is paused — + ${sync.provider === "spaces" ? "your PDS" : "the relay"} is unreachable; Ziran keeps trying +
`; } @@ -2088,7 +2175,9 @@ var ZnBaseWindow = class extends i4 { return b2`
${icons.check} - ${liveCount} ${liveCount === 1 ? "document" : "documents"} live, end-to-end encrypted + + ${liveCount} ${liveCount === 1 ? "document" : "documents"} live${sync?.provider === "spaces" ? " in your spaces" : ", end-to-end encrypted"} +
`; } @@ -2165,6 +2254,8 @@ var ZnBaseWindow = class extends i4 {
@@ -2205,6 +2296,41 @@ var ZnBaseWindow = class extends i4 { tileIcon(url) { return url ? b2`` : b2`${icons.tile}`; } + /** By location: where each document actually lives — this machine alone, + or one of your spaces (whose documents you can fetch from here). */ + renderByLocation(recents, open) { + const sync = desk.sync; + const inSpace = /* @__PURE__ */ new Map(); + for (const [id, d3] of Object.entries(sync?.docs ?? {})) { + if (d3.space) inSpace.set(id, d3.space); + } + const q = this.query.trim().toLowerCase(); + const local = recents.filter((r4) => !inSpace.has(r4.id)); + const spaces = sync?.spaces ?? []; + return b2` +
+ Local Device · ${local.length} + ${local.length ? local.map((d3) => this.renderRow(d3, open.has(d3.id))) : b2`

Nothing lives only on this machine.

`} +
+ ${spaces.map((s4) => { + const here = recents.filter((r4) => inSpace.get(r4.id) === s4.ref); + const away = s4.available.filter((a3) => !q || a3.name.toLowerCase().includes(q)); + return b2` +
+ ${s4.name || "unnamed space"} · ${here.length + away.length} + ${here.map((d3) => this.renderRow(d3, open.has(d3.id)))} + ${away.map((a3) => b2` + + `)} + ${!here.length && !away.length ? b2`

No documents in this space yet.

` : A} +
+ `; + })} + `; + } renderRow(d3, isOpen, enterTarget = false) { return b2` + + ${this.renderLastSpacesInvite()} + ` : b2`

Only the space owner can invite people to this space.

`} + `; + } if (s4.live === false) { return b2`

@@ -2703,19 +2879,69 @@ var ZnConnections = class extends i4 {

`} `; } + /** Going live into a space (Spaces provider): pick one of yours, or name a + new one. Membership is per-space, so the copy says exactly that. */ + renderGoLiveSpaces() { + const spaces = desk.sync?.spaces ?? []; + const wantsNew = this.shareSpaceRef === ""; + return b2` +
+ Only on this machine +
+
{ + e4.preventDefault(); + const form = e4.target; + const name = form.elements.namedItem("spaceName")?.value.trim(); + if (wantsNew && !name) return; + desk.startSharing(this.doc.id, wantsNew ? { + newSpaceName: name + } : { + space: this.shareSpaceRef + }); + }} + > + + ${wantsNew ? b2`` : A} + +
+

+ Going live puts this document in a space on your PDS. Everyone in a space — + every device, every person invited later — sees every document in it, and it + is not end-to-end encrypted: your PDS operator could read it. +

+ `; + } /** The relay is down: say which relay, why (when known), and offer to try right now — a shrug with no handle on it is what "in shambles" feels like from the outside. */ renderRelayDown(shared) { const sync = desk.sync; + const spaces = sync?.provider === "spaces"; const relay = sync?.relay?.replace(/^wss?:\/\//, "").replace(/\/ws$/, ""); const detail = [ relay, sync?.relayError ].filter(Boolean).join(" \u2014 "); + const backendName = spaces ? "your PDS" : "the relay"; return b2`

- ${shared ? "Live sharing is paused: Ziran can\u2019t reach the relay. Your edits stay on this machine and flow to the others when it reconnects." : "The relay is unreachable right now \u2014 Ziran keeps trying and will reconnect on its own. This document keeps working on this machine either way."} + ${shared ? `Live sharing is paused: Ziran can\u2019t reach ${backendName}. Your edits stay on this machine and flow to the others when it reconnects.` : `${spaces ? "Your PDS is" : "The relay is"} unreachable right now \u2014 Ziran keeps trying and will reconnect on its own. This document keeps working on this machine either way.`}

${detail ? b2`

${detail}

` : A}
@@ -2743,6 +2969,27 @@ var ZnConnections = class extends i4 {

`; } + /** The spaces invite outcome: inviting into the space grants membership + immediately; the record in their inbox (or this link) is how they find + out about it. */ + renderLastSpacesInvite() { + if (!this.lastInvite) { + return b2`

+ Inviting adds them to the whole space — they’ll see every document in it, + starting with this one. +

`; + } + const { link, pending } = this.lastInvite; + return b2` + +

+ ${pending ? "They can\u2019t receive invitations yet \u2014 send them this link; it works the moment they sign in to Ziran." : "They\u2019re in: the invitation shows up in their Ziran, and this link is a second way there."} +

+ `; + } /** Inline sign-in, so the way forward is right where the intent is. */ renderSignInPrompt(reason) { return b2` @@ -2764,7 +3011,11 @@ var ZnConnections = class extends i4 { /> -

Ziran opens your provider in the browser — no new account, no password here.

+

+ Ziran opens your provider in the browser — no new account, no password here. + No AT identity yet? + Create one. +

`; } async submitInvite(e4) { diff --git a/tiles/built/checklist.tile b/tiles/built/checklist.tile index c7170145d2dba69101c42f7fbe954e87ca919171..abffad50e40c5fca7ac7e87427a43d1d37783f56 100644 GIT binary patch delta 2666 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 z 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 z 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 x04$;o?s@S delta 1623 zcmZpPKIX)elM_peQxy_RN{TX*N=q{H z^As|R6^cspN-}d(brVZUQj1GcQxqOGOqpEIBjLfNprD|judk4sUzQ3|Se%(#kW;Bp zl$w>A3{sb$r%;qykds)cqmWvbT2xt{ky@0hqmYtXl3J9TnU`5yl9`;ClT$f)GtZLE zn|N6n>-F^&f=d!hz^0XCq$;G9=Hx((&&Vt;$uFu@&`3|rO)a)kNGvK!tW?NP1Iy~> zWEPhcYw9Qz=PQ(Cq{7@)oR?TooRMFm0MVLRtWZ*vS(cfYqmY=F0(Bb5-Ear7f?T9G z`3RrItI?u{zO)Iwm^iu{zO4I;K!@6EJP0W1?dg8*2?VG_5o* z861!0nR$7sMG6|43e{i<1%n63kPGPSjCI(osl`Rj^ga$;?aD z%S|lMNKVbk@h{IyEz*P-Jo$~XtrSQPED(xPOG=CKz|m2xp*h)7#kd|K4Yp2SU%>@A z+7*gQb5a$OGg6bYLCFb{J`@U4Q;QT53kq^FQ;R_nsZgAlo2mdxbqbkzAOVkz5<-j@)Z(`Qo*5AtOFJRW$dEVoWx3n zZrXft8<=uaKLcl4_-p zm{XEklm{xmK*3S0P?=v^RGgZVrl3)hk(rmBnU}5rPNbSJ-ztDpdnMTE>ba@vItr5? zifB(R5fc(rP$*6;OVxm8HwA^-$t|LD*+7}2Qe*Ober*m|>fIbH*1$CRzJ&7RemNdt ia7xor07avfLZ(8krl$4gEJ<_L$p_^OHt*6t#Rvc!bP5Il diff --git a/tiles/checklist/index.html b/tiles/checklist/index.html index ba1368f..e83858d 100644 --- a/tiles/checklist/index.html +++ b/tiles/checklist/index.html @@ -51,12 +51,13 @@
diff --git a/tiles/richtext/vendor/pm.js b/tiles/richtext/vendor/pm.js index 4091293..a061c02 100644 --- a/tiles/richtext/vendor/pm.js +++ b/tiles/richtext/vendor/pm.js @@ -1,10 +1,14 @@ -var Io=Object.defineProperty;var j=(r,e)=>{for(var t in e)Io(r,t,{get:e[t],enumerable:!0})};var wi={};j(wi,{AllSelection:()=>H,EditorState:()=>Rn,NodeSelection:()=>S,Plugin:()=>W,PluginKey:()=>Oe,Selection:()=>k,SelectionRange:()=>Fe,TextSelection:()=>C,Transaction:()=>Ht});var ei={};j(ei,{ContentMatch:()=>Se,DOMParser:()=>Xe,DOMSerializer:()=>ke,Fragment:()=>y,Mark:()=>O,MarkType:()=>Ye,Node:()=>Q,NodeRange:()=>be,NodeType:()=>dt,ReplaceError:()=>ce,ResolvedPos:()=>ut,Schema:()=>pt,Slice:()=>x});function v(r){this.content=r}v.prototype={constructor:v,find:function(r){for(var e=0;e>1}};v.from=function(r){if(r instanceof v)return r;var e=[];if(r)for(var t in r)e.push(t,r[t]);return new v(e)};var pn=v;function vr(r,e,t){for(let n=0;;n++){if(n==r.childCount||n==e.childCount)return r.childCount==e.childCount?null:t;let i=r.child(n),s=e.child(n);if(i==s){t+=i.nodeSize;continue}if(!i.sameMarkup(s))return t;if(i.isText&&i.text!=s.text){let o=i.text,l=s.text,a=0;for(;o[a]==l[a];a++)t++;return a&&a0&&u>0&&f[h-1]==c[u-1];)h--,u--,t--,n--;return h&&u&&h=56320&&r<57344}function Lr(r){return r>=55296&&r<56320}var y=class r{constructor(e,t){if(this.content=e,this.size=t||0,t==null)for(let n=0;ne&&n(a,i+l,s||null,o)!==!1&&a.content.size){let c=l+1;a.nodesBetween(Math.max(0,e-c),Math.min(a.content.size,t-c),n,i+c)}l=f}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,n,i){let s="",o=!0;return this.nodesBetween(e,t,(l,a)=>{let f=l.isText?l.text.slice(Math.max(e,a)-a,t-a):l.isLeaf?i?typeof i=="function"?i(l):i:l.type.spec.leafText?l.type.spec.leafText(l):"":"";l.isBlock&&(l.isLeaf&&f||l.isTextblock)&&n&&(o?o=!1:s+=n),s+=f},0),s}append(e){if(!e.size)return this;if(!this.size)return e;let t=this.lastChild,n=e.firstChild,i=this.content.slice(),s=0;for(t.isText&&t.sameMarkup(n)&&(i[i.length-1]=t.withText(t.text+n.text),s=1);se)for(let s=0,o=0;oe&&((ot)&&(l.isText?l=l.cut(Math.max(0,e-o),Math.min(l.text.length,t-o)):l=l.cut(Math.max(0,e-o-1),Math.min(l.content.size,t-o-1))),n.push(l),i+=l.nodeSize),o=a}return new r(n,i)}cutByIndex(e,t){return e==t?r.empty:e==0&&t==this.content.length?this:new r(this.content.slice(e,t))}replaceChild(e,t){let n=this.content[e];if(n==t)return this;let i=this.content.slice(),s=this.size+t.nodeSize-n.nodeSize;return i[e]=t,new r(i,s)}addToStart(e){return new r([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new r(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;tthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let t=0,n=0;;t++){let i=this.child(t),s=n+i.nodeSize;if(s>=e)return s==e?zt(t+1,s):zt(t,n);n=s}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,t){if(!t)return r.empty;if(!Array.isArray(t))throw new RangeError("Invalid input for Fragment.fromJSON");return r.fromArray(t.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return r.empty;let t,n=0;for(let i=0;ithis.type.rank&&(t||(t=e.slice(0,i)),t.push(this),n=!0),t&&t.push(s)}}return t||(t=e.slice()),n||t.push(this),t}removeFromSet(e){for(let t=0;tn.type.rank-i.type.rank),t}};O.none=[];var ce=class extends Error{},x=class r{constructor(e,t,n){this.content=e,this.openStart=t,this.openEnd=n}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,t){let n=Jr(this.content,e+this.openStart,t,this.openStart+1,this.openEnd+1);return n&&new r(n,this.openStart,this.openEnd)}removeBetween(e,t){return new r(Wr(this.content,e+this.openStart,t+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,t){if(!t)return r.empty;let n=t.openStart||0,i=t.openEnd||0;if(typeof n!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new r(y.fromJSON(e,t.content),n,i)}static maxOpen(e,t=!0){let n=0,i=0;for(let s=e.firstChild;s&&!s.isLeaf&&(t||!s.type.spec.isolating);s=s.firstChild)n++;for(let s=e.lastChild;s&&!s.isLeaf&&(t||!s.type.spec.isolating);s=s.lastChild)i++;return new r(e,n,i)}};x.empty=new x(y.empty,0,0);function Wr(r,e,t){let{index:n,offset:i}=r.findIndex(e),s=r.maybeChild(n),{index:o,offset:l}=r.findIndex(t);if(i==e||s.isText){if(l!=t&&!r.child(o).isText)throw new RangeError("Removing non-flat range");return r.cut(0,e).append(r.cut(t))}if(n!=o)throw new RangeError("Removing non-flat range");return r.replaceChild(n,s.copy(Wr(s.content,e-i-1,t-i-1)))}function Jr(r,e,t,n,i,s){let{index:o,offset:l}=r.findIndex(e),a=r.maybeChild(o);if(l==e||a.isText)return s&&n<=0&&i<=0&&!s.canReplace(o,o,t)?null:r.cut(0,e).append(t).append(r.cut(e));let f=Jr(a.content,e-l-1,t,o==0?n-1:0,o==r.childCount-1?i-1:0,a);return f&&r.replaceChild(o,a.copy(f))}function Ro(r,e,t){if(t.openStart>r.depth)throw new ce("Inserted content deeper than insertion position");if(r.depth-t.openStart!=e.depth-t.openEnd)throw new ce("Inconsistent open depths");return $r(r,e,t,0)}function $r(r,e,t,n){let i=r.index(n),s=r.node(n);if(i==e.index(n)&&n=0&&r.isText&&r.sameMarkup(e[t])?e[t]=r.withText(e[t].text+r.text):e.push(r)}function ct(r,e,t,n){let i=(e||r).node(t),s=0,o=e?e.index(t):i.childCount;r&&(s=r.index(t),r.depth>t?s++:r.textOffset&&(Ie(r.nodeAfter,n),s++));for(let l=s;li&&gn(r,e,i+1),o=n.depth>i&&gn(t,n,i+1),l=[];return ct(null,r,i,l),s&&o&&e.index(i)==t.index(i)?(qr(s,o),Ie(Re(s,Kr(r,e,t,n,i+1)),l)):(s&&Ie(Re(s,Lt(r,e,i+1)),l),ct(e,t,i,l),o&&Ie(Re(o,Lt(t,n,i+1)),l)),ct(n,null,i,l),new y(l)}function Lt(r,e,t){let n=[];if(ct(null,r,t,n),r.depth>t){let i=gn(r,e,t+1);Ie(Re(i,Lt(r,e,t+1)),n)}return ct(e,null,t,n),new y(n)}function Po(r,e){let t=e.depth-r.openStart,i=e.node(t).copy(r.content);for(let s=t-1;s>=0;s--)i=e.node(s).copy(y.from(i));return{start:i.resolveNoCache(r.openStart+t),end:i.resolveNoCache(i.content.size-r.openEnd-t)}}var ut=class r{constructor(e,t,n){this.pos=e,this.path=t,this.parentOffset=n,this.depth=t.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,t=this.index(this.depth);if(t==e.childCount)return null;let n=this.pos-this.path[this.path.length-1],i=e.child(t);return n?e.child(t).cut(n):i}get nodeBefore(){let e=this.index(this.depth),t=this.pos-this.path[this.path.length-1];return t?this.parent.child(e).cut(0,t):e==0?null:this.parent.child(e-1)}posAtIndex(e,t){t=this.resolveDepth(t);let n=this.path[t*3],i=t==0?0:this.path[t*3-1]+1;for(let s=0;s0;t--)if(this.start(t)<=e&&this.end(t)>=e)return t;return 0}blockRange(e=this,t){if(e.pos=0;n--)if(e.pos<=this.end(n)&&(!t||t(this.node(n))))return new be(this,e,n);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&t<=e.content.size))throw new RangeError("Position "+t+" out of range");let n=[],i=0,s=t;for(let o=e;;){let{index:l,offset:a}=o.content.findIndex(s),f=s-a;if(n.push(o,l,i+a),!f||(o=o.child(l),o.isText))break;s=f-1,i+=a+1}return new r(t,n,s)}static resolveCached(e,t){let n=Dr.get(e);if(n)for(let s=0;se&&this.nodesBetween(e,t,s=>(n.isInSet(s.marks)&&(i=!0),!i)),i}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),Hr(this.marks,e)}contentMatchAt(e){let t=this.type.contentMatch.matchFragment(this.content,0,e);if(!t)throw new Error("Called contentMatchAt on a node with invalid content");return t}canReplace(e,t,n=y.empty,i=0,s=n.childCount){let o=this.contentMatchAt(e).matchFragment(n,i,s),l=o&&o.matchFragment(this.content,t);if(!l||!l.validEnd)return!1;for(let a=i;at.type.name)}`);this.content.forEach(t=>t.check())}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(t=>t.toJSON())),e}static fromJSON(e,t){if(!t)throw new RangeError("Invalid input for Node.fromJSON");let n;if(t.marks){if(!Array.isArray(t.marks))throw new RangeError("Invalid mark data for Node.fromJSON");n=t.marks.map(e.markFromJSON)}if(t.type=="text"){if(typeof t.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(t.text,n)}let i=y.fromJSON(e,t.content),s=e.nodeType(t.type).create(t.attrs,i,n);return s.type.checkAttrs(s.attrs),s}};Q.prototype.text=void 0;var xn=class r extends Q{constructor(e,t,n,i){if(super(e,t,null,i),!n)throw new RangeError("Empty text nodes are not allowed");this.text=n}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):Hr(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,t){return this.text.slice(e,t)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new r(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new r(this.type,this.attrs,e,this.marks)}cut(e=0,t=this.text.length){return e==0&&t==this.text.length?this:this.withText(this.text.slice(e,t))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function Hr(r,e){for(let t=r.length-1;t>=0;t--)e=r[t].type.name+"("+e+")";return e}var Se=class r{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,t){let n=new bn(e,t);if(n.next==null)return r.empty;let i=Ur(n);n.next&&n.err("Unexpected trailing text");let s=$o(Jo(i));return qo(s,n),s}matchType(e){for(let t=0;tf.createAndFill()));for(let f=0;f=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function t(n){e.push(n);for(let i=0;i{let s=i+(n.validEnd?"*":" ")+" ";for(let o=0;o"+e.indexOf(n.next[o].next);return s}).join(` -`)}};Se.empty=new Se(!0);var bn=class{constructor(e,t){this.string=e,this.nodeTypes=t,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}};function Ur(r){let e=[];do e.push(vo(r));while(r.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function vo(r){let e=[];do e.push(Fo(r));while(r.next&&r.next!=")"&&r.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function Fo(r){let e=Wo(r);for(;;)if(r.eat("+"))e={type:"plus",expr:e};else if(r.eat("*"))e={type:"star",expr:e};else if(r.eat("?"))e={type:"opt",expr:e};else if(r.eat("{"))e=Vo(r,e);else break;return e}function Tr(r){/\D/.test(r.next)&&r.err("Expected number, got '"+r.next+"'");let e=Number(r.next);return r.pos++,e}function Vo(r,e){let t=Tr(r),n=t;return r.eat(",")&&(r.next!="}"?n=Tr(r):n=-1),r.eat("}")||r.err("Unclosed braced range"),{type:"range",min:t,max:n,expr:e}}function Lo(r,e){let t=r.nodeTypes,n=t[e];if(n)return[n];let i=[];for(let s in t){let o=t[s];o.isInGroup(e)&&i.push(o)}return i.length==0&&r.err("No node type or group '"+e+"' found"),i}function Wo(r){if(r.eat("(")){let e=Ur(r);return r.eat(")")||r.err("Missing closing paren"),e}else if(/\W/.test(r.next))r.err("Unexpected token '"+r.next+"'");else{let e=Lo(r,r.next).map(t=>(r.inline==null?r.inline=t.isInline:r.inline!=t.isInline&&r.err("Mixing inline and block content"),{type:"name",value:t}));return r.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function Jo(r){let e=[[]];return i(s(r,0),t()),e;function t(){return e.push([])-1}function n(o,l,a){let f={term:a,to:l};return e[o].push(f),f}function i(o,l){o.forEach(a=>a.to=l)}function s(o,l){if(o.type=="choice")return o.exprs.reduce((a,f)=>a.concat(s(f,l)),[]);if(o.type=="seq")for(let a=0;;a++){let f=s(o.exprs[a],l);if(a==o.exprs.length-1)return f;i(f,l=t())}else if(o.type=="star"){let a=t();return n(l,a),i(s(o.expr,a),a),[n(a)]}else if(o.type=="plus"){let a=t();return i(s(o.expr,l),a),i(s(o.expr,a),a),[n(a)]}else{if(o.type=="opt")return[n(l)].concat(s(o.expr,l));if(o.type=="range"){let a=l;for(let f=0;f{r[o].forEach(({term:l,to:a})=>{if(!l)return;let f;for(let c=0;c{f||i.push([l,f=[]]),f.indexOf(c)==-1&&f.push(c)})})});let s=e[n.join(",")]=new Se(n.indexOf(r.length-1)>-1);for(let o=0;o-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:Yr(this.attrs,e)}create(e=null,t,n){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new Q(this,this.computeAttrs(e),y.from(t),O.setFrom(n))}createChecked(e=null,t,n){return t=y.from(t),this.checkContent(t),new Q(this,this.computeAttrs(e),t,O.setFrom(n))}createAndFill(e=null,t,n){if(e=this.computeAttrs(e),t=y.from(t),t.size){let o=this.contentMatch.fillBefore(t);if(!o)return null;t=o.append(t)}let i=this.contentMatch.matchFragment(t),s=i&&i.fillBefore(y.empty,!0);return s?new Q(this,e,t.append(s),O.setFrom(n)):null}validContent(e){let t=this.contentMatch.matchFragment(e);if(!t||!t.validEnd)return!1;for(let n=0;n-1}allowsMarks(e){if(this.markSet==null)return!0;for(let t=0;tn[s]=new r(s,t,o));let i=t.spec.topNode||"doc";if(!n[i])throw new RangeError("Schema is missing its top node type ('"+i+"')");if(!n.text)throw new RangeError("Every schema needs a 'text' type");for(let s in n.text.attrs)throw new RangeError("The text node type should not have attributes");return n}};function Ko(r,e,t){let n=t.split("|");return i=>{let s=i===null?"null":typeof i;if(n.indexOf(s)<0)throw new RangeError(`Expected value of type ${n} for attribute ${e} on type ${r}, got ${s}`)}}var Sn=class{constructor(e,t,n){this.hasDefault=Object.prototype.hasOwnProperty.call(n,"default"),this.default=n.default,this.validate=typeof n.validate=="string"?Ko(e,t,n.validate):n.validate}get isRequired(){return!this.hasDefault}},Ye=class r{constructor(e,t,n,i){this.name=e,this.rank=t,this.schema=n,this.spec=i,this.attrs=_r(e,i.attrs),this.excluded=null;let s=Gr(this.attrs);this.instance=s?new O(this,s):null}create(e=null){return!e&&this.instance?this.instance:new O(this,Yr(this.attrs,e))}static compile(e,t){let n=Object.create(null),i=0;return e.forEach((s,o)=>n[s]=new r(s,i++,t,o)),n}removeFromSet(e){for(var t=0;t-1}},pt=class{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let t=this.spec={};for(let i in e)t[i]=e[i];t.nodes=pn.from(e.nodes),t.marks=pn.from(e.marks||{}),this.nodes=dt.compile(this.spec.nodes,this),this.marks=Ye.compile(this.spec.marks,this);let n=Object.create(null);for(let i in this.nodes){if(i in this.marks)throw new RangeError(i+" can not be both a node and a mark");let s=this.nodes[i],o=s.spec.content||"",l=s.spec.marks;if(s.contentMatch=n[o]||(n[o]=Se.parse(o,this.nodes)),s.inlineContent=s.contentMatch.inlineContent,s.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!s.isInline||!s.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=s}s.markSet=l=="_"?null:l?Ar(this,l.split(" ")):l==""||!s.inlineContent?[]:null}for(let i in this.marks){let s=this.marks[i],o=s.spec.excludes;s.excluded=o==null?[s]:o==""?[]:Ar(this,o.split(" "))}this.nodeFromJSON=i=>Q.fromJSON(this,i),this.markFromJSON=i=>O.fromJSON(this,i),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,t=null,n,i){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof dt){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(t,n,i)}text(e,t){let n=this.nodes.text;return new xn(n,n.defaultAttrs,e,O.setFrom(t))}mark(e,t){return typeof e=="string"&&(e=this.marks[e]),e.create(t)}nodeType(e){let t=this.nodes[e];if(!t)throw new RangeError("Unknown node type: "+e);return t}};function Ar(r,e){let t=[];for(let n=0;n-1)&&t.push(o=a)}if(!o)throw new SyntaxError("Unknown mark type: '"+e[n]+"'")}return t}function Ho(r){return r.tag!=null}function Uo(r){return r.style!=null}var Xe=class r{constructor(e,t){this.schema=e,this.rules=t,this.tags=[],this.styles=[];let n=this.matchedStyles=[];t.forEach(i=>{if(Ho(i))this.tags.push(i);else if(Uo(i)){let s=/[^=]*/.exec(i.style)[0];n.indexOf(s)<0&&n.push(s),this.styles.push(i)}}),this.normalizeLists=!this.tags.some(i=>{if(!/^(ul|ol)\b/.test(i.tag)||!i.node)return!1;let s=e.nodes[i.node];return s.contentMatch.matchType(s)})}parse(e,t={}){let n=new Wt(this,t,!1);return n.addAll(e,O.none,t.from,t.to),n.finish()}parseSlice(e,t={}){let n=new Wt(this,t,!0);return n.addAll(e,O.none,t.from,t.to),x.maxOpen(n.finish())}matchTag(e,t,n){for(let i=n?this.tags.indexOf(n)+1:0;ie.length&&(l.charCodeAt(e.length)!=61||l.slice(e.length+1)!=t))){if(o.getAttrs){let a=o.getAttrs(t);if(a===!1)continue;o.attrs=a||void 0}return o}}}static schemaRules(e){let t=[];function n(i){let s=i.priority==null?50:i.priority,o=0;for(;o{n(o=Rr(o)),o.mark||o.ignore||o.clearMark||(o.mark=i)})}for(let i in e.nodes){let s=e.nodes[i].spec.parseDOM;s&&s.forEach(o=>{n(o=Rr(o)),o.node||o.ignore||o.mark||(o.node=i)})}return t}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new r(e,r.schemaRules(e)))}},Qr={address:!0,article:!0,aside:!0,blockquote:!0,body:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},jo={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},Zr={ol:!0,ul:!0},mt=1,kn=2,ht=4;function Ir(r,e,t){return e!=null?(e?mt:0)|(e==="full"?kn:0):r&&r.whitespace=="pre"?mt|kn:t&~ht}var Ge=class{constructor(e,t,n,i,s,o){this.type=e,this.attrs=t,this.marks=n,this.solid=i,this.options=o,this.content=[],this.activeMarks=O.none,this.match=s||(o&ht?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let t=this.type.contentMatch.fillBefore(y.from(e));if(t)this.match=this.type.contentMatch.matchFragment(t);else{let n=this.type.contentMatch,i;return(i=n.findWrapping(e.type))?(this.match=n,i):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&mt)){let n=this.content[this.content.length-1],i;if(n&&n.isText&&(i=/[ \t\r\n\u000c]+$/.exec(n.text))){let s=n;n.text.length==i[0].length?this.content.pop():this.content[this.content.length-1]=s.withText(s.text.slice(0,s.text.length-i[0].length))}}let t=y.from(this.content);return!e&&this.match&&(t=t.append(this.match.fillBefore(y.empty,!0))),this.type?this.type.create(this.attrs,t,this.marks):t}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!Qr.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}},Wt=class{constructor(e,t,n){this.parser=e,this.options=t,this.isOpen=n,this.open=0,this.localPreserveWS=!1;let i=t.topNode,s,o=Ir(null,t.preserveWhitespace,0)|(n?ht:0);i?s=new Ge(i.type,i.attrs,O.none,!0,t.topMatch||i.type.contentMatch,o):n?s=new Ge(null,null,O.none,!0,null,o):s=new Ge(e.schema.topNodeType,null,O.none,!0,null,o),this.nodes=[s],this.find=t.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,t){e.nodeType==3?this.addTextNode(e,t):e.nodeType==1&&this.addElement(e,t)}addTextNode(e,t){let n=e.nodeValue,i=this.top,s=i.options&kn?"full":this.localPreserveWS||(i.options&mt)>0,{schema:o}=this.parser;if(s==="full"||i.inlineContext(e)||/[^ \t\r\n\u000c]/.test(n)){if(s)if(s==="full")n=n.replace(/\r\n?/g,` -`);else if(o.linebreakReplacement&&/[\r\n]/.test(n)&&this.top.findWrapping(o.linebreakReplacement.create())){let l=n.split(/\r?\n|\r/);for(let a=0;a!a.clearMark(f)):t=t.concat(this.parser.schema.marks[a.mark].create(a.attrs)),a.consuming===!1)l=a;else break}}return t}addElementByRule(e,t,n,i){let s,o;if(t.node)if(o=this.parser.schema.nodes[t.node],o.isLeaf)this.insertNode(o.create(t.attrs),n,e.nodeName=="BR")||this.leafFallback(e,n);else{let a=this.enter(o,t.attrs||null,n,t.preserveWhitespace);a&&(s=!0,n=a)}else{let a=this.parser.schema.marks[t.mark];n=n.concat(a.create(t.attrs))}let l=this.top;if(o&&o.isLeaf)this.findInside(e);else if(i)this.addElement(e,n,i);else if(t.getContent)this.findInside(e),t.getContent(e,this.parser.schema).forEach(a=>this.insertNode(a,n,!1));else{let a=e;typeof t.contentElement=="string"?a=e.querySelector(t.contentElement):typeof t.contentElement=="function"?a=t.contentElement(e):t.contentElement&&(a=t.contentElement),this.findAround(e,a,!0),this.addAll(a,n),this.findAround(e,a,!1)}s&&this.sync(l)&&this.open--}addAll(e,t,n,i){let s=n||0;for(let o=n?e.childNodes[n]:e.firstChild,l=i==null?null:e.childNodes[i];o!=l;o=o.nextSibling,++s)this.findAtPoint(e,s),this.addDOM(o,t);this.findAtPoint(e,s)}findPlace(e,t,n){let i,s;for(let o=this.open,l=0;o>=0;o--){let a=this.nodes[o],f=a.findWrapping(e);if(f&&(!i||i.length>f.length+l)&&(i=f,s=a,!f.length))break;if(a.solid){if(n)break;l+=2}}if(!i)return null;this.sync(s);for(let o=0;o(o.type?o.type.allowsMarkType(f.type):Pr(f.type,e))?(a=f.addToSet(a),!1):!0),this.nodes.push(new Ge(e,t,a,i,null,l)),this.open++,n}closeExtra(e=!1){let t=this.nodes.length-1;if(t>this.open){for(;t>this.open;t--)this.nodes[t-1].content.push(this.nodes[t].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!!(this.isOpen||this.options.topOpen))}sync(e){for(let t=this.open;t>=0;t--){if(this.nodes[t]==e)return this.open=t,!0;this.localPreserveWS&&(this.nodes[t].options|=mt)}return!1}get currentPos(){this.closeExtra();let e=0;for(let t=this.open;t>=0;t--){let n=this.nodes[t].content;for(let i=n.length-1;i>=0;i--)e+=n[i].nodeSize;t&&e++}return e}findAtPoint(e,t){if(this.find)for(let n=0;n-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let t=e.split("/"),n=this.options.context,i=!this.isOpen&&(!n||n.parent.type==this.nodes[0].type),s=-(n?n.depth+1:0)+(i?0:1),o=(l,a)=>{for(;l>=0;l--){let f=t[l];if(f==""){if(l==t.length-1||l==0)continue;for(;a>=s;a--)if(o(l-1,a))return!0;return!1}else{let c=a>0||a==0&&i?this.nodes[a].type:n&&a>=s?n.node(a-s).type:null;if(!c||c.name!=f&&!c.isInGroup(f))return!1;a--}}return!0};return o(t.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let t=e.depth;t>=0;t--){let n=e.node(t).contentMatchAt(e.indexAfter(t)).defaultType;if(n&&n.isTextblock&&n.defaultAttrs)return n}for(let t in this.parser.schema.nodes){let n=this.parser.schema.nodes[t];if(n.isTextblock&&n.defaultAttrs)return n}}};function Go(r){for(let e=r.firstChild,t=null;e;e=e.nextSibling){let n=e.nodeType==1?e.nodeName.toLowerCase():null;n&&Zr.hasOwnProperty(n)&&t?(t.appendChild(e),e=t):n=="li"?t=e:n&&(t=null)}}function Yo(r,e){return(r.matches||r.msMatchesSelector||r.webkitMatchesSelector||r.mozMatchesSelector).call(r,e)}function Rr(r){let e={};for(let t in r)e[t]=r[t];return e}function Pr(r,e){let t=e.schema.nodes;for(let n in t){let i=t[n];if(!i.allowsMarkType(r))continue;let s=[],o=l=>{s.push(l);for(let a=0;a{if(s.length||o.marks.length){let l=0,a=0;for(;l=0;i--){let s=this.serializeMark(e.marks[i],e.isInline,t);s&&((s.contentDOM||s.dom).appendChild(n),n=s.dom)}return n}serializeMark(e,t,n={}){let i=this.marks[e.type.name];return i&&Ft(vt(n),i(e,t),null,e.attrs)}static renderSpec(e,t,n=null,i){return typeof t=="string"?{dom:e.createTextNode(t)}:Ft(e,t,n,i)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new r(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let t=Br(e.nodes);return t.text||(t.text=n=>n.text),t}static marksFromSchema(e){return Br(e.marks)}};function Br(r){let e={};for(let t in r){let n=r[t].spec.toDOM;n&&(e[t]=n)}return e}function vt(r){return r.document||window.document}var zr=new WeakMap;function Xo(r){let e=zr.get(r);return e===void 0&&zr.set(r,e=_o(r)),e}function _o(r){let e=null;function t(n){if(n&&typeof n=="object")if(Array.isArray(n))if(typeof n[0]=="string")e||(e=[]),e.push(n);else for(let i=0;i-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let o=i.indexOf(" ");o>0&&(t=i.slice(0,o),i=i.slice(o+1));let l,a=t?r.createElementNS(t,i):r.createElement(i),f=e[1],c=1;if(f&&typeof f=="object"&&f.nodeType==null&&!Array.isArray(f)){c=2;for(let h in f)if(f[h]!=null){let u=h.indexOf(" ");u>0?a.setAttributeNS(h.slice(0,u),h.slice(u+1),f[h]):h=="style"&&a.style?a.style.cssText=f[h]:a.setAttribute(h,f[h])}}for(let h=c;hc)throw new RangeError("Content hole must be the only child of its parent node");return{dom:a,contentDOM:a}}else if(typeof u=="string")a.appendChild(r.createTextNode(u));else{let{dom:d,contentDOM:p}=Ft(r,u,t,n);if(a.appendChild(d),p){if(l)throw new RangeError("Multiple content holes");l=p}}}return{dom:a,contentDOM:l}}var gi={};j(gi,{AddMarkStep:()=>Ze,AddNodeMarkStep:()=>et,AttrStep:()=>xt,DocAttrStep:()=>bt,MapResult:()=>_e,Mapping:()=>Qe,RemoveMarkStep:()=>Ce,RemoveNodeMarkStep:()=>Pe,ReplaceAroundStep:()=>E,ReplaceStep:()=>F,Step:()=>T,StepMap:()=>ie,StepResult:()=>I,Transform:()=>St,TransformError:()=>Be,canJoin:()=>Z,canSplit:()=>he,dropPoint:()=>kt,findWrapping:()=>ze,insertPoint:()=>hi,joinPoint:()=>$t,liftTarget:()=>Me,replaceStep:()=>tt});var ri=65535,ii=Math.pow(2,16);function Qo(r,e){return r+e*ii}function ti(r){return r&ri}function Zo(r){return(r-(r&ri))/ii}var si=1,oi=2,Jt=4,li=8,_e=class{constructor(e,t,n){this.pos=e,this.delInfo=t,this.recover=n}get deleted(){return(this.delInfo&li)>0}get deletedBefore(){return(this.delInfo&(si|Jt))>0}get deletedAfter(){return(this.delInfo&(oi|Jt))>0}get deletedAcross(){return(this.delInfo&Jt)>0}},ie=class r{constructor(e,t=!1){if(this.ranges=e,this.inverted=t,!e.length&&r.empty)return r.empty}recover(e){let t=0,n=ti(e);if(!this.inverted)for(let i=0;ie)break;let f=this.ranges[l+s],c=this.ranges[l+o],h=a+f;if(e<=h){let u=f?e==a?-1:e==h?1:t:t,d=a+i+(u<0?0:c);if(n)return d;let p=e==(t<0?a:h)?null:Qo(l/3,e-a),m=e==a?oi:e==h?si:Jt;return(t<0?e!=a:e!=h)&&(m|=li),new _e(d,m,p)}i+=c-f}return n?e+i:new _e(e+i,0,null)}touches(e,t){let n=0,i=ti(t),s=this.inverted?2:1,o=this.inverted?1:2;for(let l=0;le)break;let f=this.ranges[l+s],c=a+f;if(e<=c&&l==i*3)return!0;n+=this.ranges[l+o]-f}return!1}forEach(e){let t=this.inverted?2:1,n=this.inverted?1:2;for(let i=0,s=0;i=0;t--){let i=e.getMirror(t);this.appendMap(e._maps[t].invert(),i!=null&&i>t?n-i-1:void 0)}}invert(){let e=new r;return e.appendMappingInverted(this),e}map(e,t=1){if(this.mirror)return this._map(e,t,!0);for(let n=this.from;ns&&a!o.isAtom||!l.type.allowsMarkType(this.mark.type)?o:o.mark(this.mark.addToSet(o.marks)),i),t.openStart,t.openEnd);return I.fromReplace(e,this.from,this.to,s)}invert(){return new Ce(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new r(t.pos,n.pos,this.mark)}merge(e){return e instanceof r&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new r(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new r(t.from,t.to,e.markFromJSON(t.mark))}};T.jsonID("addMark",Ze);var Ce=class r extends T{constructor(e,t,n){super(),this.from=e,this.to=t,this.mark=n}apply(e){let t=e.slice(this.from,this.to),n=new x(Dn(t.content,i=>i.mark(this.mark.removeFromSet(i.marks)),e),t.openStart,t.openEnd);return I.fromReplace(e,this.from,this.to,n)}invert(){return new Ze(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new r(t.pos,n.pos,this.mark)}merge(e){return e instanceof r&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new r(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new r(t.from,t.to,e.markFromJSON(t.mark))}};T.jsonID("removeMark",Ce);var et=class r extends T{constructor(e,t){super(),this.pos=e,this.mark=t}apply(e){let t=e.nodeAt(this.pos);if(!t)return I.fail("No node at mark step's position");let n=t.type.create(t.attrs,null,this.mark.addToSet(t.marks));return I.fromReplace(e,this.pos,this.pos+1,new x(y.from(n),0,t.isLeaf?0:1))}invert(e){let t=e.nodeAt(this.pos);if(t){let n=this.mark.addToSet(t.marks);if(n.length==t.marks.length){for(let i=0;in.pos?null:new r(t.pos,n.pos,i,s,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number"||typeof t.gapFrom!="number"||typeof t.gapTo!="number"||typeof t.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new r(t.from,t.to,t.gapFrom,t.gapTo,x.fromJSON(e,t.slice),t.insert,!!t.structure)}};T.jsonID("replaceAround",E);function wn(r,e,t){let n=r.resolve(e),i=t-e,s=n.depth;for(;i>0&&s>0&&n.indexAfter(s)==n.node(s).childCount;)s--,i--;if(i>0){let o=n.node(s).maybeChild(n.indexAfter(s));for(;i>0;){if(!o||o.isLeaf)return!0;o=o.firstChild,i--}}return!1}function el(r,e,t,n){let i=[],s=[],o,l;r.doc.nodesBetween(e,t,(a,f,c)=>{if(!a.isInline)return;let h=a.marks;if(!n.isInSet(h)&&c.type.allowsMarkType(n.type)){let u=Math.max(f,e),d=Math.min(f+a.nodeSize,t),p=n.addToSet(h);for(let m=0;mr.step(a)),s.forEach(a=>r.step(a))}function tl(r,e,t,n){let i=[],s=0;r.doc.nodesBetween(e,t,(o,l)=>{if(!o.isInline)return;s++;let a=null;if(n instanceof Ye){let f=o.marks,c;for(;c=n.isInSet(f);)(a||(a=[])).push(c),f=c.removeFromSet(f)}else n?n.isInSet(o.marks)&&(a=[n]):a=o.marks;if(a&&a.length){let f=Math.min(l+o.nodeSize,t);for(let c=0;cr.step(new Ce(o.from,o.to,o.style)))}function Tn(r,e,t,n=t.contentMatch,i=!0){let s=r.doc.nodeAt(e),o=[],l=e+1;for(let a=0;a=0;a--)r.step(o[a])}function nl(r,e,t){return(e==0||r.canReplace(e,r.childCount))&&(t==r.childCount||r.canReplace(0,t))}function Me(r){let t=r.parent.content.cutByIndex(r.startIndex,r.endIndex);for(let n=r.depth,i=0,s=0;;--n){let o=r.$from.node(n),l=r.$from.index(n)+i,a=r.$to.indexAfter(n)-s;if(nt;p--)m||n.index(p)>0?(m=!0,c=y.from(n.node(p).copy(c)),h++):a--;let u=y.empty,d=0;for(let p=s,m=!1;p>t;p--)m||i.after(p+1)=0;o--){if(n.size){let l=t[o].type.contentMatch.matchFragment(n);if(!l||!l.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}n=y.from(t[o].type.create(t[o].attrs,n))}let i=e.start,s=e.end;r.step(new E(i,s,i,s,new x(n,0,0),t.length,!0))}function ll(r,e,t,n,i){if(!n.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let s=r.steps.length;r.doc.nodesBetween(e,t,(o,l)=>{let a=typeof i=="function"?i(o):i;if(o.isTextblock&&!o.hasMarkup(n,a)&&al(r.doc,r.mapping.slice(s).map(l),n)){let f=null;if(n.schema.linebreakReplacement){let d=n.whitespace=="pre",p=!!n.contentMatch.matchType(n.schema.linebreakReplacement);d&&!p?f=!1:!d&&p&&(f=!0)}f===!1&&fi(r,o,l,s),Tn(r,r.mapping.slice(s).map(l,1),n,void 0,f===null);let c=r.mapping.slice(s),h=c.map(l,1),u=c.map(l+o.nodeSize,1);return r.step(new E(h,u,h+1,u-1,new x(y.from(n.create(a,null,o.marks)),0,0),1,!0)),f===!0&&ai(r,o,l,s),!1}})}function ai(r,e,t,n){e.forEach((i,s)=>{if(i.isText){let o,l=/\r?\n|\r/g;for(;o=l.exec(i.text);){let a=r.mapping.slice(n).map(t+1+s+o.index);r.replaceWith(a,a+1,e.type.schema.linebreakReplacement.create())}}})}function fi(r,e,t,n){e.forEach((i,s)=>{if(i.type==i.type.schema.linebreakReplacement){let o=r.mapping.slice(n).map(t+1+s);r.replaceWith(o,o+1,e.type.schema.text(` -`))}})}function al(r,e,t){let n=r.resolve(e),i=n.index();return n.parent.canReplaceWith(i,i+1,t)}function fl(r,e,t,n,i){let s=r.doc.nodeAt(e);if(!s)throw new RangeError("No node at given position");t||(t=s.type);let o=t.create(n,null,i||s.marks);if(s.isLeaf)return r.replaceWith(e,e+s.nodeSize,o);if(!t.validContent(s.content))throw new RangeError("Invalid content for node type "+t.name);r.step(new E(e,e+s.nodeSize,e+1,e+s.nodeSize-1,new x(y.from(o),0,0),1,!0))}function he(r,e,t=1,n){let i=r.resolve(e),s=i.depth-t,o=n&&n[n.length-1]||i.parent;if(s<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!o.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let f=i.depth-1,c=t-2;f>s;f--,c--){let h=i.node(f),u=i.index(f);if(h.type.spec.isolating)return!1;let d=h.content.cutByIndex(u,h.childCount),p=n&&n[c+1];p&&(d=d.replaceChild(0,p.type.create(p.attrs)));let m=n&&n[c]||h;if(!h.canReplace(u+1,h.childCount)||!m.type.validContent(d))return!1}let l=i.indexAfter(s),a=n&&n[0];return i.node(s).canReplaceWith(l,l,a?a.type:i.node(s+1).type)}function cl(r,e,t=1,n){let i=r.doc.resolve(e),s=y.empty,o=y.empty;for(let l=i.depth,a=i.depth-t,f=t-1;l>a;l--,f--){s=y.from(i.node(l).copy(s));let c=n&&n[f];o=y.from(c?c.type.create(c.attrs,o):i.node(l).copy(o))}r.step(new F(e,e,new x(s.append(o),t,t),!0))}function Z(r,e){let t=r.resolve(e),n=t.index();return ci(t.nodeBefore,t.nodeAfter)&&t.parent.canReplace(n,n+1)}function hl(r,e){e.content.size||r.type.compatibleContent(e.type);let t=r.contentMatchAt(r.childCount),{linebreakReplacement:n}=r.type.schema;for(let i=0;i0?(s=n.node(i+1),l++,o=n.node(i).maybeChild(l)):(s=n.node(i).maybeChild(l-1),o=n.node(i+1)),s&&!s.isTextblock&&ci(s,o)&&n.node(i).canReplace(l,l+1))return e;if(i==0)break;e=t<0?n.before(i):n.after(i)}}function ul(r,e,t){let n=null,{linebreakReplacement:i}=r.doc.type.schema,s=r.doc.resolve(e-t),o=s.node().type;if(i&&o.inlineContent){let c=o.whitespace=="pre",h=!!o.contentMatch.matchType(i);c&&!h?n=!1:!c&&h&&(n=!0)}let l=r.steps.length;if(n===!1){let c=r.doc.resolve(e+t);fi(r,c.node(),c.before(),l)}o.inlineContent&&Tn(r,e+t-1,o,s.node().contentMatchAt(s.index()),n==null);let a=r.mapping.slice(l),f=a.map(e-t);if(r.step(new F(f,a.map(e+t,-1),x.empty,!0)),n===!0){let c=r.doc.resolve(f);ai(r,c.node(),c.before(),r.steps.length)}return r}function hi(r,e,t){let n=r.resolve(e);if(n.parent.canReplaceWith(n.index(),n.index(),t))return e;if(n.parentOffset==0)for(let i=n.depth-1;i>=0;i--){let s=n.index(i);if(n.node(i).canReplaceWith(s,s,t))return n.before(i+1);if(s>0)return null}if(n.parentOffset==n.parent.content.size)for(let i=n.depth-1;i>=0;i--){let s=n.indexAfter(i);if(n.node(i).canReplaceWith(s,s,t))return n.after(i+1);if(s=0;o--){let l=o==n.depth?0:n.pos<=(n.start(o+1)+n.end(o+1))/2?-1:1,a=n.index(o)+(l>0?1:0),f=n.node(o),c=!1;if(s==1)c=f.canReplace(a,a,i);else{let h=f.contentMatchAt(a).findWrapping(i.firstChild.type);c=h&&f.canReplaceWith(a,a,h[0])}if(c)return l==0?n.pos:l<0?n.before(o+1):n.after(o+1)}return null}function tt(r,e,t=e,n=x.empty){if(e==t&&!n.size)return null;let i=r.resolve(e),s=r.resolve(t);return ui(i,s,n)?new F(e,t,n):new Nn(i,s,n).fit()}function ui(r,e,t){return!t.openStart&&!t.openEnd&&r.start()==e.start()&&r.parent.canReplace(r.index(),e.index(),t.content)}var Nn=class{constructor(e,t,n){this.$from=e,this.$to=t,this.unplaced=n,this.frontier=[],this.placed=y.empty;for(let i=0;i<=e.depth;i++){let s=e.node(i);this.frontier.push({type:s.type,match:s.contentMatchAt(e.indexAfter(i))})}for(let i=e.depth;i>0;i--)this.placed=y.from(e.node(i).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let f=this.findFittable();f?this.placeNodes(f):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),t=this.placed.size-this.depth-this.$from.depth,n=this.$from,i=this.close(e<0?this.$to:n.doc.resolve(e));if(!i)return null;let s=this.placed,o=n.depth,l=i.depth;for(;o&&l&&s.childCount==1;)s=s.firstChild.content,o--,l--;let a=new x(s,o,l);return e>-1?new E(n.pos,e,this.$to.pos,this.$to.end(),a,t):a.size||n.pos!=this.$to.pos?new F(n.pos,i.pos,a):null}findFittable(){let e=this.unplaced.openStart;for(let t=this.unplaced.content,n=0,i=this.unplaced.openEnd;n1&&(i=0),s.type.spec.isolating&&i<=n){e=n;break}t=s.content}for(let t=1;t<=2;t++)for(let n=t==1?e:this.unplaced.openStart;n>=0;n--){let i,s=null;n?(s=Mn(this.unplaced.content,n-1).firstChild,i=s.content):i=this.unplaced.content;let o=i.firstChild;for(let l=this.depth;l>=0;l--){let{type:a,match:f}=this.frontier[l],c,h=null;if(t==1&&(o?f.matchType(o.type)||(h=f.fillBefore(y.from(o),!1)):s&&a.compatibleContent(s.type)))return{sliceDepth:n,frontierDepth:l,parent:s,inject:h};if(t==2&&o&&(c=f.findWrapping(o.type)))return{sliceDepth:n,frontierDepth:l,parent:s,wrap:c};if(s&&f.matchType(s.type))break}}}openMore(){let{content:e,openStart:t,openEnd:n}=this.unplaced,i=Mn(e,t);return!i.childCount||i.firstChild.isLeaf?!1:(this.unplaced=new x(e,t+1,Math.max(n,i.size+t>=e.size-n?t+1:0)),!0)}dropNode(){let{content:e,openStart:t,openEnd:n}=this.unplaced,i=Mn(e,t);if(i.childCount<=1&&t>0){let s=e.size-t<=t+i.size;this.unplaced=new x(gt(e,t-1,1),t-1,s?t-1:n)}else this.unplaced=new x(gt(e,t,1),t,n)}placeNodes({sliceDepth:e,frontierDepth:t,parent:n,inject:i,wrap:s}){for(;this.depth>t;)this.closeFrontierNode();if(s)for(let m=0;m1||a==0||m.content.size)&&(h=g,c.push(di(m.mark(u.allowedMarks(m.marks)),f==1?a:0,f==l.childCount?d:-1)))}let p=f==l.childCount;p||(d=-1),this.placed=yt(this.placed,t,y.from(c)),this.frontier[t].match=h,p&&d<0&&n&&n.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let m=0,g=l;m1&&i==this.$to.end(--n);)++i;return i}findCloseLevel(e){e:for(let t=Math.min(this.depth,e.depth);t>=0;t--){let{match:n,type:i}=this.frontier[t],s=t=0;l--){let{match:a,type:f}=this.frontier[l],c=On(e,l,f,a,!0);if(!c||c.childCount)continue e}return{depth:t,fit:o,move:s?e.doc.resolve(e.after(t+1)):e}}}}close(e){let t=this.findCloseLevel(e);if(!t)return null;for(;this.depth>t.depth;)this.closeFrontierNode();t.fit.childCount&&(this.placed=yt(this.placed,t.depth,t.fit)),e=t.move;for(let n=t.depth+1;n<=e.depth;n++){let i=e.node(n),s=i.type.contentMatch.fillBefore(i.content,!0,e.index(n));this.openFrontierNode(i.type,i.attrs,s)}return e}openFrontierNode(e,t=null,n){let i=this.frontier[this.depth];i.match=i.match.matchType(e),this.placed=yt(this.placed,this.depth,y.from(e.create(t,n))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let t=this.frontier.pop().match.fillBefore(y.empty,!0);t.childCount&&(this.placed=yt(this.placed,this.frontier.length,t))}};function gt(r,e,t){return e==0?r.cutByIndex(t,r.childCount):r.replaceChild(0,r.firstChild.copy(gt(r.firstChild.content,e-1,t)))}function yt(r,e,t){return e==0?r.append(t):r.replaceChild(r.childCount-1,r.lastChild.copy(yt(r.lastChild.content,e-1,t)))}function Mn(r,e){for(let t=0;t1&&(n=n.replaceChild(0,di(n.firstChild,e-1,n.childCount==1?t-1:0))),e>0&&(n=r.type.contentMatch.fillBefore(n).append(n),t<=0&&(n=n.append(r.type.contentMatch.matchFragment(n).fillBefore(y.empty,!0)))),r.copy(n)}function On(r,e,t,n,i){let s=r.node(e),o=i?r.indexAfter(e):r.index(e);if(o==s.childCount&&!t.compatibleContent(s.type))return null;let l=n.fillBefore(s.content,!0,o);return l&&!dl(t,s.content,o)?l:null}function dl(r,e,t){for(let n=t;n0;u--,d--){let p=i.node(u).type.spec;if(p.defining||p.definingAsContext||p.isolating)break;o.indexOf(u)>-1?l=u:i.before(u)==d&&o.splice(1,0,-u)}let a=o.indexOf(l),f=[],c=n.openStart;for(let u=n.content,d=0;;d++){let p=u.firstChild;if(f.push(p),d==n.openStart)break;u=p.content}for(let u=c-1;u>=0;u--){let d=f[u],p=pl(d.type);if(p&&!d.sameMarkup(i.node(Math.abs(l)-1)))c=u;else if(p||!d.type.isTextblock)break}for(let u=n.openStart;u>=0;u--){let d=(u+c+1)%(n.openStart+1),p=f[d];if(p)for(let m=0;m=0&&(r.replace(e,t,n),!(r.steps.length>h));u--){let d=o[u];d<0||(e=i.before(d),t=s.after(d))}}function pi(r,e,t,n,i){if(en){let s=i.contentMatchAt(0),o=s.fillBefore(r).append(r);r=o.append(s.matchFragment(o).fillBefore(y.empty,!0))}return r}function gl(r,e,t,n){if(!n.isInline&&e==t&&r.doc.resolve(e).parent.content.size){let i=hi(r.doc,e,n.type);i!=null&&(e=t=i)}r.replaceRange(e,t,new x(y.from(n),0,0))}function yl(r,e,t){let n=r.doc.resolve(e),i=r.doc.resolve(t);if(n.parent.isTextblock&&i.parent.isTextblock&&n.start()!=i.start()&&n.parentOffset==0&&i.parentOffset==0){let o=n.sharedDepth(t),l=!1;for(let a=n.depth;a>o;a--)n.node(a).type.spec.isolating&&(l=!0);for(let a=i.depth;a>o;a--)i.node(a).type.spec.isolating&&(l=!0);if(!l){for(let a=n.depth;a>0&&e==n.start(a);a--)e=n.before(a);for(let a=i.depth;a>0&&t==i.start(a);a--)t=i.before(a);n=r.doc.resolve(e),i=r.doc.resolve(t)}}let s=mi(n,i);for(let o=0;o0&&(a||n.node(l-1).canReplace(n.index(l-1),i.indexAfter(l-1))))return r.delete(n.before(l),i.after(l))}for(let o=1;o<=n.depth&&o<=i.depth;o++)if(e-n.start(o)==n.depth-o&&t>n.end(o)&&i.end(o)-t!=i.depth-o&&n.start(o-1)==i.start(o-1)&&n.node(o-1).canReplace(n.index(o-1),i.index(o-1)))return r.delete(n.before(o),t);r.delete(e,t)}function mi(r,e){let t=[],n=Math.min(r.depth,e.depth);for(let i=n;i>=0;i--){let s=r.start(i);if(se.pos+(e.depth-i)||r.node(i).type.spec.isolating||e.node(i).type.spec.isolating)break;(s==e.start(i)||i==r.depth&&i==e.depth&&r.parent.inlineContent&&e.parent.inlineContent&&i&&e.start(i-1)==s-1)&&t.push(i)}return t}var xt=class r extends T{constructor(e,t,n){super(),this.pos=e,this.attr=t,this.value=n}apply(e){let t=e.nodeAt(this.pos);if(!t)return I.fail("No node at attribute step's position");let n=Object.create(null);for(let s in t.attrs)n[s]=t.attrs[s];n[this.attr]=this.value;let i=t.type.create(n,null,t.marks);return I.fromReplace(e,this.pos,this.pos+1,new x(y.from(i),0,t.isLeaf?0:1))}getMap(){return ie.empty}invert(e){return new r(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let t=e.mapResult(this.pos,1);return t.deletedAfter?null:new r(t.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.pos!="number"||typeof t.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new r(t.pos,t.attr,t.value)}};T.jsonID("attr",xt);var bt=class r extends T{constructor(e,t){super(),this.attr=e,this.value=t}apply(e){let t=Object.create(null);for(let i in e.attrs)t[i]=e.attrs[i];t[this.attr]=this.value;let n=e.type.create(t,e.content,e.marks);return I.ok(n)}getMap(){return ie.empty}invert(e){return new r(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new r(t.attr,t.value)}};T.jsonID("docAttr",bt);var Be=class extends Error{};Be=function r(e){let t=Error.call(this,e);return t.__proto__=r.prototype,t};Be.prototype=Object.create(Error.prototype);Be.prototype.constructor=Be;Be.prototype.name="TransformError";var St=class{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new Qe}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let t=this.maybeStep(e);if(t.failed)throw new Be(t.failed);return this}maybeStep(e){let t=e.apply(this.doc);return t.failed||this.addStep(e,t.doc),t}get docChanged(){return this.steps.length>0}changedRange(){let e=1e9,t=-1e9;for(let n=0;n{e=Math.min(e,l),t=Math.max(t,a)})}return e==1e9?null:{from:e,to:t}}addStep(e,t){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=t}replace(e,t=e,n=x.empty){let i=tt(this.doc,e,t,n);return i&&this.step(i),this}replaceWith(e,t,n){return this.replace(e,t,new x(y.from(n),0,0))}delete(e,t){return this.replace(e,t,x.empty)}insert(e,t){return this.replaceWith(e,e,t)}replaceRange(e,t,n){return ml(this,e,t,n),this}replaceRangeWith(e,t,n){return gl(this,e,t,n),this}deleteRange(e,t){return yl(this,e,t),this}lift(e,t){return rl(this,e,t),this}join(e,t=1){return ul(this,e,t),this}wrap(e,t){return ol(this,e,t),this}setBlockType(e,t=e,n,i=null){return ll(this,e,t,n,i),this}setNodeMarkup(e,t,n=null,i){return fl(this,e,t,n,i),this}setNodeAttribute(e,t,n){return this.step(new xt(e,t,n)),this}setDocAttribute(e,t){return this.step(new bt(e,t)),this}addNodeMark(e,t){return this.step(new et(e,t)),this}removeNodeMark(e,t){let n=this.doc.nodeAt(e);if(!n)throw new RangeError("No node at position "+e);if(t instanceof O)t.isInSet(n.marks)&&this.step(new Pe(e,t));else{let i=n.marks,s,o=[];for(;s=t.isInSet(i);)o.push(new Pe(e,s)),i=s.removeFromSet(i);for(let l=o.length-1;l>=0;l--)this.step(o[l])}return this}split(e,t=1,n){return cl(this,e,t,n),this}addMark(e,t,n){return el(this,e,t,n),this}removeMark(e,t,n){return tl(this,e,t,n),this}clearIncompatible(e,t,n){return Tn(this,e,t,n),this}};var En=Object.create(null),k=class{constructor(e,t,n){this.$anchor=e,this.$head=t,this.ranges=n||[new Fe(e.min(t),e.max(t))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let t=0;t=0;s--){let o=t<0?nt(e.node(0),e.node(s),e.before(s+1),e.index(s),t,n):nt(e.node(0),e.node(s),e.after(s+1),e.index(s)+1,t,n);if(o)return o}return null}static near(e,t=1){return this.findFrom(e,t)||this.findFrom(e,-t)||new H(e.node(0))}static atStart(e){return nt(e,e,0,0,1)||new H(e)}static atEnd(e){return nt(e,e,e.content.size,e.childCount,-1)||new H(e)}static fromJSON(e,t){if(!t||!t.type)throw new RangeError("Invalid input for Selection.fromJSON");let n=En[t.type];if(!n)throw new RangeError(`No selection type ${t.type} defined`);return n.fromJSON(e,t)}static jsonID(e,t){if(e in En)throw new RangeError("Duplicate use of selection JSON ID "+e);return En[e]=t,t.prototype.jsonID=e,t}getBookmark(){return C.between(this.$anchor,this.$head).getBookmark()}};k.prototype.visible=!0;var Fe=class{constructor(e,t){this.$from=e,this.$to=t}},yi=!1;function xi(r){!yi&&!r.parent.inlineContent&&(yi=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+r.parent.type.name+")"))}var C=class r extends k{constructor(e,t=e){xi(e),xi(t),super(e,t)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,t){let n=e.resolve(t.map(this.head));if(!n.parent.inlineContent)return k.near(n);let i=e.resolve(t.map(this.anchor));return new r(i.parent.inlineContent?i:n,n)}replace(e,t=x.empty){if(super.replace(e,t),t==x.empty){let n=this.$from.marksAcross(this.$to);n&&e.ensureMarks(n)}}eq(e){return e instanceof r&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new Kt(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,t){if(typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new r(e.resolve(t.anchor),e.resolve(t.head))}static create(e,t,n=t){let i=e.resolve(t);return new this(i,n==t?i:e.resolve(n))}static between(e,t,n){let i=e.pos-t.pos;if((!n||i)&&(n=i>=0?1:-1),!t.parent.inlineContent){let s=k.findFrom(t,n,!0)||k.findFrom(t,-n,!0);if(s)t=s.$head;else return k.near(t,n)}return e.parent.inlineContent||(i==0?e=t:(e=(k.findFrom(e,-n,!0)||k.findFrom(e,n,!0)).$anchor,e.pos0?0:1);i>0?o=0;o+=i){let l=e.child(o);if(l.isAtom){if(!s&&S.isSelectable(l))return S.create(r,t-(i<0?l.nodeSize:0))}else{let a=nt(r,l,t+i,i<0?l.childCount:0,i,s);if(a)return a}t+=l.nodeSize*i}return null}function bi(r,e,t){let n=r.steps.length-1;if(n{o==null&&(o=c)}),r.setSelection(k.near(r.doc.resolve(o),t))}var Si=1,qt=2,ki=4,Ht=class extends St{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=qt,this}ensureMarks(e){return O.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&qt)>0}addStep(e,t){super.addStep(e,t),this.updated=this.updated&~qt,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,t=!0){let n=this.selection;return t&&(e=e.mark(this.storedMarks||(n.empty?n.$from.marks():n.$from.marksAcross(n.$to)||O.none))),n.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,t,n){let i=this.doc.type.schema;if(t==null)return e?this.replaceSelectionWith(i.text(e),!0):this.deleteSelection();{if(n==null&&(n=t),!e)return this.deleteRange(t,n);let s=this.storedMarks;if(!s){let o=this.doc.resolve(t);s=n==t?o.marks():o.marksAcross(this.doc.resolve(n))}return this.replaceRangeWith(t,n,i.text(e,s)),!this.selection.empty&&this.selection.to==t+e.length&&this.setSelection(k.near(this.selection.$to)),this}}setMeta(e,t){return this.meta[typeof e=="string"?e:e.key]=t,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=ki,this}get scrolledIntoView(){return(this.updated&ki)>0}};function Ci(r,e){return!e||!r?r:r.bind(e)}var ve=class{constructor(e,t,n){this.name=e,this.init=Ci(t.init,n),this.apply=Ci(t.apply,n)}},bl=[new ve("doc",{init(r){return r.doc||r.schema.topNodeType.createAndFill()},apply(r){return r.doc}}),new ve("selection",{init(r,e){return r.selection||k.atStart(e.doc)},apply(r){return r.selection}}),new ve("storedMarks",{init(r){return r.storedMarks||null},apply(r,e,t,n){return n.selection.$cursor?r.storedMarks:null}}),new ve("scrollToSelection",{init(){return 0},apply(r,e){return r.scrolledIntoView?e+1:e}})],Ct=class{constructor(e,t){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=bl.slice(),t&&t.forEach(n=>{if(this.pluginsByKey[n.key])throw new RangeError("Adding different instances of a keyed plugin ("+n.key+")");this.plugins.push(n),this.pluginsByKey[n.key]=n,n.spec.state&&this.fields.push(new ve(n.key,n.spec.state,n))})}},Rn=class r{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,t=-1){for(let n=0;nn.toJSON())),e&&typeof e=="object")for(let n in e){if(n=="doc"||n=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let i=e[n],s=i.spec.state;s&&s.toJSON&&(t[n]=s.toJSON.call(i,this[i.key]))}return t}static fromJSON(e,t,n){if(!t)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let i=new Ct(e.schema,e.plugins),s=new r(i);return i.fields.forEach(o=>{if(o.name=="doc")s.doc=Q.fromJSON(e.schema,t.doc);else if(o.name=="selection")s.selection=k.fromJSON(s.doc,t.selection);else if(o.name=="storedMarks")t.storedMarks&&(s.storedMarks=t.storedMarks.map(e.schema.markFromJSON));else{if(n)for(let l in n){let a=n[l],f=a.spec.state;if(a.key==o.name&&f&&f.fromJSON&&Object.prototype.hasOwnProperty.call(t,l)){s[o.name]=f.fromJSON.call(a,e,t[l],s);return}}s[o.name]=o.init(e,s)}}),s}};function Mi(r,e,t){for(let n in r){let i=r[n];i instanceof Function?i=i.bind(e):n=="handleDOMEvents"&&(i=Mi(i,e,{})),t[n]=i}return t}var W=class{constructor(e){this.spec=e,this.props={},e.props&&Mi(e.props,this,this.props),this.key=e.key?e.key.key:Oi("plugin")}getState(e){return e[this.key]}},An=Object.create(null);function Oi(r){return r in An?r+"$"+ ++An[r]:(An[r]=0,r+"$")}var Oe=class{constructor(e="key"){this.key=Oi(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}};var Bs={};j(Bs,{Decoration:()=>te,DecorationSet:()=>J,EditorView:()=>nn,__endComposition:()=>ja,__parseFromClipboard:()=>Ua});var R=function(r){for(var e=0;;e++)if(r=r.previousSibling,!r)return e},ot=function(r){let e=r.assignedSlot||r.parentNode;return e&&e.nodeType==11?e.host:e},Vn=null,de=function(r,e,t){let n=Vn||(Vn=document.createRange());return n.setEnd(r,t??r.nodeValue.length),n.setStart(r,e||0),n},Sl=function(){Vn=null},He=function(r,e,t,n){return t&&(Ni(r,e,t,n,-1)||Ni(r,e,t,n,1))},kl=/^(img|br|input|textarea|hr)$/i;function Ni(r,e,t,n,i){for(var s;;){if(r==t&&e==n)return!0;if(e==(i<0?0:Y(r))){let o=r.parentNode;if(!o||o.nodeType!=1||At(r)||kl.test(r.nodeName)||r.contentEditable=="false")return!1;e=R(r)+(i<0?0:1),r=o}else if(r.nodeType==1){let o=r.childNodes[e+(i<0?-1:0)];if(o.nodeType==1&&o.contentEditable=="false")if(!((s=o.pmViewDesc)===null||s===void 0)&&s.ignoreForSelection)e+=i;else return!1;else r=o,e=i<0?Y(r):0}else return!1}}function Y(r){return r.nodeType==3?r.nodeValue.length:r.childNodes.length}function Cl(r,e){for(;;){if(r.nodeType==3&&e)return r;if(r.nodeType==1&&e>0){if(r.contentEditable=="false")return null;r=r.childNodes[e-1],e=Y(r)}else if(r.parentNode&&!At(r))e=R(r),r=r.parentNode;else return null}}function Ml(r,e){for(;;){if(r.nodeType==3&&e2),G=lt||(se?/Mac/.test(se.platform):!1),is=se?/Win/.test(se.platform):!1,pe=/Android \d/.test(Ee),It=!!Di&&"webkitFontSmoothing"in Di.documentElement.style,Dl=It?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function Tl(r){let e=r.defaultView&&r.defaultView.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:r.documentElement.clientWidth,top:0,bottom:r.documentElement.clientHeight}}function ue(r,e){return typeof r=="number"?r:r[e]}function El(r){let e=r.getBoundingClientRect(),t=e.width/r.offsetWidth||1,n=e.height/r.offsetHeight||1;return{left:e.left,right:e.left+r.clientWidth*t,top:e.top,bottom:e.top+r.clientHeight*n}}function Ti(r,e,t){if(!$n(e)&&e.left==0)return;let n=r.someProp("scrollThreshold")||0,i=r.someProp("scrollMargin")||5,s=r.dom.ownerDocument;for(let o=t||r.dom;o;){if(o.nodeType!=1){o=ot(o);continue}let l=o,a=l==s.body,f=a?Tl(s):El(l),c=0,h=0;if(e.topf.bottom-ue(n,"bottom")&&(h=e.bottom-e.top>f.bottom-f.top?e.top+ue(i,"top")-f.top:e.bottom-f.bottom+ue(i,"bottom")),e.leftf.right-ue(n,"right")&&(c=e.right-f.right+ue(i,"right")),c||h)if(a)s.defaultView.scrollBy(c,h);else{let d=l.scrollLeft,p=l.scrollTop;h&&(l.scrollTop+=h),c&&(l.scrollLeft+=c);let m=l.scrollLeft-d,g=l.scrollTop-p;e={left:e.left-m,top:e.top-g,right:e.right-m,bottom:e.bottom-g}}let u=a?"fixed":getComputedStyle(o).position;if(/^(fixed|sticky)$/.test(u))break;o=u=="absolute"?o.offsetParent:ot(o)}}function Al(r){let e=r.dom.getBoundingClientRect(),t=Math.max(0,e.top),n,i;for(let s=(e.left+e.right)/2,o=t+1;o=t-20){n=l,i=a.top;break}}return{refDOM:n,refTop:i,stack:ss(r.dom)}}function ss(r){let e=[],t=r.ownerDocument;for(let n=r;n&&(e.push({dom:n,top:n.scrollTop,left:n.scrollLeft}),r!=t);n=ot(n));return e}function Il({refDOM:r,refTop:e,stack:t}){let n=r?r.getBoundingClientRect().top:0;ls(t,n==0?0:n-e)}function ls(r,e){for(let t=0;t=l){o=Math.max(p.bottom,o),l=Math.min(p.top,l);let m=p.left>e.left?p.left-e.left:p.right=(p.left+p.right)/2?1:0));continue}}else p.top>e.top&&!a&&p.left<=e.left&&p.right>=e.left&&(a=c,f={left:Math.max(p.left,Math.min(p.right,e.left)),top:p.top});!t&&(e.left>=p.right&&e.top>=p.top||e.left>=p.left&&e.top>=p.bottom)&&(s=h+1)}}return!t&&a&&(t=a,i=f,n=0),t&&t.nodeType==3?Pl(t,i):!t||n&&t.nodeType==1?{node:r,offset:s}:as(t,i)}function Pl(r,e){let t=r.nodeValue.length,n=document.createRange(),i;for(let s=0;s=(o.left+o.right)/2?1:0)};break}}return n.detach(),i||{node:r,offset:0}}function ir(r,e){return r.left>=e.left-1&&r.left<=e.right+1&&r.top>=e.top-1&&r.top<=e.bottom+1}function Bl(r,e){let t=r.parentNode;return t&&/^li$/i.test(t.nodeName)&&e.left(o.left+o.right)/2?1:-1}return r.docView.posFromDOM(n,i,s)}function vl(r,e,t,n){let i=-1;for(let s=e,o=!1;s!=r.dom;){let l=r.docView.nearestDesc(s,!0),a;if(!l)return null;if(l.dom.nodeType==1&&(l.node.isBlock&&l.parent||!l.contentDOM)&&((a=l.dom.getBoundingClientRect()).width||a.height)&&(l.node.isBlock&&l.parent&&!/^T(R|BODY|HEAD|FOOT)$/.test(l.dom.nodeName)&&(!o&&a.left>n.left||a.top>n.top?i=l.posBefore:(!o&&a.right-1?i:r.docView.posFromDOM(e,t,-1)}function fs(r,e,t){let n=r.childNodes.length;if(n&&t.tope.top&&i++}let f;It&&i&&n.nodeType==1&&(f=n.childNodes[i-1]).nodeType==1&&f.contentEditable=="false"&&f.getBoundingClientRect().top>=e.top&&i--,n==r.dom&&i==n.childNodes.length-1&&n.lastChild.nodeType==1&&e.top>n.lastChild.getBoundingClientRect().bottom?l=r.state.doc.content.size:(i==0||n.nodeType!=1||n.childNodes[i-1].nodeName!="BR")&&(l=vl(r,n,i,e))}l==null&&(l=zl(r,o,e));let a=r.docView.nearestDesc(o,!0);return{pos:l,inside:a?a.posAtStart-a.border:-1}}function $n(r){return r.top=0&&i==n.nodeValue.length?(a--,c=1):t<0?a--:f++,Mt(we(de(n,a,f),c),c<0)}if(!r.state.doc.resolve(e-(s||0)).parent.inlineContent){if(s==null&&i&&(t<0||i==Y(n))){let a=n.childNodes[i-1];if(a.nodeType==1)return Pn(a.getBoundingClientRect(),!1)}if(s==null&&i=0)}if(s==null&&i&&(t<0||i==Y(n))){let a=n.childNodes[i-1],f=a.nodeType==3?de(a,Y(a)-(o?0:1)):a.nodeType==1&&(a.nodeName!="BR"||!a.nextSibling)?a:null;if(f)return Mt(we(f,1),!1)}if(s==null&&i=0)}function Mt(r,e){if(r.width==0)return r;let t=e?r.left:r.right;return{top:r.top,bottom:r.bottom,left:t,right:t}}function Pn(r,e){if(r.height==0)return r;let t=e?r.top:r.bottom;return{top:t,bottom:t,left:r.left,right:r.right}}function hs(r,e,t){let n=r.state,i=r.root.activeElement;n!=e&&r.updateState(e),i!=r.dom&&r.focus();try{return t()}finally{n!=e&&r.updateState(n),i!=r.dom&&i&&i.focus()}}function Ll(r,e,t){let n=e.selection,i=t=="up"?n.$from:n.$to;return hs(r,e,()=>{let{node:s}=r.docView.domFromPos(i.pos,t=="up"?-1:1);for(;;){let l=r.docView.nearestDesc(s,!0);if(!l)break;if(l.node.isBlock){s=l.contentDOM||l.dom;break}s=l.dom.parentNode}let o=cs(r,i.pos,1);for(let l=s.firstChild;l;l=l.nextSibling){let a;if(l.nodeType==1)a=l.getClientRects();else if(l.nodeType==3)a=de(l,0,l.nodeValue.length).getClientRects();else continue;for(let f=0;fc.top+1&&(t=="up"?o.top-c.top>(c.bottom-o.top)*2:c.bottom-o.bottom>(o.bottom-c.top)*2))return!1}}return!0})}var Wl=/[\u0590-\u08ac]/;function Jl(r,e,t){let{$head:n}=e.selection;if(!n.parent.isTextblock)return!1;let i=n.parentOffset,s=!i,o=i==n.parent.content.size,l=r.domSelection();return l?!Wl.test(n.parent.textContent)||!l.modify?t=="left"||t=="backward"?s:o:hs(r,e,()=>{let{focusNode:a,focusOffset:f,anchorNode:c,anchorOffset:h}=r.domSelectionRange(),u=l.caretBidiLevel;l.modify("move",t,"character");let d=n.depth?r.docView.domAfterPos(n.before()):r.dom,{focusNode:p,focusOffset:m}=r.domSelectionRange(),g=p&&!d.contains(p.nodeType==1?p:p.parentNode)||a==p&&f==m;try{l.collapse(c,h),a&&(a!=c||f!=h)&&l.extend&&l.extend(a,f)}catch{}return u!=null&&(l.caretBidiLevel=u),g}):n.pos==n.start()||n.pos==n.end()}var Ei=null,Ai=null,Ii=!1;function $l(r,e,t){return Ei==e&&Ai==t?Ii:(Ei=e,Ai=t,Ii=t=="up"||t=="down"?Ll(r,e,t):Jl(r,e,t))}var _=0,Ri=1,Le=2,ee=3,Ue=class{constructor(e,t,n,i){this.parent=e,this.children=t,this.dom=n,this.contentDOM=i,this.dirty=_,n.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,t,n){return!1}matchesHack(e){return!1}parseRule(e){return null}stopEvent(e){return!1}get size(){let e=0;for(let t=0;tR(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))i=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(t==0)for(let s=e;;s=s.parentNode){if(s==this.dom){i=!1;break}if(s.previousSibling)break}if(i==null&&t==e.childNodes.length)for(let s=e;;s=s.parentNode){if(s==this.dom){i=!0;break}if(s.nextSibling)break}}return i??n>0?this.posAtEnd:this.posAtStart}nearestDesc(e,t=!1){for(let n=!0,i=e;i;i=i.parentNode){let s=this.getDesc(i),o;if(s&&(!t||s.node))if(n&&(o=s.nodeDOM)&&!(o.nodeType==1?o.contains(e.nodeType==1?e:e.parentNode):o==e))n=!1;else return s}}getDesc(e){let t=e.pmViewDesc;for(let n=t;n;n=n.parent)if(n==this)return t}posFromDOM(e,t,n){for(let i=e;i;i=i.parentNode){let s=this.getDesc(i);if(s)return s.localPosFromDOM(e,t,n)}return-1}descAt(e){for(let t=0,n=0;te||o instanceof Gt){i=e-s;break}s=l}if(i)return this.children[n].domFromPos(i-this.children[n].border,t);for(let s;n&&!(s=this.children[n-1]).size&&s instanceof Ut&&s.side>=0;n--);if(t<=0){let s,o=!0;for(;s=n?this.children[n-1]:null,!(!s||s.dom.parentNode==this.contentDOM);n--,o=!1);return s&&t&&o&&!s.border&&!s.domAtom?s.domFromPos(s.size,t):{node:this.contentDOM,offset:s?R(s.dom)+1:0}}else{let s,o=!0;for(;s=n=c&&t<=f-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(e,t,c);e=o;for(let h=l;h>0;h--){let u=this.children[h-1];if(u.size&&u.dom.parentNode==this.contentDOM&&!u.emptyChildAt(1)){i=R(u.dom)+1;break}e-=u.size}i==-1&&(i=0)}if(i>-1&&(f>t||l==this.children.length-1)){t=f;for(let c=l+1;cp&&ot){let p=l;l=a,a=p}let d=document.createRange();d.setEnd(a.node,a.offset),d.setStart(l.node,l.offset),f.removeAllRanges(),f.addRange(d)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,t){for(let n=0,i=0;i=n:en){let l=n+s.border,a=o-s.border;if(e>=l&&t<=a){this.dirty=e==n||t==o?Le:Ri,e==l&&t==a&&(s.contentLost||s.dom.parentNode!=this.contentDOM)?s.dirty=ee:s.markDirty(e-l,t-l);return}else s.dirty=s.dom==s.contentDOM&&s.dom.parentNode==this.contentDOM&&!s.children.length?Le:ee}n=o}this.dirty=Le}markParentsDirty(){let e=1;for(let t=this.parent;t;t=t.parent,e++){let n=e==1?Le:Ri;t.dirty{if(!s)return i;if(s.parent)return s.parent.posBeforeChild(s)})),!t.type.spec.raw){if(o.nodeType!=1){let l=document.createElement("span");l.appendChild(o),o=l}o.contentEditable="false",o.classList.add("ProseMirror-widget")}super(e,[],o,null),this.widget=t,this.widget=t,s=this}matchesWidget(e){return this.dirty==_&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let t=this.widget.spec.stopEvent;return t?t(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get ignoreForSelection(){return!!this.widget.type.spec.relaxedSide}get side(){return this.widget.type.side}},qn=class extends Ue{constructor(e,t,n,i){super(e,[],t,null),this.textDOM=n,this.text=i}get size(){return this.text.length}localPosFromDOM(e,t){return e!=this.textDOM?this.posAtStart+(t?this.size:0):this.posAtStart+t}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}},Je=class r extends Ue{constructor(e,t,n,i,s){super(e,[],n,i),this.mark=t,this.spec=s}static create(e,t,n,i){let s=i.nodeViews[t.type.name],o=s&&s(t,i,n);return(!o||!o.dom)&&(o=ke.renderSpec(document,t.type.spec.toDOM(t,n),null,t.attrs)),new r(e,t,o.dom,o.contentDOM||o.dom,o)}parseRule(){return this.dirty&ee||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=ee&&this.mark.eq(e)}markDirty(e,t){if(super.markDirty(e,t),this.dirty!=_){let n=this.parent;for(;!n.node;)n=n.parent;n.dirty0&&(s=jn(s,0,e,n));for(let l=0;l{if(!a)return o;if(a.parent)return a.parent.posBeforeChild(a)},n,i),c=f&&f.dom,h=f&&f.contentDOM;if(t.isText){if(!c)c=document.createTextNode(t.text);else if(c.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else c||({dom:c,contentDOM:h}=ke.renderSpec(document,t.type.spec.toDOM(t),null,t.attrs));!h&&!t.isText&&c.nodeName!="BR"&&(c.hasAttribute("contenteditable")||(c.contentEditable="false"),t.type.spec.draggable&&(c.draggable=!0));let u=c;return c=ps(c,n,t),f?a=new Kn(e,t,n,i,c,h||null,u,f):t.isText?new jt(e,t,n,i,c,u):new r(e,t,n,i,c,h||null,u)}parseRule(e){if(this.node.type.spec.reparseInView)return null;let t={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(t.preserveWhitespace="full"),!this.contentDOM)t.getContent=()=>this.node.content;else if(!this.contentLost)t.contentElement=this.contentDOM;else{for(let n=this.children.length-1;n>=0;n--){let i=this.children[n];if(this.dom.contains(i.dom.parentNode)){t.contentElement=i.dom.parentNode;break}}if(!t.contentElement){let n=e&&e.find(i=>i.nodeType==1&&e.indexOf(i.parentNode)<0&&this.dom.contains(i));n?t.contentElement=n:t.getContent=()=>y.empty}}return t}matchesNode(e,t,n){return this.dirty==_&&e.eq(this.node)&&Yt(t,this.outerDeco)&&n.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,t){let n=this.node.inlineContent,i=t,s=e.composing?this.localCompositionInfo(e,t):null,o=s&&s.pos>-1?s:null,l=s&&s.pos<0,a=new Un(this,o&&o.node,e);Ul(this.node,this.innerDeco,(f,c,h)=>{f.spec.marks?a.syncToMarks(f.spec.marks,n,e,c):f.type.side>=0&&!h&&a.syncToMarks(c==this.node.childCount?O.none:this.node.child(c).marks,n,e,c),a.placeWidget(f,e,i)},(f,c,h,u)=>{a.syncToMarks(f.marks,n,e,u);let d;a.findNodeMatch(f,c,h,u)||l&&e.state.selection.from>i&&e.state.selection.to-1&&a.updateNodeAt(f,c,h,d,e)||a.updateNextNode(f,c,h,e,u,i)||a.addNode(f,c,h,e,i),i+=f.nodeSize}),a.syncToMarks([],n,e,0),this.node.isTextblock&&a.addTextblockHacks(),a.destroyRest(),(a.changed||this.dirty==Le)&&(o&&this.protectLocalComposition(e,o),us(this.contentDOM,this.children,e),lt&&jl(this.dom))}localCompositionInfo(e,t){let{from:n,to:i}=e.state.selection;if(!(e.state.selection instanceof C)||nt+this.node.content.size)return null;let s=e.input.compositionNode;if(!s||!this.dom.contains(s.parentNode))return null;if(this.node.inlineContent){let o=s.nodeValue,l=Gl(this.node.content,o,n-t,i-t);return l<0?null:{node:s,pos:l,text:o}}else return{node:s,pos:-1,text:""}}protectLocalComposition(e,{node:t,pos:n,text:i}){if(this.getDesc(t))return;let s=t;for(;s.parentNode!=this.contentDOM;s=s.parentNode){for(;s.previousSibling;)s.parentNode.removeChild(s.previousSibling);for(;s.nextSibling;)s.parentNode.removeChild(s.nextSibling);s.pmViewDesc&&(s.pmViewDesc=void 0)}let o=new qn(this,s,t,i);e.input.compositionNodes.push(o),this.children=jn(this.children,n,n+i.length,e,o)}update(e,t,n,i){return this.dirty==ee||!e.sameMarkup(this.node)?!1:(this.updateInner(e,t,n,i),!0)}updateInner(e,t,n,i){this.updateOuterDeco(t),this.node=e,this.innerDeco=n,this.contentDOM&&this.updateChildren(i,this.posAtStart),this.dirty=_}updateOuterDeco(e){if(Yt(e,this.outerDeco))return;let t=this.nodeDOM.nodeType!=1,n=this.dom;this.dom=ds(this.dom,this.nodeDOM,Hn(this.outerDeco,this.node,t),Hn(e,this.node,t)),this.dom!=n&&(n.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.nodeDOM.draggable=!0))}deselectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.nodeDOM.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}};function Pi(r,e,t,n,i){ps(n,e,r);let s=new Te(void 0,r,e,t,n,n,n);return s.contentDOM&&s.updateChildren(i,0),s}var jt=class r extends Te{constructor(e,t,n,i,s,o){super(e,t,n,i,s,null,o)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,t,n,i){return this.dirty==ee||this.dirty!=_&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(t),(this.dirty!=_||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,i.trackWrites==this.nodeDOM&&(i.trackWrites=null)),this.node=e,this.dirty=_,!0)}inParent(){let e=this.parent.contentDOM;for(let t=this.nodeDOM;t;t=t.parentNode)if(t==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,t,n){return e==this.nodeDOM?this.posAtStart+Math.min(t,this.node.text.length):super.localPosFromDOM(e,t,n)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,t,n){let i=this.node.cut(e,t),s=document.createTextNode(i.text);return new r(this.parent,i,this.outerDeco,this.innerDeco,s,s)}markDirty(e,t){super.markDirty(e,t),this.dom!=this.nodeDOM&&(e==0||t==this.nodeDOM.nodeValue.length)&&(this.dirty=ee)}get domAtom(){return!1}isText(e){return this.node.text==e}},Gt=class extends Ue{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==_&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}},Kn=class extends Te{constructor(e,t,n,i,s,o,l,a){super(e,t,n,i,s,o,l),this.spec=a}update(e,t,n,i){if(this.dirty==ee)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let s=this.spec.update(e,t,n);return s&&this.updateInner(e,t,n,i),s}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,t,n,i)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,t,n,i){this.spec.setSelection?this.spec.setSelection(e,t,n.root):super.setSelection(e,t,n,i)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}};function us(r,e,t){let n=r.firstChild,i=!1;for(let s=0;s>1,l=Math.min(o,e.length);for(;s-1)a>this.index&&(this.changed=!0,this.destroyBetween(this.index,a)),this.top=this.top.children[this.index];else{let c=Je.create(this.top,e[o],t,n);this.top.children.splice(this.index,0,c),this.top=c,this.changed=!0}this.index=0,o++}}findNodeMatch(e,t,n,i){let s=-1,o;if(i>=this.preMatch.index&&(o=this.preMatch.matches[i-this.preMatch.index]).parent==this.top&&o.matchesNode(e,t,n))s=this.top.children.indexOf(o,this.index);else for(let l=this.index,a=Math.min(this.top.children.length,l+5);l0;){let l;for(;;)if(n){let f=t.children[n-1];if(f instanceof Je)t=f,n=f.children.length;else{l=f,n--;break}}else{if(t==e)break e;n=t.parent.children.indexOf(t),t=t.parent}let a=l.node;if(a){if(a!=r.child(i-1))break;--i,s.set(l,i),o.push(l)}}return{index:i,matched:s,matches:o.reverse()}}function Hl(r,e){return r.type.side-e.type.side}function Ul(r,e,t,n){let i=e.locals(r),s=0;if(i.length==0){for(let f=0;fs;)l.push(i[o++]);let p=s+u.nodeSize;if(u.isText){let g=p;o!g.inline):l.slice();n(u,m,e.forChild(s,u),d),s=p}}function jl(r){if(r.nodeName=="UL"||r.nodeName=="OL"){let e=r.style.cssText;r.style.cssText=e+"; list-style: square !important",window.getComputedStyle(r).listStyle,r.style.cssText=e}}function Gl(r,e,t,n){for(let i=0,s=0;i=t){if(s>=n&&a.slice(n-e.length-l,n-l)==e)return n-e.length;let f=l=0&&f+e.length+l>=t)return l+f;if(t==n&&a.length>=n+e.length-l&&a.slice(n-l,n-l+e.length)==e)return n}}return-1}function jn(r,e,t,n,i){let s=[];for(let o=0,l=0;o=t||c<=e?s.push(a):(ft&&s.push(a.slice(t-f,a.size,n)))}return s}function sr(r,e=null){let t=r.domSelectionRange(),n=r.state.doc;if(!t.focusNode)return null;let i=r.docView.nearestDesc(t.focusNode),s=i&&i.size==0,o=r.docView.posFromDOM(t.focusNode,t.focusOffset,1);if(o<0)return null;let l=n.resolve(o),a,f;if(rn(t)){for(a=o;i&&!i.node;)i=i.parent;let h=i.node;if(i&&h.isAtom&&S.isSelectable(h)&&i.parent&&!(h.isInline&&Ol(t.focusNode,t.focusOffset,i.dom))){let u=i.posBefore;f=new S(o==u?l:n.resolve(u))}}else{if(t instanceof r.dom.ownerDocument.defaultView.Selection&&t.rangeCount>1){let h=o,u=o;for(let d=0;d{(t.anchorNode!=n||t.anchorOffset!=i)&&(e.removeEventListener("selectionchange",r.input.hideSelectionGuard),setTimeout(()=>{(!ms(r)||r.state.selection.visible)&&r.dom.classList.remove("ProseMirror-hideselection")},20))})}function Xl(r){let e=r.domSelection();if(!e)return;let t=r.cursorWrapper.dom,n=t.nodeName=="IMG";n?e.collapse(t.parentNode,R(t)+1):e.collapse(t,0),!n&&!r.state.selection.visible&&U&&De<=11&&(t.disabled=!0,t.disabled=!1)}function gs(r,e){if(e instanceof S){let t=r.docView.descAt(e.from);t!=r.lastSelectedViewDesc&&(Vi(r),t&&t.selectNode(),r.lastSelectedViewDesc=t)}else Vi(r)}function Vi(r){r.lastSelectedViewDesc&&(r.lastSelectedViewDesc.parent&&r.lastSelectedViewDesc.deselectNode(),r.lastSelectedViewDesc=void 0)}function or(r,e,t,n){return r.someProp("createSelectionBetween",i=>i(r,e,t))||C.between(e,t,n)}function Li(r){return r.editable&&!r.hasFocus()?!1:ys(r)}function ys(r){let e=r.domSelectionRange();if(!e.anchorNode)return!1;try{return r.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(r.editable||r.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function _l(r){let e=r.docView.domFromPos(r.state.selection.anchor,0),t=r.domSelectionRange();return He(e.node,e.offset,t.anchorNode,t.anchorOffset)}function Gn(r,e){let{$anchor:t,$head:n}=r.selection,i=e>0?t.max(n):t.min(n),s=i.parent.inlineContent?i.depth?r.doc.resolve(e>0?i.after():i.before()):null:i;return s&&k.findFrom(s,e)}function Ne(r,e){return r.dispatch(r.state.tr.setSelection(e).scrollIntoView()),!0}function Wi(r,e,t){let n=r.state.selection;if(n instanceof C)if(t.indexOf("s")>-1){let{$head:i}=n,s=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter;if(!s||s.isText||!s.isLeaf)return!1;let o=r.state.doc.resolve(i.pos+s.nodeSize*(e<0?-1:1));return Ne(r,new C(n.$anchor,o))}else if(n.empty){if(r.endOfTextblock(e>0?"forward":"backward")){let i=Gn(r.state,e);return i&&i instanceof S?Ne(r,i):!1}else if(!(G&&t.indexOf("m")>-1)){let i=n.$head,s=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter,o;if(!s||s.isText)return!1;let l=e<0?i.pos-s.nodeSize:i.pos;return s.isAtom||(o=r.docView.descAt(l))&&!o.contentDOM?S.isSelectable(s)?Ne(r,new S(e<0?r.state.doc.resolve(i.pos-s.nodeSize):i)):It?Ne(r,new C(r.state.doc.resolve(e<0?l:l+s.nodeSize))):!1:!1}}else return!1;else{if(n instanceof S&&n.node.isInline)return Ne(r,new C(e>0?n.$to:n.$from));{let i=Gn(r.state,e);return i?Ne(r,i):!1}}}function Xt(r){return r.nodeType==3?r.nodeValue.length:r.childNodes.length}function wt(r,e){let t=r.pmViewDesc;return t&&t.size==0&&(e<0||r.nextSibling||r.nodeName!="BR")}function it(r,e){return e<0?Ql(r):Zl(r)}function Ql(r){let e=r.domSelectionRange(),t=e.focusNode,n=e.focusOffset;if(!t)return;let i,s,o=!1;for(X&&t.nodeType==1&&n0){if(t.nodeType!=1)break;{let l=t.childNodes[n-1];if(wt(l,-1))i=t,s=--n;else if(l.nodeType==3)t=l,n=t.nodeValue.length;else break}}else{if(xs(t))break;{let l=t.previousSibling;for(;l&&wt(l,-1);)i=t.parentNode,s=R(l),l=l.previousSibling;if(l)t=l,n=Xt(t);else{if(t=t.parentNode,t==r.dom)break;n=0}}}o?Yn(r,t,n):i&&Yn(r,i,s)}function Zl(r){let e=r.domSelectionRange(),t=e.focusNode,n=e.focusOffset;if(!t)return;let i=Xt(t),s,o;for(;;)if(n{r.state==i&&ge(r)},50)}function Ji(r,e){let t=r.state.doc.resolve(e);if(!(P||is)&&t.parent.inlineContent){let i=r.coordsAtPos(e);if(e>t.start()){let s=r.coordsAtPos(e-1),o=(s.top+s.bottom)/2;if(o>i.top&&o1)return s.lefti.top&&o1)return s.left>i.left?"ltr":"rtl"}}return getComputedStyle(r.dom).direction=="rtl"?"rtl":"ltr"}function $i(r,e,t){let n=r.state.selection;if(n instanceof C&&!n.empty||t.indexOf("s")>-1||G&&t.indexOf("m")>-1)return!1;let{$from:i,$to:s}=n;if(!i.parent.inlineContent||r.endOfTextblock(e<0?"up":"down")){let o=Gn(r.state,e);if(o&&o instanceof S)return Ne(r,o)}if(!i.parent.inlineContent){let o=e<0?i:s,l=n instanceof H?k.near(o,e):k.findFrom(o,e);return l?Ne(r,l):!1}return!1}function qi(r,e){if(!(r.state.selection instanceof C))return!0;let{$head:t,$anchor:n,empty:i}=r.state.selection;if(!t.sameParent(n))return!0;if(!i)return!1;if(r.endOfTextblock(e>0?"forward":"backward"))return!0;let s=!t.textOffset&&(e<0?t.nodeBefore:t.nodeAfter);if(s&&!s.isText){let o=r.state.tr;return e<0?o.delete(t.pos-s.nodeSize,t.pos):o.delete(t.pos,t.pos+s.nodeSize),r.dispatch(o),!0}return!1}function Ki(r,e,t){r.domObserver.stop(),e.contentEditable=t,r.domObserver.start()}function na(r){if(!L||r.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:t}=r.domSelectionRange();if(e&&e.nodeType==1&&t==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let n=e.firstChild;Ki(r,n,"true"),setTimeout(()=>Ki(r,n,"false"),20)}return!1}function ra(r){let e="";return r.ctrlKey&&(e+="c"),r.metaKey&&(e+="m"),r.altKey&&(e+="a"),r.shiftKey&&(e+="s"),e}function ia(r,e){let t=e.keyCode,n=ra(e);if(t==8||G&&t==72&&n=="c")return qi(r,-1)||it(r,-1);if(t==46&&!e.shiftKey||G&&t==68&&n=="c")return qi(r,1)||it(r,1);if(t==13||t==27)return!0;if(t==37||G&&t==66&&n=="c"){let i=t==37?Ji(r,r.state.selection.from)=="ltr"?-1:1:-1;return Wi(r,i,n)||it(r,i)}else if(t==39||G&&t==70&&n=="c"){let i=t==39?Ji(r,r.state.selection.from)=="ltr"?1:-1:1;return Wi(r,i,n)||it(r,i)}else{if(t==38||G&&t==80&&n=="c")return $i(r,-1,n)||it(r,-1);if(t==40||G&&t==78&&n=="c")return na(r)||$i(r,1,n)||it(r,1);if(n==(G?"m":"c")&&(t==66||t==73||t==89||t==90))return!0}return!1}function lr(r,e){r.someProp("transformCopied",d=>{e=d(e,r)});let t=[],{content:n,openStart:i,openEnd:s}=e;for(;i>1&&s>1&&n.childCount==1&&n.firstChild.childCount==1;){i--,s--;let d=n.firstChild;t.push(d.type.name,d.attrs!=d.type.defaultAttrs?d.attrs:null),n=d.content}let o=r.someProp("clipboardSerializer")||ke.fromSchema(r.state.schema),l=Ms(),a=l.createElement("div");a.appendChild(o.serializeFragment(n,{document:l}));let f=a.firstChild,c,h=0;for(;f&&f.nodeType==1&&(c=Cs[f.nodeName.toLowerCase()]);){for(let d=c.length-1;d>=0;d--){let p=l.createElement(c[d]);for(;a.firstChild;)p.appendChild(a.firstChild);a.appendChild(p),h++}f=a.firstChild}f&&f.nodeType==1&&f.setAttribute("data-pm-slice",`${i} ${s}${h?` -${h}`:""} ${JSON.stringify(t)}`);let u=r.someProp("clipboardTextSerializer",d=>d(e,r))||e.content.textBetween(0,e.content.size,` +var Op=Object.defineProperty;var pe=(n,e)=>{for(var t in e)Op(n,t,{get:e[t],enumerable:!0})};var fi={};pe(fi,{AbsolutePosition:()=>Ss,AbstractConnector:()=>rl,AbstractStruct:()=>or,AbstractType:()=>B,Array:()=>dn,ContentAny:()=>Ft,ContentBinary:()=>mn,ContentDeleted:()=>lr,ContentDoc:()=>gn,ContentEmbed:()=>mt,ContentFormat:()=>V,ContentJSON:()=>oi,ContentString:()=>_e,ContentType:()=>Me,Doc:()=>ve,GC:()=>oe,ID:()=>dt,Item:()=>A,Map:()=>pn,PermanentUserData:()=>sl,RelativePosition:()=>Qe,Skip:()=>Q,Snapshot:()=>Pt,Text:()=>tt,Transaction:()=>Cs,UndoManager:()=>fn,UpdateDecoderV1:()=>De,UpdateDecoderV2:()=>ye,UpdateEncoderV1:()=>Ze,UpdateEncoderV2:()=>Re,XmlElement:()=>L,XmlFragment:()=>nt,XmlHook:()=>si,XmlText:()=>le,YArrayEvent:()=>Os,YEvent:()=>un,YMapEvent:()=>Ms,YTextEvent:()=>Es,YXmlEvent:()=>As,applyUpdate:()=>eg,applyUpdateV2:()=>yn,cleanupYTextFormatting:()=>Kh,compareIDs:()=>on,compareRelativePositions:()=>Is,convertUpdateFormatV1ToV2:()=>_g,convertUpdateFormatV2ToV1:()=>Ih,createAbsolutePositionFromRelativePosition:()=>bl,createDeleteSet:()=>cr,createDeleteSetFromStructStore:()=>pl,createDocFromSnapshot:()=>xg,createID:()=>k,createRelativePositionFromJSON:()=>bn,createRelativePositionFromTypeIndex:()=>li,createSnapshot:()=>ci,decodeRelativePosition:()=>ug,decodeSnapshot:()=>gg,decodeSnapshotV2:()=>xh,decodeStateVector:()=>yl,decodeUpdate:()=>Og,decodeUpdateV2:()=>Dh,diffUpdate:()=>Ng,diffUpdateV2:()=>wl,emptySnapshot:()=>yg,encodeRelativePosition:()=>hg,encodeSnapshot:()=>mg,encodeSnapshotV2:()=>yh,encodeStateAsUpdate:()=>ng,encodeStateAsUpdateV2:()=>ph,encodeStateVector:()=>sg,encodeStateVectorFromUpdate:()=>Mg,encodeStateVectorFromUpdateV2:()=>Mh,equalDeleteSets:()=>uh,equalSnapshots:()=>pg,findIndexSS:()=>Oe,findRootTypeKey:()=>xn,getItem:()=>ln,getItemCleanEnd:()=>cl,getItemCleanStart:()=>se,getState:()=>v,getTypeChildren:()=>Bg,isDeleted:()=>gt,isParentOf:()=>hn,iterateDeletedStructs:()=>Ge,logType:()=>og,logUpdate:()=>Dg,logUpdateV2:()=>Th,mergeDeleteSets:()=>cn,mergeUpdates:()=>Oh,mergeUpdatesV2:()=>ti,obfuscateUpdate:()=>Ig,obfuscateUpdateV2:()=>Rg,parseUpdateMeta:()=>Eg,parseUpdateMetaV2:()=>Eh,readUpdate:()=>Qm,readUpdateV2:()=>gl,relativePositionToJSON:()=>lg,snapshot:()=>ai,snapshotContainsUpdate:()=>wg,transact:()=>I,tryGc:()=>Cg,typeListToArraySnapshot:()=>Vs,typeMapGetAllSnapshot:()=>qh,typeMapGetSnapshot:()=>Lg});var U=()=>new Map,Li=n=>{let e=U();return n.forEach((t,r)=>{e.set(r,t)}),e},$=(n,e,t)=>{let r=n.get(e);return r===void 0&&n.set(e,r=t()),r},Hc=(n,e)=>{let t=[];for(let[r,i]of n)t.push(e(i,r));return t},Gc=(n,e)=>{for(let[t,r]of n)if(e(r,t))return!0;return!1};var Le=()=>new Set;var $i=n=>n[n.length-1];var Xc=(n,e)=>{for(let t=0;t{for(let t=0;t{for(let t=0;t{let t=new Array(n);for(let r=0;r{this.off(e,r),t(...i)};this.on(e,r)}off(e,t){let r=this._observers.get(e);r!==void 0&&(r.delete(t),r.size===0&&this._observers.delete(e))}emit(e,t){return je((this._observers.get(e)||U()).values()).forEach(r=>r(...t))}destroy(){this._observers=U()}};var G=Math.floor;var Qt=Math.abs;var Ne=(n,e)=>nn>e?n:e,Pw=Number.isNaN;var Ji=n=>n!==0?n<0:1/n<0;var Ln=Number.MAX_SAFE_INTEGER,So=Number.MIN_SAFE_INTEGER,Fw=1<<31;var Qc=Number.isInteger||(n=>typeof n=="number"&&isFinite(n)&&G(n)===n),Lw=Number.isNaN,zw=Number.parseInt;var Ir=String.fromCharCode,Mp=String.fromCodePoint,$w=Ir(65535),Ep=n=>n.toLowerCase(),Ap=/^\s*/g,Np=n=>n.replace(Ap,""),Ip=/([A-Z])/g,Co=(n,e)=>Np(n.replace(Ip,t=>`${e}${Ep(t)}`));var Rp=n=>{let e=unescape(encodeURIComponent(n)),t=e.length,r=new Uint8Array(t);for(let i=0;i$n.encode(n),ea=$n?_p:Rp;var zn=typeof TextDecoder>"u"?null:new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});zn&&zn.decode(new Uint8Array).length===1&&(zn=null);var Wi=(n,e)=>Zc(e,()=>n).join("");var en=class{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}},Nt=()=>new en,sa=n=>{let e=Nt();return n(e),ke(e)},vp=n=>{let e=n.cpos;for(let t=0;t{let e=new Uint8Array(vp(n)),t=0;for(let r=0;r{let t=n.cbuf.length;t-n.cpos{let t=n.cbuf.length;n.cpos===t&&(n.bufs.push(n.cbuf),n.cbuf=new Uint8Array(t*2),n.cpos=0),n.cbuf[n.cpos++]=e};var jn=Y;var S=(n,e)=>{for(;e>127;)Y(n,128|127&e),e=G(e/128);Y(n,127&e)},_r=(n,e)=>{let t=Ji(e);for(t&&(e=-e),Y(n,(e>63?128:0)|(t?64:0)|63&e),e=G(e/64);e>0;)Y(n,(e>127?128:0)|127&e),e=G(e/128)},To=new Uint8Array(3e4),Up=To.length/3,Bp=(n,e)=>{if(e.length{let t=unescape(encodeURIComponent(e)),r=t.length;S(n,r);for(let i=0;iYn(n,ke(e)),Yn=(n,e)=>{let t=n.cbuf.length,r=n.cpos,i=Ne(t-r,e.length),s=e.length-i;n.cbuf.set(e.subarray(0,i),r),n.cpos+=i,s>0&&(n.bufs.push(n.cbuf),n.cbuf=new Uint8Array(me(t*2,s)),n.cbuf.set(e.subarray(i)),n.cpos=s)},Ce=(n,e)=>{S(n,e.byteLength),Yn(n,e)},Do=(n,e)=>{Vp(n,e);let t=new DataView(n.cbuf.buffer,n.cpos,e);return n.cpos+=e,t},Fp=(n,e)=>Do(n,4).setFloat32(0,e,!1),Lp=(n,e)=>Do(n,8).setFloat64(0,e,!1),zp=(n,e)=>Do(n,8).setBigInt64(0,e,!1);var na=new DataView(new ArrayBuffer(4)),$p=n=>(na.setFloat32(0,n),na.getFloat32(0)===n),Et=(n,e)=>{switch(typeof e){case"string":Y(n,119),Mt(n,e);break;case"number":Qc(e)&&Qt(e)<=2147483647?(Y(n,125),_r(n,e)):$p(e)?(Y(n,124),Fp(n,e)):(Y(n,123),Lp(n,e));break;case"bigint":Y(n,122),zp(n,e);break;case"object":if(e===null)Y(n,126);else if(ft(e)){Y(n,117),S(n,e.length);for(let t=0;t0&&S(this,this.count-1),this.count=1,this.w(this,e),this.s=e)}};var ra=n=>{n.count>0&&(_r(n.encoder,n.count===1?n.s:-n.s),n.count>1&&S(n.encoder,n.count-2))},tn=class{constructor(){this.encoder=new en,this.s=0,this.count=0}write(e){this.s===e?this.count++:(ra(this),this.count=1,this.s=e)}toUint8Array(){return ra(this),ke(this.encoder)}};var ia=n=>{if(n.count>0){let e=n.diff*2+(n.count===1?0:1);_r(n.encoder,e),n.count>1&&S(n.encoder,n.count-2)}},Wn=class{constructor(){this.encoder=new en,this.s=0,this.count=0,this.diff=0}write(e){this.diff===e-this.s?(this.s=e,this.count++):(ia(this),this.count=1,this.diff=e-this.s,this.s=e)}toUint8Array(){return ia(this),ke(this.encoder)}},ji=class{constructor(){this.sarr=[],this.s="",this.lensE=new tn}write(e){this.s+=e,this.s.length>19&&(this.sarr.push(this.s),this.s=""),this.lensE.write(e.length)}toUint8Array(){let e=new en;return this.sarr.push(this.s),this.s="",Mt(e,this.sarr.join("")),Yn(e,this.lensE.toUint8Array()),ke(e)}};var Ie=n=>new Error(n),ge=()=>{throw Ie("Method unimplemented")},_=()=>{throw Ie("Unexpected case")};var ca=Ie("Unexpected end of array"),aa=Ie("Integer out of Range"),Kn=class{constructor(e){this.arr=e,this.pos=0}},X=n=>new Kn(n),Oo=n=>n.pos!==n.arr.length;var qp=(n,e)=>{let t=new Uint8Array(n.arr.buffer,n.pos+n.arr.byteOffset,e);return n.pos+=e,t},Te=n=>qp(n,C(n));var nn=n=>n.arr[n.pos++];var C=n=>{let e=0,t=1,r=n.arr.length;for(;n.posLn)throw aa}throw ca},Ur=n=>{let e=n.arr[n.pos++],t=e&63,r=64,i=(e&64)>0?-1:1;if((e&128)===0)return i*t;let s=n.arr.length;for(;n.posLn)throw aa}throw ca};var Jp=n=>{let e=C(n);if(e===0)return"";{let t=String.fromCodePoint(nn(n));if(--e<100)for(;e--;)t+=String.fromCodePoint(nn(n));else for(;e>0;){let r=e<1e4?e:1e4,i=n.arr.subarray(n.pos,n.pos+r);n.pos+=r,t+=String.fromCodePoint.apply(null,i),e-=r}return decodeURIComponent(escape(t))}},Wp=n=>zn.decode(Te(n)),It=zn?Wp:Jp;var Mo=(n,e)=>{let t=new DataView(n.arr.buffer,n.arr.byteOffset+n.pos,e);return n.pos+=e,t},jp=n=>Mo(n,4).getFloat32(0,!1),Yp=n=>Mo(n,8).getFloat64(0,!1),Kp=n=>Mo(n,8).getBigInt64(0,!1);var Hp=[n=>{},n=>null,Ur,jp,Yp,Kp,n=>!1,n=>!0,It,n=>{let e=C(n),t={};for(let r=0;r{let e=C(n),t=[];for(let r=0;rHp[127-nn(n)](n),Vr=class extends Kn{constructor(e,t){super(e),this.reader=t,this.s=null,this.count=0}read(){return this.count===0&&(this.s=this.reader(this),Oo(this)?this.count=C(this)+1:this.count=-1),this.count--,this.s}};var rn=class extends Kn{constructor(e){super(e),this.s=0,this.count=0}read(){if(this.count===0){this.s=Ur(this);let e=Ji(this.s);this.count=1,e&&(this.s=-this.s,this.count=C(this)+2)}return this.count--,this.s}};var Gn=class extends Kn{constructor(e){super(e),this.s=0,this.count=0,this.diff=0}read(){if(this.count===0){let e=Ur(this),t=e&1;this.diff=G(e/2),this.count=1,t&&(this.count=C(this)+2)}return this.s+=this.diff,this.count--,this.s}},Yi=class{constructor(e){this.decoder=new rn(e),this.str=It(this.decoder),this.spos=0}read(){let e=this.spos+this.decoder.read(),t=this.str.slice(this.spos,e);return this.spos=e,t}};var Ww=crypto.subtle,ha=crypto.getRandomValues.bind(crypto);var Xp=Math.random,Eo=()=>ha(new Uint32Array(1))[0];var fa=n=>n[G(Xp()*n.length)],Zp="10000000-1000-4000-8000"+-1e11,ua=()=>Zp.replace(/[018]/g,n=>(n^Eo()&15>>n/4).toString(16));var Ki=Date.now;var Ao=n=>new Promise(n);var Kw=Promise.all.bind(Promise);var No=n=>n===void 0?null:n;var Io=class{constructor(){this.map=new Map}setItem(e,t){this.map.set(e,t)}getItem(e){return this.map.get(e)}},ma=new Io,tm=!0;try{typeof localStorage<"u"&&localStorage&&(ma=localStorage,tm=!1)}catch{}var ga=ma;var sn=Symbol("Equality"),Hi=(n,e)=>n===e||!!n?.[sn]?.(e)||!1;var ya=n=>typeof n=="object",xa=Object.assign,_o=Object.keys;var ba=(n,e)=>{for(let t in n)e(n[t],t)};var Br=n=>_o(n).length;var wa=n=>{for(let e in n)return!1;return!0},Rt=(n,e)=>{for(let t in n)if(!e(n[t],t))return!1;return!0},Pr=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),vo=(n,e)=>n===e||Br(n)===Br(e)&&Rt(n,(t,r)=>(t!==void 0||Pr(e,r))&&Hi(e[r],t)),rm=Object.freeze,Vo=n=>{for(let e in n){let t=n[e];(typeof t=="object"||typeof t=="function")&&Vo(n[e])}return rm(n)};var Lr=(n,e,t=0)=>{try{for(;tn;var Fr=(n,e)=>{if(n===e)return!0;if(n==null||e==null||n.constructor!==e.constructor&&(n.constructor||Object)!==(e.constructor||Object))return!1;if(n[sn]!=null)return n[sn](e);switch(n.constructor){case ArrayBuffer:n=new Uint8Array(n),e=new Uint8Array(e);case Uint8Array:{if(n.byteLength!==e.byteLength)return!1;for(let t=0;te.includes(n);var Xn=typeof process<"u"&&process.release&&/node|io\.js/.test(process.release.name)&&Object.prototype.toString.call(typeof process<"u"?process:0)==="[object process]",$r=typeof window<"u"&&typeof document<"u"&&!Xn,Hw=typeof navigator<"u"?/Mac/.test(navigator.platform):!1,Ye,im=[],sm=()=>{if(Ye===void 0)if(Xn){Ye=U();let n=process.argv,e=null;for(let t=0;t{if(n.length!==0){let[e,t]=n.split("=");Ye.set(`--${Co(e,"-")}`,t),Ye.set(`-${Co(e,"-")}`,t)}})):Ye=U();return Ye},Po=n=>sm().has(n);var zr=n=>Xn?No(process.env[n.toUpperCase().replaceAll("-","_")]):No(ga.getItem(n));var ka=n=>Po("--"+n)||zr(n)!==null,Ca=ka("production"),om=Xn&&Sa(process.env.FORCE_COLOR,["true","1","2"]),Ta=om||!Po("--no-colors")&&!ka("no-color")&&(!Xn||process.stdout.isTTY)&&(!Xn||Po("--color")||zr("COLORTERM")!==null||(zr("TERM")||"").includes("color"));var lm=n=>new Uint8Array(n);var cm=n=>{let e="";for(let t=0;tBuffer.from(n.buffer,n.byteOffset,n.byteLength).toString("base64");var Da=$r?cm:am;var Oa=n=>{let e=lm(n.byteLength);return e.set(n),e},Ma=n=>sa(e=>Et(e,n));var Fo=class{constructor(e,t){this.left=e,this.right=t}},Ke=(n,e)=>new Fo(n,e);var Lo=n=>n.next()>=.5,Xi=(n,e,t)=>G(n.next()*(t+1-e)+e);var zo=(n,e,t)=>G(n.next()*(t+1-e)+e);var $o=(n,e,t)=>zo(n,e,t);var fm=n=>Ir($o(n,97,122)),Aa=(n,e=0,t=20)=>{let r=$o(n,e,t),i="";for(let s=0;se[$o(n,0,e.length-1)];var dm=Symbol("0schema"),qo=class{constructor(){this._rerrs=[]}extend(e,t,r,i=null){this._rerrs.push({path:e,expected:t,has:r,message:i})}toString(){let e=[];for(let t=this._rerrs.length-1;t>0;t--){let r=this._rerrs[t];e.push(Wi(" ",(this._rerrs.length-t)*2)+`${r.path!=null?`[${r.path}] `:""}${r.has} doesn't match ${r.expected}. ${r.message}`)}return e.join(` +`)}},Jo=(n,e)=>n===e?!0:n==null||e==null||n.constructor!==e.constructor?!1:n[sn]?Hi(n,e):ft(n)?qi(n,t=>Ar(e,r=>Jo(t,r))):ya(n)?Rt(n,(t,r)=>Jo(t,e[r])):!1,Z=class{static _dilutes=!1;extends(e){let[t,r]=[this.shape,e.shape];return this.constructor._dilutes&&([r,t]=[t,r]),Jo(t,r)}equals(e){return this.constructor===e.constructor&&Fr(this.shape,e.shape)}[dm](){return!0}[sn](e){return this.equals(e)}validate(e){return this.check(e)}check(e,t){ge()}get nullable(){return nr(this,fs)}get optional(){return new Qi(this)}cast(e){return Na(e,this),e}expect(e){return Na(e,this),e}},Jr=class extends Z{constructor(e,t){super(),this.shape=e,this._c=t}check(e,t=void 0){let r=e?.constructor===this.shape&&(this._c==null||this._c(e));return!r&&t?.extend(null,this.shape.name,e?.constructor.name,e?.constructor!==this.shape?"Constructor match failed":"Check failed"),r}},F=(n,e=null)=>new Jr(n,e),Xw=F(Jr),Wr=class extends Z{constructor(e){super(),this.shape=e}check(e,t){let r=this.shape(e);return!r&&t?.extend(null,"custom prop",e?.constructor.name,"failed to check custom prop"),r}},q=n=>new Wr(n),Zw=F(Wr),er=class extends Z{constructor(e){super(),this.shape=e}check(e,t){let r=this.shape.some(i=>i===e);return!r&&t?.extend(null,this.shape.join(" | "),e.toString()),r}},as=(...n)=>new er(n),Ia=F(er),pm=RegExp.escape||(n=>n.replace(/[().|&,$^[\]]/g,e=>"\\"+e)),Ra=n=>{if(tr.check(n))return[pm(n)];if(Ia.check(n))return n.shape.map(e=>e+"");if(Ba.check(n))return["[+-]?\\d+.?\\d*"];if(Pa.check(n))return[".*"];if(ls.check(n))return n.shape.map(Ra).flat(1);_()},Wo=class extends Z{constructor(e){super(),this.shape=e,this._r=new RegExp("^"+e.map(Ra).map(t=>`(${t.join("|")})`).join("")+"$")}check(e,t){let r=this._r.exec(e)!=null;return!r&&t?.extend(null,this._r.toString(),e.toString(),"String doesn't match string template."),r}};var Qw=F(Wo),mm=Symbol("optional"),Qi=class extends Z{constructor(e){super(),this.shape=e}check(e,t){let r=e===void 0||this.shape.check(e);return!r&&t?.extend(null,"undefined (optional)","()"),r}get[mm](){return!0}},gm=F(Qi),es=class extends Z{check(e,t){return t?.extend(null,"never",typeof e),!1}},eS=new es,tS=F(es),ts=class n extends Z{constructor(e,t=!1){super(),this.shape=e,this._isPartial=t}static _dilutes=!0;get partial(){return new n(this.shape,!0)}check(e,t){return e==null?(t?.extend(null,"object","null"),!1):Rt(this.shape,(r,i)=>{let s=this._isPartial&&!Pr(e,i)||r.check(e[i],t);return!s&&t?.extend(i.toString(),r.toString(),typeof e[i],"Object property does not match"),s})}},ym=n=>new ts(n),xm=F(ts),bm=q(n=>n!=null&&(n.constructor===Object||n.constructor==null)),ns=class extends Z{constructor(e,t){super(),this.shape={keys:e,values:t}}check(e,t){return e!=null&&Rt(e,(r,i)=>{let s=this.shape.keys.check(i,t);return!s&&t?.extend(i+"","Record",typeof e,s?"Key doesn't match schema":"Value doesn't match value"),s&&this.shape.values.check(r,t)})}},_a=(n,e)=>new ns(n,e),wm=F(ns),rs=class extends Z{constructor(e){super(),this.shape=e}check(e,t){return e!=null&&Rt(this.shape,(r,i)=>{let s=r.check(e[i],t);return!s&&t?.extend(i.toString(),"Tuple",typeof r),s})}},Sm=(...n)=>new rs(n),nS=F(rs),is=class extends Z{constructor(e){super(),this.shape=e.length===1?e[0]:new jr(e)}check(e,t){let r=ft(e)&&qi(e,i=>this.shape.check(i));return!r&&t?.extend(null,"Array",""),r}},va=(...n)=>new is(n),km=F(is),Cm=q(n=>ft(n)),ss=class extends Z{constructor(e,t){super(),this.shape=e,this._c=t}check(e,t){let r=e instanceof this.shape&&(this._c==null||this._c(e));return!r&&t?.extend(null,this.shape.name,e?.constructor.name),r}},Tm=(n,e=null)=>new ss(n,e),rS=F(ss),Dm=Tm(Z),jo=class extends Z{constructor(e){super(),this.len=e.length-1,this.args=Sm(...e.slice(-1)),this.res=e[this.len]}check(e,t){let r=e.constructor===Function&&e.length<=this.len;return!r&&t?.extend(null,"function",typeof e),r}};var Om=F(jo),Mm=q(n=>typeof n=="function"),Yo=class extends Z{constructor(e){super(),this.shape=e}check(e,t){let r=qi(this.shape,i=>i.check(e,t));return!r&&t?.extend(null,"Intersectinon",typeof e),r}};var iS=F(Yo,n=>n.shape.length>0),jr=class extends Z{static _dilutes=!0;constructor(e){super(),this.shape=e}check(e,t){let r=Ar(this.shape,i=>i.check(e,t));return t?.extend(null,"Union",typeof e),r}},nr=(...n)=>n.findIndex(e=>ls.check(e))>=0?nr(...n.map(e=>Yr(e)).map(e=>ls.check(e)?e.shape:[e]).flat(1)):n.length===1?n[0]:new jr(n),ls=F(jr),Va=()=>!0,cs=q(Va),Em=F(Wr,n=>n.shape===Va),Ho=q(n=>typeof n=="bigint"),Am=q(n=>n===Ho),Ua=q(n=>typeof n=="symbol"),sS=q(n=>n===Ua),Qn=q(n=>typeof n=="number"),Ba=q(n=>n===Qn),tr=q(n=>typeof n=="string"),Pa=q(n=>n===tr),hs=q(n=>typeof n=="boolean"),Nm=q(n=>n===hs),Fa=as(void 0),oS=F(er,n=>n.shape.length===1&&n.shape[0]===void 0),lS=as(void 0);var fs=as(null),Im=F(er,n=>n.shape.length===1&&n.shape[0]===null),cS=F(Uint8Array),aS=F(Jr,n=>n.shape===Uint8Array),Rm=nr(Qn,tr,fs,Fa,Ho,hs,Ua),hS=(()=>{let n=va(cs),e=_a(tr,cs),t=nr(Qn,tr,fs,hs,n,e);return n.shape=t,e.shape.values=t,t})(),Yr=n=>{if(Dm.check(n))return n;if(bm.check(n)){let e={};for(let t in n)e[t]=Yr(n[t]);return ym(e)}else{if(Cm.check(n))return nr(...n.map(Yr));if(Rm.check(n))return as(n);if(Mm.check(n))return F(n)}_()},Na=Ca?()=>{}:(n,e)=>{let t=new qo;if(!e.check(n,t))throw Ie(`Expected value to be of type ${e.constructor.name}. +${t.toString()}`)},Ko=class{constructor(e){this.patterns=[],this.$state=e}if(e,t){return this.patterns.push({if:Yr(e),h:t}),this}else(e){return this.if(cs,e)}done(){return(e,t)=>{for(let r=0;rnew Ko(n),La=_m(cs).if(Ba,(n,e)=>Xi(e,So,Ln)).if(Pa,(n,e)=>Aa(e)).if(Nm,(n,e)=>Lo(e)).if(Am,(n,e)=>BigInt(Xi(e,So,Ln))).if(ls,(n,e)=>Zn(e,Zi(e,n.shape))).if(xm,(n,e)=>{let t={};for(let r in n.shape){let i=n.shape[r];if(gm.check(i)){if(Lo(e))continue;i=i.shape}t[r]=La(i,e)}return t}).if(km,(n,e)=>{let t=[],r=zo(e,0,42);for(let i=0;iZi(e,n.shape)).if(Im,(n,e)=>null).if(Om,(n,e)=>{let t=Zn(e,n.res);return()=>t}).if(Em,(n,e)=>Zn(e,Zi(e,[Qn,tr,fs,Fa,Ho,hs,va(Qn),_a(nr("a","b","c"),Qn)]))).if(wm,(n,e)=>{let t={},r=Xi(e,0,3);for(let i=0;iLa(Yr(e),n);var ut=typeof document<"u"?document:{};var fS=q(n=>n.nodeType===Pm);var uS=typeof DOMParser<"u"?new DOMParser:null;var dS=q(n=>n.nodeType===Vm);var pS=q(n=>n.nodeType===Um);var za=n=>Hc(n,(e,t)=>`${t}:${e};`).join("");var Vm=ut.ELEMENT_NODE,Um=ut.TEXT_NODE,mS=ut.CDATA_SECTION_NODE,gS=ut.COMMENT_NODE,Bm=ut.DOCUMENT_NODE,yS=ut.DOCUMENT_TYPE_NODE,Pm=ut.DOCUMENT_FRAGMENT_NODE,xS=q(n=>n.nodeType===Bm);var us=n=>class{constructor(t){this._=t}destroy(){n(this._)}},Fm=us(clearTimeout),Kr=(n,e)=>new Fm(setTimeout(e,n)),wS=us(clearInterval);var SS=us(n=>typeof requestAnimationFrame<"u"&&cancelAnimationFrame(n));var kS=us(n=>typeof cancelIdleCallback<"u"&&cancelIdleCallback(n));var He=Symbol;var Hr=He(),Gr=He(),Go=He(),Xo=He(),Zo=He(),Xr=He(),Qo=He(),rr=He(),el=He(),Ja=n=>{n.length===1&&n[0]?.constructor===Function&&(n=n[0]());let e=[],t=[],r=0;for(;r0&&t.push(e.join(""));r{n.length===1&&n[0]?.constructor===Function&&(n=n[0]());let e=[],t=[],r=U(),i=[],s=0;for(;s0||c.length>0?(e.push("%c"+o),t.push(c)):e.push(o)}else break}}for(s>0&&(i=t,i.unshift(e.join("")));s{console.log(...Wa(n)),ja.forEach(e=>e.print(n))},tl=(...n)=>{console.warn(...Wa(n)),n.unshift(rr),ja.forEach(e=>e.print(n))};var ja=Le();var Ya=n=>({[Symbol.iterator](){return this},next:n}),Ka=(n,e)=>Ya(()=>{let t;do t=n.next();while(!t.done&&!e(t.value));return t}),ps=(n,e)=>Ya(()=>{let{done:t,value:r}=n.next();return{done:t,value:t?void 0:e(r)}});var rl=class extends Fn{constructor(e,t){super(),this.doc=e,this.awareness=t}},ir=class{constructor(e,t){this.clock=e,this.len=t}},Ut=class{constructor(){this.clients=new Map}},Ge=(n,e,t)=>e.clients.forEach((r,i)=>{let s=n.doc.store.clients.get(i);if(s!=null){let o=s[s.length-1],l=o.id.clock+o.length;for(let c=0,a=r[c];c{let t=0,r=n.length-1;for(;t<=r;){let i=G((t+r)/2),s=n[i],o=s.clock;if(o<=e){if(e{let t=n.clients.get(e.client);return t!==void 0&&Km(t,e.clock)!==null},dl=n=>{n.clients.forEach(e=>{e.sort((i,s)=>i.clock-s.clock);let t,r;for(t=1,r=1;t=s.clock?e[r-1]=new ir(i.clock,me(i.len,s.clock+s.len-i.clock)):(r{let e=new Ut;for(let t=0;t{if(!e.clients.has(i)){let s=r.slice();for(let o=t+1;o{$(n.clients,e,()=>[]).push(new ir(t,r))},cr=()=>new Ut,pl=n=>{let e=cr();return n.clients.forEach((t,r)=>{let i=[];for(let s=0;s0&&e.clients.set(r,i)}),e},Xe=(n,e)=>{S(n.restEncoder,e.clients.size),je(e.clients.entries()).sort((t,r)=>r[0]-t[0]).forEach(([t,r])=>{n.resetDsCurVal(),S(n.restEncoder,t);let i=r.length;S(n.restEncoder,i);for(let s=0;s{let e=new Ut,t=C(n.restDecoder);for(let r=0;r0){let o=$(e.clients,i,()=>[]);for(let l=0;l{let r=new Ut,i=C(n.restDecoder);for(let s=0;s0){let s=new Re;return S(s.restEncoder,0),Xe(s,r),s.toUint8Array()}return null},uh=(n,e)=>{if(n.clients.size!==e.clients.size)return!1;for(let[t,r]of n.clients.entries()){let i=e.clients.get(t);if(i===void 0||r.length!==i.length)return!1;for(let s=0;s!0,meta:s=null,autoLoad:o=!1,shouldLoad:l=!0}={}){super(),this.gc=r,this.gcFilter=i,this.clientID=dh(),this.guid=e,this.collectionid=t,this.share=new Map,this.store=new ks,this._transaction=null,this._transactionCleanups=[],this.subdocs=new Set,this._item=null,this.shouldLoad=l,this.autoLoad=o,this.meta=s,this.isLoaded=!1,this.isSynced=!1,this.isDestroyed=!1,this.whenLoaded=Ao(a=>{this.on("load",()=>{this.isLoaded=!0,a(this)})});let c=()=>Ao(a=>{let h=f=>{(f===void 0||f===!0)&&(this.off("sync",h),a())};this.on("sync",h)});this.on("sync",a=>{a===!1&&this.isSynced&&(this.whenSynced=c()),this.isSynced=a===void 0||a===!0,this.isSynced&&!this.isLoaded&&this.emit("load",[this])}),this.whenSynced=c()}load(){let e=this._item;e!==null&&!this.shouldLoad&&I(e.parent.doc,t=>{t.subdocsLoaded.add(this)},null,!0),this.shouldLoad=!0}getSubdocs(){return this.subdocs}getSubdocGuids(){return new Set(je(this.subdocs).map(e=>e.guid))}transact(e,t=null){return I(this,e,t)}get(e,t=B){let r=$(this.share,e,()=>{let s=new t;return s._integrate(this,null),s}),i=r.constructor;if(t!==B&&i!==t)if(i===B){let s=new t;s._map=r._map,r._map.forEach(o=>{for(;o!==null;o=o.left)o.parent=s}),s._start=r._start;for(let o=s._start;o!==null;o=o.right)o.parent=s;return s._length=r._length,this.share.set(e,s),s._integrate(this,null),s}else throw new Error(`Type with the name ${e} has already been defined with a different constructor`);return r}getArray(e=""){return this.get(e,dn)}getText(e=""){return this.get(e,tt)}getMap(e=""){return this.get(e,pn)}getXmlElement(e=""){return this.get(e,L)}getXmlFragment(e=""){return this.get(e,nt)}toJSON(){let e={};return this.share.forEach((t,r)=>{e[r]=t.toJSON()}),e}destroy(){this.isDestroyed=!0,je(this.subdocs).forEach(t=>t.destroy());let e=this._item;if(e!==null){this._item=null;let t=e.content;t.doc=new n({guid:this.guid,...t.opts,shouldLoad:!1}),t.doc._item=e,I(e.parent.doc,r=>{let i=t.doc;e.deleted||r.subdocsAdded.add(i),r.subdocsRemoved.add(this)},null,!0)}this.emit("destroyed",[!0]),this.emit("destroy",[this]),super.destroy()}},an=class{constructor(e){this.restDecoder=e}resetDsCurVal(){}readDsClock(){return C(this.restDecoder)}readDsLen(){return C(this.restDecoder)}},De=class extends an{readLeftID(){return k(C(this.restDecoder),C(this.restDecoder))}readRightID(){return k(C(this.restDecoder),C(this.restDecoder))}readClient(){return C(this.restDecoder)}readInfo(){return nn(this.restDecoder)}readString(){return It(this.restDecoder)}readParentInfo(){return C(this.restDecoder)===1}readTypeRef(){return C(this.restDecoder)}readLen(){return C(this.restDecoder)}readAny(){return Hn(this.restDecoder)}readBuf(){return Oa(Te(this.restDecoder))}readJSON(){return JSON.parse(It(this.restDecoder))}readKey(){return It(this.restDecoder)}},ws=class{constructor(e){this.dsCurrVal=0,this.restDecoder=e}resetDsCurVal(){this.dsCurrVal=0}readDsClock(){return this.dsCurrVal+=C(this.restDecoder),this.dsCurrVal}readDsLen(){let e=C(this.restDecoder)+1;return this.dsCurrVal+=e,e}},ye=class extends ws{constructor(e){super(e),this.keys=[],C(e),this.keyClockDecoder=new Gn(Te(e)),this.clientDecoder=new rn(Te(e)),this.leftClockDecoder=new Gn(Te(e)),this.rightClockDecoder=new Gn(Te(e)),this.infoDecoder=new Vr(Te(e),nn),this.stringDecoder=new Yi(Te(e)),this.parentInfoDecoder=new Vr(Te(e),nn),this.typeRefDecoder=new rn(Te(e)),this.lenDecoder=new rn(Te(e))}readLeftID(){return new dt(this.clientDecoder.read(),this.leftClockDecoder.read())}readRightID(){return new dt(this.clientDecoder.read(),this.rightClockDecoder.read())}readClient(){return this.clientDecoder.read()}readInfo(){return this.infoDecoder.read()}readString(){return this.stringDecoder.read()}readParentInfo(){return this.parentInfoDecoder.read()===1}readTypeRef(){return this.typeRefDecoder.read()}readLen(){return this.lenDecoder.read()}readAny(){return Hn(this.restDecoder)}readBuf(){return Te(this.restDecoder)}readJSON(){return Hn(this.restDecoder)}readKey(){let e=this.keyClockDecoder.read();if(e{r=me(r,e[0].id.clock);let i=Oe(e,r);S(n.restEncoder,e.length-i),n.writeClient(t),S(n.restEncoder,r);let s=e[i];s.write(n,r-s.id.clock);for(let o=i+1;o{let r=new Map;t.forEach((i,s)=>{v(e,s)>i&&r.set(s,i)}),hi(e).forEach((i,s)=>{t.has(s)||r.set(s,0)}),S(n.restEncoder,r.size),je(r.entries()).sort((i,s)=>s[0]-i[0]).forEach(([i,s])=>{Hm(n,e.clients.get(i),i,s)})},Gm=(n,e)=>{let t=U(),r=C(n.restDecoder);for(let i=0;i{let r=[],i=je(t.keys()).sort((d,p)=>d-p);if(i.length===0)return null;let s=()=>{if(i.length===0)return null;let d=t.get(i[i.length-1]);for(;d.refs.length===d.i;)if(i.pop(),i.length>0)d=t.get(i[i.length-1]);else return null;return d},o=s();if(o===null)return null;let l=new ks,c=new Map,a=(d,p)=>{let m=c.get(d);(m==null||m>p)&&c.set(d,p)},h=o.refs[o.i++],f=new Map,u=()=>{for(let d of r){let p=d.id.client,m=t.get(p);m?(m.i--,l.clients.set(p,m.refs.slice(m.i)),t.delete(p),m.i=0,m.refs=[]):l.clients.set(p,[d]),i=i.filter(g=>g!==p)}r.length=0};for(;;){if(h.constructor!==Q){let p=$(f,h.id.client,()=>v(e,h.id.client))-h.id.clock;if(p<0)r.push(h),a(h.id.client,h.id.clock-1),u();else{let m=h.getMissing(n,e);if(m!==null){r.push(h);let g=t.get(m)||{refs:[],i:0};if(g.refs.length===g.i)a(m,v(e,m)),u();else{h=g.refs[g.i++];continue}}else(p===0||p0)h=r.pop();else if(o!==null&&o.i0){let d=new Re;return ml(d,l,new Map),S(d.restEncoder,0),{missing:c,update:d.toUint8Array()}}return null},Zm=(n,e)=>ml(n,e.doc.store,e.beforeState),gl=(n,e,t,r=new ye(n))=>I(e,i=>{i.local=!1;let s=!1,o=i.doc,l=o.store,c=Gm(r,o),a=Xm(i,l,c),h=l.pendingStructs;if(h){for(let[u,d]of h.missing)if(dd)&&h.missing.set(u,d)}h.update=ti([h.update,a.update])}}else l.pendingStructs=a;let f=Xa(r,i,l);if(l.pendingDs){let u=new ye(X(l.pendingDs));C(u.restDecoder);let d=Xa(u,i,l);f&&d?l.pendingDs=ti([f,d]):l.pendingDs=f||d}else l.pendingDs=f;if(s){let u=l.pendingStructs.update;l.pendingStructs=null,yn(i.doc,u)}},t,!1),Qm=(n,e,t)=>gl(n,e,t,new De(n)),yn=(n,e,t,r=ye)=>{let i=X(e);gl(i,n,t,new r(i))},eg=(n,e,t)=>yn(n,e,t,De),tg=(n,e,t=new Map)=>{ml(n,e.store,t),Xe(n,pl(e.store))},ph=(n,e=new Uint8Array([0]),t=new Re)=>{let r=yl(e);tg(t,n,r);let i=[t.toUint8Array()];if(n.store.pendingDs&&i.push(n.store.pendingDs),n.store.pendingStructs&&i.push(wl(n.store.pendingStructs.update,e)),i.length>1){if(t.constructor===Ze)return Oh(i.map((s,o)=>o===0?s:Ih(s)));if(t.constructor===Re)return ti(i)}return i[0]},ng=(n,e)=>ph(n,e,new Ze),mh=n=>{let e=new Map,t=C(n.restDecoder);for(let r=0;rmh(new an(X(n))),xl=(n,e)=>(S(n.restEncoder,e.size),je(e.entries()).sort((t,r)=>r[0]-t[0]).forEach(([t,r])=>{S(n.restEncoder,t),S(n.restEncoder,r)}),n),rg=(n,e)=>xl(n,hi(e.store)),ig=(n,e=new sr)=>(n instanceof Map?xl(e,n):rg(e,n),e.toUint8Array()),sg=n=>ig(n,new Bt),il=class{constructor(){this.l=[]}},Za=()=>new il,Qa=(n,e)=>n.l.push(e),eh=(n,e)=>{let t=n.l,r=t.length;n.l=t.filter(i=>e!==i),r===n.l.length&&console.error("[yjs] Tried to remove event handler that doesn't exist.")},gh=(n,e,t)=>Lr(n.l,[e,t]),dt=class{constructor(e,t){this.client=e,this.clock=t}},on=(n,e)=>n===e||n!==null&&e!==null&&n.client===e.client&&n.clock===e.clock,k=(n,e)=>new dt(n,e),th=(n,e)=>{S(n,e.client),S(n,e.clock)},nh=n=>k(C(n),C(n)),xn=n=>{for(let[e,t]of n.doc.share.entries())if(t===n)return e;throw _()},hn=(n,e)=>{for(;e!==null;){if(e.parent===n)return!0;e=e.parent._item}return!1},og=n=>{let e=[],t=n._start;for(;t;)e.push(t),t=t.right;console.log("Children: ",e),console.log("Children content: ",e.filter(r=>!r.deleted).map(r=>r.content))},sl=class{constructor(e,t=e.getMap("users")){let r=new Map;this.yusers=t,this.doc=e,this.clients=new Map,this.dss=r;let i=(s,o)=>{let l=s.get("ds"),c=s.get("ids"),a=h=>this.clients.set(h,o);l.observe(h=>{h.changes.added.forEach(f=>{f.content.getContent().forEach(u=>{u instanceof Uint8Array&&this.dss.set(o,cn([this.dss.get(o)||cr(),pt(new an(X(u)))]))})})}),this.dss.set(o,cn(l.map(h=>pt(new an(X(h)))))),c.observe(h=>h.changes.added.forEach(f=>f.content.getContent().forEach(a))),c.forEach(a)};t.observe(s=>{s.keysChanged.forEach(o=>i(t.get(o),o))}),t.forEach(i)}setUserMapping(e,t,r,{filter:i=()=>!0}={}){let s=this.yusers,o=s.get(r);o||(o=new pn,o.set("ids",new dn),o.set("ds",new dn),s.set(r,o)),o.get("ids").push([t]),s.observe(l=>{setTimeout(()=>{let c=s.get(r);if(c!==o){o=c,this.clients.forEach((f,u)=>{r===f&&o.get("ids").push([u])});let a=new Bt,h=this.dss.get(r);h&&(Xe(a,h),o.get("ds").push([a.toUint8Array()]))}},0)}),e.on("afterTransaction",l=>{setTimeout(()=>{let c=o.get("ds"),a=l.deleteSet;if(l.local&&a.clients.size>0&&i(l,a)){let h=new Bt;Xe(h,a),c.push([h.toUint8Array()])}})})}getUserByClientId(e){return this.clients.get(e)||null}getUserByDeletedId(e){for(let[t,r]of this.dss.entries())if(gt(r,e))return t;return null}},Qe=class{constructor(e,t,r,i=0){this.type=e,this.tname=t,this.item=r,this.assoc=i}},lg=n=>{let e={};return n.type&&(e.type=n.type),n.tname&&(e.tname=n.tname),n.item&&(e.item=n.item),n.assoc!=null&&(e.assoc=n.assoc),e},bn=n=>new Qe(n.type==null?null:k(n.type.client,n.type.clock),n.tname??null,n.item==null?null:k(n.item.client,n.item.clock),n.assoc==null?0:n.assoc),Ss=class{constructor(e,t,r=0){this.type=e,this.index=t,this.assoc=r}},cg=(n,e,t=0)=>new Ss(n,e,t),ms=(n,e,t)=>{let r=null,i=null;return n._item===null?i=xn(n):r=k(n._item.id.client,n._item.id.clock),new Qe(r,i,e,t)},li=(n,e,t=0)=>{let r=n._start;if(t<0){if(e===0)return ms(n,null,t);e--}for(;r!==null;){if(!r.deleted&&r.countable){if(r.length>e)return ms(n,k(r.id.client,r.id.clock+e),t);e-=r.length}if(r.right===null&&t<0)return ms(n,r.lastId,t);r=r.right}return ms(n,null,t)},ag=(n,e)=>{let{type:t,tname:r,item:i,assoc:s}=e;if(i!==null)S(n,0),th(n,i);else if(r!==null)jn(n,1),Mt(n,r);else if(t!==null)jn(n,2),th(n,t);else throw _();return _r(n,s),n},hg=n=>{let e=Nt();return ag(e,n),ke(e)},fg=n=>{let e=null,t=null,r=null;switch(C(n)){case 0:r=nh(n);break;case 1:t=It(n);break;case 2:e=nh(n)}let i=Oo(n)?Ur(n):0;return new Qe(e,t,r,i)},ug=n=>fg(X(n)),dg=(n,e)=>{let t=ln(n,e),r=e.clock-t.id.clock;return{item:t,diff:r}},bl=(n,e,t=!0)=>{let r=e.store,i=n.item,s=n.type,o=n.tname,l=n.assoc,c=null,a=0;if(i!==null){if(v(r,i.client)<=i.clock)return null;let h=t?fl(r,i):dg(r,i),f=h.item;if(!(f instanceof A))return null;if(c=f.parent,c._item===null||!c._item.deleted){a=f.deleted||!f.countable?0:h.diff+(l>=0?0:1);let u=f.left;for(;u!==null;)!u.deleted&&u.countable&&(a+=u.length),u=u.left}}else{if(o!==null)c=e.get(o);else if(s!==null){if(v(r,s.client)<=s.clock)return null;let{item:h}=t?fl(r,s):{item:ln(r,s)};if(h instanceof A&&h.content instanceof Me)c=h.content.type;else return null}else throw _();l>=0?a=c._length:a=0}return cg(c,a,n.assoc)},Is=(n,e)=>n===e||n!==null&&e!==null&&n.tname===e.tname&&on(n.item,e.item)&&on(n.type,e.type)&&n.assoc===e.assoc,Pt=class{constructor(e,t){this.ds=e,this.sv=t}},pg=(n,e)=>{let t=n.ds.clients,r=e.ds.clients,i=n.sv,s=e.sv;if(i.size!==s.size||t.size!==r.size)return!1;for(let[o,l]of i.entries())if(s.get(o)!==l)return!1;for(let[o,l]of t.entries()){let c=r.get(o)||[];if(l.length!==c.length)return!1;for(let a=0;a(Xe(e,n.ds),xl(e,n.sv),e.toUint8Array()),mg=n=>yh(n,new Bt),xh=(n,e=new ws(X(n)))=>new Pt(pt(e),mh(e)),gg=n=>xh(n,new an(X(n))),ci=(n,e)=>new Pt(n,e),yg=ci(cr(),new Map),ai=n=>ci(pl(n.store),hi(n.store)),_t=(n,e)=>e===void 0?!n.deleted:e.sv.has(n.id.client)&&(e.sv.get(n.id.client)||0)>n.id.clock&&!gt(e.ds,n.id),ol=(n,e)=>{let t=$(n.meta,ol,Le),r=n.doc.store;t.has(e)||(e.sv.forEach((i,s)=>{i{}),t.add(e))},xg=(n,e,t=new ve)=>{if(n.gc)throw new Error("Garbage-collection must be disabled in `originDoc`!");let{sv:r,ds:i}=e,s=new Re;return n.transact(o=>{let l=0;r.forEach(c=>{c>0&&l++}),S(s.restEncoder,l);for(let[c,a]of r){if(a===0)continue;a{let r=new t(X(e)),i=new et(r,!1);for(let o=i.curr;o!==null;o=i.next())if((n.sv.get(o.id.client)||0)bg(n,e,De),ks=class{constructor(){this.clients=new Map,this.pendingStructs=null,this.pendingDs=null}},hi=n=>{let e=new Map;return n.clients.forEach((t,r)=>{let i=t[t.length-1];e.set(r,i.id.clock+i.length)}),e},v=(n,e)=>{let t=n.clients.get(e);if(t===void 0)return 0;let r=t[t.length-1];return r.id.clock+r.length},bh=(n,e)=>{let t=n.clients.get(e.id.client);if(t===void 0)t=[],n.clients.set(e.id.client,t);else{let r=t[t.length-1];if(r.id.clock+r.length!==e.id.clock)throw _()}t.push(e)},Oe=(n,e)=>{let t=0,r=n.length-1,i=n[r],s=i.id.clock;if(s===e)return r;let o=G(e/(s+i.length-1)*r);for(;t<=r;){if(i=n[o],s=i.id.clock,s<=e){if(e{let t=n.clients.get(e.client);return t[Oe(t,e.clock)]},ln=Sg,ll=(n,e,t)=>{let r=Oe(e,t),i=e[r];return i.id.clock{let t=n.doc.store.clients.get(e.client);return t[ll(n,t,e.clock)]},cl=(n,e,t)=>{let r=e.clients.get(t.client),i=Oe(r,t.clock),s=r[i];return t.clock!==s.id.clock+s.length-1&&s.constructor!==oe&&r.splice(i+1,0,Ns(n,s,t.clock-s.id.clock+1)),s},kg=(n,e,t)=>{let r=n.clients.get(e.id.client);r[Oe(r,e.id.clock)]=t},wh=(n,e,t,r,i)=>{if(r===0)return;let s=t+r,o=ll(n,e,t),l;do l=e[o++],se.deleteSet.clients.size===0&&!Gc(e.afterState,(t,r)=>e.beforeState.get(r)!==t)?!1:(dl(e.deleteSet),Zm(n,e),Xe(n,e.deleteSet),!0),ih=(n,e,t)=>{let r=e._item;(r===null||r.id.clock<(n.beforeState.get(r.id.client)||0)&&!r.deleted)&&$(n.changed,e,Le).add(t)},xs=(n,e)=>{let t=n[e],r=n[e-1],i=e;for(;i>0;t=r,r=n[--i-1]){if(r.deleted===t.deleted&&r.constructor===t.constructor&&r.mergeWith(t)){t instanceof A&&t.parentSub!==null&&t.parent._map.get(t.parentSub)===t&&t.parent._map.set(t.parentSub,r);continue}break}let s=e-i;return s&&n.splice(e+1-s,s),s},Sh=(n,e,t)=>{for(let[r,i]of n.clients.entries()){let s=e.clients.get(r);for(let o=i.length-1;o>=0;o--){let l=i[o],c=l.clock+l.len;for(let a=Oe(s,l.clock),h=s[a];a{n.clients.forEach((t,r)=>{let i=e.clients.get(r);for(let s=t.length-1;s>=0;s--){let o=t[s],l=Ne(i.length-1,1+Oe(i,o.clock+o.len-1));for(let c=l,a=i[c];c>0&&a.id.clock>=o.clock;a=i[c])c-=1+xs(i,c)}})},Cg=(n,e,t)=>{Sh(n,e,t),kh(n,e)},Ch=(n,e)=>{if(el.push(()=>{(a._item===null||!a._item.deleted)&&a._callObserver(t,c)})),l.push(()=>{t.changedParentTypes.forEach((c,a)=>{a._dEH.l.length>0&&(a._item===null||!a._item.deleted)&&(c=c.filter(h=>h.target._item===null||!h.target._item.deleted),c.forEach(h=>{h.currentTarget=a,h._path=null}),c.sort((h,f)=>h.path.length-f.path.length),l.push(()=>{gh(a._dEH,c,t)}))}),l.push(()=>r.emit("afterTransaction",[t,r])),l.push(()=>{t._needFormattingCleanup&&Jg(t)})}),Lr(l,[])}finally{r.gc&&Sh(s,i,r.gcFilter),kh(s,i),t.afterState.forEach((h,f)=>{let u=t.beforeState.get(f)||0;if(u!==h){let d=i.clients.get(f),p=me(Oe(d,u),1);for(let m=d.length-1;m>=p;)m-=1+xs(d,m)}});for(let h=o.length-1;h>=0;h--){let{client:f,clock:u}=o[h].id,d=i.clients.get(f),p=Oe(d,u);p+11||p>0&&xs(d,p)}if(!t.local&&t.afterState.get(r.clientID)!==t.beforeState.get(r.clientID)&&(ds(rr,Hr,"[yjs] ",Gr,Xr,"Changed the client-id because another client seems to be using it."),r.clientID=dh()),r.emit("afterTransactionCleanup",[t,r]),r._observers.has("update")){let h=new Ze;rh(h,t)&&r.emit("update",[h.toUint8Array(),t.origin,r,t])}if(r._observers.has("updateV2")){let h=new Re;rh(h,t)&&r.emit("updateV2",[h.toUint8Array(),t.origin,r,t])}let{subdocsAdded:l,subdocsLoaded:c,subdocsRemoved:a}=t;(l.size>0||a.size>0||c.size>0)&&(l.forEach(h=>{h.clientID=r.clientID,h.collectionid==null&&(h.collectionid=r.collectionid),r.subdocs.add(h)}),a.forEach(h=>r.subdocs.delete(h)),r.emit("subdocs",[{loaded:c,added:l,removed:a},r,t]),a.forEach(h=>h.destroy())),n.length<=e+1?(r._transactionCleanups=[],r.emit("afterAllTransactions",[r,n])):Ch(n,e+1)}}},I=(n,e,t=null,r=!0)=>{let i=n._transactionCleanups,s=!1,o=null;n._transaction===null&&(s=!0,n._transaction=new Cs(n,t,r),i.push(n._transaction),i.length===1&&n.emit("beforeAllTransactions",[n]),n.emit("beforeTransaction",[n._transaction,n]));try{o=e(n._transaction)}finally{if(s){let l=n._transaction===i[0];n._transaction=null,l&&Ch(i,0)}}return o},al=class{constructor(e,t){this.insertions=t,this.deletions=e,this.meta=new Map}},sh=(n,e,t)=>{Ge(n,t.deletions,r=>{r instanceof A&&e.scope.some(i=>i===n.doc||hn(i,r))&&Dl(r,!1)})},oh=(n,e,t)=>{let r=null,i=n.doc,s=n.scope;I(i,l=>{for(;e.length>0&&n.currStackItem===null;){let c=i.store,a=e.pop(),h=new Set,f=[],u=!1;Ge(l,a.insertions,d=>{if(d instanceof A){if(d.redone!==null){let{item:p,diff:m}=fl(c,d.id);m>0&&(p=se(l,k(p.id.client,p.id.clock+m))),d=p}!d.deleted&&s.some(p=>p===l.doc||hn(p,d))&&f.push(d)}}),Ge(l,a.deletions,d=>{d instanceof A&&s.some(p=>p===l.doc||hn(p,d))&&!gt(a.insertions,d.id)&&h.add(d)}),h.forEach(d=>{u=Gh(l,d,h,a.insertions,n.ignoreRemoteMapChanges,n)!==null||u});for(let d=f.length-1;d>=0;d--){let p=f[d];n.deleteFilter(p)&&(p.delete(l),u=!0)}n.currStackItem=u?a:null}l.changed.forEach((c,a)=>{c.has(null)&&a._searchMarker&&(a._searchMarker.length=0)}),r=l},n);let o=n.currStackItem;if(o!=null){let l=r.changedParentTypes;n.emit("stack-item-popped",[{stackItem:o,type:t,changedParentTypes:l,origin:n},n]),n.currStackItem=null}return o},fn=class extends Fn{constructor(e,{captureTimeout:t=500,captureTransaction:r=c=>!0,deleteFilter:i=()=>!0,trackedOrigins:s=new Set([null]),ignoreRemoteMapChanges:o=!1,doc:l=ft(e)?e[0].doc:e instanceof ve?e:e.doc}={}){super(),this.scope=[],this.doc=l,this.addToScope(e),this.deleteFilter=i,s.add(this),this.trackedOrigins=s,this.captureTransaction=r,this.undoStack=[],this.redoStack=[],this.undoing=!1,this.redoing=!1,this.currStackItem=null,this.lastChange=0,this.ignoreRemoteMapChanges=o,this.captureTimeout=t,this.afterTransactionHandler=c=>{if(!this.captureTransaction(c)||!this.scope.some(g=>c.changedParentTypes.has(g)||g===this.doc)||!this.trackedOrigins.has(c.origin)&&(!c.origin||!this.trackedOrigins.has(c.origin.constructor)))return;let a=this.undoing,h=this.redoing,f=a?this.redoStack:this.undoStack;a?this.stopCapturing():h||this.clear(!1,!0);let u=new Ut;c.afterState.forEach((g,x)=>{let N=c.beforeState.get(x)||0,O=g-N;O>0&&Qr(u,x,N,O)});let d=Ki(),p=!1;if(this.lastChange>0&&d-this.lastChange0&&!a&&!h){let g=f[f.length-1];g.deletions=cn([g.deletions,c.deleteSet]),g.insertions=cn([g.insertions,u])}else f.push(new al(c.deleteSet,u)),p=!0;!a&&!h&&(this.lastChange=d),Ge(c,c.deleteSet,g=>{g instanceof A&&this.scope.some(x=>x===c.doc||hn(x,g))&&Dl(g,!0)});let m=[{stackItem:f[f.length-1],origin:c.origin,type:a?"redo":"undo",changedParentTypes:c.changedParentTypes},this];p?this.emit("stack-item-added",m):this.emit("stack-item-updated",m)},this.destroy=this.destroy.bind(this),this.doc.on("afterTransaction",this.afterTransactionHandler),this.doc.on("destroy",this.destroy)}addToScope(e){let t=new Set(this.scope);e=ft(e)?e:[e],e.forEach(r=>{t.has(r)||(t.add(r),(r instanceof B?r.doc!==this.doc:r!==this.doc)&&tl("[yjs#509] Not same Y.Doc"),this.scope.push(r))})}addTrackedOrigin(e){this.trackedOrigins.add(e)}removeTrackedOrigin(e){this.trackedOrigins.delete(e)}clear(e=!0,t=!0){(e&&this.canUndo()||t&&this.canRedo())&&this.doc.transact(r=>{e&&(this.undoStack.forEach(i=>sh(r,this,i)),this.undoStack=[]),t&&(this.redoStack.forEach(i=>sh(r,this,i)),this.redoStack=[]),this.emit("stack-cleared",[{undoStackCleared:e,redoStackCleared:t}])})}stopCapturing(){this.lastChange=0}undo(){this.undoing=!0;let e;try{e=oh(this,this.undoStack,"undo")}finally{this.undoing=!1}return e}redo(){this.redoing=!0;let e;try{e=oh(this,this.redoStack,"redo")}finally{this.redoing=!1}return e}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}destroy(){this.trackedOrigins.delete(this),this.doc.off("afterTransaction",this.afterTransactionHandler),this.doc.off("destroy",this.destroy),super.destroy()}};function*Tg(n){let e=C(n.restDecoder);for(let t=0;tTh(n,De),Th=(n,e=ye)=>{let t=[],r=new e(X(n)),i=new et(r,!1);for(let o=i.curr;o!==null;o=i.next())t.push(o);ds("Structs: ",t);let s=pt(r);ds("DeleteSet: ",s)},Og=n=>Dh(n,De),Dh=(n,e=ye)=>{let t=[],r=new e(X(n)),i=new et(r,!1);for(let s=i.curr;s!==null;s=i.next())t.push(s);return{structs:t,ds:pt(r)}},ei=class{constructor(e){this.currClient=0,this.startClock=0,this.written=0,this.encoder=e,this.clientStructs=[]}},Oh=n=>ti(n,De,Ze),Mh=(n,e=sr,t=ye)=>{let r=new e,i=new et(new t(X(n)),!1),s=i.curr;if(s!==null){let o=0,l=s.id.client,c=s.id.clock!==0,a=c?0:s.id.clock+s.length;for(;s!==null;s=i.next())l!==s.id.client&&(a!==0&&(o++,S(r.restEncoder,l),S(r.restEncoder,a)),l=s.id.client,a=0,c=s.id.clock!==0),s.constructor===Q&&(c=!0),c||(a=s.id.clock+s.length);a!==0&&(o++,S(r.restEncoder,l),S(r.restEncoder,a));let h=Nt();return S(h,o),oa(h,r.restEncoder),r.restEncoder=h,r.toUint8Array()}else return S(r.restEncoder,0),r.toUint8Array()},Mg=n=>Mh(n,Bt,De),Eh=(n,e=ye)=>{let t=new Map,r=new Map,i=new et(new e(X(n)),!1),s=i.curr;if(s!==null){let o=s.id.client,l=s.id.clock;for(t.set(o,l);s!==null;s=i.next())o!==s.id.client&&(r.set(o,l),t.set(s.id.client,s.id.clock),o=s.id.client),l=s.id.clock+s.length;r.set(o,l)}return{from:t,to:r}},Eg=n=>Eh(n,De),Ag=(n,e)=>{if(n.constructor===oe){let{client:t,clock:r}=n.id;return new oe(k(t,r+e),n.length-e)}else if(n.constructor===Q){let{client:t,clock:r}=n.id;return new Q(k(t,r+e),n.length-e)}else{let t=n,{client:r,clock:i}=t.id;return new A(k(r,i+e),null,k(r,i+e-1),null,t.rightOrigin,t.parent,t.parentSub,t.content.splice(e))}},ti=(n,e=ye,t=Re)=>{if(n.length===1)return n[0];let r=n.map(h=>new e(X(h))),i=r.map(h=>new et(h,!0)),s=null,o=new t,l=new ei(o);for(;i=i.filter(u=>u.curr!==null),i.sort((u,d)=>{if(u.curr.id.client===d.curr.id.client){let p=u.curr.id.clock-d.curr.id.clock;return p===0?u.curr.constructor===d.curr.constructor?0:u.curr.constructor===Q?1:-1:p}else return d.curr.id.client-u.curr.id.client}),i.length!==0;){let h=i[0],f=h.curr.id.client;if(s!==null){let u=h.curr,d=!1;for(;u!==null&&u.id.clock+u.length<=s.struct.id.clock+s.struct.length&&u.id.client>=s.struct.id.client;)u=h.next(),d=!0;if(u===null||u.id.client!==f||d&&u.id.clock>s.struct.id.clock+s.struct.length)continue;if(f!==s.struct.id.client)vt(l,s.struct,s.offset),s={struct:u,offset:0},h.next();else if(s.struct.id.clock+s.struct.length0&&(s.struct.constructor===Q?s.struct.length-=p:u=Ag(u,p)),s.struct.mergeWith(u)||(vt(l,s.struct,s.offset),s={struct:u,offset:0},h.next())}}else s={struct:h.curr,offset:0},h.next();for(let u=h.curr;u!==null&&u.id.client===f&&u.id.clock===s.struct.id.clock+s.struct.length&&u.constructor!==Q;u=h.next())vt(l,s.struct,s.offset),s={struct:u,offset:0}}s!==null&&(vt(l,s.struct,s.offset),s=null),Sl(l);let c=r.map(h=>pt(h)),a=cn(c);return Xe(o,a),o.toUint8Array()},wl=(n,e,t=ye,r=Re)=>{let i=yl(e),s=new r,o=new ei(s),l=new t(X(n)),c=new et(l,!1);for(;c.curr;){let h=c.curr,f=h.id.client,u=i.get(f)||0;if(c.curr.constructor===Q){c.next();continue}if(h.id.clock+h.length>u)for(vt(o,h,me(u-h.id.clock,0)),c.next();c.curr&&c.curr.id.client===f;)vt(o,c.curr,0),c.next();else for(;c.curr&&c.curr.id.client===f&&c.curr.id.clock+c.curr.length<=u;)c.next()}Sl(o);let a=pt(l);return Xe(s,a),s.toUint8Array()},Ng=(n,e)=>wl(n,e,De,Ze),Ah=n=>{n.written>0&&(n.clientStructs.push({written:n.written,restEncoder:ke(n.encoder.restEncoder)}),n.encoder.restEncoder=Nt(),n.written=0)},vt=(n,e,t)=>{n.written>0&&n.currClient!==e.id.client&&Ah(n),n.written===0&&(n.currClient=e.id.client,n.encoder.writeClient(e.id.client),S(n.encoder.restEncoder,e.id.clock+t)),e.write(n.encoder,t),n.written++},Sl=n=>{Ah(n);let e=n.encoder.restEncoder;S(e,n.clientStructs.length);for(let t=0;t{let i=new t(X(n)),s=new et(i,!1),o=new r,l=new ei(o);for(let a=s.curr;a!==null;a=s.next())vt(l,e(a),0);Sl(l);let c=pt(i);return Xe(o,c),o.toUint8Array()},Nh=({formatting:n=!0,subdocs:e=!0,yxml:t=!0}={})=>{let r=0,i=U(),s=U(),o=U(),l=U();return l.set(null,null),c=>{switch(c.constructor){case oe:case Q:return c;case A:{let a=c,h=a.content;switch(h.constructor){case lr:break;case Me:{if(t){let f=h.type;f instanceof L&&(f.nodeName=$(s,f.nodeName,()=>"node-"+r)),f instanceof si&&(f.hookName=$(s,f.hookName,()=>"hook-"+r))}break}case Ft:{let f=h;f.arr=f.arr.map(()=>r);break}case mn:{let f=h;f.content=new Uint8Array([r]);break}case gn:{let f=h;e&&(f.opts={},f.doc.guid=r+"");break}case mt:{let f=h;f.embed={};break}case V:{let f=h;n&&(f.key=$(o,f.key,()=>r+""),f.value=$(l,f.value,()=>({i:r})));break}case oi:{let f=h;f.arr=f.arr.map(()=>r);break}case _e:{let f=h;f.str=Wi(r%10+"",f.str.length);break}default:_()}return a.parentSub&&(a.parentSub=$(i,a.parentSub,()=>r+"")),r++,c}default:_()}}},Ig=(n,e)=>Rs(n,Nh(e),De,Ze),Rg=(n,e)=>Rs(n,Nh(e),ye,Re),_g=n=>Rs(n,Uo,De,Re),Ih=n=>Rs(n,Uo,ye,Ze),lh="You must not compute changes after the event-handler fired.",un=class{constructor(e,t){this.target=e,this.currentTarget=e,this.transaction=t,this._changes=null,this._keys=null,this._delta=null,this._path=null}get path(){return this._path||(this._path=vg(this.currentTarget,this.target))}deletes(e){return gt(this.transaction.deleteSet,e.id)}get keys(){if(this._keys===null){if(this.transaction.doc._transactionCleanups.length===0)throw Ie(lh);let e=new Map,t=this.target;this.transaction.changed.get(t).forEach(i=>{if(i!==null){let s=t._map.get(i),o,l;if(this.adds(s)){let c=s.left;for(;c!==null&&this.adds(c);)c=c.left;if(this.deletes(s))if(c!==null&&this.deletes(c))o="delete",l=$i(c.content.getContent());else return;else c!==null&&this.deletes(c)?(o="update",l=$i(c.content.getContent())):(o="add",l=void 0)}else if(this.deletes(s))o="delete",l=$i(s.content.getContent());else return;e.set(i,{action:o,oldValue:l})}}),this._keys=e}return this._keys}get delta(){return this.changes.delta}adds(e){return e.id.clock>=(this.transaction.beforeState.get(e.id.client)||0)}get changes(){let e=this._changes;if(e===null){if(this.transaction.doc._transactionCleanups.length===0)throw Ie(lh);let t=this.target,r=Le(),i=Le(),s=[];if(e={added:r,deleted:i,delta:s,keys:this.keys},this.transaction.changed.get(t).has(null)){let l=null,c=()=>{l&&s.push(l)};for(let a=t._start;a!==null;a=a.right)a.deleted?this.deletes(a)&&!this.adds(a)&&((l===null||l.delete===void 0)&&(c(),l={delete:0}),l.delete+=a.length,i.add(a)):this.adds(a)?((l===null||l.insert===void 0)&&(c(),l={insert:[]}),l.insert=l.insert.concat(a.content.getContent()),r.add(a)):((l===null||l.retain===void 0)&&(c(),l={retain:0}),l.retain+=a.length);l!==null&&l.retain===void 0&&c()}this._changes=e}return e}},vg=(n,e)=>{let t=[];for(;e._item!==null&&e!==n;){if(e._item.parentSub!==null)t.unshift(e._item.parentSub);else{let r=0,i=e._item.parent._start;for(;i!==e._item&&i!==null;)!i.deleted&&i.countable&&(r+=i.length),i=i.right;t.unshift(r)}e=e._item.parent}return t},ee=()=>{tl("Invalid access: Add Yjs type to a document before reading data.")},Rh=80,kl=0,hl=class{constructor(e,t){e.marker=!0,this.p=e,this.index=t,this.timestamp=kl++}},Vg=n=>{n.timestamp=kl++},_h=(n,e,t)=>{n.p.marker=!1,n.p=e,e.marker=!0,n.index=t,n.timestamp=kl++},Ug=(n,e,t)=>{if(n.length>=Rh){let r=n.reduce((i,s)=>i.timestamp{if(n._start===null||e===0||n._searchMarker===null)return null;let t=n._searchMarker.length===0?null:n._searchMarker.reduce((s,o)=>Qt(e-s.index)e;)r=r.left,!r.deleted&&r.countable&&(i-=r.length);for(;r.left!==null&&r.left.id.client===r.id.client&&r.left.id.clock+r.left.length===r.id.clock;)r=r.left,!r.deleted&&r.countable&&(i-=r.length);return t!==null&&Qt(t.index-i){for(let r=n.length-1;r>=0;r--){let i=n[r];if(t>0){let s=i.p;for(s.marker=!1;s&&(s.deleted||!s.countable);)s=s.left,s&&!s.deleted&&s.countable&&(i.index-=s.length);if(s===null||s.marker===!0){n.splice(r,1);continue}i.p=s,s.marker=!0}(e0&&e===i.index)&&(i.index=me(e,i.index+t))}},Bg=n=>{n.doc??ee();let e=n._start,t=[];for(;e;)t.push(e),e=e.right;return t},vs=(n,e,t)=>{let r=n,i=e.changedParentTypes;for(;$(i,n,()=>[]).push(t),n._item!==null;)n=n._item.parent;gh(r._eH,t,e)},B=class{constructor(){this._item=null,this._map=new Map,this._start=null,this.doc=null,this._length=0,this._eH=Za(),this._dEH=Za(),this._searchMarker=null}get parent(){return this._item?this._item.parent:null}_integrate(e,t){this.doc=e,this._item=t}_copy(){throw ge()}clone(){throw ge()}_write(e){}get _first(){let e=this._start;for(;e!==null&&e.deleted;)e=e.right;return e}_callObserver(e,t){!e.local&&this._searchMarker&&(this._searchMarker.length=0)}observe(e){Qa(this._eH,e)}observeDeep(e){Qa(this._dEH,e)}unobserve(e){eh(this._eH,e)}unobserveDeep(e){eh(this._dEH,e)}toJSON(){}},vh=(n,e,t)=>{n.doc??ee(),e<0&&(e=n._length+e),t<0&&(t=n._length+t);let r=t-e,i=[],s=n._start;for(;s!==null&&r>0;){if(s.countable&&!s.deleted){let o=s.content.getContent();if(o.length<=e)e-=o.length;else{for(let l=e;l0;l++)i.push(o[l]),r--;e=0}}s=s.right}return i},Vh=n=>{n.doc??ee();let e=[],t=n._start;for(;t!==null;){if(t.countable&&!t.deleted){let r=t.content.getContent();for(let i=0;i{let t=[],r=n._start;for(;r!==null;){if(r.countable&&_t(r,e)){let i=r.content.getContent();for(let s=0;s{let t=0,r=n._start;for(n.doc??ee();r!==null;){if(r.countable&&!r.deleted){let i=r.content.getContent();for(let s=0;s{let t=[];return ri(n,(r,i)=>{t.push(e(r,i,n))}),t},Pg=n=>{let e=n._start,t=null,r=0;return{[Symbol.iterator](){return this},next:()=>{if(t===null){for(;e!==null&&e.deleted;)e=e.right;if(e===null)return{done:!0,value:void 0};t=e.content.getContent(),r=0,e=e.right}let i=t[r++];return t.length<=r&&(t=null),{done:!1,value:i}}}},Bh=(n,e)=>{n.doc??ee();let t=_s(n,e),r=n._start;for(t!==null&&(r=t.p,e-=t.index);r!==null;r=r.right)if(!r.deleted&&r.countable){if(e{let i=t,s=n.doc,o=s.clientID,l=s.store,c=t===null?e._start:t.right,a=[],h=()=>{a.length>0&&(i=new A(k(o,v(l,o)),i,i&&i.lastId,c,c&&c.id,e,null,new Ft(a)),i.integrate(n,0),a=[])};r.forEach(f=>{if(f===null)a.push(f);else switch(f.constructor){case Number:case Object:case Boolean:case Array:case String:a.push(f);break;default:switch(h(),f.constructor){case Uint8Array:case ArrayBuffer:i=new A(k(o,v(l,o)),i,i&&i.lastId,c,c&&c.id,e,null,new mn(new Uint8Array(f))),i.integrate(n,0);break;case ve:i=new A(k(o,v(l,o)),i,i&&i.lastId,c,c&&c.id,e,null,new gn(f)),i.integrate(n,0);break;default:if(f instanceof B)i=new A(k(o,v(l,o)),i,i&&i.lastId,c,c&&c.id,e,null,new Me(f)),i.integrate(n,0);else throw new Error("Unexpected content type in insert operation")}}}),h()},Ph=()=>Ie("Length exceeded!"),Fh=(n,e,t,r)=>{if(t>e._length)throw Ph();if(t===0)return e._searchMarker&&ni(e._searchMarker,t,r.length),Ts(n,e,null,r);let i=t,s=_s(e,t),o=e._start;for(s!==null&&(o=s.p,t-=s.index,t===0&&(o=o.prev,t+=o&&o.countable&&!o.deleted?o.length:0));o!==null;o=o.right)if(!o.deleted&&o.countable){if(t<=o.length){t{let i=(e._searchMarker||[]).reduce((s,o)=>o.index>s.index?o:s,{index:0,p:e._start}).p;if(i)for(;i.right;)i=i.right;return Ts(n,e,i,t)},Lh=(n,e,t,r)=>{if(r===0)return;let i=t,s=r,o=_s(e,t),l=e._start;for(o!==null&&(l=o.p,t-=o.index);l!==null&&t>0;l=l.right)!l.deleted&&l.countable&&(t0&&l!==null;)l.deleted||(r0)throw Ph();e._searchMarker&&ni(e._searchMarker,i,-s+r)},Ds=(n,e,t)=>{let r=e._map.get(t);r!==void 0&&r.delete(n)},Cl=(n,e,t,r)=>{let i=e._map.get(t)||null,s=n.doc,o=s.clientID,l;if(r==null)l=new Ft([r]);else switch(r.constructor){case Number:case Object:case Boolean:case Array:case String:case Date:case BigInt:l=new Ft([r]);break;case Uint8Array:l=new mn(r);break;case ve:l=new gn(r);break;default:if(r instanceof B)l=new Me(r);else throw new Error("Unexpected content type")}new A(k(o,v(s.store,o)),i,i&&i.lastId,null,null,e,t,l).integrate(n,0)},Tl=(n,e)=>{n.doc??ee();let t=n._map.get(e);return t!==void 0&&!t.deleted?t.content.getContent()[t.length-1]:void 0},zh=n=>{let e={};return n.doc??ee(),n._map.forEach((t,r)=>{t.deleted||(e[r]=t.content.getContent()[t.length-1])}),e},$h=(n,e)=>{n.doc??ee();let t=n._map.get(e);return t!==void 0&&!t.deleted},Lg=(n,e,t)=>{let r=n._map.get(e)||null;for(;r!==null&&(!t.sv.has(r.id.client)||r.id.clock>=(t.sv.get(r.id.client)||0));)r=r.left;return r!==null&&_t(r,t)?r.content.getContent()[r.length-1]:void 0},qh=(n,e)=>{let t={};return n._map.forEach((r,i)=>{let s=r;for(;s!==null&&(!e.sv.has(s.id.client)||s.id.clock>=(e.sv.get(s.id.client)||0));)s=s.left;s!==null&&_t(s,e)&&(t[i]=s.content.getContent()[s.length-1])}),t},gs=n=>(n.doc??ee(),Ka(n._map.entries(),e=>!e[1].deleted)),Os=class extends un{},dn=class n extends B{constructor(){super(),this._prelimContent=[],this._searchMarker=[]}static from(e){let t=new n;return t.push(e),t}_integrate(e,t){super._integrate(e,t),this.insert(0,this._prelimContent),this._prelimContent=null}_copy(){return new n}clone(){let e=new n;return e.insert(0,this.toArray().map(t=>t instanceof B?t.clone():t)),e}get length(){return this.doc??ee(),this._length}_callObserver(e,t){super._callObserver(e,t),vs(this,e,new Os(this,e))}insert(e,t){this.doc!==null?I(this.doc,r=>{Fh(r,this,e,t)}):this._prelimContent.splice(e,0,...t)}push(e){this.doc!==null?I(this.doc,t=>{Fg(t,this,e)}):this._prelimContent.push(...e)}unshift(e){this.insert(0,e)}delete(e,t=1){this.doc!==null?I(this.doc,r=>{Lh(r,this,e,t)}):this._prelimContent.splice(e,t)}get(e){return Bh(this,e)}toArray(){return Vh(this)}slice(e=0,t=this.length){return vh(this,e,t)}toJSON(){return this.map(e=>e instanceof B?e.toJSON():e)}map(e){return Uh(this,e)}forEach(e){ri(this,e)}[Symbol.iterator](){return Pg(this)}_write(e){e.writeTypeRef(ly)}},zg=n=>new dn,Ms=class extends un{constructor(e,t,r){super(e,t),this.keysChanged=r}},pn=class n extends B{constructor(e){super(),this._prelimContent=null,e===void 0?this._prelimContent=new Map:this._prelimContent=new Map(e)}_integrate(e,t){super._integrate(e,t),this._prelimContent.forEach((r,i)=>{this.set(i,r)}),this._prelimContent=null}_copy(){return new n}clone(){let e=new n;return this.forEach((t,r)=>{e.set(r,t instanceof B?t.clone():t)}),e}_callObserver(e,t){vs(this,e,new Ms(this,e,t))}toJSON(){this.doc??ee();let e={};return this._map.forEach((t,r)=>{if(!t.deleted){let i=t.content.getContent()[t.length-1];e[r]=i instanceof B?i.toJSON():i}}),e}get size(){return[...gs(this)].length}keys(){return ps(gs(this),e=>e[0])}values(){return ps(gs(this),e=>e[1].content.getContent()[e[1].length-1])}entries(){return ps(gs(this),e=>[e[0],e[1].content.getContent()[e[1].length-1]])}forEach(e){this.doc??ee(),this._map.forEach((t,r)=>{t.deleted||e(t.content.getContent()[t.length-1],r,this)})}[Symbol.iterator](){return this.entries()}delete(e){this.doc!==null?I(this.doc,t=>{Ds(t,this,e)}):this._prelimContent.delete(e)}set(e,t){return this.doc!==null?I(this.doc,r=>{Cl(r,this,e,t)}):this._prelimContent.set(e,t),t}get(e){return Tl(this,e)}has(e){return $h(this,e)}clear(){this.doc!==null?I(this.doc,e=>{this.forEach(function(t,r,i){Ds(e,i,r)})}):this._prelimContent.clear()}_write(e){e.writeTypeRef(cy)}},$g=n=>new pn,Vt=(n,e)=>n===e||typeof n=="object"&&typeof e=="object"&&n&&e&&vo(n,e),ii=class{constructor(e,t,r,i){this.left=e,this.right=t,this.index=r,this.currentAttributes=i}forward(){switch(this.right===null&&_(),this.right.content.constructor){case V:this.right.deleted||ar(this.currentAttributes,this.right.content);break;default:this.right.deleted||(this.index+=this.right.length);break}this.left=this.right,this.right=this.right.right}},ch=(n,e,t)=>{for(;e.right!==null&&t>0;){switch(e.right.content.constructor){case V:e.right.deleted||ar(e.currentAttributes,e.right.content);break;default:e.right.deleted||(t{let i=new Map,s=r?_s(e,t):null;if(s){let o=new ii(s.p.left,s.p,s.index,i);return ch(n,o,t-s.index)}else{let o=new ii(null,e._start,0,i);return ch(n,o,t)}},Jh=(n,e,t,r)=>{for(;t.right!==null&&(t.right.deleted===!0||t.right.content.constructor===V&&Vt(r.get(t.right.content.key),t.right.content.value));)t.right.deleted||r.delete(t.right.content.key),t.forward();let i=n.doc,s=i.clientID;r.forEach((o,l)=>{let c=t.left,a=t.right,h=new A(k(s,v(i.store,s)),c,c&&c.lastId,a,a&&a.id,e,null,new V(l,o));h.integrate(n,0),t.right=h,t.forward()})},ar=(n,e)=>{let{key:t,value:r}=e;r===null?n.delete(t):n.set(t,r)},Wh=(n,e)=>{for(;n.right!==null;){if(!(n.right.deleted||n.right.content.constructor===V&&Vt(e[n.right.content.key]??null,n.right.content.value)))break;n.forward()}},jh=(n,e,t,r)=>{let i=n.doc,s=i.clientID,o=new Map;for(let l in r){let c=r[l],a=t.currentAttributes.get(l)??null;if(!Vt(a,c)){o.set(l,a);let{left:h,right:f}=t;t.right=new A(k(s,v(i.store,s)),h,h&&h.lastId,f,f&&f.id,e,null,new V(l,c)),t.right.integrate(n,0),t.forward()}}return o},nl=(n,e,t,r,i)=>{t.currentAttributes.forEach((u,d)=>{i[d]===void 0&&(i[d]=null)});let s=n.doc,o=s.clientID;Wh(t,i);let l=jh(n,e,t,i),c=r.constructor===String?new _e(r):r instanceof B?new Me(r):new mt(r),{left:a,right:h,index:f}=t;e._searchMarker&&ni(e._searchMarker,t.index,c.getLength()),h=new A(k(o,v(s.store,o)),a,a&&a.lastId,h,h&&h.id,e,null,c),h.integrate(n,0),t.right=h,t.index=f,t.forward(),Jh(n,e,t,l)},ah=(n,e,t,r,i)=>{let s=n.doc,o=s.clientID;Wh(t,i);let l=jh(n,e,t,i);e:for(;t.right!==null&&(r>0||l.size>0&&(t.right.deleted||t.right.content.constructor===V));){if(!t.right.deleted)switch(t.right.content.constructor){case V:{let{key:c,value:a}=t.right.content,h=i[c];if(h!==void 0){if(Vt(h,a))l.delete(c);else{if(r===0)break e;l.set(c,a)}t.right.delete(n)}else t.currentAttributes.set(c,a);break}default:r0){let c="";for(;r>0;r--)c+=` +`;t.right=new A(k(o,v(s.store,o)),t.left,t.left&&t.left.lastId,t.right,t.right&&t.right.id,e,null,new _e(c)),t.right.integrate(n,0),t.forward()}Jh(n,e,t,l)},Yh=(n,e,t,r,i)=>{let s=e,o=U();for(;s&&(!s.countable||s.deleted);){if(!s.deleted&&s.content.constructor===V){let a=s.content;o.set(a.key,a)}s=s.right}let l=0,c=!1;for(;e!==s;){if(t===e&&(c=!0),!e.deleted){let a=e.content;switch(a.constructor){case V:{let{key:h,value:f}=a,u=r.get(h)??null;(o.get(h)!==a||u===f)&&(e.delete(n),l++,!c&&(i.get(h)??null)===f&&u!==f&&(u===null?i.delete(h):i.set(h,u))),!c&&!e.deleted&&ar(i,a);break}}}e=e.right}return l},qg=(n,e)=>{for(;e&&e.right&&(e.right.deleted||!e.right.countable);)e=e.right;let t=new Set;for(;e&&(e.deleted||!e.countable);){if(!e.deleted&&e.content.constructor===V){let r=e.content.key;t.has(r)?e.delete(n):t.add(r)}e=e.left}},Kh=n=>{let e=0;return I(n.doc,t=>{let r=n._start,i=n._start,s=U(),o=Li(s);for(;i;){if(i.deleted===!1)switch(i.content.constructor){case V:ar(o,i.content);break;default:e+=Yh(t,r,i,s,o),s=Li(o),r=i;break}i=i.right}}),e},Jg=n=>{let e=new Set,t=n.doc;for(let[r,i]of n.afterState.entries()){let s=n.beforeState.get(r)||0;i!==s&&wh(n,t.store.clients.get(r),s,i,o=>{!o.deleted&&o.content.constructor===V&&o.constructor!==oe&&e.add(o.parent)})}I(t,r=>{Ge(n,n.deleteSet,i=>{if(i instanceof oe||!i.parent._hasFormatting||e.has(i.parent))return;let s=i.parent;i.content.constructor===V?e.add(s):qg(r,i)});for(let i of e)Kh(i)})},hh=(n,e,t)=>{let r=t,i=Li(e.currentAttributes),s=e.right;for(;t>0&&e.right!==null;){if(e.right.deleted===!1)switch(e.right.content.constructor){case Me:case mt:case _e:t{i===null?this.childListChanged=!0:this.keysChanged.add(i)})}get changes(){if(this._changes===null){let e={keys:this.keys,delta:this.delta,added:new Set,deleted:new Set};this._changes=e}return this._changes}get delta(){if(this._delta===null){let e=this.target.doc,t=[];I(e,r=>{let i=new Map,s=new Map,o=this.target._start,l=null,c={},a="",h=0,f=0,u=()=>{if(l!==null){let d=null;switch(l){case"delete":f>0&&(d={delete:f}),f=0;break;case"insert":(typeof a=="object"||a.length>0)&&(d={insert:a},i.size>0&&(d.attributes={},i.forEach((p,m)=>{p!==null&&(d.attributes[m]=p)}))),a="";break;case"retain":h>0&&(d={retain:h},wa(c)||(d.attributes=xa({},c))),h=0;break}d&&t.push(d),l=null}};for(;o!==null;){switch(o.content.constructor){case Me:case mt:this.adds(o)?this.deletes(o)||(u(),l="insert",a=o.content.getContent()[0],u()):this.deletes(o)?(l!=="delete"&&(u(),l="delete"),f+=1):o.deleted||(l!=="retain"&&(u(),l="retain"),h+=1);break;case _e:this.adds(o)?this.deletes(o)||(l!=="insert"&&(u(),l="insert"),a+=o.content.str):this.deletes(o)?(l!=="delete"&&(u(),l="delete"),f+=o.length):o.deleted||(l!=="retain"&&(u(),l="retain"),h+=o.length);break;case V:{let{key:d,value:p}=o.content;if(this.adds(o)){if(!this.deletes(o)){let m=i.get(d)??null;Vt(m,p)?p!==null&&o.delete(r):(l==="retain"&&u(),Vt(p,s.get(d)??null)?delete c[d]:c[d]=p)}}else if(this.deletes(o)){s.set(d,p);let m=i.get(d)??null;Vt(m,p)||(l==="retain"&&u(),c[d]=m)}else if(!o.deleted){s.set(d,p);let m=c[d];m!==void 0&&(Vt(m,p)?m!==null&&o.delete(r):(l==="retain"&&u(),p===null?delete c[d]:c[d]=p))}o.deleted||(l==="insert"&&u(),ar(i,o.content));break}}o=o.right}for(u();t.length>0;){let d=t[t.length-1];if(d.retain!==void 0&&d.attributes===void 0)t.pop();else break}}),this._delta=t}return this._delta}},tt=class n extends B{constructor(e){super(),this._pending=e!==void 0?[()=>this.insert(0,e)]:[],this._searchMarker=[],this._hasFormatting=!1}get length(){return this.doc??ee(),this._length}_integrate(e,t){super._integrate(e,t);try{this._pending.forEach(r=>r())}catch(r){console.error(r)}this._pending=null}_copy(){return new n}clone(){let e=new n;return e.applyDelta(this.toDelta()),e}_callObserver(e,t){super._callObserver(e,t);let r=new Es(this,e,t);vs(this,e,r),!e.local&&this._hasFormatting&&(e._needFormattingCleanup=!0)}toString(){this.doc??ee();let e="",t=this._start;for(;t!==null;)!t.deleted&&t.countable&&t.content.constructor===_e&&(e+=t.content.str),t=t.right;return e}toJSON(){return this.toString()}applyDelta(e,{sanitize:t=!0}={}){this.doc!==null?I(this.doc,r=>{let i=new ii(null,this._start,0,new Map);for(let s=0;s0)&&nl(r,this,i,l,o.attributes||{})}else o.retain!==void 0?ah(r,this,i,o.retain,o.attributes||{}):o.delete!==void 0&&hh(r,i,o.delete)}}):this._pending.push(()=>this.applyDelta(e))}toDelta(e,t,r){this.doc??ee();let i=[],s=new Map,o=this.doc,l="",c=this._start;function a(){if(l.length>0){let f={},u=!1;s.forEach((p,m)=>{u=!0,f[m]=p});let d={insert:l};u&&(d.attributes=f),i.push(d),l=""}}let h=()=>{for(;c!==null;){if(_t(c,e)||t!==void 0&&_t(c,t))switch(c.content.constructor){case _e:{let f=s.get("ychange");e!==void 0&&!_t(c,e)?(f===void 0||f.user!==c.id.client||f.type!=="removed")&&(a(),s.set("ychange",r?r("removed",c.id):{type:"removed"})):t!==void 0&&!_t(c,t)?(f===void 0||f.user!==c.id.client||f.type!=="added")&&(a(),s.set("ychange",r?r("added",c.id):{type:"added"})):f!==void 0&&(a(),s.delete("ychange")),l+=c.content.str;break}case Me:case mt:{a();let f={insert:c.content.getContent()[0]};if(s.size>0){let u={};f.attributes=u,s.forEach((d,p)=>{u[p]=d})}i.push(f);break}case V:_t(c,e)&&(a(),ar(s,c.content));break}c=c.right}a()};return e||t?I(o,f=>{e&&ol(f,e),t&&ol(f,t),h()},"cleanup"):h(),i}insert(e,t,r){if(t.length<=0)return;let i=this.doc;i!==null?I(i,s=>{let o=ys(s,this,e,!r);r||(r={},o.currentAttributes.forEach((l,c)=>{r[c]=l})),nl(s,this,o,t,r)}):this._pending.push(()=>this.insert(e,t,r))}insertEmbed(e,t,r){let i=this.doc;i!==null?I(i,s=>{let o=ys(s,this,e,!r);nl(s,this,o,t,r||{})}):this._pending.push(()=>this.insertEmbed(e,t,r||{}))}delete(e,t){if(t===0)return;let r=this.doc;r!==null?I(r,i=>{hh(i,ys(i,this,e,!0),t)}):this._pending.push(()=>this.delete(e,t))}format(e,t,r){if(t===0)return;let i=this.doc;i!==null?I(i,s=>{let o=ys(s,this,e,!1);o.right!==null&&ah(s,this,o,t,r)}):this._pending.push(()=>this.format(e,t,r))}removeAttribute(e){this.doc!==null?I(this.doc,t=>{Ds(t,this,e)}):this._pending.push(()=>this.removeAttribute(e))}setAttribute(e,t){this.doc!==null?I(this.doc,r=>{Cl(r,this,e,t)}):this._pending.push(()=>this.setAttribute(e,t))}getAttribute(e){return Tl(this,e)}getAttributes(){return zh(this)}_write(e){e.writeTypeRef(ay)}},Wg=n=>new tt,Zr=class{constructor(e,t=()=>!0){this._filter=t,this._root=e,this._currentNode=e._start,this._firstCall=!0,e.doc??ee()}[Symbol.iterator](){return this}next(){let e=this._currentNode,t=e&&e.content&&e.content.type;if(e!==null&&(!this._firstCall||e.deleted||!this._filter(t)))do if(t=e.content.type,!e.deleted&&(t.constructor===L||t.constructor===nt)&&t._start!==null)e=t._start;else for(;e!==null;){let r=e.next;if(r!==null){e=r;break}else e.parent===this._root?e=null:e=e.parent._item}while(e!==null&&(e.deleted||!this._filter(e.content.type)));return this._firstCall=!1,e===null?{value:void 0,done:!0}:(this._currentNode=e,{value:e.content.type,done:!1})}},nt=class n extends B{constructor(){super(),this._prelimContent=[]}get firstChild(){let e=this._first;return e?e.content.getContent()[0]:null}_integrate(e,t){super._integrate(e,t),this.insert(0,this._prelimContent),this._prelimContent=null}_copy(){return new n}clone(){let e=new n;return e.insert(0,this.toArray().map(t=>t instanceof B?t.clone():t)),e}get length(){return this.doc??ee(),this._prelimContent===null?this._length:this._prelimContent.length}createTreeWalker(e){return new Zr(this,e)}querySelector(e){e=e.toUpperCase();let r=new Zr(this,i=>i.nodeName&&i.nodeName.toUpperCase()===e).next();return r.done?null:r.value}querySelectorAll(e){return e=e.toUpperCase(),je(new Zr(this,t=>t.nodeName&&t.nodeName.toUpperCase()===e))}_callObserver(e,t){vs(this,e,new As(this,t,e))}toString(){return Uh(this,e=>e.toString()).join("")}toJSON(){return this.toString()}toDOM(e=document,t={},r){let i=e.createDocumentFragment();return r!==void 0&&r._createAssociation(i,this),ri(this,s=>{i.insertBefore(s.toDOM(e,t,r),null)}),i}insert(e,t){this.doc!==null?I(this.doc,r=>{Fh(r,this,e,t)}):this._prelimContent.splice(e,0,...t)}insertAfter(e,t){if(this.doc!==null)I(this.doc,r=>{let i=e&&e instanceof B?e._item:e;Ts(r,this,i,t)});else{let r=this._prelimContent,i=e===null?0:r.findIndex(s=>s===e)+1;if(i===0&&e!==null)throw Ie("Reference item not found");r.splice(i,0,...t)}}delete(e,t=1){this.doc!==null?I(this.doc,r=>{Lh(r,this,e,t)}):this._prelimContent.splice(e,t)}toArray(){return Vh(this)}push(e){this.insert(this.length,e)}unshift(e){this.insert(0,e)}get(e){return Bh(this,e)}slice(e=0,t=this.length){return vh(this,e,t)}forEach(e){ri(this,e)}_write(e){e.writeTypeRef(fy)}},jg=n=>new nt,L=class n extends nt{constructor(e="UNDEFINED"){super(),this.nodeName=e,this._prelimAttrs=new Map}get nextSibling(){let e=this._item?this._item.next:null;return e?e.content.type:null}get prevSibling(){let e=this._item?this._item.prev:null;return e?e.content.type:null}_integrate(e,t){super._integrate(e,t),this._prelimAttrs.forEach((r,i)=>{this.setAttribute(i,r)}),this._prelimAttrs=null}_copy(){return new n(this.nodeName)}clone(){let e=new n(this.nodeName),t=this.getAttributes();return ba(t,(r,i)=>{e.setAttribute(i,r)}),e.insert(0,this.toArray().map(r=>r instanceof B?r.clone():r)),e}toString(){let e=this.getAttributes(),t=[],r=[];for(let l in e)r.push(l);r.sort();let i=r.length;for(let l=0;l0?" "+t.join(" "):"";return`<${s}${o}>${super.toString()}`}removeAttribute(e){this.doc!==null?I(this.doc,t=>{Ds(t,this,e)}):this._prelimAttrs.delete(e)}setAttribute(e,t){this.doc!==null?I(this.doc,r=>{Cl(r,this,e,t)}):this._prelimAttrs.set(e,t)}getAttribute(e){return Tl(this,e)}hasAttribute(e){return $h(this,e)}getAttributes(e){return e?qh(this,e):zh(this)}toDOM(e=document,t={},r){let i=e.createElement(this.nodeName),s=this.getAttributes();for(let o in s){let l=s[o];typeof l=="string"&&i.setAttribute(o,l)}return ri(this,o=>{i.appendChild(o.toDOM(e,t,r))}),r!==void 0&&r._createAssociation(i,this),i}_write(e){e.writeTypeRef(hy),e.writeKey(this.nodeName)}},Yg=n=>new L(n.readKey()),As=class extends un{constructor(e,t,r){super(e,r),this.childListChanged=!1,this.attributesChanged=new Set,t.forEach(i=>{i===null?this.childListChanged=!0:this.attributesChanged.add(i)})}},si=class n extends pn{constructor(e){super(),this.hookName=e}_copy(){return new n(this.hookName)}clone(){let e=new n(this.hookName);return this.forEach((t,r)=>{e.set(r,t)}),e}toDOM(e=document,t={},r){let i=t[this.hookName],s;return i!==void 0?s=i.createDom(this):s=document.createElement(this.hookName),s.setAttribute("data-yjs-hook",this.hookName),r!==void 0&&r._createAssociation(s,this),s}_write(e){e.writeTypeRef(uy),e.writeKey(this.hookName)}},Kg=n=>new si(n.readKey()),le=class n extends tt{get nextSibling(){let e=this._item?this._item.next:null;return e?e.content.type:null}get prevSibling(){let e=this._item?this._item.prev:null;return e?e.content.type:null}_copy(){return new n}clone(){let e=new n;return e.applyDelta(this.toDelta()),e}toDOM(e=document,t,r){let i=e.createTextNode(this.toString());return r!==void 0&&r._createAssociation(i,this),i}toString(){return this.toDelta().map(e=>{let t=[];for(let i in e.attributes){let s=[];for(let o in e.attributes[i])s.push({key:o,value:e.attributes[i][o]});s.sort((o,l)=>o.keyi.nodeName=0;i--)r+=``;return r}).join("")}toJSON(){return this.toString()}_write(e){e.writeTypeRef(dy)}},Hg=n=>new le,or=class{constructor(e,t){this.id=e,this.length=t}get deleted(){throw ge()}mergeWith(e){return!1}write(e,t,r){throw ge()}integrate(e,t){throw ge()}},Gg=0,oe=class extends or{get deleted(){return!0}delete(){}mergeWith(e){return this.constructor!==e.constructor?!1:(this.length+=e.length,!0)}integrate(e,t){t>0&&(this.id.clock+=t,this.length-=t),bh(e.doc.store,this)}write(e,t){e.writeInfo(Gg),e.writeLen(this.length-t)}getMissing(e,t){return null}},mn=class n{constructor(e){this.content=e}getLength(){return 1}getContent(){return[this.content]}isCountable(){return!0}copy(){return new n(this.content)}splice(e){throw ge()}mergeWith(e){return!1}integrate(e,t){}delete(e){}gc(e){}write(e,t){e.writeBuf(this.content)}getRef(){return 3}},Xg=n=>new mn(n.readBuf()),lr=class n{constructor(e){this.len=e}getLength(){return this.len}getContent(){return[]}isCountable(){return!1}copy(){return new n(this.len)}splice(e){let t=new n(this.len-e);return this.len=e,t}mergeWith(e){return this.len+=e.len,!0}integrate(e,t){Qr(e.deleteSet,t.id.client,t.id.clock,this.len),t.markDeleted()}delete(e){}gc(e){}write(e,t){e.writeLen(this.len-t)}getRef(){return 1}},Zg=n=>new lr(n.readLen()),Hh=(n,e)=>new ve({guid:n,...e,shouldLoad:e.shouldLoad||e.autoLoad||!1}),gn=class n{constructor(e){e._item&&console.error("This document was already integrated as a sub-document. You should create a second instance instead with the same guid."),this.doc=e;let t={};this.opts=t,e.gc||(t.gc=!1),e.autoLoad&&(t.autoLoad=!0),e.meta!==null&&(t.meta=e.meta)}getLength(){return 1}getContent(){return[this.doc]}isCountable(){return!0}copy(){return new n(Hh(this.doc.guid,this.opts))}splice(e){throw ge()}mergeWith(e){return!1}integrate(e,t){this.doc._item=t,e.subdocsAdded.add(this.doc),this.doc.shouldLoad&&e.subdocsLoaded.add(this.doc)}delete(e){e.subdocsAdded.has(this.doc)?e.subdocsAdded.delete(this.doc):e.subdocsRemoved.add(this.doc)}gc(e){}write(e,t){e.writeString(this.doc.guid),e.writeAny(this.opts)}getRef(){return 9}},Qg=n=>new gn(Hh(n.readString(),n.readAny())),mt=class n{constructor(e){this.embed=e}getLength(){return 1}getContent(){return[this.embed]}isCountable(){return!0}copy(){return new n(this.embed)}splice(e){throw ge()}mergeWith(e){return!1}integrate(e,t){}delete(e){}gc(e){}write(e,t){e.writeJSON(this.embed)}getRef(){return 5}},ey=n=>new mt(n.readJSON()),V=class n{constructor(e,t){this.key=e,this.value=t}getLength(){return 1}getContent(){return[]}isCountable(){return!1}copy(){return new n(this.key,this.value)}splice(e){throw ge()}mergeWith(e){return!1}integrate(e,t){let r=t.parent;r._searchMarker=null,r._hasFormatting=!0}delete(e){}gc(e){}write(e,t){e.writeKey(this.key),e.writeJSON(this.value)}getRef(){return 6}},ty=n=>new V(n.readKey(),n.readJSON()),oi=class n{constructor(e){this.arr=e}getLength(){return this.arr.length}getContent(){return this.arr}isCountable(){return!0}copy(){return new n(this.arr)}splice(e){let t=new n(this.arr.slice(e));return this.arr=this.arr.slice(0,e),t}mergeWith(e){return this.arr=this.arr.concat(e.arr),!0}integrate(e,t){}delete(e){}gc(e){}write(e,t){let r=this.arr.length;e.writeLen(r-t);for(let i=t;i{let e=n.readLen(),t=[];for(let r=0;r{let e=n.readLen(),t=[];for(let r=0;r=55296&&r<=56319&&(this.str=this.str.slice(0,e-1)+"\uFFFD",t.str="\uFFFD"+t.str.slice(1)),t}mergeWith(e){return this.str+=e.str,!0}integrate(e,t){}delete(e){}gc(e){}write(e,t){e.writeString(t===0?this.str:this.str.slice(t))}getRef(){return 4}},sy=n=>new _e(n.readString()),oy=[zg,$g,Wg,Yg,jg,Kg,Hg],ly=0,cy=1,ay=2,hy=3,fy=4,uy=5,dy=6,Me=class n{constructor(e){this.type=e}getLength(){return 1}getContent(){return[this.type]}isCountable(){return!0}copy(){return new n(this.type._copy())}splice(e){throw ge()}mergeWith(e){return!1}integrate(e,t){this.type._integrate(e.doc,t)}delete(e){let t=this.type._start;for(;t!==null;)t.deleted?t.id.clock<(e.beforeState.get(t.id.client)||0)&&e._mergeStructs.push(t):t.delete(e),t=t.right;this.type._map.forEach(r=>{r.deleted?r.id.clock<(e.beforeState.get(r.id.client)||0)&&e._mergeStructs.push(r):r.delete(e)}),e.changed.delete(this.type)}gc(e){let t=this.type._start;for(;t!==null;)t.gc(e,!0),t=t.right;this.type._start=null,this.type._map.forEach(r=>{for(;r!==null;)r.gc(e,!0),r=r.left}),this.type._map=new Map}write(e,t){this.type._write(e)}getRef(){return 7}},py=n=>new Me(oy[n.readTypeRef()](n)),fl=(n,e)=>{let t=e,r=0,i;do r>0&&(t=k(t.client,t.clock+r)),i=ln(n,t),r=t.clock-i.id.clock,t=i.redone;while(t!==null&&i instanceof A);return{item:i,diff:r}},Dl=(n,e)=>{for(;n!==null&&n.keep!==e;)n.keep=e,n=n.parent._item},Ns=(n,e,t)=>{let{client:r,clock:i}=e.id,s=new A(k(r,i+t),e,k(r,i+t-1),e.right,e.rightOrigin,e.parent,e.parentSub,e.content.splice(t));return e.deleted&&s.markDeleted(),e.keep&&(s.keep=!0),e.redone!==null&&(s.redone=k(e.redone.client,e.redone.clock+t)),e.right=s,s.right!==null&&(s.right.left=s),n._mergeStructs.push(s),s.parentSub!==null&&s.right===null&&s.parent._map.set(s.parentSub,s),e.length=t,s},fh=(n,e)=>Ar(n,t=>gt(t.deletions,e)),Gh=(n,e,t,r,i,s)=>{let o=n.doc,l=o.store,c=o.clientID,a=e.redone;if(a!==null)return se(n,a);let h=e.parent._item,f=null,u;if(h!==null&&h.deleted===!0){if(h.redone===null&&(!t.has(h)||Gh(n,h,t,r,i,s)===null))return null;for(;h.redone!==null;)h=se(n,h.redone)}let d=h===null?e.parent:h.content.type;if(e.parentSub===null){for(f=e.left,u=e;f!==null;){let x=f;for(;x!==null&&x.parent._item!==h;)x=x.redone===null?null:se(n,x.redone);if(x!==null&&x.parent._item===h){f=x;break}f=f.left}for(;u!==null;){let x=u;for(;x!==null&&x.parent._item!==h;)x=x.redone===null?null:se(n,x.redone);if(x!==null&&x.parent._item===h){u=x;break}u=u.right}}else{if(u=null,e.right&&!i){for(f=e;f!==null&&f.right!==null&&(f.right.redone||gt(r,f.right.id)||fh(s.undoStack,f.right.id)||fh(s.redoStack,f.right.id));)for(f=f.right;f.redone;)f=se(n,f.redone);if(f&&f.right!==null)return null}else f=d._map.get(e.parentSub)||null;f!==null&&f.parent._item!==h&&(f=d._map.get(e.parentSub)||null)}let p=v(l,c),m=k(c,p),g=new A(m,f,f&&f.lastId,u,u&&u.id,d,e.parentSub,e.content.copy());return e.redone=m,Dl(g,!0),g.integrate(n,0),g},A=class n extends or{constructor(e,t,r,i,s,o,l,c){super(e,c.getLength()),this.origin=r,this.left=t,this.right=i,this.rightOrigin=s,this.parent=o,this.parentSub=l,this.redone=null,this.content=c,this.info=this.content.isCountable()?2:0}set marker(e){(this.info&8)>0!==e&&(this.info^=8)}get marker(){return(this.info&8)>0}get keep(){return(this.info&1)>0}set keep(e){this.keep!==e&&(this.info^=1)}get countable(){return(this.info&2)>0}get deleted(){return(this.info&4)>0}set deleted(e){this.deleted!==e&&(this.info^=4)}markDeleted(){this.info|=4}getMissing(e,t){if(this.origin&&this.origin.client!==this.id.client&&this.origin.clock>=v(t,this.origin.client))return this.origin.client;if(this.rightOrigin&&this.rightOrigin.client!==this.id.client&&this.rightOrigin.clock>=v(t,this.rightOrigin.client))return this.rightOrigin.client;if(this.parent&&this.parent.constructor===dt&&this.id.client!==this.parent.client&&this.parent.clock>=v(t,this.parent.client))return this.parent.client;if(this.origin&&(this.left=cl(e,t,this.origin),this.origin=this.left.lastId),this.rightOrigin&&(this.right=se(e,this.rightOrigin),this.rightOrigin=this.right.id),this.left&&this.left.constructor===oe||this.right&&this.right.constructor===oe)this.parent=null;else if(!this.parent)this.left&&this.left.constructor===n?(this.parent=this.left.parent,this.parentSub=this.left.parentSub):this.right&&this.right.constructor===n&&(this.parent=this.right.parent,this.parentSub=this.right.parentSub);else if(this.parent.constructor===dt){let r=ln(t,this.parent);r.constructor===oe?this.parent=null:this.parent=r.content.type}return null}integrate(e,t){if(t>0&&(this.id.clock+=t,this.left=cl(e,e.doc.store,k(this.id.client,this.id.clock-1)),this.origin=this.left.lastId,this.content=this.content.splice(t),this.length-=t),this.parent){if(!this.left&&(!this.right||this.right.left!==null)||this.left&&this.left.right!==this.right){let r=this.left,i;if(r!==null)i=r.right;else if(this.parentSub!==null)for(i=this.parent._map.get(this.parentSub)||null;i!==null&&i.left!==null;)i=i.left;else i=this.parent._start;let s=new Set,o=new Set;for(;i!==null&&i!==this.right;){if(o.add(i),s.add(i),on(this.origin,i.origin)){if(i.id.client{r.p===e&&(r.p=this,!this.deleted&&this.countable&&(r.index-=this.length))}),e.keep&&(this.keep=!0),this.right=e.right,this.right!==null&&(this.right.left=this),this.length+=e.length,!0}return!1}delete(e){if(!this.deleted){let t=this.parent;this.countable&&this.parentSub===null&&(t._length-=this.length),this.markDeleted(),Qr(e.deleteSet,this.id.client,this.id.clock,this.length),ih(e,t,this.parentSub),this.content.delete(e)}}gc(e,t){if(!this.deleted)throw _();this.content.gc(e),t?kg(e,this,new oe(this.id,this.length)):this.content=new lr(this.length)}write(e,t){let r=t>0?k(this.id.client,this.id.clock+t-1):this.origin,i=this.rightOrigin,s=this.parentSub,o=this.content.getRef()&31|(r===null?0:128)|(i===null?0:64)|(s===null?0:32);if(e.writeInfo(o),r!==null&&e.writeLeftID(r),i!==null&&e.writeRightID(i),r===null&&i===null){let l=this.parent;if(l._item!==void 0){let c=l._item;if(c===null){let a=xn(l);e.writeParentInfo(!0),e.writeString(a)}else e.writeParentInfo(!1),e.writeLeftID(c.id)}else l.constructor===String?(e.writeParentInfo(!0),e.writeString(l)):l.constructor===dt?(e.writeParentInfo(!1),e.writeLeftID(l)):_();s!==null&&e.writeString(s)}this.content.write(e,t)}},Xh=(n,e)=>my[e&31](n),my=[()=>{_()},Zg,ny,Xg,sy,ey,ty,py,iy,Qg,()=>{_()}],gy=10,Q=class extends or{get deleted(){return!0}delete(){}mergeWith(e){return this.constructor!==e.constructor?!1:(this.length+=e.length,!0)}integrate(e,t){_()}write(e,t){e.writeInfo(gy),S(e.restEncoder,this.length-t)}getMissing(e,t){return null}},Zh=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:{},Qh="__ $YJS$ __";Zh[Qh]===!0&&console.error("Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438");Zh[Qh]=!0;var Nd={};pe(Nd,{ProsemirrorBinding:()=>Ui,absolutePositionToRelativePosition:()=>Gt,createDecorations:()=>vc,defaultAwarenessStateFilter:()=>Cd,defaultCursorBuilder:()=>Td,defaultDeleteFilter:()=>Ad,defaultProtectedNodes:()=>Ed,defaultSelectionBuilder:()=>Dd,getRelativeSelection:()=>Or,initProseMirrorDoc:()=>xd,isVisible:()=>Dr,prosemirrorJSONToYDoc:()=>bd,prosemirrorJSONToYXmlFragment:()=>wd,prosemirrorToYDoc:()=>Rc,prosemirrorToYXmlFragment:()=>ao,redo:()=>Md,redoCommand:()=>cb,relativePositionToAbsolutePosition:()=>ot,setMeta:()=>co,undo:()=>Od,undoCommand:()=>lb,updateYFragment:()=>Bn,yCursorPlugin:()=>ob,yCursorPluginKey:()=>Tr,yDocToProsemirror:()=>Sd,yDocToProsemirrorJSON:()=>_c,ySyncPlugin:()=>dd,ySyncPluginKey:()=>R,yUndoPlugin:()=>ab,yUndoPluginKey:()=>qe,yXmlFragmentToProseMirrorFragment:()=>Ic,yXmlFragmentToProseMirrorRootNode:()=>yd,yXmlFragmentToProsemirror:()=>kd,yXmlFragmentToProsemirrorJSON:()=>ho});var od={};pe(od,{Decoration:()=>Ae,DecorationSet:()=>H,EditorView:()=>ro,__endComposition:()=>Rx,__parseFromClipboard:()=>Ix});var Zf={};pe(Zf,{AllSelection:()=>fe,EditorState:()=>Wl,NodeSelection:()=>w,Plugin:()=>P,PluginKey:()=>Ve,Selection:()=>T,SelectionRange:()=>On,TextSelection:()=>D,Transaction:()=>js});var vl={};pe(vl,{ContentMatch:()=>zt,DOMParser:()=>ur,DOMSerializer:()=>$t,Fragment:()=>y,Mark:()=>E,MarkType:()=>fr,Node:()=>ae,NodeRange:()=>Lt,NodeType:()=>mi,ReplaceError:()=>yt,ResolvedPos:()=>pi,Schema:()=>gi,Slice:()=>b});function ce(n){this.content=n}ce.prototype={constructor:ce,find:function(n){for(var e=0;e>1}};ce.from=function(n){if(n instanceof ce)return n;var e=[];if(n)for(var t in n)e.push(t,n[t]);return new ce(e)};var Ol=ce;function hf(n,e,t){for(let r=0;;r++){if(r==n.childCount||r==e.childCount)return n.childCount==e.childCount?null:t;let i=n.child(r),s=e.child(r);if(i==s){t+=i.nodeSize;continue}if(!i.sameMarkup(s))return t;if(i.isText&&i.text!=s.text){let o=i.text,l=s.text,c=0;for(;o[c]==l[c];c++)t++;return c&&c0&&u>0&&a[f-1]==h[u-1];)f--,u--,t--,r--;return f&&u&&f=56320&&n<57344}function df(n){return n>=55296&&n<56320}var y=class n{constructor(e,t){if(this.content=e,this.size=t||0,t==null)for(let r=0;re&&r(c,i+l,s||null,o)!==!1&&c.content.size){let h=l+1;c.nodesBetween(Math.max(0,e-h),Math.min(c.content.size,t-h),r,i+h)}l=a}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,r,i){let s="",o=!0;return this.nodesBetween(e,t,(l,c)=>{let a=l.isText?l.text.slice(Math.max(e,c)-c,t-c):l.isLeaf?i?typeof i=="function"?i(l):i:l.type.spec.leafText?l.type.spec.leafText(l):"":"";l.isBlock&&(l.isLeaf&&a||l.isTextblock)&&r&&(o?o=!1:s+=r),s+=a},0),s}append(e){if(!e.size)return this;if(!this.size)return e;let t=this.lastChild,r=e.firstChild,i=this.content.slice(),s=0;for(t.isText&&t.sameMarkup(r)&&(i[i.length-1]=t.withText(t.text+r.text),s=1);se)for(let s=0,o=0;oe&&((ot)&&(l.isText?l=l.cut(Math.max(0,e-o),Math.min(l.text.length,t-o)):l=l.cut(Math.max(0,e-o-1),Math.min(l.content.size,t-o-1))),r.push(l),i+=l.nodeSize),o=c}return new n(r,i)}cutByIndex(e,t){return e==t?n.empty:e==0&&t==this.content.length?this:new n(this.content.slice(e,t))}replaceChild(e,t){let r=this.content[e];if(r==t)return this;let i=this.content.slice(),s=this.size+t.nodeSize-r.nodeSize;return i[e]=t,new n(i,s)}addToStart(e){return new n([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new n(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;tthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let t=0,r=0;;t++){let i=this.child(t),s=r+i.nodeSize;if(s>=e)return s==e?Us(t+1,s):Us(t,r);r=s}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,t){if(!t)return n.empty;if(!Array.isArray(t))throw new RangeError("Invalid input for Fragment.fromJSON");return n.fromArray(t.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return n.empty;let t,r=0;for(let i=0;ithis.type.rank&&(t||(t=e.slice(0,i)),t.push(this),r=!0),t&&t.push(s)}}return t||(t=e.slice()),r||t.push(this),t}removeFromSet(e){for(let t=0;tr.type.rank-i.type.rank),t}};E.none=[];var yt=class extends Error{},b=class n{constructor(e,t,r){this.content=e,this.openStart=t,this.openEnd=r}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,t){let r=mf(this.content,e+this.openStart,t,this.openStart+1,this.openEnd+1);return r&&new n(r,this.openStart,this.openEnd)}removeBetween(e,t){return new n(pf(this.content,e+this.openStart,t+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,t){if(!t)return n.empty;let r=t.openStart||0,i=t.openEnd||0;if(typeof r!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new n(y.fromJSON(e,t.content),r,i)}static maxOpen(e,t=!0){let r=0,i=0;for(let s=e.firstChild;s&&!s.isLeaf&&(t||!s.type.spec.isolating);s=s.firstChild)r++;for(let s=e.lastChild;s&&!s.isLeaf&&(t||!s.type.spec.isolating);s=s.lastChild)i++;return new n(e,r,i)}};b.empty=new b(y.empty,0,0);function pf(n,e,t){let{index:r,offset:i}=n.findIndex(e),s=n.maybeChild(r),{index:o,offset:l}=n.findIndex(t);if(i==e||s.isText){if(l!=t&&!n.child(o).isText)throw new RangeError("Removing non-flat range");return n.cut(0,e).append(n.cut(t))}if(r!=o)throw new RangeError("Removing non-flat range");return n.replaceChild(r,s.copy(pf(s.content,e-i-1,t-i-1)))}function mf(n,e,t,r,i,s){let{index:o,offset:l}=n.findIndex(e),c=n.maybeChild(o);if(l==e||c.isText)return s&&r<=0&&i<=0&&!s.canReplace(o,o,t)?null:n.cut(0,e).append(t).append(n.cut(e));let a=mf(c.content,e-l-1,t,o==0?r-1:0,o==n.childCount-1?i-1:0,c);return a&&n.replaceChild(o,c.copy(a))}function yy(n,e,t){if(t.openStart>n.depth)throw new yt("Inserted content deeper than insertion position");if(n.depth-t.openStart!=e.depth-t.openEnd)throw new yt("Inconsistent open depths");return gf(n,e,t,0)}function gf(n,e,t,r){let i=n.index(r),s=n.node(r);if(i==e.index(r)&&r=0&&n.isText&&n.sameMarkup(e[t])?e[t]=n.withText(e[t].text+n.text):e.push(n)}function ui(n,e,t,r){let i=(e||n).node(t),s=0,o=e?e.index(t):i.childCount;n&&(s=n.index(t),n.depth>t?s++:n.textOffset&&(wn(n.nodeAfter,r),s++));for(let l=s;li&&El(n,e,i+1),o=r.depth>i&&El(t,r,i+1),l=[];return ui(null,n,i,l),s&&o&&e.index(i)==t.index(i)?(yf(s,o),wn(Sn(s,xf(n,e,t,r,i+1)),l)):(s&&wn(Sn(s,Ls(n,e,i+1)),l),ui(e,t,i,l),o&&wn(Sn(o,Ls(t,r,i+1)),l)),ui(r,null,i,l),new y(l)}function Ls(n,e,t){let r=[];if(ui(null,n,t,r),n.depth>t){let i=El(n,e,t+1);wn(Sn(i,Ls(n,e,t+1)),r)}return ui(e,null,t,r),new y(r)}function xy(n,e){let t=e.depth-n.openStart,i=e.node(t).copy(n.content);for(let s=t-1;s>=0;s--)i=e.node(s).copy(y.from(i));return{start:i.resolveNoCache(n.openStart+t),end:i.resolveNoCache(i.content.size-n.openEnd-t)}}var pi=class n{constructor(e,t,r){this.pos=e,this.path=t,this.parentOffset=r,this.depth=t.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,t=this.index(this.depth);if(t==e.childCount)return null;let r=this.pos-this.path[this.path.length-1],i=e.child(t);return r?e.child(t).cut(r):i}get nodeBefore(){let e=this.index(this.depth),t=this.pos-this.path[this.path.length-1];return t?this.parent.child(e).cut(0,t):e==0?null:this.parent.child(e-1)}posAtIndex(e,t){t=this.resolveDepth(t);let r=this.path[t*3],i=t==0?0:this.path[t*3-1]+1;for(let s=0;s0;t--)if(this.start(t)<=e&&this.end(t)>=e)return t;return 0}blockRange(e=this,t){if(e.pos=0;r--)if(e.pos<=this.end(r)&&(!t||t(this.node(r))))return new Lt(this,e,r);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&t<=e.content.size))throw new RangeError("Position "+t+" out of range");let r=[],i=0,s=t;for(let o=e;;){let{index:l,offset:c}=o.content.findIndex(s),a=s-c;if(r.push(o,l,i+c),!a||(o=o.child(l),o.isText))break;s=a-1,i+=c+1}return new n(t,r,s)}static resolveCached(e,t){let r=ef.get(e);if(r)for(let s=0;se&&this.nodesBetween(e,t,s=>(r.isInSet(s.marks)&&(i=!0),!i)),i}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),bf(this.marks,e)}contentMatchAt(e){let t=this.type.contentMatch.matchFragment(this.content,0,e);if(!t)throw new Error("Called contentMatchAt on a node with invalid content");return t}canReplace(e,t,r=y.empty,i=0,s=r.childCount){let o=this.contentMatchAt(e).matchFragment(r,i,s),l=o&&o.matchFragment(this.content,t);if(!l||!l.validEnd)return!1;for(let c=i;ct.type.name)}`);this.content.forEach(t=>t.check())}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(t=>t.toJSON())),e}static fromJSON(e,t){if(!t)throw new RangeError("Invalid input for Node.fromJSON");let r;if(t.marks){if(!Array.isArray(t.marks))throw new RangeError("Invalid mark data for Node.fromJSON");r=t.marks.map(e.markFromJSON)}if(t.type=="text"){if(typeof t.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(t.text,r)}let i=y.fromJSON(e,t.content),s=e.nodeType(t.type).create(t.attrs,i,r);return s.type.checkAttrs(s.attrs),s}};ae.prototype.text=void 0;var Nl=class n extends ae{constructor(e,t,r,i){if(super(e,t,null,i),!r)throw new RangeError("Empty text nodes are not allowed");this.text=r}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):bf(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,t){return this.text.slice(e,t)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new n(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new n(this.type,this.attrs,e,this.marks)}cut(e=0,t=this.text.length){return e==0&&t==this.text.length?this:this.withText(this.text.slice(e,t))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function bf(n,e){for(let t=n.length-1;t>=0;t--)e=n[t].type.name+"("+e+")";return e}var zt=class n{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,t){let r=new Il(e,t);if(r.next==null)return n.empty;let i=wf(r);r.next&&r.err("Unexpected trailing text");let s=My(Oy(i));return Ey(s,r),s}matchType(e){for(let t=0;ta.createAndFill()));for(let a=0;a=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function t(r){e.push(r);for(let i=0;i{let s=i+(r.validEnd?"*":" ")+" ";for(let o=0;o"+e.indexOf(r.next[o].next);return s}).join(` +`)}};zt.empty=new zt(!0);var Il=class{constructor(e,t){this.string=e,this.nodeTypes=t,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}};function wf(n){let e=[];do e.push(Sy(n));while(n.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function Sy(n){let e=[];do e.push(ky(n));while(n.next&&n.next!=")"&&n.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function ky(n){let e=Dy(n);for(;;)if(n.eat("+"))e={type:"plus",expr:e};else if(n.eat("*"))e={type:"star",expr:e};else if(n.eat("?"))e={type:"opt",expr:e};else if(n.eat("{"))e=Cy(n,e);else break;return e}function tf(n){/\D/.test(n.next)&&n.err("Expected number, got '"+n.next+"'");let e=Number(n.next);return n.pos++,e}function Cy(n,e){let t=tf(n),r=t;return n.eat(",")&&(n.next!="}"?r=tf(n):r=-1),n.eat("}")||n.err("Unclosed braced range"),{type:"range",min:t,max:r,expr:e}}function Ty(n,e){let t=n.nodeTypes,r=t[e];if(r)return[r];let i=[];for(let s in t){let o=t[s];o.isInGroup(e)&&i.push(o)}return i.length==0&&n.err("No node type or group '"+e+"' found"),i}function Dy(n){if(n.eat("(")){let e=wf(n);return n.eat(")")||n.err("Missing closing paren"),e}else if(/\W/.test(n.next))n.err("Unexpected token '"+n.next+"'");else{let e=Ty(n,n.next).map(t=>(n.inline==null?n.inline=t.isInline:n.inline!=t.isInline&&n.err("Mixing inline and block content"),{type:"name",value:t}));return n.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function Oy(n){let e=[[]];return i(s(n,0),t()),e;function t(){return e.push([])-1}function r(o,l,c){let a={term:c,to:l};return e[o].push(a),a}function i(o,l){o.forEach(c=>c.to=l)}function s(o,l){if(o.type=="choice")return o.exprs.reduce((c,a)=>c.concat(s(a,l)),[]);if(o.type=="seq")for(let c=0;;c++){let a=s(o.exprs[c],l);if(c==o.exprs.length-1)return a;i(a,l=t())}else if(o.type=="star"){let c=t();return r(l,c),i(s(o.expr,c),c),[r(c)]}else if(o.type=="plus"){let c=t();return i(s(o.expr,l),c),i(s(o.expr,c),c),[r(c)]}else{if(o.type=="opt")return[r(l)].concat(s(o.expr,l));if(o.type=="range"){let c=l;for(let a=0;a{n[o].forEach(({term:l,to:c})=>{if(!l)return;let a;for(let h=0;h{a||i.push([l,a=[]]),a.indexOf(h)==-1&&a.push(h)})})});let s=e[r.join(",")]=new zt(r.indexOf(n.length-1)>-1);for(let o=0;o-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:Cf(this.attrs,e)}create(e=null,t,r){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new ae(this,this.computeAttrs(e),y.from(t),E.setFrom(r))}createChecked(e=null,t,r){return t=y.from(t),this.checkContent(t),new ae(this,this.computeAttrs(e),t,E.setFrom(r))}createAndFill(e=null,t,r){if(e=this.computeAttrs(e),t=y.from(t),t.size){let o=this.contentMatch.fillBefore(t);if(!o)return null;t=o.append(t)}let i=this.contentMatch.matchFragment(t),s=i&&i.fillBefore(y.empty,!0);return s?new ae(this,e,t.append(s),E.setFrom(r)):null}validContent(e){let t=this.contentMatch.matchFragment(e);if(!t||!t.validEnd)return!1;for(let r=0;r-1}allowsMarks(e){if(this.markSet==null)return!0;for(let t=0;tr[s]=new n(s,t,o));let i=t.spec.topNode||"doc";if(!r[i])throw new RangeError("Schema is missing its top node type ('"+i+"')");if(!r.text)throw new RangeError("Every schema needs a 'text' type");for(let s in r.text.attrs)throw new RangeError("The text node type should not have attributes");return r}};function Ay(n,e,t){let r=t.split("|");return i=>{let s=i===null?"null":typeof i;if(r.indexOf(s)<0)throw new RangeError(`Expected value of type ${r} for attribute ${e} on type ${n}, got ${s}`)}}var Rl=class{constructor(e,t,r){this.hasDefault=Object.prototype.hasOwnProperty.call(r,"default"),this.default=r.default,this.validate=typeof r.validate=="string"?Ay(e,t,r.validate):r.validate}get isRequired(){return!this.hasDefault}},fr=class n{constructor(e,t,r,i){this.name=e,this.rank=t,this.schema=r,this.spec=i,this.attrs=Df(e,i.attrs),this.excluded=null;let s=kf(this.attrs);this.instance=s?new E(this,s):null}create(e=null){return!e&&this.instance?this.instance:new E(this,Cf(this.attrs,e))}static compile(e,t){let r=Object.create(null),i=0;return e.forEach((s,o)=>r[s]=new n(s,i++,t,o)),r}removeFromSet(e){for(var t=0;t-1}},gi=class{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let t=this.spec={};for(let i in e)t[i]=e[i];t.nodes=Ol.from(e.nodes),t.marks=Ol.from(e.marks||{}),this.nodes=mi.compile(this.spec.nodes,this),this.marks=fr.compile(this.spec.marks,this);let r=Object.create(null);for(let i in this.nodes){if(i in this.marks)throw new RangeError(i+" can not be both a node and a mark");let s=this.nodes[i],o=s.spec.content||"",l=s.spec.marks;if(s.contentMatch=r[o]||(r[o]=zt.parse(o,this.nodes)),s.inlineContent=s.contentMatch.inlineContent,s.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!s.isInline||!s.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=s}s.markSet=l=="_"?null:l?rf(this,l.split(" ")):l==""||!s.inlineContent?[]:null}for(let i in this.marks){let s=this.marks[i],o=s.spec.excludes;s.excluded=o==null?[s]:o==""?[]:rf(this,o.split(" "))}this.nodeFromJSON=i=>ae.fromJSON(this,i),this.markFromJSON=i=>E.fromJSON(this,i),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,t=null,r,i){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof mi){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(t,r,i)}text(e,t){let r=this.nodes.text;return new Nl(r,r.defaultAttrs,e,E.setFrom(t))}mark(e,t){return typeof e=="string"&&(e=this.marks[e]),e.create(t)}nodeType(e){let t=this.nodes[e];if(!t)throw new RangeError("Unknown node type: "+e);return t}};function rf(n,e){let t=[];for(let r=0;r-1)&&t.push(o=c)}if(!o)throw new SyntaxError("Unknown mark type: '"+e[r]+"'")}return t}function Ny(n){return n.tag!=null}function Iy(n){return n.style!=null}var ur=class n{constructor(e,t){this.schema=e,this.rules=t,this.tags=[],this.styles=[];let r=this.matchedStyles=[];t.forEach(i=>{if(Ny(i))this.tags.push(i);else if(Iy(i)){let s=/[^=]*/.exec(i.style)[0];r.indexOf(s)<0&&r.push(s),this.styles.push(i)}}),this.normalizeLists=!this.tags.some(i=>{if(!/^(ul|ol)\b/.test(i.tag)||!i.node)return!1;let s=e.nodes[i.node];return s.contentMatch.matchType(s)})}parse(e,t={}){let r=new zs(this,t,!1);return r.addAll(e,E.none,t.from,t.to),r.finish()}parseSlice(e,t={}){let r=new zs(this,t,!0);return r.addAll(e,E.none,t.from,t.to),b.maxOpen(r.finish())}matchTag(e,t,r){for(let i=r?this.tags.indexOf(r)+1:0;ie.length&&(l.charCodeAt(e.length)!=61||l.slice(e.length+1)!=t))){if(o.getAttrs){let c=o.getAttrs(t);if(c===!1)continue;o.attrs=c||void 0}return o}}}static schemaRules(e){let t=[];function r(i){let s=i.priority==null?50:i.priority,o=0;for(;o{r(o=of(o)),o.mark||o.ignore||o.clearMark||(o.mark=i)})}for(let i in e.nodes){let s=e.nodes[i].spec.parseDOM;s&&s.forEach(o=>{r(o=of(o)),o.node||o.ignore||o.mark||(o.node=i)})}return t}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new n(e,n.schemaRules(e)))}},Of={address:!0,article:!0,aside:!0,blockquote:!0,body:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},Ry={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},Mf={ol:!0,ul:!0},yi=1,_l=2,di=4;function sf(n,e,t){return e!=null?(e?yi:0)|(e==="full"?_l:0):n&&n.whitespace=="pre"?yi|_l:t&~di}var hr=class{constructor(e,t,r,i,s,o){this.type=e,this.attrs=t,this.marks=r,this.solid=i,this.options=o,this.content=[],this.activeMarks=E.none,this.match=s||(o&di?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let t=this.type.contentMatch.fillBefore(y.from(e));if(t)this.match=this.type.contentMatch.matchFragment(t);else{let r=this.type.contentMatch,i;return(i=r.findWrapping(e.type))?(this.match=r,i):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&yi)){let r=this.content[this.content.length-1],i;if(r&&r.isText&&(i=/[ \t\r\n\u000c]+$/.exec(r.text))){let s=r;r.text.length==i[0].length?this.content.pop():this.content[this.content.length-1]=s.withText(s.text.slice(0,s.text.length-i[0].length))}}let t=y.from(this.content);return!e&&this.match&&(t=t.append(this.match.fillBefore(y.empty,!0))),this.type?this.type.create(this.attrs,t,this.marks):t}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!Of.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}},zs=class{constructor(e,t,r){this.parser=e,this.options=t,this.isOpen=r,this.open=0,this.localPreserveWS=!1;let i=t.topNode,s,o=sf(null,t.preserveWhitespace,0)|(r?di:0);i?s=new hr(i.type,i.attrs,E.none,!0,t.topMatch||i.type.contentMatch,o):r?s=new hr(null,null,E.none,!0,null,o):s=new hr(e.schema.topNodeType,null,E.none,!0,null,o),this.nodes=[s],this.find=t.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,t){e.nodeType==3?this.addTextNode(e,t):e.nodeType==1&&this.addElement(e,t)}addTextNode(e,t){let r=e.nodeValue,i=this.top,s=i.options&_l?"full":this.localPreserveWS||(i.options&yi)>0,{schema:o}=this.parser;if(s==="full"||i.inlineContext(e)||/[^ \t\r\n\u000c]/.test(r)){if(s)if(s==="full")r=r.replace(/\r\n?/g,` +`);else if(o.linebreakReplacement&&/[\r\n]/.test(r)&&this.top.findWrapping(o.linebreakReplacement.create())){let l=r.split(/\r?\n|\r/);for(let c=0;c!c.clearMark(a)):t=t.concat(this.parser.schema.marks[c.mark].create(c.attrs)),c.consuming===!1)l=c;else break}}return t}addElementByRule(e,t,r,i){let s,o;if(t.node)if(o=this.parser.schema.nodes[t.node],o.isLeaf)this.insertNode(o.create(t.attrs),r,e.nodeName=="BR")||this.leafFallback(e,r);else{let c=this.enter(o,t.attrs||null,r,t.preserveWhitespace);c&&(s=!0,r=c)}else{let c=this.parser.schema.marks[t.mark];r=r.concat(c.create(t.attrs))}let l=this.top;if(o&&o.isLeaf)this.findInside(e);else if(i)this.addElement(e,r,i);else if(t.getContent)this.findInside(e),t.getContent(e,this.parser.schema).forEach(c=>this.insertNode(c,r,!1));else{let c=e;typeof t.contentElement=="string"?c=e.querySelector(t.contentElement):typeof t.contentElement=="function"?c=t.contentElement(e):t.contentElement&&(c=t.contentElement),this.findAround(e,c,!0),this.addAll(c,r),this.findAround(e,c,!1)}s&&this.sync(l)&&this.open--}addAll(e,t,r,i){let s=r||0;for(let o=r?e.childNodes[r]:e.firstChild,l=i==null?null:e.childNodes[i];o!=l;o=o.nextSibling,++s)this.findAtPoint(e,s),this.addDOM(o,t);this.findAtPoint(e,s)}findPlace(e,t,r){let i,s;for(let o=this.open,l=0;o>=0;o--){let c=this.nodes[o],a=c.findWrapping(e);if(a&&(!i||i.length>a.length+l)&&(i=a,s=c,!a.length))break;if(c.solid){if(r)break;l+=2}}if(!i)return null;this.sync(s);for(let o=0;o(o.type?o.type.allowsMarkType(a.type):lf(a.type,e))?(c=a.addToSet(c),!1):!0),this.nodes.push(new hr(e,t,c,i,null,l)),this.open++,r}closeExtra(e=!1){let t=this.nodes.length-1;if(t>this.open){for(;t>this.open;t--)this.nodes[t-1].content.push(this.nodes[t].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!!(this.isOpen||this.options.topOpen))}sync(e){for(let t=this.open;t>=0;t--){if(this.nodes[t]==e)return this.open=t,!0;this.localPreserveWS&&(this.nodes[t].options|=yi)}return!1}get currentPos(){this.closeExtra();let e=0;for(let t=this.open;t>=0;t--){let r=this.nodes[t].content;for(let i=r.length-1;i>=0;i--)e+=r[i].nodeSize;t&&e++}return e}findAtPoint(e,t){if(this.find)for(let r=0;r-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let t=e.split("/"),r=this.options.context,i=!this.isOpen&&(!r||r.parent.type==this.nodes[0].type),s=-(r?r.depth+1:0)+(i?0:1),o=(l,c)=>{for(;l>=0;l--){let a=t[l];if(a==""){if(l==t.length-1||l==0)continue;for(;c>=s;c--)if(o(l-1,c))return!0;return!1}else{let h=c>0||c==0&&i?this.nodes[c].type:r&&c>=s?r.node(c-s).type:null;if(!h||h.name!=a&&!h.isInGroup(a))return!1;c--}}return!0};return o(t.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let t=e.depth;t>=0;t--){let r=e.node(t).contentMatchAt(e.indexAfter(t)).defaultType;if(r&&r.isTextblock&&r.defaultAttrs)return r}for(let t in this.parser.schema.nodes){let r=this.parser.schema.nodes[t];if(r.isTextblock&&r.defaultAttrs)return r}}};function _y(n){for(let e=n.firstChild,t=null;e;e=e.nextSibling){let r=e.nodeType==1?e.nodeName.toLowerCase():null;r&&Mf.hasOwnProperty(r)&&t?(t.appendChild(e),e=t):r=="li"?t=e:r&&(t=null)}}function vy(n,e){return(n.matches||n.msMatchesSelector||n.webkitMatchesSelector||n.mozMatchesSelector).call(n,e)}function of(n){let e={};for(let t in n)e[t]=n[t];return e}function lf(n,e){let t=e.schema.nodes;for(let r in t){let i=t[r];if(!i.allowsMarkType(n))continue;let s=[],o=l=>{s.push(l);for(let c=0;c{if(s.length||o.marks.length){let l=0,c=0;for(;l=0;i--){let s=this.serializeMark(e.marks[i],e.isInline,t);s&&((s.contentDOM||s.dom).appendChild(r),r=s.dom)}return r}serializeMark(e,t,r={}){let i=this.marks[e.type.name];return i&&Ps(Bs(r),i(e,t),null,e.attrs)}static renderSpec(e,t,r=null,i){return typeof t=="string"?{dom:e.createTextNode(t)}:Ps(e,t,r,i)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new n(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let t=cf(e.nodes);return t.text||(t.text=r=>r.text),t}static marksFromSchema(e){return cf(e.marks)}};function cf(n){let e={};for(let t in n){let r=n[t].spec.toDOM;r&&(e[t]=r)}return e}function Bs(n){return n.document||window.document}var af=new WeakMap;function Vy(n){let e=af.get(n);return e===void 0&&af.set(n,e=Uy(n)),e}function Uy(n){let e=null;function t(r){if(r&&typeof r=="object")if(Array.isArray(r))if(typeof r[0]=="string")e||(e=[]),e.push(r);else for(let i=0;i-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let o=i.indexOf(" ");o>0&&(t=i.slice(0,o),i=i.slice(o+1));let l,c=t?n.createElementNS(t,i):n.createElement(i),a=e[1],h=1;if(a&&typeof a=="object"&&a.nodeType==null&&!Array.isArray(a)){h=2;for(let f in a)if(a[f]!=null){let u=f.indexOf(" ");u>0?c.setAttributeNS(f.slice(0,u),f.slice(u+1),a[f]):f=="style"&&c.style?c.style.cssText=a[f]:c.setAttribute(f,a[f])}}for(let f=h;fh)throw new RangeError("Content hole must be the only child of its parent node");return{dom:c,contentDOM:c}}else if(typeof u=="string")c.appendChild(n.createTextNode(u));else{let{dom:d,contentDOM:p}=Ps(n,u,t,r);if(c.appendChild(d),p){if(l)throw new RangeError("Multiple content holes");l=p}}}return{dom:c,contentDOM:l}}var qf={};pe(qf,{AddMarkStep:()=>mr,AddNodeMarkStep:()=>gr,AttrStep:()=>wi,DocAttrStep:()=>Si,MapResult:()=>dr,Mapping:()=>pr,RemoveMarkStep:()=>qt,RemoveNodeMarkStep:()=>kn,ReplaceAroundStep:()=>W,ReplaceStep:()=>he,Step:()=>J,StepMap:()=>rt,StepResult:()=>K,Transform:()=>ki,TransformError:()=>Cn,canJoin:()=>ze,canSplit:()=>xt,dropPoint:()=>Ci,findWrapping:()=>Tn,insertPoint:()=>Pf,joinPoint:()=>qs,liftTarget:()=>Jt,replaceStep:()=>yr});var Nf=65535,If=Math.pow(2,16);function By(n,e){return n+e*If}function Ef(n){return n&Nf}function Py(n){return(n-(n&Nf))/If}var Rf=1,_f=2,$s=4,vf=8,dr=class{constructor(e,t,r){this.pos=e,this.delInfo=t,this.recover=r}get deleted(){return(this.delInfo&vf)>0}get deletedBefore(){return(this.delInfo&(Rf|$s))>0}get deletedAfter(){return(this.delInfo&(_f|$s))>0}get deletedAcross(){return(this.delInfo&$s)>0}},rt=class n{constructor(e,t=!1){if(this.ranges=e,this.inverted=t,!e.length&&n.empty)return n.empty}recover(e){let t=0,r=Ef(e);if(!this.inverted)for(let i=0;ie)break;let a=this.ranges[l+s],h=this.ranges[l+o],f=c+a;if(e<=f){let u=a?e==c?-1:e==f?1:t:t,d=c+i+(u<0?0:h);if(r)return d;let p=e==(t<0?c:f)?null:By(l/3,e-c),m=e==c?_f:e==f?Rf:$s;return(t<0?e!=c:e!=f)&&(m|=vf),new dr(d,m,p)}i+=h-a}return r?e+i:new dr(e+i,0,null)}touches(e,t){let r=0,i=Ef(t),s=this.inverted?2:1,o=this.inverted?1:2;for(let l=0;le)break;let a=this.ranges[l+s],h=c+a;if(e<=h&&l==i*3)return!0;r+=this.ranges[l+o]-a}return!1}forEach(e){let t=this.inverted?2:1,r=this.inverted?1:2;for(let i=0,s=0;i=0;t--){let i=e.getMirror(t);this.appendMap(e._maps[t].invert(),i!=null&&i>t?r-i-1:void 0)}}invert(){let e=new n;return e.appendMappingInverted(this),e}map(e,t=1){if(this.mirror)return this._map(e,t,!0);for(let r=this.from;rs&&c!o.isAtom||!l.type.allowsMarkType(this.mark.type)?o:o.mark(this.mark.addToSet(o.marks)),i),t.openStart,t.openEnd);return K.fromReplace(e,this.from,this.to,s)}invert(){return new qt(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return t.deleted&&r.deleted||t.pos>=r.pos?null:new n(t.pos,r.pos,this.mark)}merge(e){return e instanceof n&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new n(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new n(t.from,t.to,e.markFromJSON(t.mark))}};J.jsonID("addMark",mr);var qt=class n extends J{constructor(e,t,r){super(),this.from=e,this.to=t,this.mark=r}apply(e){let t=e.slice(this.from,this.to),r=new b(Ll(t.content,i=>i.mark(this.mark.removeFromSet(i.marks)),e),t.openStart,t.openEnd);return K.fromReplace(e,this.from,this.to,r)}invert(){return new mr(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return t.deleted&&r.deleted||t.pos>=r.pos?null:new n(t.pos,r.pos,this.mark)}merge(e){return e instanceof n&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new n(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new n(t.from,t.to,e.markFromJSON(t.mark))}};J.jsonID("removeMark",qt);var gr=class n extends J{constructor(e,t){super(),this.pos=e,this.mark=t}apply(e){let t=e.nodeAt(this.pos);if(!t)return K.fail("No node at mark step's position");let r=t.type.create(t.attrs,null,this.mark.addToSet(t.marks));return K.fromReplace(e,this.pos,this.pos+1,new b(y.from(r),0,t.isLeaf?0:1))}invert(e){let t=e.nodeAt(this.pos);if(t){let r=this.mark.addToSet(t.marks);if(r.length==t.marks.length){for(let i=0;ir.pos?null:new n(t.pos,r.pos,i,s,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,t){if(typeof t.from!="number"||typeof t.to!="number"||typeof t.gapFrom!="number"||typeof t.gapTo!="number"||typeof t.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new n(t.from,t.to,t.gapFrom,t.gapTo,b.fromJSON(e,t.slice),t.insert,!!t.structure)}};J.jsonID("replaceAround",W);function Pl(n,e,t){let r=n.resolve(e),i=t-e,s=r.depth;for(;i>0&&s>0&&r.indexAfter(s)==r.node(s).childCount;)s--,i--;if(i>0){let o=r.node(s).maybeChild(r.indexAfter(s));for(;i>0;){if(!o||o.isLeaf)return!0;o=o.firstChild,i--}}return!1}function Fy(n,e,t,r){let i=[],s=[],o,l;n.doc.nodesBetween(e,t,(c,a,h)=>{if(!c.isInline)return;let f=c.marks;if(!r.isInSet(f)&&h.type.allowsMarkType(r.type)){let u=Math.max(a,e),d=Math.min(a+c.nodeSize,t),p=r.addToSet(f);for(let m=0;mn.step(c)),s.forEach(c=>n.step(c))}function Ly(n,e,t,r){let i=[],s=0;n.doc.nodesBetween(e,t,(o,l)=>{if(!o.isInline)return;s++;let c=null;if(r instanceof fr){let a=o.marks,h;for(;h=r.isInSet(a);)(c||(c=[])).push(h),a=h.removeFromSet(a)}else r?r.isInSet(o.marks)&&(c=[r]):c=o.marks;if(c&&c.length){let a=Math.min(l+o.nodeSize,t);for(let h=0;hn.step(new qt(o.from,o.to,o.style)))}function zl(n,e,t,r=t.contentMatch,i=!0){let s=n.doc.nodeAt(e),o=[],l=e+1;for(let c=0;c=0;c--)n.step(o[c])}function zy(n,e,t){return(e==0||n.canReplace(e,n.childCount))&&(t==n.childCount||n.canReplace(0,t))}function Jt(n){let t=n.parent.content.cutByIndex(n.startIndex,n.endIndex);for(let r=n.depth,i=0,s=0;;--r){let o=n.$from.node(r),l=n.$from.index(r)+i,c=n.$to.indexAfter(r)-s;if(rt;p--)m||r.index(p)>0?(m=!0,h=y.from(r.node(p).copy(h)),f++):c--;let u=y.empty,d=0;for(let p=s,m=!1;p>t;p--)m||i.after(p+1)=0;o--){if(r.size){let l=t[o].type.contentMatch.matchFragment(r);if(!l||!l.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=y.from(t[o].type.create(t[o].attrs,r))}let i=e.start,s=e.end;n.step(new W(i,s,i,s,new b(r,0,0),t.length,!0))}function jy(n,e,t,r,i){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let s=n.steps.length;n.doc.nodesBetween(e,t,(o,l)=>{let c=typeof i=="function"?i(o):i;if(o.isTextblock&&!o.hasMarkup(r,c)&&Yy(n.doc,n.mapping.slice(s).map(l),r)){let a=null;if(r.schema.linebreakReplacement){let d=r.whitespace=="pre",p=!!r.contentMatch.matchType(r.schema.linebreakReplacement);d&&!p?a=!1:!d&&p&&(a=!0)}a===!1&&Uf(n,o,l,s),zl(n,n.mapping.slice(s).map(l,1),r,void 0,a===null);let h=n.mapping.slice(s),f=h.map(l,1),u=h.map(l+o.nodeSize,1);return n.step(new W(f,u,f+1,u-1,new b(y.from(r.create(c,null,o.marks)),0,0),1,!0)),a===!0&&Vf(n,o,l,s),!1}})}function Vf(n,e,t,r){e.forEach((i,s)=>{if(i.isText){let o,l=/\r?\n|\r/g;for(;o=l.exec(i.text);){let c=n.mapping.slice(r).map(t+1+s+o.index);n.replaceWith(c,c+1,e.type.schema.linebreakReplacement.create())}}})}function Uf(n,e,t,r){e.forEach((i,s)=>{if(i.type==i.type.schema.linebreakReplacement){let o=n.mapping.slice(r).map(t+1+s);n.replaceWith(o,o+1,e.type.schema.text(` +`))}})}function Yy(n,e,t){let r=n.resolve(e),i=r.index();return r.parent.canReplaceWith(i,i+1,t)}function Ky(n,e,t,r,i){let s=n.doc.nodeAt(e);if(!s)throw new RangeError("No node at given position");t||(t=s.type);let o=t.create(r,null,i||s.marks);if(s.isLeaf)return n.replaceWith(e,e+s.nodeSize,o);if(!t.validContent(s.content))throw new RangeError("Invalid content for node type "+t.name);n.step(new W(e,e+s.nodeSize,e+1,e+s.nodeSize-1,new b(y.from(o),0,0),1,!0))}function xt(n,e,t=1,r){let i=n.resolve(e),s=i.depth-t,o=r&&r[r.length-1]||i.parent;if(s<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!o.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let a=i.depth-1,h=t-2;a>s;a--,h--){let f=i.node(a),u=i.index(a);if(f.type.spec.isolating)return!1;let d=f.content.cutByIndex(u,f.childCount),p=r&&r[h+1];p&&(d=d.replaceChild(0,p.type.create(p.attrs)));let m=r&&r[h]||f;if(!f.canReplace(u+1,f.childCount)||!m.type.validContent(d))return!1}let l=i.indexAfter(s),c=r&&r[0];return i.node(s).canReplaceWith(l,l,c?c.type:i.node(s+1).type)}function Hy(n,e,t=1,r){let i=n.doc.resolve(e),s=y.empty,o=y.empty;for(let l=i.depth,c=i.depth-t,a=t-1;l>c;l--,a--){s=y.from(i.node(l).copy(s));let h=r&&r[a];o=y.from(h?h.type.create(h.attrs,o):i.node(l).copy(o))}n.step(new he(e,e,new b(s.append(o),t,t),!0))}function ze(n,e){let t=n.resolve(e),r=t.index();return Bf(t.nodeBefore,t.nodeAfter)&&t.parent.canReplace(r,r+1)}function Gy(n,e){e.content.size||n.type.compatibleContent(e.type);let t=n.contentMatchAt(n.childCount),{linebreakReplacement:r}=n.type.schema;for(let i=0;i0?(s=r.node(i+1),l++,o=r.node(i).maybeChild(l)):(s=r.node(i).maybeChild(l-1),o=r.node(i+1)),s&&!s.isTextblock&&Bf(s,o)&&r.node(i).canReplace(l,l+1))return e;if(i==0)break;e=t<0?r.before(i):r.after(i)}}function Xy(n,e,t){let r=null,{linebreakReplacement:i}=n.doc.type.schema,s=n.doc.resolve(e-t),o=s.node().type;if(i&&o.inlineContent){let h=o.whitespace=="pre",f=!!o.contentMatch.matchType(i);h&&!f?r=!1:!h&&f&&(r=!0)}let l=n.steps.length;if(r===!1){let h=n.doc.resolve(e+t);Uf(n,h.node(),h.before(),l)}o.inlineContent&&zl(n,e+t-1,o,s.node().contentMatchAt(s.index()),r==null);let c=n.mapping.slice(l),a=c.map(e-t);if(n.step(new he(a,c.map(e+t,-1),b.empty,!0)),r===!0){let h=n.doc.resolve(a);Vf(n,h.node(),h.before(),n.steps.length)}return n}function Pf(n,e,t){let r=n.resolve(e);if(r.parent.canReplaceWith(r.index(),r.index(),t))return e;if(r.parentOffset==0)for(let i=r.depth-1;i>=0;i--){let s=r.index(i);if(r.node(i).canReplaceWith(s,s,t))return r.before(i+1);if(s>0)return null}if(r.parentOffset==r.parent.content.size)for(let i=r.depth-1;i>=0;i--){let s=r.indexAfter(i);if(r.node(i).canReplaceWith(s,s,t))return r.after(i+1);if(s=0;o--){let l=o==r.depth?0:r.pos<=(r.start(o+1)+r.end(o+1))/2?-1:1,c=r.index(o)+(l>0?1:0),a=r.node(o),h=!1;if(s==1)h=a.canReplace(c,c,i);else{let f=a.contentMatchAt(c).findWrapping(i.firstChild.type);h=f&&a.canReplaceWith(c,c,f[0])}if(h)return l==0?r.pos:l<0?r.before(o+1):r.after(o+1)}return null}function yr(n,e,t=e,r=b.empty){if(e==t&&!r.size)return null;let i=n.resolve(e),s=n.resolve(t);return Ff(i,s,r)?new he(e,t,r):new Fl(i,s,r).fit()}function Ff(n,e,t){return!t.openStart&&!t.openEnd&&n.start()==e.start()&&n.parent.canReplace(n.index(),e.index(),t.content)}var Fl=class{constructor(e,t,r){this.$from=e,this.$to=t,this.unplaced=r,this.frontier=[],this.placed=y.empty;for(let i=0;i<=e.depth;i++){let s=e.node(i);this.frontier.push({type:s.type,match:s.contentMatchAt(e.indexAfter(i))})}for(let i=e.depth;i>0;i--)this.placed=y.from(e.node(i).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let a=this.findFittable();a?this.placeNodes(a):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),t=this.placed.size-this.depth-this.$from.depth,r=this.$from,i=this.close(e<0?this.$to:r.doc.resolve(e));if(!i)return null;let s=this.placed,o=r.depth,l=i.depth;for(;o&&l&&s.childCount==1;)s=s.firstChild.content,o--,l--;let c=new b(s,o,l);return e>-1?new W(r.pos,e,this.$to.pos,this.$to.end(),c,t):c.size||r.pos!=this.$to.pos?new he(r.pos,i.pos,c):null}findFittable(){let e=this.unplaced.openStart;for(let t=this.unplaced.content,r=0,i=this.unplaced.openEnd;r1&&(i=0),s.type.spec.isolating&&i<=r){e=r;break}t=s.content}for(let t=1;t<=2;t++)for(let r=t==1?e:this.unplaced.openStart;r>=0;r--){let i,s=null;r?(s=Ul(this.unplaced.content,r-1).firstChild,i=s.content):i=this.unplaced.content;let o=i.firstChild;for(let l=this.depth;l>=0;l--){let{type:c,match:a}=this.frontier[l],h,f=null;if(t==1&&(o?a.matchType(o.type)||(f=a.fillBefore(y.from(o),!1)):s&&c.compatibleContent(s.type)))return{sliceDepth:r,frontierDepth:l,parent:s,inject:f};if(t==2&&o&&(h=a.findWrapping(o.type)))return{sliceDepth:r,frontierDepth:l,parent:s,wrap:h};if(s&&a.matchType(s.type))break}}}openMore(){let{content:e,openStart:t,openEnd:r}=this.unplaced,i=Ul(e,t);return!i.childCount||i.firstChild.isLeaf?!1:(this.unplaced=new b(e,t+1,Math.max(r,i.size+t>=e.size-r?t+1:0)),!0)}dropNode(){let{content:e,openStart:t,openEnd:r}=this.unplaced,i=Ul(e,t);if(i.childCount<=1&&t>0){let s=e.size-t<=t+i.size;this.unplaced=new b(xi(e,t-1,1),t-1,s?t-1:r)}else this.unplaced=new b(xi(e,t,1),t,r)}placeNodes({sliceDepth:e,frontierDepth:t,parent:r,inject:i,wrap:s}){for(;this.depth>t;)this.closeFrontierNode();if(s)for(let m=0;m1||c==0||m.content.size)&&(f=g,h.push(Lf(m.mark(u.allowedMarks(m.marks)),a==1?c:0,a==l.childCount?d:-1)))}let p=a==l.childCount;p||(d=-1),this.placed=bi(this.placed,t,y.from(h)),this.frontier[t].match=f,p&&d<0&&r&&r.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let m=0,g=l;m1&&i==this.$to.end(--r);)++i;return i}findCloseLevel(e){e:for(let t=Math.min(this.depth,e.depth);t>=0;t--){let{match:r,type:i}=this.frontier[t],s=t=0;l--){let{match:c,type:a}=this.frontier[l],h=Bl(e,l,a,c,!0);if(!h||h.childCount)continue e}return{depth:t,fit:o,move:s?e.doc.resolve(e.after(t+1)):e}}}}close(e){let t=this.findCloseLevel(e);if(!t)return null;for(;this.depth>t.depth;)this.closeFrontierNode();t.fit.childCount&&(this.placed=bi(this.placed,t.depth,t.fit)),e=t.move;for(let r=t.depth+1;r<=e.depth;r++){let i=e.node(r),s=i.type.contentMatch.fillBefore(i.content,!0,e.index(r));this.openFrontierNode(i.type,i.attrs,s)}return e}openFrontierNode(e,t=null,r){let i=this.frontier[this.depth];i.match=i.match.matchType(e),this.placed=bi(this.placed,this.depth,y.from(e.create(t,r))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let t=this.frontier.pop().match.fillBefore(y.empty,!0);t.childCount&&(this.placed=bi(this.placed,this.frontier.length,t))}};function xi(n,e,t){return e==0?n.cutByIndex(t,n.childCount):n.replaceChild(0,n.firstChild.copy(xi(n.firstChild.content,e-1,t)))}function bi(n,e,t){return e==0?n.append(t):n.replaceChild(n.childCount-1,n.lastChild.copy(bi(n.lastChild.content,e-1,t)))}function Ul(n,e){for(let t=0;t1&&(r=r.replaceChild(0,Lf(r.firstChild,e-1,r.childCount==1?t-1:0))),e>0&&(r=n.type.contentMatch.fillBefore(r).append(r),t<=0&&(r=r.append(n.type.contentMatch.matchFragment(r).fillBefore(y.empty,!0)))),n.copy(r)}function Bl(n,e,t,r,i){let s=n.node(e),o=i?n.indexAfter(e):n.index(e);if(o==s.childCount&&!t.compatibleContent(s.type))return null;let l=r.fillBefore(s.content,!0,o);return l&&!Zy(t,s.content,o)?l:null}function Zy(n,e,t){for(let r=t;r0;u--,d--){let p=i.node(u).type.spec;if(p.defining||p.definingAsContext||p.isolating)break;o.indexOf(u)>-1?l=u:i.before(u)==d&&o.splice(1,0,-u)}let c=o.indexOf(l),a=[],h=r.openStart;for(let u=r.content,d=0;;d++){let p=u.firstChild;if(a.push(p),d==r.openStart)break;u=p.content}for(let u=h-1;u>=0;u--){let d=a[u],p=Qy(d.type);if(p&&!d.sameMarkup(i.node(Math.abs(l)-1)))h=u;else if(p||!d.type.isTextblock)break}for(let u=r.openStart;u>=0;u--){let d=(u+h+1)%(r.openStart+1),p=a[d];if(p)for(let m=0;m=0&&(n.replace(e,t,r),!(n.steps.length>f));u--){let d=o[u];d<0||(e=i.before(d),t=s.after(d))}}function zf(n,e,t,r,i){if(er){let s=i.contentMatchAt(0),o=s.fillBefore(n).append(n);n=o.append(s.matchFragment(o).fillBefore(y.empty,!0))}return n}function t0(n,e,t,r){if(!r.isInline&&e==t&&n.doc.resolve(e).parent.content.size){let i=Pf(n.doc,e,r.type);i!=null&&(e=t=i)}n.replaceRange(e,t,new b(y.from(r),0,0))}function n0(n,e,t){let r=n.doc.resolve(e),i=n.doc.resolve(t);if(r.parent.isTextblock&&i.parent.isTextblock&&r.start()!=i.start()&&r.parentOffset==0&&i.parentOffset==0){let o=r.sharedDepth(t),l=!1;for(let c=r.depth;c>o;c--)r.node(c).type.spec.isolating&&(l=!0);for(let c=i.depth;c>o;c--)i.node(c).type.spec.isolating&&(l=!0);if(!l){for(let c=r.depth;c>0&&e==r.start(c);c--)e=r.before(c);for(let c=i.depth;c>0&&t==i.start(c);c--)t=i.before(c);r=n.doc.resolve(e),i=n.doc.resolve(t)}}let s=$f(r,i);for(let o=0;o0&&(c||r.node(l-1).canReplace(r.index(l-1),i.indexAfter(l-1))))return n.delete(r.before(l),i.after(l))}for(let o=1;o<=r.depth&&o<=i.depth;o++)if(e-r.start(o)==r.depth-o&&t>r.end(o)&&i.end(o)-t!=i.depth-o&&r.start(o-1)==i.start(o-1)&&r.node(o-1).canReplace(r.index(o-1),i.index(o-1)))return n.delete(r.before(o),t);n.delete(e,t)}function $f(n,e){let t=[],r=Math.min(n.depth,e.depth);for(let i=r;i>=0;i--){let s=n.start(i);if(se.pos+(e.depth-i)||n.node(i).type.spec.isolating||e.node(i).type.spec.isolating)break;(s==e.start(i)||i==n.depth&&i==e.depth&&n.parent.inlineContent&&e.parent.inlineContent&&i&&e.start(i-1)==s-1)&&t.push(i)}return t}var wi=class n extends J{constructor(e,t,r){super(),this.pos=e,this.attr=t,this.value=r}apply(e){let t=e.nodeAt(this.pos);if(!t)return K.fail("No node at attribute step's position");let r=Object.create(null);for(let s in t.attrs)r[s]=t.attrs[s];r[this.attr]=this.value;let i=t.type.create(r,null,t.marks);return K.fromReplace(e,this.pos,this.pos+1,new b(y.from(i),0,t.isLeaf?0:1))}getMap(){return rt.empty}invert(e){return new n(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let t=e.mapResult(this.pos,1);return t.deletedAfter?null:new n(t.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.pos!="number"||typeof t.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new n(t.pos,t.attr,t.value)}};J.jsonID("attr",wi);var Si=class n extends J{constructor(e,t){super(),this.attr=e,this.value=t}apply(e){let t=Object.create(null);for(let i in e.attrs)t[i]=e.attrs[i];t[this.attr]=this.value;let r=e.type.create(t,e.content,e.marks);return K.ok(r)}getMap(){return rt.empty}invert(e){return new n(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,t){if(typeof t.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new n(t.attr,t.value)}};J.jsonID("docAttr",Si);var Cn=class extends Error{};Cn=function n(e){let t=Error.call(this,e);return t.__proto__=n.prototype,t};Cn.prototype=Object.create(Error.prototype);Cn.prototype.constructor=Cn;Cn.prototype.name="TransformError";var ki=class{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new pr}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let t=this.maybeStep(e);if(t.failed)throw new Cn(t.failed);return this}maybeStep(e){let t=e.apply(this.doc);return t.failed||this.addStep(e,t.doc),t}get docChanged(){return this.steps.length>0}changedRange(){let e=1e9,t=-1e9;for(let r=0;r{e=Math.min(e,l),t=Math.max(t,c)})}return e==1e9?null:{from:e,to:t}}addStep(e,t){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=t}replace(e,t=e,r=b.empty){let i=yr(this.doc,e,t,r);return i&&this.step(i),this}replaceWith(e,t,r){return this.replace(e,t,new b(y.from(r),0,0))}delete(e,t){return this.replace(e,t,b.empty)}insert(e,t){return this.replaceWith(e,e,t)}replaceRange(e,t,r){return e0(this,e,t,r),this}replaceRangeWith(e,t,r){return t0(this,e,t,r),this}deleteRange(e,t){return n0(this,e,t),this}lift(e,t){return $y(this,e,t),this}join(e,t=1){return Xy(this,e,t),this}wrap(e,t){return Wy(this,e,t),this}setBlockType(e,t=e,r,i=null){return jy(this,e,t,r,i),this}setNodeMarkup(e,t,r=null,i){return Ky(this,e,t,r,i),this}setNodeAttribute(e,t,r){return this.step(new wi(e,t,r)),this}setDocAttribute(e,t){return this.step(new Si(e,t)),this}addNodeMark(e,t){return this.step(new gr(e,t)),this}removeNodeMark(e,t){let r=this.doc.nodeAt(e);if(!r)throw new RangeError("No node at position "+e);if(t instanceof E)t.isInSet(r.marks)&&this.step(new kn(e,t));else{let i=r.marks,s,o=[];for(;s=t.isInSet(i);)o.push(new kn(e,s)),i=s.removeFromSet(i);for(let l=o.length-1;l>=0;l--)this.step(o[l])}return this}split(e,t=1,r){return Hy(this,e,t,r),this}addMark(e,t,r){return Fy(this,e,t,r),this}removeMark(e,t,r){return Ly(this,e,t,r),this}clearIncompatible(e,t,r){return zl(this,e,t,r),this}};var $l=Object.create(null),T=class{constructor(e,t,r){this.$anchor=e,this.$head=t,this.ranges=r||[new On(e.min(t),e.max(t))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let t=0;t=0;s--){let o=t<0?xr(e.node(0),e.node(s),e.before(s+1),e.index(s),t,r):xr(e.node(0),e.node(s),e.after(s+1),e.index(s)+1,t,r);if(o)return o}return null}static near(e,t=1){return this.findFrom(e,t)||this.findFrom(e,-t)||new fe(e.node(0))}static atStart(e){return xr(e,e,0,0,1)||new fe(e)}static atEnd(e){return xr(e,e,e.content.size,e.childCount,-1)||new fe(e)}static fromJSON(e,t){if(!t||!t.type)throw new RangeError("Invalid input for Selection.fromJSON");let r=$l[t.type];if(!r)throw new RangeError(`No selection type ${t.type} defined`);return r.fromJSON(e,t)}static jsonID(e,t){if(e in $l)throw new RangeError("Duplicate use of selection JSON ID "+e);return $l[e]=t,t.prototype.jsonID=e,t}getBookmark(){return D.between(this.$anchor,this.$head).getBookmark()}};T.prototype.visible=!0;var On=class{constructor(e,t){this.$from=e,this.$to=t}},Jf=!1;function Wf(n){!Jf&&!n.parent.inlineContent&&(Jf=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+n.parent.type.name+")"))}var D=class n extends T{constructor(e,t=e){Wf(e),Wf(t),super(e,t)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,t){let r=e.resolve(t.map(this.head));if(!r.parent.inlineContent)return T.near(r);let i=e.resolve(t.map(this.anchor));return new n(i.parent.inlineContent?i:r,r)}replace(e,t=b.empty){if(super.replace(e,t),t==b.empty){let r=this.$from.marksAcross(this.$to);r&&e.ensureMarks(r)}}eq(e){return e instanceof n&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new Ws(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,t){if(typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new n(e.resolve(t.anchor),e.resolve(t.head))}static create(e,t,r=t){let i=e.resolve(t);return new this(i,r==t?i:e.resolve(r))}static between(e,t,r){let i=e.pos-t.pos;if((!r||i)&&(r=i>=0?1:-1),!t.parent.inlineContent){let s=T.findFrom(t,r,!0)||T.findFrom(t,-r,!0);if(s)t=s.$head;else return T.near(t,r)}return e.parent.inlineContent||(i==0?e=t:(e=(T.findFrom(e,-r,!0)||T.findFrom(e,r,!0)).$anchor,e.pos0?0:1);i>0?o=0;o+=i){let l=e.child(o);if(l.isAtom){if(!s&&w.isSelectable(l))return w.create(n,t-(i<0?l.nodeSize:0))}else{let c=xr(n,l,t+i,i<0?l.childCount:0,i,s);if(c)return c}t+=l.nodeSize*i}return null}function jf(n,e,t){let r=n.steps.length-1;if(r{o==null&&(o=h)}),n.setSelection(T.near(n.doc.resolve(o),t))}var Yf=1,Js=2,Kf=4,js=class extends ki{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=Js,this}ensureMarks(e){return E.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&Js)>0}addStep(e,t){super.addStep(e,t),this.updated=this.updated&~Js,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,t=!0){let r=this.selection;return t&&(e=e.mark(this.storedMarks||(r.empty?r.$from.marks():r.$from.marksAcross(r.$to)||E.none))),r.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,t,r){let i=this.doc.type.schema;if(t==null)return e?this.replaceSelectionWith(i.text(e),!0):this.deleteSelection();{if(r==null&&(r=t),!e)return this.deleteRange(t,r);let s=this.storedMarks;if(!s){let o=this.doc.resolve(t);s=r==t?o.marks():o.marksAcross(this.doc.resolve(r))}return this.replaceRangeWith(t,r,i.text(e,s)),!this.selection.empty&&this.selection.to==t+e.length&&this.setSelection(T.near(this.selection.$to)),this}}setMeta(e,t){return this.meta[typeof e=="string"?e:e.key]=t,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=Kf,this}get scrolledIntoView(){return(this.updated&Kf)>0}};function Hf(n,e){return!e||!n?n:n.bind(e)}var Dn=class{constructor(e,t,r){this.name=e,this.init=Hf(t.init,r),this.apply=Hf(t.apply,r)}},i0=[new Dn("doc",{init(n){return n.doc||n.schema.topNodeType.createAndFill()},apply(n){return n.doc}}),new Dn("selection",{init(n,e){return n.selection||T.atStart(e.doc)},apply(n){return n.selection}}),new Dn("storedMarks",{init(n){return n.storedMarks||null},apply(n,e,t,r){return r.selection.$cursor?n.storedMarks:null}}),new Dn("scrollToSelection",{init(){return 0},apply(n,e){return n.scrolledIntoView?e+1:e}})],Ti=class{constructor(e,t){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=i0.slice(),t&&t.forEach(r=>{if(this.pluginsByKey[r.key])throw new RangeError("Adding different instances of a keyed plugin ("+r.key+")");this.plugins.push(r),this.pluginsByKey[r.key]=r,r.spec.state&&this.fields.push(new Dn(r.key,r.spec.state,r))})}},Wl=class n{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,t=-1){for(let r=0;rr.toJSON())),e&&typeof e=="object")for(let r in e){if(r=="doc"||r=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let i=e[r],s=i.spec.state;s&&s.toJSON&&(t[r]=s.toJSON.call(i,this[i.key]))}return t}static fromJSON(e,t,r){if(!t)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let i=new Ti(e.schema,e.plugins),s=new n(i);return i.fields.forEach(o=>{if(o.name=="doc")s.doc=ae.fromJSON(e.schema,t.doc);else if(o.name=="selection")s.selection=T.fromJSON(s.doc,t.selection);else if(o.name=="storedMarks")t.storedMarks&&(s.storedMarks=t.storedMarks.map(e.schema.markFromJSON));else{if(r)for(let l in r){let c=r[l],a=c.spec.state;if(c.key==o.name&&a&&a.fromJSON&&Object.prototype.hasOwnProperty.call(t,l)){s[o.name]=a.fromJSON.call(c,e,t[l],s);return}}s[o.name]=o.init(e,s)}}),s}};function Gf(n,e,t){for(let r in n){let i=n[r];i instanceof Function?i=i.bind(e):r=="handleDOMEvents"&&(i=Gf(i,e,{})),t[r]=i}return t}var P=class{constructor(e){this.spec=e,this.props={},e.props&&Gf(e.props,this,this.props),this.key=e.key?e.key.key:Xf("plugin")}getState(e){return e[this.key]}},ql=Object.create(null);function Xf(n){return n in ql?n+"$"+ ++ql[n]:(ql[n]=0,n+"$")}var Ve=class{constructor(e="key"){this.key=Xf(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}};var te=function(n){for(var e=0;;e++)if(n=n.previousSibling,!n)return e},kr=function(n){let e=n.assignedSlot||n.parentNode;return e&&e.nodeType==11?e.host:e},Xl=null,wt=function(n,e,t){let r=Xl||(Xl=document.createRange());return r.setEnd(n,t??n.nodeValue.length),r.setStart(n,e||0),r},s0=function(){Xl=null},vn=function(n,e,t,r){return t&&(Qf(n,e,t,r,-1)||Qf(n,e,t,r,1))},o0=/^(img|br|input|textarea|hr)$/i;function Qf(n,e,t,r,i){for(var s;;){if(n==t&&e==r)return!0;if(e==(i<0?0:Be(n))){let o=n.parentNode;if(!o||o.nodeType!=1||Ri(n)||o0.test(n.nodeName)||n.contentEditable=="false")return!1;e=te(n)+(i<0?0:1),n=o}else if(n.nodeType==1){let o=n.childNodes[e+(i<0?-1:0)];if(o.nodeType==1&&o.contentEditable=="false")if(!((s=o.pmViewDesc)===null||s===void 0)&&s.ignoreForSelection)e+=i;else return!1;else n=o,e=i<0?Be(n):0}else return!1}}function Be(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function l0(n,e){for(;;){if(n.nodeType==3&&e)return n;if(n.nodeType==1&&e>0){if(n.contentEditable=="false")return null;n=n.childNodes[e-1],e=Be(n)}else if(n.parentNode&&!Ri(n))e=te(n),n=n.parentNode;else return null}}function c0(n,e){for(;;){if(n.nodeType==3&&e2),Ue=Cr||(it?/Mac/.test(it.platform):!1),Iu=it?/Win/.test(it.platform):!1,St=/Android \d/.test(Ht),_i=!!eu&&"webkitFontSmoothing"in eu.documentElement.style,u0=_i?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function d0(n){let e=n.defaultView&&n.defaultView.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:n.documentElement.clientWidth,top:0,bottom:n.documentElement.clientHeight}}function bt(n,e){return typeof n=="number"?n:n[e]}function p0(n){let e=n.getBoundingClientRect(),t=e.width/n.offsetWidth||1,r=e.height/n.offsetHeight||1;return{left:e.left,right:e.left+n.clientWidth*t,top:e.top,bottom:e.top+n.clientHeight*r}}function tu(n,e,t){if(!tc(e)&&e.left==0)return;let r=n.someProp("scrollThreshold")||0,i=n.someProp("scrollMargin")||5,s=n.dom.ownerDocument;for(let o=t||n.dom;o;){if(o.nodeType!=1){o=kr(o);continue}let l=o,c=l==s.body,a=c?d0(s):p0(l),h=0,f=0;if(e.topa.bottom-bt(r,"bottom")&&(f=e.bottom-e.top>a.bottom-a.top?e.top+bt(i,"top")-a.top:e.bottom-a.bottom+bt(i,"bottom")),e.lefta.right-bt(r,"right")&&(h=e.right-a.right+bt(i,"right")),h||f)if(c)s.defaultView.scrollBy(h,f);else{let d=l.scrollLeft,p=l.scrollTop;f&&(l.scrollTop+=f),h&&(l.scrollLeft+=h);let m=l.scrollLeft-d,g=l.scrollTop-p;e={left:e.left-m,top:e.top-g,right:e.right-m,bottom:e.bottom-g}}let u=c?"fixed":getComputedStyle(o).position;if(/^(fixed|sticky)$/.test(u))break;o=u=="absolute"?o.offsetParent:kr(o)}}function m0(n){let e=n.dom.getBoundingClientRect(),t=Math.max(0,e.top),r,i;for(let s=(e.left+e.right)/2,o=t+1;o=t-20){r=l,i=c.top;break}}return{refDOM:r,refTop:i,stack:Ru(n.dom)}}function Ru(n){let e=[],t=n.ownerDocument;for(let r=n;r&&(e.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),n!=t);r=kr(r));return e}function g0({refDOM:n,refTop:e,stack:t}){let r=n?n.getBoundingClientRect().top:0;_u(t,r==0?0:r-e)}function _u(n,e){for(let t=0;t=l){o=Math.max(p.bottom,o),l=Math.min(p.top,l);let m=p.left>e.left?p.left-e.left:p.right=(p.left+p.right)/2?1:0));continue}}else p.top>e.top&&!c&&p.left<=e.left&&p.right>=e.left&&(c=h,a={left:Math.max(p.left,Math.min(p.right,e.left)),top:p.top});!t&&(e.left>=p.right&&e.top>=p.top||e.left>=p.left&&e.top>=p.bottom)&&(s=f+1)}}return!t&&c&&(t=c,i=a,r=0),t&&t.nodeType==3?x0(t,i):!t||r&&t.nodeType==1?{node:n,offset:s}:vu(t,i)}function x0(n,e){let t=n.nodeValue.length,r=document.createRange(),i;for(let s=0;s=(o.left+o.right)/2?1:0)};break}}return r.detach(),i||{node:n,offset:0}}function yc(n,e){return n.left>=e.left-1&&n.left<=e.right+1&&n.top>=e.top-1&&n.top<=e.bottom+1}function b0(n,e){let t=n.parentNode;return t&&/^li$/i.test(t.nodeName)&&e.left(o.left+o.right)/2?1:-1}return n.docView.posFromDOM(r,i,s)}function S0(n,e,t,r){let i=-1;for(let s=e,o=!1;s!=n.dom;){let l=n.docView.nearestDesc(s,!0),c;if(!l)return null;if(l.dom.nodeType==1&&(l.node.isBlock&&l.parent||!l.contentDOM)&&((c=l.dom.getBoundingClientRect()).width||c.height)&&(l.node.isBlock&&l.parent&&!/^T(R|BODY|HEAD|FOOT)$/.test(l.dom.nodeName)&&(!o&&c.left>r.left||c.top>r.top?i=l.posBefore:(!o&&c.right-1?i:n.docView.posFromDOM(e,t,-1)}function Vu(n,e,t){let r=n.childNodes.length;if(r&&t.tope.top&&i++}let a;_i&&i&&r.nodeType==1&&(a=r.childNodes[i-1]).nodeType==1&&a.contentEditable=="false"&&a.getBoundingClientRect().top>=e.top&&i--,r==n.dom&&i==r.childNodes.length-1&&r.lastChild.nodeType==1&&e.top>r.lastChild.getBoundingClientRect().bottom?l=n.state.doc.content.size:(i==0||r.nodeType!=1||r.childNodes[i-1].nodeName!="BR")&&(l=S0(n,r,i,e))}l==null&&(l=w0(n,o,e));let c=n.docView.nearestDesc(o,!0);return{pos:l,inside:c?c.posAtStart-c.border:-1}}function tc(n){return n.top=0&&i==r.nodeValue.length?(c--,h=1):t<0?c--:a++,Di(Wt(wt(r,c,a),h),h<0)}if(!n.state.doc.resolve(e-(s||0)).parent.inlineContent){if(s==null&&i&&(t<0||i==Be(r))){let c=r.childNodes[i-1];if(c.nodeType==1)return jl(c.getBoundingClientRect(),!1)}if(s==null&&i=0)}if(s==null&&i&&(t<0||i==Be(r))){let c=r.childNodes[i-1],a=c.nodeType==3?wt(c,Be(c)-(o?0:1)):c.nodeType==1&&(c.nodeName!="BR"||!c.nextSibling)?c:null;if(a)return Di(Wt(a,1),!1)}if(s==null&&i=0)}function Di(n,e){if(n.width==0)return n;let t=e?n.left:n.right;return{top:n.top,bottom:n.bottom,left:t,right:t}}function jl(n,e){if(n.height==0)return n;let t=e?n.top:n.bottom;return{top:t,bottom:t,left:n.left,right:n.right}}function Bu(n,e,t){let r=n.state,i=n.root.activeElement;r!=e&&n.updateState(e),i!=n.dom&&n.focus();try{return t()}finally{r!=e&&n.updateState(r),i!=n.dom&&i&&i.focus()}}function T0(n,e,t){let r=e.selection,i=t=="up"?r.$from:r.$to;return Bu(n,e,()=>{let{node:s}=n.docView.domFromPos(i.pos,t=="up"?-1:1);for(;;){let l=n.docView.nearestDesc(s,!0);if(!l)break;if(l.node.isBlock){s=l.contentDOM||l.dom;break}s=l.dom.parentNode}let o=Uu(n,i.pos,1);for(let l=s.firstChild;l;l=l.nextSibling){let c;if(l.nodeType==1)c=l.getClientRects();else if(l.nodeType==3)c=wt(l,0,l.nodeValue.length).getClientRects();else continue;for(let a=0;ah.top+1&&(t=="up"?o.top-h.top>(h.bottom-o.top)*2:h.bottom-o.bottom>(o.bottom-h.top)*2))return!1}}return!0})}var D0=/[\u0590-\u08ac]/;function O0(n,e,t){let{$head:r}=e.selection;if(!r.parent.isTextblock)return!1;let i=r.parentOffset,s=!i,o=i==r.parent.content.size,l=n.domSelection();return l?!D0.test(r.parent.textContent)||!l.modify?t=="left"||t=="backward"?s:o:Bu(n,e,()=>{let{focusNode:c,focusOffset:a,anchorNode:h,anchorOffset:f}=n.domSelectionRange(),u=l.caretBidiLevel;l.modify("move",t,"character");let d=r.depth?n.docView.domAfterPos(r.before()):n.dom,{focusNode:p,focusOffset:m}=n.domSelectionRange(),g=p&&!d.contains(p.nodeType==1?p:p.parentNode)||c==p&&a==m;try{l.collapse(h,f),c&&(c!=h||a!=f)&&l.extend&&l.extend(c,a)}catch{}return u!=null&&(l.caretBidiLevel=u),g}):r.pos==r.start()||r.pos==r.end()}var nu=null,ru=null,iu=!1;function M0(n,e,t){return nu==e&&ru==t?iu:(nu=e,ru=t,iu=t=="up"||t=="down"?T0(n,e,t):O0(n,e,t))}var Fe=0,su=1,En=2,$e=3,Vn=class{constructor(e,t,r,i){this.parent=e,this.children=t,this.dom=r,this.contentDOM=i,this.dirty=Fe,r.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,t,r){return!1}matchesHack(e){return!1}parseRule(e){return null}stopEvent(e){return!1}get size(){let e=0;for(let t=0;tte(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))i=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(t==0)for(let s=e;;s=s.parentNode){if(s==this.dom){i=!1;break}if(s.previousSibling)break}if(i==null&&t==e.childNodes.length)for(let s=e;;s=s.parentNode){if(s==this.dom){i=!0;break}if(s.nextSibling)break}}return i??r>0?this.posAtEnd:this.posAtStart}nearestDesc(e,t=!1){for(let r=!0,i=e;i;i=i.parentNode){let s=this.getDesc(i),o;if(s&&(!t||s.node))if(r&&(o=s.nodeDOM)&&!(o.nodeType==1?o.contains(e.nodeType==1?e:e.parentNode):o==e))r=!1;else return s}}getDesc(e){let t=e.pmViewDesc;for(let r=t;r;r=r.parent)if(r==this)return t}posFromDOM(e,t,r){for(let i=e;i;i=i.parentNode){let s=this.getDesc(i);if(s)return s.localPosFromDOM(e,t,r)}return-1}descAt(e){for(let t=0,r=0;te||o instanceof Hs){i=e-s;break}s=l}if(i)return this.children[r].domFromPos(i-this.children[r].border,t);for(let s;r&&!(s=this.children[r-1]).size&&s instanceof Ys&&s.side>=0;r--);if(t<=0){let s,o=!0;for(;s=r?this.children[r-1]:null,!(!s||s.dom.parentNode==this.contentDOM);r--,o=!1);return s&&t&&o&&!s.border&&!s.domAtom?s.domFromPos(s.size,t):{node:this.contentDOM,offset:s?te(s.dom)+1:0}}else{let s,o=!0;for(;s=r=h&&t<=a-c.border&&c.node&&c.contentDOM&&this.contentDOM.contains(c.contentDOM))return c.parseRange(e,t,h);e=o;for(let f=l;f>0;f--){let u=this.children[f-1];if(u.size&&u.dom.parentNode==this.contentDOM&&!u.emptyChildAt(1)){i=te(u.dom)+1;break}e-=u.size}i==-1&&(i=0)}if(i>-1&&(a>t||l==this.children.length-1)){t=a;for(let h=l+1;hp&&ot){let p=l;l=c,c=p}let d=document.createRange();d.setEnd(c.node,c.offset),d.setStart(l.node,l.offset),a.removeAllRanges(),a.addRange(d)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,t){for(let r=0,i=0;i=r:er){let l=r+s.border,c=o-s.border;if(e>=l&&t<=c){this.dirty=e==r||t==o?En:su,e==l&&t==c&&(s.contentLost||s.dom.parentNode!=this.contentDOM)?s.dirty=$e:s.markDirty(e-l,t-l);return}else s.dirty=s.dom==s.contentDOM&&s.dom.parentNode==this.contentDOM&&!s.children.length?En:$e}r=o}this.dirty=En}markParentsDirty(){let e=1;for(let t=this.parent;t;t=t.parent,e++){let r=e==1?En:su;t.dirty{if(!s)return i;if(s.parent)return s.parent.posBeforeChild(s)})),!t.type.spec.raw){if(o.nodeType!=1){let l=document.createElement("span");l.appendChild(o),o=l}o.contentEditable="false",o.classList.add("ProseMirror-widget")}super(e,[],o,null),this.widget=t,this.widget=t,s=this}matchesWidget(e){return this.dirty==Fe&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let t=this.widget.spec.stopEvent;return t?t(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get ignoreForSelection(){return!!this.widget.type.spec.relaxedSide}get side(){return this.widget.type.side}},nc=class extends Vn{constructor(e,t,r,i){super(e,[],t,null),this.textDOM=r,this.text=i}get size(){return this.text.length}localPosFromDOM(e,t){return e!=this.textDOM?this.posAtStart+(t?this.size:0):this.posAtStart+t}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}},Nn=class n extends Vn{constructor(e,t,r,i,s){super(e,[],r,i),this.mark=t,this.spec=s}static create(e,t,r,i){let s=i.nodeViews[t.type.name],o=s&&s(t,i,r);return(!o||!o.dom)&&(o=$t.renderSpec(document,t.type.spec.toDOM(t,r),null,t.attrs)),new n(e,t,o.dom,o.contentDOM||o.dom,o)}parseRule(){return this.dirty&$e||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=$e&&this.mark.eq(e)}markDirty(e,t){if(super.markDirty(e,t),this.dirty!=Fe){let r=this.parent;for(;!r.node;)r=r.parent;r.dirty0&&(s=oc(s,0,e,r));for(let l=0;l{if(!c)return o;if(c.parent)return c.parent.posBeforeChild(c)},r,i),h=a&&a.dom,f=a&&a.contentDOM;if(t.isText){if(!h)h=document.createTextNode(t.text);else if(h.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else h||({dom:h,contentDOM:f}=$t.renderSpec(document,t.type.spec.toDOM(t),null,t.attrs));!f&&!t.isText&&h.nodeName!="BR"&&(h.hasAttribute("contenteditable")||(h.contentEditable="false"),t.type.spec.draggable&&(h.draggable=!0));let u=h;return h=Lu(h,r,t),a?c=new rc(e,t,r,i,h,f||null,u,a):t.isText?new Ks(e,t,r,i,h,u):new n(e,t,r,i,h,f||null,u)}parseRule(e){if(this.node.type.spec.reparseInView)return null;let t={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(t.preserveWhitespace="full"),!this.contentDOM)t.getContent=()=>this.node.content;else if(!this.contentLost)t.contentElement=this.contentDOM;else{for(let r=this.children.length-1;r>=0;r--){let i=this.children[r];if(this.dom.contains(i.dom.parentNode)){t.contentElement=i.dom.parentNode;break}}if(!t.contentElement){let r=e&&e.find(i=>i.nodeType==1&&e.indexOf(i.parentNode)<0&&this.dom.contains(i));r?t.contentElement=r:t.getContent=()=>y.empty}}return t}matchesNode(e,t,r){return this.dirty==Fe&&e.eq(this.node)&&Gs(t,this.outerDeco)&&r.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,t){let r=this.node.inlineContent,i=t,s=e.composing?this.localCompositionInfo(e,t):null,o=s&&s.pos>-1?s:null,l=s&&s.pos<0,c=new sc(this,o&&o.node,e);I0(this.node,this.innerDeco,(a,h,f)=>{a.spec.marks?c.syncToMarks(a.spec.marks,r,e,h):a.type.side>=0&&!f&&c.syncToMarks(h==this.node.childCount?E.none:this.node.child(h).marks,r,e,h),c.placeWidget(a,e,i)},(a,h,f,u)=>{c.syncToMarks(a.marks,r,e,u);let d;c.findNodeMatch(a,h,f,u)||l&&e.state.selection.from>i&&e.state.selection.to-1&&c.updateNodeAt(a,h,f,d,e)||c.updateNextNode(a,h,f,e,u,i)||c.addNode(a,h,f,e,i),i+=a.nodeSize}),c.syncToMarks([],r,e,0),this.node.isTextblock&&c.addTextblockHacks(),c.destroyRest(),(c.changed||this.dirty==En)&&(o&&this.protectLocalComposition(e,o),Pu(this.contentDOM,this.children,e),Cr&&R0(this.dom))}localCompositionInfo(e,t){let{from:r,to:i}=e.state.selection;if(!(e.state.selection instanceof D)||rt+this.node.content.size)return null;let s=e.input.compositionNode;if(!s||!this.dom.contains(s.parentNode))return null;if(this.node.inlineContent){let o=s.nodeValue,l=_0(this.node.content,o,r-t,i-t);return l<0?null:{node:s,pos:l,text:o}}else return{node:s,pos:-1,text:""}}protectLocalComposition(e,{node:t,pos:r,text:i}){if(this.getDesc(t))return;let s=t;for(;s.parentNode!=this.contentDOM;s=s.parentNode){for(;s.previousSibling;)s.parentNode.removeChild(s.previousSibling);for(;s.nextSibling;)s.parentNode.removeChild(s.nextSibling);s.pmViewDesc&&(s.pmViewDesc=void 0)}let o=new nc(this,s,t,i);e.input.compositionNodes.push(o),this.children=oc(this.children,r,r+i.length,e,o)}update(e,t,r,i){return this.dirty==$e||!e.sameMarkup(this.node)?!1:(this.updateInner(e,t,r,i),!0)}updateInner(e,t,r,i){this.updateOuterDeco(t),this.node=e,this.innerDeco=r,this.contentDOM&&this.updateChildren(i,this.posAtStart),this.dirty=Fe}updateOuterDeco(e){if(Gs(e,this.outerDeco))return;let t=this.nodeDOM.nodeType!=1,r=this.dom;this.dom=Fu(this.dom,this.nodeDOM,ic(this.outerDeco,this.node,t),ic(e,this.node,t)),this.dom!=r&&(r.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.nodeDOM.draggable=!0))}deselectNode(){this.nodeDOM.nodeType==1&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.nodeDOM.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}};function ou(n,e,t,r,i){Lu(r,e,n);let s=new Kt(void 0,n,e,t,r,r,r);return s.contentDOM&&s.updateChildren(i,0),s}var Ks=class n extends Kt{constructor(e,t,r,i,s,o){super(e,t,r,i,s,null,o)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,t,r,i){return this.dirty==$e||this.dirty!=Fe&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(t),(this.dirty!=Fe||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,i.trackWrites==this.nodeDOM&&(i.trackWrites=null)),this.node=e,this.dirty=Fe,!0)}inParent(){let e=this.parent.contentDOM;for(let t=this.nodeDOM;t;t=t.parentNode)if(t==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,t,r){return e==this.nodeDOM?this.posAtStart+Math.min(t,this.node.text.length):super.localPosFromDOM(e,t,r)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,t,r){let i=this.node.cut(e,t),s=document.createTextNode(i.text);return new n(this.parent,i,this.outerDeco,this.innerDeco,s,s)}markDirty(e,t){super.markDirty(e,t),this.dom!=this.nodeDOM&&(e==0||t==this.nodeDOM.nodeValue.length)&&(this.dirty=$e)}get domAtom(){return!1}isText(e){return this.node.text==e}},Hs=class extends Vn{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==Fe&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}},rc=class extends Kt{constructor(e,t,r,i,s,o,l,c){super(e,t,r,i,s,o,l),this.spec=c}update(e,t,r,i){if(this.dirty==$e)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let s=this.spec.update(e,t,r);return s&&this.updateInner(e,t,r,i),s}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,t,r,i)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,t,r,i){this.spec.setSelection?this.spec.setSelection(e,t,r.root):super.setSelection(e,t,r,i)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}};function Pu(n,e,t){let r=n.firstChild,i=!1;for(let s=0;s>1,l=Math.min(o,e.length);for(;s-1)c>this.index&&(this.changed=!0,this.destroyBetween(this.index,c)),this.top=this.top.children[this.index];else{let h=Nn.create(this.top,e[o],t,r);this.top.children.splice(this.index,0,h),this.top=h,this.changed=!0}this.index=0,o++}}findNodeMatch(e,t,r,i){let s=-1,o;if(i>=this.preMatch.index&&(o=this.preMatch.matches[i-this.preMatch.index]).parent==this.top&&o.matchesNode(e,t,r))s=this.top.children.indexOf(o,this.index);else for(let l=this.index,c=Math.min(this.top.children.length,l+5);l0;){let l;for(;;)if(r){let a=t.children[r-1];if(a instanceof Nn)t=a,r=a.children.length;else{l=a,r--;break}}else{if(t==e)break e;r=t.parent.children.indexOf(t),t=t.parent}let c=l.node;if(c){if(c!=n.child(i-1))break;--i,s.set(l,i),o.push(l)}}return{index:i,matched:s,matches:o.reverse()}}function N0(n,e){return n.type.side-e.type.side}function I0(n,e,t,r){let i=e.locals(n),s=0;if(i.length==0){for(let a=0;as;)l.push(i[o++]);let p=s+u.nodeSize;if(u.isText){let g=p;o!g.inline):l.slice();r(u,m,e.forChild(s,u),d),s=p}}function R0(n){if(n.nodeName=="UL"||n.nodeName=="OL"){let e=n.style.cssText;n.style.cssText=e+"; list-style: square !important",window.getComputedStyle(n).listStyle,n.style.cssText=e}}function _0(n,e,t,r){for(let i=0,s=0;i=t){if(s>=r&&c.slice(r-e.length-l,r-l)==e)return r-e.length;let a=l=0&&a+e.length+l>=t)return l+a;if(t==r&&c.length>=r+e.length-l&&c.slice(r-l,r-l+e.length)==e)return r}}return-1}function oc(n,e,t,r,i){let s=[];for(let o=0,l=0;o=t||h<=e?s.push(c):(at&&s.push(c.slice(t-a,c.size,r)))}return s}function xc(n,e=null){let t=n.domSelectionRange(),r=n.state.doc;if(!t.focusNode)return null;let i=n.docView.nearestDesc(t.focusNode),s=i&&i.size==0,o=n.docView.posFromDOM(t.focusNode,t.focusOffset,1);if(o<0)return null;let l=r.resolve(o),c,a;if(io(t)){for(c=o;i&&!i.node;)i=i.parent;let f=i.node;if(i&&f.isAtom&&w.isSelectable(f)&&i.parent&&!(f.isInline&&a0(t.focusNode,t.focusOffset,i.dom))){let u=i.posBefore;a=new w(o==u?l:r.resolve(u))}}else{if(t instanceof n.dom.ownerDocument.defaultView.Selection&&t.rangeCount>1){let f=o,u=o;for(let d=0;d{(t.anchorNode!=r||t.anchorOffset!=i)&&(e.removeEventListener("selectionchange",n.input.hideSelectionGuard),setTimeout(()=>{(!zu(n)||n.state.selection.visible)&&n.dom.classList.remove("ProseMirror-hideselection")},20))})}function V0(n){let e=n.domSelection();if(!e)return;let t=n.cursorWrapper.dom,r=t.nodeName=="IMG";r?e.collapse(t.parentNode,te(t)+1):e.collapse(t,0),!r&&!n.state.selection.visible&&Ee&&Yt<=11&&(t.disabled=!0,t.disabled=!1)}function $u(n,e){if(e instanceof w){let t=n.docView.descAt(e.from);t!=n.lastSelectedViewDesc&&(fu(n),t&&t.selectNode(),n.lastSelectedViewDesc=t)}else fu(n)}function fu(n){n.lastSelectedViewDesc&&(n.lastSelectedViewDesc.parent&&n.lastSelectedViewDesc.deselectNode(),n.lastSelectedViewDesc=void 0)}function bc(n,e,t,r){return n.someProp("createSelectionBetween",i=>i(n,e,t))||D.between(e,t,r)}function uu(n){return n.editable&&!n.hasFocus()?!1:qu(n)}function qu(n){let e=n.domSelectionRange();if(!e.anchorNode)return!1;try{return n.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(n.editable||n.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function U0(n){let e=n.docView.domFromPos(n.state.selection.anchor,0),t=n.domSelectionRange();return vn(e.node,e.offset,t.anchorNode,t.anchorOffset)}function lc(n,e){let{$anchor:t,$head:r}=n.selection,i=e>0?t.max(r):t.min(r),s=i.parent.inlineContent?i.depth?n.doc.resolve(e>0?i.after():i.before()):null:i;return s&&T.findFrom(s,e)}function jt(n,e){return n.dispatch(n.state.tr.setSelection(e).scrollIntoView()),!0}function du(n,e,t){let r=n.state.selection;if(r instanceof D)if(t.indexOf("s")>-1){let{$head:i}=r,s=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter;if(!s||s.isText||!s.isLeaf)return!1;let o=n.state.doc.resolve(i.pos+s.nodeSize*(e<0?-1:1));return jt(n,new D(r.$anchor,o))}else if(r.empty){if(n.endOfTextblock(e>0?"forward":"backward")){let i=lc(n.state,e);return i&&i instanceof w?jt(n,i):!1}else if(!(Ue&&t.indexOf("m")>-1)){let i=r.$head,s=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter,o;if(!s||s.isText)return!1;let l=e<0?i.pos-s.nodeSize:i.pos;return s.isAtom||(o=n.docView.descAt(l))&&!o.contentDOM?w.isSelectable(s)?jt(n,new w(e<0?n.state.doc.resolve(i.pos-s.nodeSize):i)):_i?jt(n,new D(n.state.doc.resolve(e<0?l:l+s.nodeSize))):!1:!1}}else return!1;else{if(r instanceof w&&r.node.isInline)return jt(n,new D(e>0?r.$to:r.$from));{let i=lc(n.state,e);return i?jt(n,i):!1}}}function Xs(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function Mi(n,e){let t=n.pmViewDesc;return t&&t.size==0&&(e<0||n.nextSibling||n.nodeName!="BR")}function wr(n,e){return e<0?B0(n):P0(n)}function B0(n){let e=n.domSelectionRange(),t=e.focusNode,r=e.focusOffset;if(!t)return;let i,s,o=!1;for(Pe&&t.nodeType==1&&r0){if(t.nodeType!=1)break;{let l=t.childNodes[r-1];if(Mi(l,-1))i=t,s=--r;else if(l.nodeType==3)t=l,r=t.nodeValue.length;else break}}else{if(Ju(t))break;{let l=t.previousSibling;for(;l&&Mi(l,-1);)i=t.parentNode,s=te(l),l=l.previousSibling;if(l)t=l,r=Xs(t);else{if(t=t.parentNode,t==n.dom)break;r=0}}}o?cc(n,t,r):i&&cc(n,i,s)}function P0(n){let e=n.domSelectionRange(),t=e.focusNode,r=e.focusOffset;if(!t)return;let i=Xs(t),s,o;for(;;)if(r{n.state==i&&Ct(n)},50)}function pu(n,e){let t=n.state.doc.resolve(e);if(!(ne||Iu)&&t.parent.inlineContent){let i=n.coordsAtPos(e);if(e>t.start()){let s=n.coordsAtPos(e-1),o=(s.top+s.bottom)/2;if(o>i.top&&o1)return s.lefti.top&&o1)return s.left>i.left?"ltr":"rtl"}}return getComputedStyle(n.dom).direction=="rtl"?"rtl":"ltr"}function mu(n,e,t){let r=n.state.selection;if(r instanceof D&&!r.empty||t.indexOf("s")>-1||Ue&&t.indexOf("m")>-1)return!1;let{$from:i,$to:s}=r;if(!i.parent.inlineContent||n.endOfTextblock(e<0?"up":"down")){let o=lc(n.state,e);if(o&&o instanceof w)return jt(n,o)}if(!i.parent.inlineContent){let o=e<0?i:s,l=r instanceof fe?T.near(o,e):T.findFrom(o,e);return l?jt(n,l):!1}return!1}function gu(n,e){if(!(n.state.selection instanceof D))return!0;let{$head:t,$anchor:r,empty:i}=n.state.selection;if(!t.sameParent(r))return!0;if(!i)return!1;if(n.endOfTextblock(e>0?"forward":"backward"))return!0;let s=!t.textOffset&&(e<0?t.nodeBefore:t.nodeAfter);if(s&&!s.isText){let o=n.state.tr;return e<0?o.delete(t.pos-s.nodeSize,t.pos):o.delete(t.pos,t.pos+s.nodeSize),n.dispatch(o),!0}return!1}function yu(n,e,t){n.domObserver.stop(),e.contentEditable=t,n.domObserver.start()}function z0(n){if(!de||n.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:t}=n.domSelectionRange();if(e&&e.nodeType==1&&t==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let r=e.firstChild;yu(n,r,"true"),setTimeout(()=>yu(n,r,"false"),20)}return!1}function $0(n){let e="";return n.ctrlKey&&(e+="c"),n.metaKey&&(e+="m"),n.altKey&&(e+="a"),n.shiftKey&&(e+="s"),e}function q0(n,e){let t=e.keyCode,r=$0(e);if(t==8||Ue&&t==72&&r=="c")return gu(n,-1)||wr(n,-1);if(t==46&&!e.shiftKey||Ue&&t==68&&r=="c")return gu(n,1)||wr(n,1);if(t==13||t==27)return!0;if(t==37||Ue&&t==66&&r=="c"){let i=t==37?pu(n,n.state.selection.from)=="ltr"?-1:1:-1;return du(n,i,r)||wr(n,i)}else if(t==39||Ue&&t==70&&r=="c"){let i=t==39?pu(n,n.state.selection.from)=="ltr"?1:-1:1;return du(n,i,r)||wr(n,i)}else{if(t==38||Ue&&t==80&&r=="c")return mu(n,-1,r)||wr(n,-1);if(t==40||Ue&&t==78&&r=="c")return z0(n)||mu(n,1,r)||wr(n,1);if(r==(Ue?"m":"c")&&(t==66||t==73||t==89||t==90))return!0}return!1}function wc(n,e){n.someProp("transformCopied",d=>{e=d(e,n)});let t=[],{content:r,openStart:i,openEnd:s}=e;for(;i>1&&s>1&&r.childCount==1&&r.firstChild.childCount==1;){i--,s--;let d=r.firstChild;t.push(d.type.name,d.attrs!=d.type.defaultAttrs?d.attrs:null),r=d.content}let o=n.someProp("clipboardSerializer")||$t.fromSchema(n.state.schema),l=Hu(),c=l.createElement("div");c.appendChild(o.serializeFragment(r,{document:l}));let a=c.firstChild,h,f=0;for(;a&&a.nodeType==1&&(h=Ku[a.nodeName.toLowerCase()]);){for(let d=h.length-1;d>=0;d--){let p=l.createElement(h[d]);for(;c.firstChild;)p.appendChild(c.firstChild);c.appendChild(p),f++}a=c.firstChild}a&&a.nodeType==1&&a.setAttribute("data-pm-slice",`${i} ${s}${f?` -${f}`:""} ${JSON.stringify(t)}`);let u=n.someProp("clipboardTextSerializer",d=>d(e,n))||e.content.textBetween(0,e.content.size,` -`);return{dom:a,text:u,slice:e}}function ar(r,e,t,n,i){let s=i.parent.type.spec.code,o,l;if(!t&&!e)return null;let a=!!e&&(n||s||!t);if(a){if(r.someProp("transformPastedText",u=>{e=u(e,s||n,r)}),s)return l=new x(y.from(r.state.schema.text(e.replace(/\r\n?/g,` -`))),0,0),r.someProp("transformPasted",u=>{l=u(l,r,!0)}),l;let h=r.someProp("clipboardTextParser",u=>u(e,i,n,r));if(h)l=h;else{let u=i.marks(),{schema:d}=r.state,p=ke.fromSchema(d);o=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(m=>{let g=o.appendChild(document.createElement("p"));m&&g.appendChild(p.serializeNode(d.text(m,u)))})}}else r.someProp("transformPastedHTML",h=>{t=h(t,r)}),o=aa(t),It&&fa(o);let f=o&&o.querySelector("[data-pm-slice]"),c=f&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(f.getAttribute("data-pm-slice")||"");if(c&&c[3])for(let h=+c[3];h>0;h--){let u=o.firstChild;for(;u&&u.nodeType!=1;)u=u.nextSibling;if(!u)break;o=u}if(l||(l=(r.someProp("clipboardParser")||r.someProp("domParser")||Xe.fromSchema(r.state.schema)).parseSlice(o,{preserveWhitespace:!!(a||c),context:i,ruleFromNode(u){return u.nodeName=="BR"&&!u.nextSibling&&u.parentNode&&!sa.test(u.parentNode.nodeName)?{ignore:!0}:null}})),c)l=ca(Hi(l,+c[1],+c[2]),c[4]);else if(l=x.maxOpen(oa(l.content,i),!0),l.openStart||l.openEnd){let h=0,u=0;for(let d=l.content.firstChild;h{l=h(l,r,a)}),l}var sa=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function oa(r,e){if(r.childCount<2)return r;for(let t=e.depth;t>=0;t--){let i=e.node(t).contentMatchAt(e.index(t)),s,o=[];if(r.forEach(l=>{if(!o)return;let a=i.findWrapping(l.type),f;if(!a)return o=null;if(f=o.length&&s.length&&Ss(a,s,l,o[o.length-1],0))o[o.length-1]=f;else{o.length&&(o[o.length-1]=ks(o[o.length-1],s.length));let c=bs(l,a);o.push(c),i=i.matchType(c.type),s=a}}),o)return y.from(o)}return r}function bs(r,e,t=0){for(let n=e.length-1;n>=t;n--)r=e[n].create(null,y.from(r));return r}function Ss(r,e,t,n,i){if(i1&&(s=0),i=t&&(l=e<0?o.contentMatchAt(0).fillBefore(l,s<=i).append(l):l.append(o.contentMatchAt(o.childCount).fillBefore(y.empty,!0))),r.replaceChild(e<0?0:r.childCount-1,o.copy(l))}function Hi(r,e,t){return et})),zn.createHTML(r)):r}function aa(r){let e=/^(\s*]*>)*/.exec(r);e&&(r=r.slice(e[0].length));let t=Ms(),n=t.body,i=/<([a-z][^>\s]+)/i.exec(r),s;if((s=i&&Cs[i[1].toLowerCase()])&&(r=s.map(o=>"<"+o+">").join("")+r+s.map(o=>"").reverse().join("")),n.innerHTML=la(r),s)for(let o=0;o=0;l-=2){let a=t.nodes[n[l]];if(!a||a.hasRequiredAttrs())break;i=y.from(a.create(n[l+1],i)),s++,o++}return new x(i,s,o)}var $={},q={},ha={touchstart:!0,touchmove:!0},_n=class{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:"",button:0},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastChromeDelete=0,this.composing=!1,this.compositionNode=null,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.badSafariComposition=!1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}};function ua(r){for(let e in $){let t=$[e];r.dom.addEventListener(e,r.input.eventHandlers[e]=n=>{pa(r,n)&&!fr(r,n)&&(r.editable||!(n.type in q))&&t(r,n)},ha[e]?{passive:!0}:void 0)}L&&r.dom.addEventListener("input",()=>null),Qn(r)}function me(r,e){r.input.lastSelectionOrigin=e,r.input.lastSelectionTime=Date.now()}function da(r){r.input.mouseDown&&r.input.mouseDown.done(),r.domObserver.stop();for(let e in r.input.eventHandlers)r.dom.removeEventListener(e,r.input.eventHandlers[e]);clearTimeout(r.input.composingTimeout),clearTimeout(r.input.lastIOSEnterFallbackTimeout)}function Qn(r){r.someProp("handleDOMEvents",e=>{for(let t in e)r.input.eventHandlers[t]||r.dom.addEventListener(t,r.input.eventHandlers[t]=n=>fr(r,n))})}function fr(r,e){return r.someProp("handleDOMEvents",t=>{let n=t[e.type];return n?n(r,e)||e.defaultPrevented:!1})}function pa(r,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target;t!=r.dom;t=t.parentNode)if(!t||t.nodeType==11||t.pmViewDesc&&t.pmViewDesc.stopEvent(e))return!1;return!0}function ma(r,e){!fr(r,e)&&$[e.type]&&(r.editable||!(e.type in q))&&$[e.type](r,e)}q.keydown=(r,e)=>{let t=e;if(r.input.shiftKey=t.keyCode==16||t.shiftKey,!Ns(r)&&(r.input.lastKeyCode=t.keyCode,r.input.lastKeyCodeTime=Date.now(),!(pe&&P&&t.keyCode==13)))if(t.keyCode!=229&&r.domObserver.forceFlush(),lt&&t.keyCode==13&&!t.ctrlKey&&!t.altKey&&!t.metaKey){let n=Date.now();r.input.lastIOSEnter=n,r.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{r.input.lastIOSEnter==n&&(r.someProp("handleKeyDown",i=>i(r,Ve(13,"Enter"))),r.input.lastIOSEnter=0)},200)}else r.someProp("handleKeyDown",n=>n(r,t))||ia(r,t)?t.preventDefault():me(r,"key")};q.keyup=(r,e)=>{e.keyCode==16&&(r.input.shiftKey=!1)};q.keypress=(r,e)=>{let t=e;if(Ns(r)||!t.charCode||t.ctrlKey&&!t.altKey||G&&t.metaKey)return;if(r.someProp("handleKeyPress",i=>i(r,t))){t.preventDefault();return}let n=r.state.selection;if(!(n instanceof C)||!n.$from.sameParent(n.$to)){let i=String.fromCharCode(t.charCode),s=()=>r.state.tr.insertText(i).scrollIntoView();!/[\r\n]/.test(i)&&!r.someProp("handleTextInput",o=>o(r,n.$from.pos,n.$to.pos,i,s))&&r.dispatch(s()),t.preventDefault()}};function Rt(r){return{left:r.clientX,top:r.clientY}}function ga(r,e){let t=e.x-r.clientX,n=e.y-r.clientY;return t*t+n*n<100}function cr(r,e,t,n,i){if(n==-1)return!1;let s=r.state.doc.resolve(n);for(let o=s.depth+1;o>0;o--)if(r.someProp(e,l=>o>s.depth?l(r,t,s.nodeAfter,s.before(o),i,!0):l(r,t,s.node(o),s.before(o),i,!1)))return!0;return!1}function Pt(r,e,t){if(r.focused||r.focus(),r.state.selection.eq(e))return;let n=r.state.tr.setSelection(e);t=="pointer"&&n.setMeta("pointer",!0),r.dispatch(n)}function ya(r,e){if(e==-1)return!1;let t=r.state.doc.resolve(e),n=t.nodeAfter;return n&&n.isAtom&&S.isSelectable(n)?(Pt(r,new S(t),"pointer"),!0):!1}function xa(r,e){if(e==-1)return!1;let t=r.state.selection,n,i;t instanceof S&&(n=t.node);let s=r.state.doc.resolve(e);for(let o=s.depth+1;o>0;o--){let l=o>s.depth?s.nodeAfter:s.node(o);if(S.isSelectable(l)){n&&t.$from.depth>0&&o>=t.$from.depth&&s.before(t.$from.depth+1)==t.$from.pos?i=s.before(t.$from.depth):i=s.before(o);break}}return i!=null?(Pt(r,S.create(r.state.doc,i),"pointer"),!0):!1}function ba(r,e,t,n,i){return cr(r,"handleClickOn",e,t,n)||r.someProp("handleClick",s=>s(r,e,n))||(i?xa(r,t):ya(r,t))}function Sa(r,e,t,n){return cr(r,"handleDoubleClickOn",e,t,n)||r.someProp("handleDoubleClick",i=>i(r,e,n))}function ka(r,e,t,n){return cr(r,"handleTripleClickOn",e,t,n)||r.someProp("handleTripleClick",i=>i(r,e,n))||Ca(r,t,n)}function Ca(r,e,t){if(t.button!=0)return!1;let n=Os(r,e,!0),i=r.state.doc;return n?(Pt(r,n,"pointer"),n instanceof C&&i.eq(r.state.doc)&&(r.input.mouseDown=new er(r,n)),!0):!1}function Os(r,e,t){let n=r.state.doc;if(e==-1)return n.inlineContent?C.create(n,0,n.content.size):null;let i=n.resolve(e);for(let s=i.depth+1;s>0;s--){let o=s>i.depth?i.nodeAfter:i.node(s),l=i.before(s);if(o.inlineContent)return C.create(n,l+1,l+1+o.content.size);if(t&&S.isSelectable(o))return S.create(n,l)}return null}function hr(r){return Nt(r)}var ws=G?"metaKey":"ctrlKey";$.mousedown=(r,e)=>{let t=e;r.input.shiftKey=t.shiftKey;let n=hr(r),i=Date.now(),s="singleClick";i-r.input.lastClick.time<500&&ga(t,r.input.lastClick)&&!t[ws]&&r.input.lastClick.button==t.button&&(r.input.lastClick.type=="singleClick"?s="doubleClick":r.input.lastClick.type=="doubleClick"&&(s="tripleClick")),r.input.lastClick={time:i,x:t.clientX,y:t.clientY,type:s,button:t.button},r.input.mouseDown&&r.input.mouseDown.done();let o=r.posAtCoords(Rt(t));o&&(s=="singleClick"?r.input.mouseDown=new Zn(r,o,t,!!n):(s=="doubleClick"?Sa:ka)(r,o.pos,o.inside,t)?t.preventDefault():me(r,"pointer"))};var _t=class{constructor(e){this.view=e,this.mightDrag=null,e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this))}up(e){this.done()}move(e){e.buttons==0&&this.done()}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.view.input.mouseDown==this&&(this.view.input.mouseDown=null)}delaySelUpdate(){return!1}},Zn=class extends _t{constructor(e,t,n,i){super(e),this.pos=t,this.event=n,this.flushed=i,this.delayedSelectionSync=!1,this.startDoc=e.state.doc,this.selectNode=!!n[ws],this.allowDefault=n.shiftKey;let s,o;if(t.inside>-1)s=e.state.doc.nodeAt(t.inside),o=t.inside;else{let c=e.state.doc.resolve(t.pos);s=c.parent,o=c.depth?c.before():0}let l=i?null:n.target,a=l?e.docView.nearestDesc(l,!0):null;this.target=a&&a.nodeDOM.nodeType==1?a.nodeDOM:null;let{selection:f}=e.state;n.button==0&&(s.type.spec.draggable&&s.type.spec.selectable!==!1||f instanceof S&&f.from<=o&&f.to>o)&&(this.mightDrag={node:s,pos:o,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&X&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),me(e,"pointer")}done(){super.done(),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>{this.view.isDestroyed||ge(this.view)})}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let t=this.pos;this.view.state.doc!=this.startDoc&&(t=this.view.posAtCoords(Rt(e))),this.updateAllowDefault(e),this.allowDefault||!t?me(this.view,"pointer"):ba(this.view,t.pos,t.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||L&&this.mightDrag&&!this.mightDrag.node.isAtom||P&&!this.view.state.selection.visible&&Math.min(Math.abs(t.pos-this.view.state.selection.from),Math.abs(t.pos-this.view.state.selection.to))<=2)?(Pt(this.view,k.near(this.view.state.doc.resolve(t.pos)),"pointer"),e.preventDefault()):me(this.view,"pointer")}move(e){this.updateAllowDefault(e),me(this.view,"pointer"),super.move(e)}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}delaySelUpdate(){return this.allowDefault?(this.delayedSelectionSync=!0,!0):!1}},er=class extends _t{constructor(e,t){super(e),this.startSelection=t,this.startDoc=e.state.doc}move(e){if(e.buttons==0||this.view.isDestroyed||!this.view.state.doc.eq(this.startDoc)){this.done();return}e.preventDefault(),me(this.view,"pointer");let t=this.view.posAtCoords(Rt(e)),n=t&&Os(this.view,t.inside,!1);if(!n)return;let{doc:i}=this.view.state,s=this.startSelection,[o,l]=n.from{r.input.lastTouch=Date.now(),hr(r),me(r,"pointer")};$.touchmove=r=>{r.input.lastTouch=Date.now(),me(r,"pointer")};$.contextmenu=r=>hr(r);function Ns(r,e){return r.composing?!0:L&&Math.abs(Date.now()-r.input.compositionEndedAt)<500?(r.input.compositionEndedAt=-2e8,!0):!1}var Ma=pe?5e3:-1;q.compositionstart=q.compositionupdate=r=>{if(!r.composing){r.domObserver.flush();let{state:e}=r,t=e.selection.$to;if(e.selection instanceof C&&(e.storedMarks||!t.textOffset&&t.parentOffset&&t.nodeBefore.marks.some(n=>n.type.spec.inclusive===!1)||P&&is&&Oa(r)))r.markCursor=r.state.storedMarks||t.marks(),Nt(r,!0),r.markCursor=null;else if(Nt(r,!e.selection.empty),X&&e.selection.empty&&t.parentOffset&&!t.textOffset&&t.nodeBefore.marks.length){let n=r.domSelectionRange();for(let i=n.focusNode,s=n.focusOffset;i&&i.nodeType==1&&s!=0;){let o=s<0?i.lastChild:i.childNodes[s-1];if(!o)break;if(o.nodeType==3){let l=r.domSelection();l&&l.collapse(o,o.nodeValue.length);break}else i=o,s=-1}}r.input.composing=!0}Ds(r,Ma)};function Oa(r){let{focusNode:e,focusOffset:t}=r.domSelectionRange();if(!e||e.nodeType!=1||t>=e.childNodes.length)return!1;let n=e.childNodes[t];return n.nodeType==1&&n.contentEditable=="false"}q.compositionend=(r,e)=>{r.composing&&(r.input.composing=!1,r.input.compositionEndedAt=Date.now(),r.input.compositionPendingChanges=r.domObserver.pendingRecords().length?r.input.compositionID:0,r.input.compositionNode=null,r.input.badSafariComposition?r.domObserver.forceFlush():r.input.compositionPendingChanges&&Promise.resolve().then(()=>r.domObserver.flush()),r.input.compositionID++,Ds(r,20))};function Ds(r,e){clearTimeout(r.input.composingTimeout),e>-1&&(r.input.composingTimeout=setTimeout(()=>Nt(r),e))}function Ts(r){for(r.composing&&(r.input.composing=!1,r.input.compositionEndedAt=Date.now());r.input.compositionNodes.length>0;)r.input.compositionNodes.pop().markParentsDirty()}function wa(r){let e=r.domSelectionRange();if(!e.focusNode)return null;let t=Cl(e.focusNode,e.focusOffset),n=Ml(e.focusNode,e.focusOffset);if(t&&n&&t!=n){let i=n.pmViewDesc,s=r.domObserver.lastChangedTextNode;if(t==s||n==s)return s;if(!i||!i.isText(n.nodeValue))return n;if(r.input.compositionNode==n){let o=t.pmViewDesc;if(!(!o||!o.isText(t.nodeValue)))return n}}return t||n}function Nt(r,e=!1){if(!(pe&&r.domObserver.flushingSoon>=0)){if(r.domObserver.forceFlush(),Ts(r),e||r.docView&&r.docView.dirty){let t=sr(r),n=r.state.selection;return t&&!t.eq(n)?r.dispatch(r.state.tr.setSelection(t)):(r.markCursor||e)&&!n.$from.node(n.$from.sharedDepth(n.to)).inlineContent?r.dispatch(r.state.tr.deleteSelection()):r.updateState(r.state),!0}return!1}}function Na(r,e){if(!r.dom.parentNode)return;let t=r.dom.parentNode.appendChild(document.createElement("div"));t.appendChild(e),t.style.cssText="position: fixed; left: -10000px; top: 10px";let n=getSelection(),i=document.createRange();i.selectNodeContents(e),r.dom.blur(),n.removeAllRanges(),n.addRange(i),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),r.focus()},50)}var Dt=U&&De<15||lt&&Dl<604;$.copy=q.cut=(r,e)=>{let t=e,n=r.state.selection,i=t.type=="cut";if(n.empty)return;let s=Dt?null:t.clipboardData,o=n.content(),{dom:l,text:a}=lr(r,o);s?(t.preventDefault(),s.clearData(),s.setData("text/html",l.innerHTML),s.setData("text/plain",a)):Na(r,l),i&&r.dispatch(r.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function Da(r){return r.openStart==0&&r.openEnd==0&&r.content.childCount==1?r.content.firstChild:null}function Ta(r,e){if(!r.dom.parentNode)return;let t=r.input.shiftKey||r.state.selection.$from.parent.type.spec.code,n=r.dom.parentNode.appendChild(document.createElement(t?"textarea":"div"));t||(n.contentEditable="true"),n.style.cssText="position: fixed; left: -10000px; top: 10px",n.focus();let i=r.input.shiftKey&&r.input.lastKeyCode!=45;setTimeout(()=>{r.focus(),n.parentNode&&n.parentNode.removeChild(n),t?Tt(r,n.value,null,i,e):Tt(r,n.textContent,n.innerHTML,i,e)},50)}function Tt(r,e,t,n,i){let s=ar(r,e,t,n,r.state.selection.$from);if(r.someProp("handlePaste",a=>a(r,i,s||x.empty)))return!0;if(!s)return!1;let o=Da(s),l=o?r.state.tr.replaceSelectionWith(o,n):r.state.tr.replaceSelection(s);return r.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function Es(r){let e=r.getData("text/plain")||r.getData("Text");if(e)return e;let t=r.getData("text/uri-list");return t?t.replace(/\r?\n/g," "):""}q.paste=(r,e)=>{let t=e;if(r.composing&&!pe)return;let n=Dt?null:t.clipboardData,i=r.input.shiftKey&&r.input.lastKeyCode!=45;n&&Tt(r,Es(n),n.getData("text/html"),i,t)?t.preventDefault():Ta(r,t)};var Qt=class{constructor(e,t,n){this.slice=e,this.move=t,this.node=n}},Ea=G?"altKey":"ctrlKey";function As(r,e){let t;return r.someProp("dragCopies",n=>{t=t||n(e)}),t!=null?!t:!e[Ea]}$.dragstart=(r,e)=>{let t=e,n=r.input.mouseDown;if(n&&n.done(),!t.dataTransfer)return;let i=r.state.selection,s=i.empty?null:r.posAtCoords(Rt(t)),o;if(!(s&&s.pos>=i.from&&s.pos<=(i instanceof S?i.to-1:i.to))){if(n&&n.mightDrag)o=S.create(r.state.doc,n.mightDrag.pos);else if(t.target&&t.target.nodeType==1){let h=r.docView.nearestDesc(t.target,!0);h&&h.node.type.spec.draggable&&h!=r.docView&&(o=S.create(r.state.doc,h.posBefore))}}let l=(o||r.state.selection).content(),{dom:a,text:f,slice:c}=lr(r,l);(!t.dataTransfer.files.length||!P||rs>120)&&t.dataTransfer.clearData(),t.dataTransfer.setData(Dt?"Text":"text/html",a.innerHTML),t.dataTransfer.effectAllowed="copyMove",Dt||t.dataTransfer.setData("text/plain",f),r.dragging=new Qt(c,As(r,t),o)};$.dragend=r=>{let e=r.dragging;window.setTimeout(()=>{r.dragging==e&&(r.dragging=null)},50)};q.dragover=q.dragenter=(r,e)=>e.preventDefault();q.drop=(r,e)=>{try{Aa(r,e,r.dragging)}finally{r.dragging=null}};function Aa(r,e,t){if(!e.dataTransfer)return;let n=r.posAtCoords(Rt(e));if(!n)return;let i=r.state.doc.resolve(n.pos),s=t&&t.slice;s?r.someProp("transformPasted",d=>{s=d(s,r,!1)}):s=ar(r,Es(e.dataTransfer),Dt?null:e.dataTransfer.getData("text/html"),!1,i);let o=!!(t&&As(r,e));if(r.someProp("handleDrop",d=>d(r,e,s||x.empty,o))){e.preventDefault();return}if(!s)return;e.preventDefault();let l=s?kt(r.state.doc,i.pos,s):i.pos;l==null&&(l=i.pos);let a=r.state.tr;if(o){let{node:d}=t;d?d.replace(a):a.deleteSelection()}let f=a.mapping.map(l),c=s.openStart==0&&s.openEnd==0&&s.content.childCount==1,h=a.doc;if(c?a.replaceRangeWith(f,f,s.content.firstChild):a.replaceRange(f,f,s),a.doc.eq(h))return;let u=a.doc.resolve(f);if(c&&S.isSelectable(s.content.firstChild)&&u.nodeAfter&&u.nodeAfter.sameMarkup(s.content.firstChild))a.setSelection(new S(u));else{let d=a.mapping.map(l);a.mapping.maps[a.mapping.maps.length-1].forEach((p,m,g,b)=>d=b),a.setSelection(or(r,u,a.doc.resolve(d)))}r.focus(),r.dispatch(a.setMeta("uiEvent","drop"))}$.focus=r=>{r.input.lastFocus=Date.now(),r.focused||(r.domObserver.stop(),r.dom.classList.add("ProseMirror-focused"),r.domObserver.start(),r.focused=!0,setTimeout(()=>{r.docView&&r.hasFocus()&&!r.domObserver.currentSelection.eq(r.domSelectionRange())&&ge(r)},20))};$.blur=(r,e)=>{let t=e;r.focused&&(r.domObserver.stop(),r.dom.classList.remove("ProseMirror-focused"),r.domObserver.start(),t.relatedTarget&&r.dom.contains(t.relatedTarget)&&r.domObserver.currentSelection.clear(),r.focused=!1)};$.beforeinput=(r,e)=>{if(pe&&e.inputType=="deleteContentBackward"){r.domObserver.flushSoon();let{domChangeCount:n}=r.input;setTimeout(()=>{if(r.input.domChangeCount!=n||(r.dom.blur(),r.focus(),r.someProp("handleKeyDown",s=>s(r,Ve(8,"Backspace")))))return;let{$cursor:i}=r.state.selection;i&&i.pos>0&&r.dispatch(r.state.tr.delete(i.pos-1,i.pos).scrollIntoView())},50)}};for(let r in q)$[r]=q[r];function Et(r,e){if(r==e)return!0;for(let t in r)if(r[t]!==e[t])return!1;for(let t in e)if(!(t in r))return!1;return!0}var Zt=class r{constructor(e,t){this.toDOM=e,this.spec=t||qe,this.side=this.spec.side||0}map(e,t,n,i){let{pos:s,deleted:o}=e.mapResult(t.from+i,this.side<0?-1:1);return o?null:new te(s-n,s-n,this)}valid(){return!0}eq(e){return this==e||e instanceof r&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&Et(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}},$e=class r{constructor(e,t){this.attrs=e,this.spec=t||qe}map(e,t,n,i){let s=e.map(t.from+i,this.spec.inclusiveStart?-1:1)-n,o=e.map(t.to+i,this.spec.inclusiveEnd?1:-1)-n;return s>=o?null:new te(s,o,this)}valid(e,t){return t.from=e&&(!s||s(l.spec))&&n.push(l.copy(l.from+i,l.to+i))}for(let o=0;oe){let l=this.children[o]+1;this.children[o+2].findInner(e-l,t-l,n,i+l,s)}}map(e,t,n){return this==V||e.maps.length==0?this:this.mapInner(e,t,0,0,n||qe)}mapInner(e,t,n,i,s){let o;for(let l=0;l{let f=a+n,c;if(c=Rs(t,l,f)){for(i||(i=this.children.slice());sl&&h.to=e){this.children[l]==e&&(n=this.children[l+2]);break}let s=e+1,o=s+t.content.size;for(let l=0;ls&&a.type instanceof $e){let f=Math.max(s,a.from)-s,c=Math.min(o,a.to)-s;fi.map(e,t,qe));return r.from(n)}forChild(e,t){if(t.isLeaf)return J.empty;let n=[];for(let i=0;it instanceof J)?e:e.reduce((t,n)=>t.concat(n instanceof J?n:n.members),[]))}}forEachSet(e){for(let t=0;t{let g=m-p-(d-u);for(let b=0;bN+c-h)continue;let w=l[b]+c-h;d>=w?l[b+1]=u<=w?-2:-1:u>=c&&g&&(l[b]+=g,l[b+1]+=g)}h+=g}),c=t.maps[f].map(c,-1)}let a=!1;for(let f=0;f=n.content.size){a=!0;continue}let u=t.map(r[f+1]+s,-1),d=u-i,{index:p,offset:m}=n.content.findIndex(h),g=n.maybeChild(p);if(g&&m==h&&m+g.nodeSize==d){let b=l[f+2].mapInner(t,g,c+1,r[f]+s+1,o);b!=V?(l[f]=h,l[f+1]=d,l[f+2]=b):(l[f+1]=-2,a=!0)}else a=!0}if(a){let f=Ra(l,r,e,t,i,s,o),c=tn(f,n,0,o);e=c.local;for(let h=0;ht&&o.to{let f=Rs(r,l,a+t);if(f){s=!0;let c=tn(f,l,t+a+1,n);c!=V&&i.push(a,a+l.nodeSize,c)}});let o=Is(s?Ps(r):r,-t).sort(Ke);for(let l=0;l0;)e++;r.splice(e,0,t)}function vn(r){let e=[];return r.someProp("decorations",t=>{let n=t(r.state);n&&n!=V&&e.push(n)}),r.cursorWrapper&&e.push(J.create(r.state.doc,[r.cursorWrapper.deco])),en.from(e)}var Pa={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},Ba=U&&De<=11,nr=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}},rr=class{constructor(e,t){this.view=e,this.handleDOMChange=t,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new nr,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver(n=>{for(let i=0;ii.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():L&&e.composing&&n.some(i=>i.type=="childList"&&i.target.nodeName=="TR")?(e.input.badSafariComposition=!0,this.flushSoon()):this.flush()}),Ba&&(this.onCharData=n=>{this.queue.push({target:n.target,type:"characterData",oldValue:n.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,Pa)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let t=0;tthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(Li(this.view)){if(this.suppressingSelectionUpdates)return ge(this.view);if(U&&De<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&He(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let t=new Set,n;for(let s=e.focusNode;s;s=ot(s))t.add(s);for(let s=e.anchorNode;s;s=ot(s))if(t.has(s)){n=s;break}let i=n&&this.view.docView.nearestDesc(n);if(i&&i.ignoreMutation({type:"selection",target:n.nodeType==3?n.parentNode:n}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let t=this.pendingRecords();t.length&&(this.queue=[]);let n=e.domSelectionRange(),i=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(n)&&Li(e)&&!this.ignoreSelectionChange(n),s=-1,o=-1,l=!1,a=[];if(e.editable)for(let c=0;cc.nodeName=="BR")&&(e.input.lastKeyCode==8||e.input.lastKeyCode==46||P&&(e.composing||e.input.compositionEndedAt>Date.now()-50)&&t.some(c=>c.type=="childList"&&c.removedNodes.length))){for(let c of a)if(c.nodeName=="BR"&&c.parentNode){let h=c.nextSibling;for(;h&&h.nodeType==1;){if(h.contentEditable=="false"){c.parentNode.removeChild(c);break}h=h.firstChild}}}else if(X&&a.length){let c=a.filter(h=>h.nodeName=="BR");if(c.length==2){let[h,u]=c;h.parentNode&&h.parentNode.parentNode==u.parentNode?u.remove():h.remove()}else{let{focusNode:h}=this.currentSelection;for(let u of c){let d=u.parentNode;d&&d.nodeName=="LI"&&(!h||Fa(e,h)!=d)&&u.remove()}}}let f=null;s<0&&i&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||i)&&(s>-1&&(e.docView.markDirty(s,o),za(e)),e.input.badSafariComposition&&(e.input.badSafariComposition=!1,Va(e,a)),this.handleDOMChange(s,o,l,a),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(n)||ge(e),this.currentSelection.set(n))}registerMutation(e,t){if(t.indexOf(e.target)>-1)return null;let n=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(n==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!n||n.ignoreMutation(e))return null;if(e.type=="childList"){for(let c=0;cs;b--){let N=i.childNodes[b-1],w=N.pmViewDesc;if(N.nodeName=="BR"&&!w){o=b;break}if(!w||w.size)break}let u=r.state.doc,d=r.someProp("domParser")||Xe.fromSchema(r.state.schema),p=u.resolve(l),m=null,g=d.parse(i,{topNode:p.parent,topMatch:p.parent.contentMatchAt(p.index()),topOpen:!0,from:s,to:o,preserveWhitespace:p.parent.type.whitespace=="pre"?"full":!0,findPositions:c,ruleFromNode:Wa(n),context:p});if(c&&c[0].pos!=null){let b=c[0].pos,N=c[1]&&c[1].pos;N==null&&(N=b),m={anchor:b+l,head:N+l}}return{doc:g,sel:m,from:l,to:a}}var Wa=r=>e=>{let t=e.pmViewDesc;if(t)return t.parseRule(r);if(e.nodeName=="BR"&&e.parentNode){if(L&&/^(ul|ol)$/i.test(e.parentNode.nodeName)){let n=document.createElement("div");return n.appendChild(document.createElement("li")),{skip:n}}else if(e.parentNode.lastChild==e||L&&/^(tr|table)$/i.test(e.parentNode.nodeName))return{ignore:!0}}else if(e.nodeName=="IMG"&&e.getAttribute("mark-placeholder"))return{ignore:!0};return null},Ja=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function $a(r,e,t,n,i){let s=r.input.compositionPendingChanges||(r.composing?r.input.compositionID:0);if(r.input.compositionPendingChanges=0,e<0){let M=r.input.lastSelectionTime>Date.now()-50?r.input.lastSelectionOrigin:null,A=sr(r,M);if(A&&!r.state.selection.eq(A)){if(P&&pe&&r.input.lastKeyCode===13&&Date.now()-100Ao(r,Ve(13,"Enter"))))return;let K=r.state.tr.setSelection(A);M=="pointer"?K.setMeta("pointer",!0):M=="key"&&K.scrollIntoView(),s&&K.setMeta("composition",s),r.dispatch(K)}return}let o=r.state.doc.resolve(e),l=o.sharedDepth(t);e=o.before(l+1),t=r.state.doc.resolve(t).after(l+1);let a=r.state.selection,f=La(r,e,t,i),c=r.state.doc,h=c.slice(f.from,f.to),u,d;r.input.lastKeyCode===8&&Date.now()-100Date.now()-225||pe)&&i.some(M=>M.nodeType==1&&!Ja.test(M.nodeName))&&(!p||p.endA>=p.endB)&&r.someProp("handleKeyDown",M=>M(r,Ve(13,"Enter")))){r.input.lastIOSEnter=0;return}if(!p)if(n&&a instanceof C&&!a.empty&&a.$head.sameParent(a.$anchor)&&!r.composing&&!(f.sel&&f.sel.anchor!=f.sel.head))p={start:a.from,endA:a.to,endB:a.to};else{if(f.sel){let M=Xi(r,r.state.doc,f.sel);if(M&&!M.eq(r.state.selection)){let A=r.state.tr.setSelection(M);s&&A.setMeta("composition",s),r.dispatch(A)}}return}r.state.selection.fromr.state.selection.from&&p.start<=r.state.selection.from+2&&r.state.selection.from>=f.from?p.start=r.state.selection.from:p.endA=r.state.selection.to-2&&r.state.selection.to<=f.to&&(p.endB+=r.state.selection.to-p.endA,p.endA=r.state.selection.to)),U&&De<=11&&p.endB==p.start+1&&p.endA==p.start&&p.start>f.from&&f.doc.textBetween(p.start-f.from-1,p.start-f.from+1)==" \xA0"&&(p.start--,p.endA--,p.endB--);let m=f.doc.resolveNoCache(p.start-f.from),g=f.doc.resolveNoCache(p.endB-f.from),b=c.resolve(p.start),N=m.sameParent(g)&&m.parent.inlineContent&&b.end()>=p.endA;if((lt&&r.input.lastIOSEnter>Date.now()-225&&(!N||i.some(M=>M.nodeName=="DIV"||M.nodeName=="P"))||!N&&m.posM(r,Ve(13,"Enter")))){r.input.lastIOSEnter=0;return}if(r.state.selection.anchor>p.start&&Ka(c,p.start,p.endA,m,g)&&r.someProp("handleKeyDown",M=>M(r,Ve(8,"Backspace")))){pe&&P&&r.domObserver.suppressSelectionUpdates();return}P&&p.endB==p.start&&(r.input.lastChromeDelete=Date.now()),pe&&!N&&m.start()!=g.start()&&g.parentOffset==0&&m.depth==g.depth&&f.sel&&f.sel.anchor==f.sel.head&&f.sel.head==p.endA&&(p.endB-=2,g=f.doc.resolveNoCache(p.endB-f.from),setTimeout(()=>{r.someProp("handleKeyDown",function(M){return M(r,Ve(13,"Enter"))})},20));let w=p.start,re=p.endA,Ae=M=>{let A=M||r.state.tr.replace(w,re,f.doc.slice(p.start-f.from,p.endB-f.from));if(f.sel){let K=Xi(r,A.doc,f.sel);K&&!(P&&r.composing&&K.empty&&(p.start!=p.endB||r.input.lastChromeDeletege(r),20));let M=Ae(r.state.tr.delete(w,re)),A=c.resolve(p.start).marksAcross(c.resolve(p.endA));A&&M.ensureMarks(A),r.dispatch(M)}else if(p.endA==p.endB&&(Bt=qa(m.parent.content.cut(m.parentOffset,g.parentOffset),b.parent.content.cut(b.parentOffset,p.endA-b.start())))){let M=Ae(r.state.tr);Bt.type=="add"?M.addMark(w,re,Bt.mark):M.removeMark(w,re,Bt.mark),r.dispatch(M)}else if(m.parent.child(m.index()).isText&&m.index()==g.index()-(g.textOffset?0:1)){let M=m.parent.textBetween(m.parentOffset,g.parentOffset),A=()=>Ae(r.state.tr.insertText(M,w,re));r.someProp("handleTextInput",K=>K(r,w,re,M,A))||r.dispatch(A())}else r.dispatch(Ae());else r.dispatch(Ae())}function Xi(r,e,t){return Math.max(t.anchor,t.head)>e.content.size?null:or(r,e.resolve(t.anchor),e.resolve(t.head))}function qa(r,e){let t=r.firstChild.marks,n=e.firstChild.marks,i=t,s=n,o,l,a;for(let c=0;cc.mark(l.addToSet(c.marks));else if(i.length==0&&s.length==1)l=s[0],o="remove",a=c=>c.mark(l.removeFromSet(c.marks));else return null;let f=[];for(let c=0;ct||Fn(o,!0,!1)0&&(e||r.indexAfter(n)==r.node(n).childCount);)n--,i++,e=!1;if(t){let s=r.node(n).maybeChild(r.indexAfter(n));for(;s&&!s.isLeaf;)s=s.firstChild,i++}return i}function Ha(r,e,t,n,i){let s=r.findDiffStart(e,t),o=t+r.size,l=t+e.size;if(s==null)return null;let{a,b:f}=r.findDiffEnd(e,o,l);if(i=="end"){let c=Math.max(0,s-Math.min(a,f));n-=a+c-s}if(a=a?s-n:0;s-=c,f=s+(f-a),a=s}else if(f=f?s-n:0;s-=c,a=s+(a-f),f=s}return{start:s,endA:a,endB:f}}var Ua=ar,ja=Nt,nn=class{constructor(e,t){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new _n,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=t,this.state=t.state,this.directPlugins=t.plugins||[],this.directPlugins.forEach(ts),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=Zi(this),Qi(this),this.nodeViews=es(this),this.docView=Pi(this.state.doc,_i(this),vn(this),this.dom,this),this.domObserver=new rr(this,(n,i,s,o)=>$a(this,n,i,s,o)),this.domObserver.start(),ua(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let t in e)this._props[t]=e[t];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&Qn(this);let t=this._props;this._props=e,e.plugins&&(e.plugins.forEach(ts),this.directPlugins=e.plugins),this.updateStateInner(e.state,t)}setProps(e){let t={};for(let n in this._props)t[n]=this._props[n];t.state=this.state;for(let n in e)t[n]=e[n];this.update(t)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,t){var n;let i=this.state,s=!1,o=!1;e.storedMarks&&this.composing&&(Ts(this),o=!0),this.state=e;let l=i.plugins!=e.plugins||this._props.plugins!=t.plugins;if(l||this._props.plugins!=t.plugins||this._props.nodeViews!=t.nodeViews){let d=es(this);Ya(d,this.nodeViews)&&(this.nodeViews=d,s=!0)}(l||t.handleDOMEvents!=this._props.handleDOMEvents)&&Qn(this),this.editable=Zi(this),Qi(this);let a=vn(this),f=_i(this),c=i.plugins!=e.plugins&&!i.doc.eq(e.doc)?"reset":e.scrollToSelection>i.scrollToSelection?"to selection":"preserve",h=s||!this.docView.matchesNode(e.doc,f,a);(h||!e.selection.eq(i.selection))&&(o=!0);let u=c=="preserve"&&o&&this.dom.style.overflowAnchor==null&&Al(this);if(o){this.domObserver.stop();let d=h&&(U||P)&&!this.composing&&!i.selection.empty&&!e.selection.empty&&Ga(i.selection,e.selection);if(h){let m=P?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=wa(this)),(s||!this.docView.update(e.doc,f,a,this))&&(this.docView.updateOuterDeco(f),this.docView.destroy(),this.docView=Pi(e.doc,f,a,this.dom,this)),m&&(!this.trackWrites||!this.dom.contains(this.trackWrites))&&(d=!0)}let p=this.input.mouseDown;d||!(p&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&_l(this)&&p.delaySelUpdate())?ge(this,d):(gs(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(i),!((n=this.dragging)===null||n===void 0)&&n.node&&!i.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,i),c=="reset"?this.dom.scrollTop=0:c=="to selection"?this.scrollToSelection():u&&Il(u)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!(!e||!this.dom.contains(e.nodeType==1?e:e.parentNode))){if(!this.someProp("handleScrollToSelection",t=>t(this)))if(this.state.selection instanceof S){let t=this.docView.domAfterPos(this.state.selection.from);t.nodeType==1&&Ti(this,t.getBoundingClientRect(),e)}else Ti(this,this.coordsAtPos(this.state.selection.head,1),e)}}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let t=0;t0&&st.ownerDocument.getSelection()),this._root=t}return e||document}updateRoot(){this._root=null}posAtCoords(e){return Fl(this,e)}coordsAtPos(e,t=1){return cs(this,e,t)}domAtPos(e,t=0){return this.docView.domFromPos(e,t)}nodeDOM(e){let t=this.docView.descAt(e);return t?t.nodeDOM:null}posAtDOM(e,t,n=-1){let i=this.docView.posFromDOM(e,t,n);if(i==null)throw new RangeError("DOM position not inside the editor");return i}endOfTextblock(e,t){return $l(this,t||this.state,e)}pasteHTML(e,t){return Tt(this,"",e,!1,t||new ClipboardEvent("paste"))}pasteText(e,t){return Tt(this,e,null,!0,t||new ClipboardEvent("paste"))}serializeForClipboard(e){return lr(this,e)}destroy(){this.docView&&(da(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],vn(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,Sl())}get isDestroyed(){return this.docView==null}dispatchEvent(e){return ma(this,e)}domSelectionRange(){let e=this.domSelection();return e?L&&this.root.nodeType===11&&wl(this.dom.ownerDocument)==this.dom&&va(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}};nn.prototype.dispatch=function(r){let e=this._props.dispatchTransaction;e?e.call(this,r):this.updateState(this.state.apply(r))};function _i(r){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(r.editable),r.someProp("attributes",t=>{if(typeof t=="function"&&(t=t(r.state)),t)for(let n in t)n=="class"?e.class+=" "+t[n]:n=="style"?e.style=(e.style?e.style+";":"")+t[n]:!e[n]&&n!="contenteditable"&&n!="nodeName"&&(e[n]=String(t[n]))}),e.translate||(e.translate="no"),[te.node(0,r.state.doc.content.size,e)]}function Qi(r){if(r.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),r.cursorWrapper={dom:e,deco:te.widget(r.state.selection.from,e,{raw:!0,marks:r.markCursor})}}else r.cursorWrapper=null}function Zi(r){return!r.someProp("editable",e=>e(r.state)===!1)}function Ga(r,e){let t=Math.min(r.$anchor.sharedDepth(r.head),e.$anchor.sharedDepth(e.head));return r.$anchor.start(t)!=e.$anchor.start(t)}function es(r){let e=Object.create(null);function t(n){for(let i in n)Object.prototype.hasOwnProperty.call(e,i)||(e[i]=n[i])}return r.someProp("nodeViews",t),r.someProp("markViews",t),e}function Ya(r,e){let t=0,n=0;for(let i in r){if(r[i]!=e[i])return!0;t++}for(let i in e)n++;return t!=n}function ts(r){if(r.spec.state||r.spec.filterTransaction||r.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var vs={};j(vs,{collab:()=>_a,getVersion:()=>ef,rebaseSteps:()=>zs,receiveTransaction:()=>Qa,sendableSteps:()=>Za});var sn=class{constructor(e,t,n){this.step=e,this.inverted=t,this.origin=n}};function zs(r,e,t){for(let i=r.length-1;i>=0;i--)t.step(r[i].inverted);for(let i=0;inew at(e.version,[]),apply(t,n){let i=t.getMeta(ye);return i||(t.docChanged?new at(n.version,n.unconfirmed.concat(Xa(t))):n)}},config:e,historyPreserveItems:!0})}function Qa(r,e,t,n={}){let i=ye.getState(r),s=i.version+e.length,o=ye.get(r).spec.config.clientID,l=0;for(;lt.step),clientID:ye.get(r).spec.config.clientID,get origins(){return this._origins||(this._origins=e.unconfirmed.map(t=>t.origin))}}}function ef(r){return ye.getState(r).version}var qs={};j(qs,{closeHistory:()=>ff,history:()=>cf,isHistoryTransaction:()=>mf,redo:()=>$s,redoDepth:()=>pf,redoNoScroll:()=>uf,undo:()=>Js,undoDepth:()=>df,undoNoScroll:()=>hf});var on=200,B=function(){};B.prototype.append=function(e){return e.length?(e=B.from(e),!this.length&&e||e.length=t?B.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,t))};B.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};B.prototype.forEach=function(e,t,n){t===void 0&&(t=0),n===void 0&&(n=this.length),t<=n?this.forEachInner(e,t,n,0):this.forEachInvertedInner(e,t,n,0)};B.prototype.map=function(e,t,n){t===void 0&&(t=0),n===void 0&&(n=this.length);var i=[];return this.forEach(function(s,o){return i.push(e(s,o))},t,n),i};B.from=function(e){return e instanceof B?e:e&&e.length?new Fs(e):B.empty};var Fs=function(r){function e(n){r.call(this),this.values=n}r&&(e.__proto__=r),e.prototype=Object.create(r&&r.prototype),e.prototype.constructor=e;var t={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(i,s){return i==0&&s==this.length?this:new e(this.values.slice(i,s))},e.prototype.getInner=function(i){return this.values[i]},e.prototype.forEachInner=function(i,s,o,l){for(var a=s;a=o;a--)if(i(this.values[a],l+a)===!1)return!1},e.prototype.leafAppend=function(i){if(this.length+i.length<=on)return new e(this.values.concat(i.flatten()))},e.prototype.leafPrepend=function(i){if(this.length+i.length<=on)return new e(i.flatten().concat(this.values))},t.length.get=function(){return this.values.length},t.depth.get=function(){return 0},Object.defineProperties(e.prototype,t),e}(B);B.empty=new Fs([]);var tf=function(r){function e(t,n){r.call(this),this.left=t,this.right=n,this.length=t.length+n.length,this.depth=Math.max(t.depth,n.depth)+1}return r&&(e.__proto__=r),e.prototype=Object.create(r&&r.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(n){return nl&&this.right.forEachInner(n,Math.max(i-l,0),Math.min(this.length,s)-l,o+l)===!1)return!1},e.prototype.forEachInvertedInner=function(n,i,s,o){var l=this.left.length;if(i>l&&this.right.forEachInvertedInner(n,i-l,Math.max(s,l)-l,o+l)===!1||s=s?this.right.slice(n-s,i-s):this.left.slice(n,s).append(this.right.slice(0,i-s))},e.prototype.leafAppend=function(n){var i=this.right.leafAppend(n);if(i)return new e(this.left,i)},e.prototype.leafPrepend=function(n){var i=this.left.leafPrepend(n);if(i)return new e(i,this.right)},e.prototype.appendInner=function(n){return this.left.depth>=Math.max(this.right.depth,n.depth)+1?new e(this.left,new e(this.right,n)):new e(this,n)},e}(B),dr=B;var nf=500,je=class r{constructor(e,t){this.items=e,this.eventCount=t}popEvent(e,t){if(this.eventCount==0)return null;let n=this.items.length;for(;;n--)if(this.items.get(n-1).selection){--n;break}let i,s;t&&(i=this.remapping(n,this.items.length),s=i.maps.length);let o=e.tr,l,a,f=[],c=[];return this.items.forEach((h,u)=>{if(!h.step){i||(i=this.remapping(n,u+1),s=i.maps.length),s--,c.push(h);return}if(i){c.push(new oe(h.map));let d=h.step.map(i.slice(s)),p;d&&o.maybeStep(d).doc&&(p=o.mapping.maps[o.mapping.maps.length-1],f.push(new oe(p,void 0,void 0,f.length+c.length))),s--,p&&i.appendMap(p,s)}else o.maybeStep(h.step);if(h.selection)return l=i?h.selection.map(i.slice(s)):h.selection,a=new r(this.items.slice(0,n).append(c.reverse().concat(f)),this.eventCount-1),!1},this.items.length,0),{remaining:a,transform:o,selection:l}}addTransform(e,t,n,i){let s=[],o=this.eventCount,l=this.items,a=!i&&l.length?l.get(l.length-1):null;for(let c=0;csf&&(l=rf(l,f),o-=f),new r(l.append(s),o)}remapping(e,t){let n=new Qe;return this.items.forEach((i,s)=>{let o=i.mirrorOffset!=null&&s-i.mirrorOffset>=e?n.maps.length-i.mirrorOffset:void 0;n.appendMap(i.map,o)},e,t),n}addMaps(e){return this.eventCount==0?this:new r(this.items.append(e.map(t=>new oe(t))),this.eventCount)}rebased(e,t){if(!this.eventCount)return this;let n=[],i=Math.max(0,this.items.length-t),s=e.mapping,o=e.steps.length,l=this.eventCount;this.items.forEach(u=>{u.selection&&l--},i);let a=t;this.items.forEach(u=>{let d=s.getMirror(--a);if(d==null)return;o=Math.min(o,d);let p=s.maps[d];if(u.step){let m=e.steps[d].invert(e.docs[d]),g=u.selection&&u.selection.map(s.slice(a+1,d));g&&l++,n.push(new oe(p,m,g))}else n.push(new oe(p))},i);let f=[];for(let u=t;unf&&(h=h.compress(this.items.length-n.length)),h}emptyItemCount(){let e=0;return this.items.forEach(t=>{t.step||e++}),e}compress(e=this.items.length){let t=this.remapping(0,e),n=t.maps.length,i=[],s=0;return this.items.forEach((o,l)=>{if(l>=e)i.push(o),o.selection&&s++;else if(o.step){let a=o.step.map(t.slice(n)),f=a&&a.getMap();if(n--,f&&t.appendMap(f,n),a){let c=o.selection&&o.selection.map(t.slice(n));c&&s++;let h=new oe(f.invert(),a,c),u,d=i.length-1;(u=i.length&&i[d].merge(h))?i[d]=u:i.push(h)}}else o.map&&n--},this.items.length,0),new r(dr.from(i.reverse()),s)}};je.empty=new je(dr.empty,0);function rf(r,e){let t;return r.forEach((n,i)=>{if(n.selection&&e--==0)return t=i,!1}),r.slice(t)}var oe=class r{constructor(e,t,n,i){this.map=e,this.step=t,this.selection=n,this.mirrorOffset=i}merge(e){if(this.step&&e.step&&!e.selection){let t=e.step.merge(this.step);if(t)return new r(t.getMap().invert(),t,this.selection)}}},le=class{constructor(e,t,n,i,s){this.done=e,this.undone=t,this.prevRanges=n,this.prevTime=i,this.prevComposition=s}},sf=20;function of(r,e,t,n){let i=t.getMeta(ae),s;if(i)return i.historyState;t.getMeta(Ws)&&(r=new le(r.done,r.undone,null,0,-1));let o=t.getMeta("appendedTransaction");if(t.steps.length==0)return r;if(o&&o.getMeta(ae))return o.getMeta(ae).redo?new le(r.done.addTransform(t,void 0,n,ln(e)),r.undone,Vs(t.mapping.maps),r.prevTime,r.prevComposition):new le(r.done,r.undone.addTransform(t,void 0,n,ln(e)),null,r.prevTime,r.prevComposition);if(t.getMeta("addToHistory")!==!1&&!(o&&o.getMeta("addToHistory")===!1)){let l=t.getMeta("composition"),a=r.prevTime==0||!o&&r.prevComposition!=l&&(r.prevTime<(t.time||0)-n.newGroupDelay||!lf(t,r.prevRanges)),f=o?pr(r.prevRanges,t.mapping):Vs(t.mapping.maps);return new le(r.done.addTransform(t,a?e.selection.getBookmark():void 0,n,ln(e)),je.empty,f,t.time,l??r.prevComposition)}else return(s=t.getMeta("rebased"))?new le(r.done.rebased(t,s),r.undone.rebased(t,s),pr(r.prevRanges,t.mapping),r.prevTime,r.prevComposition):new le(r.done.addMaps(t.mapping.maps),r.undone.addMaps(t.mapping.maps),pr(r.prevRanges,t.mapping),r.prevTime,r.prevComposition)}function lf(r,e){if(!e)return!1;if(!r.docChanged)return!0;let t=!1;return r.mapping.maps[0].forEach((n,i)=>{for(let s=0;s=e[s]&&(t=!0)}),t}function Vs(r){let e=[];for(let t=r.length-1;t>=0&&e.length==0;t--)r[t].forEach((n,i,s,o)=>e.push(s,o));return e}function pr(r,e){if(!r)return null;let t=[];for(let n=0;n{let i=ae.getState(t);if(!i||(r?i.undone:i.done).eventCount==0)return!1;if(n){let s=af(i,t,r);s&&n(e?s.scrollIntoView():s)}return!0}}var Js=an(!1,!0),$s=an(!0,!0),hf=an(!1,!1),uf=an(!0,!1);function df(r){let e=ae.getState(r);return e?e.done.eventCount:0}function pf(r){let e=ae.getState(r);return e?e.undone.eventCount:0}function mf(r){return r.getMeta(ae)!=null}var Hs={};j(Hs,{keydownHandler:()=>hn,keymap:()=>Cf});var xe={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},cn={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},gf=typeof navigator<"u"&&/Mac/.test(navigator.platform),yf=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(D=0;D<10;D++)xe[48+D]=xe[96+D]=String(D);var D;for(D=1;D<=24;D++)xe[D+111]="F"+D;var D;for(D=65;D<=90;D++)xe[D]=String.fromCharCode(D+32),cn[D]=String.fromCharCode(D);var D;for(fn in xe)cn.hasOwnProperty(fn)||(cn[fn]=xe[fn]);var fn;function Ks(r){var e=gf&&r.metaKey&&r.shiftKey&&!r.ctrlKey&&!r.altKey||yf&&r.shiftKey&&r.key&&r.key.length==1||r.key=="Unidentified",t=!e&&r.key||(r.shiftKey?cn:xe)[r.keyCode]||r.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}var xf=typeof navigator<"u"&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),bf=typeof navigator<"u"&&/Win/.test(navigator.platform);function Sf(r){let e=r.split(/-(?!$)/),t=e[e.length-1];t=="Space"&&(t=" ");let n,i,s,o;for(let l=0;lFf,baseKeymap:()=>Lf,chainCommands:()=>un,createParagraphNear:()=>no,deleteSelection:()=>xr,exitCode:()=>to,joinBackward:()=>Gs,joinDown:()=>Nf,joinForward:()=>Qs,joinTextblockBackward:()=>Mf,joinTextblockForward:()=>Of,joinUp:()=>wf,lift:()=>Df,liftEmptyBlock:()=>ro,macBaseKeymap:()=>Mr,newlineInCode:()=>eo,pcBaseKeymap:()=>fe,selectAll:()=>so,selectNodeBackward:()=>Xs,selectNodeForward:()=>Zs,selectParentNode:()=>Ef,selectTextblockEnd:()=>fo,selectTextblockStart:()=>ao,setBlockType:()=>Rf,splitBlock:()=>Cr,splitBlockAs:()=>io,splitBlockKeepMarks:()=>Tf,toggleMark:()=>zf,wrapIn:()=>If});var xr=(r,e)=>r.selection.empty?!1:(e&&e(r.tr.deleteSelection().scrollIntoView()),!0);function js(r,e){let{$cursor:t}=r.selection;return!t||(e?!e.endOfTextblock("backward",r):t.parentOffset>0)?null:t}var Gs=(r,e,t)=>{let n=js(r,t);if(!n)return!1;let i=br(n);if(!i){let o=n.blockRange(),l=o&&Me(o);return l==null?!1:(e&&e(r.tr.lift(o,l).scrollIntoView()),!0)}let s=i.nodeBefore;if(oo(r,i,e,-1))return!0;if(n.parent.content.size==0&&(ft(s,"end")||S.isSelectable(s)))for(let o=n.depth;;o--){let l=tt(r.doc,n.before(o),n.after(o),x.empty);if(l&&l.slice.size1)break}return s.isAtom&&i.depth==n.depth-1?(e&&e(r.tr.delete(i.pos-s.nodeSize,i.pos).scrollIntoView()),!0):!1},Mf=(r,e,t)=>{let n=js(r,t);if(!n)return!1;let i=br(n);return i?Ys(r,i,e):!1},Of=(r,e,t)=>{let n=_s(r,t);if(!n)return!1;let i=Sr(n);return i?Ys(r,i,e):!1};function Ys(r,e,t){let n=e.nodeBefore,i=n,s=e.pos-1;for(;!i.isTextblock;s--){if(i.type.spec.isolating)return!1;let c=i.lastChild;if(!c)return!1;i=c}let o=e.nodeAfter,l=o,a=e.pos+1;for(;!l.isTextblock;a++){if(l.type.spec.isolating)return!1;let c=l.firstChild;if(!c)return!1;l=c}let f=tt(r.doc,s,a,x.empty);if(!f||f.from!=s||f instanceof F&&f.slice.size>=a-s)return!1;if(t){let c=r.tr.step(f);c.setSelection(C.create(c.doc,s)),t(c.scrollIntoView())}return!0}function ft(r,e,t=!1){for(let n=r;n;n=e=="start"?n.firstChild:n.lastChild){if(n.isTextblock)return!0;if(t&&n.childCount!=1)return!1}return!1}var Xs=(r,e,t)=>{let{$head:n,empty:i}=r.selection,s=n;if(!i)return!1;if(n.parent.isTextblock){if(t?!t.endOfTextblock("backward",r):n.parentOffset>0)return!1;s=br(n)}let o=s&&s.nodeBefore;return!o||!S.isSelectable(o)?!1:(e&&e(r.tr.setSelection(S.create(r.doc,s.pos-o.nodeSize)).scrollIntoView()),!0)};function br(r){if(!r.parent.type.spec.isolating)for(let e=r.depth-1;e>=0;e--){if(r.index(e)>0)return r.doc.resolve(r.before(e+1));if(r.node(e).type.spec.isolating)break}return null}function _s(r,e){let{$cursor:t}=r.selection;return!t||(e?!e.endOfTextblock("forward",r):t.parentOffset{let n=_s(r,t);if(!n)return!1;let i=Sr(n);if(!i)return!1;let s=i.nodeAfter;if(oo(r,i,e,1))return!0;if(n.parent.content.size==0&&(ft(s,"start")||S.isSelectable(s))){let o=tt(r.doc,n.before(),n.after(),x.empty);if(o&&o.slice.size{let{$head:n,empty:i}=r.selection,s=n;if(!i)return!1;if(n.parent.isTextblock){if(t?!t.endOfTextblock("forward",r):n.parentOffset=0;e--){let t=r.node(e);if(r.index(e)+1{let t=r.selection,n=t instanceof S,i;if(n){if(t.node.isTextblock||!Z(r.doc,t.from))return!1;i=t.from}else if(i=$t(r.doc,t.from,-1),i==null)return!1;if(e){let s=r.tr.join(i);n&&s.setSelection(S.create(s.doc,i-r.doc.resolve(i).nodeBefore.nodeSize)),e(s.scrollIntoView())}return!0},Nf=(r,e)=>{let t=r.selection,n;if(t instanceof S){if(t.node.isTextblock||!Z(r.doc,t.to))return!1;n=t.to}else if(n=$t(r.doc,t.to,1),n==null)return!1;return e&&e(r.tr.join(n).scrollIntoView()),!0},Df=(r,e)=>{let{$from:t,$to:n}=r.selection,i=t.blockRange(n),s=i&&Me(i);return s==null?!1:(e&&e(r.tr.lift(i,s).scrollIntoView()),!0)},eo=(r,e)=>{let{$head:t,$anchor:n}=r.selection;return!t.parent.type.spec.code||!t.sameParent(n)?!1:(e&&e(r.tr.insertText(` -`).scrollIntoView()),!0)};function kr(r){for(let e=0;e{let{$head:t,$anchor:n}=r.selection;if(!t.parent.type.spec.code||!t.sameParent(n))return!1;let i=t.node(-1),s=t.indexAfter(-1),o=kr(i.contentMatchAt(s));if(!o||!i.canReplaceWith(s,s,o))return!1;if(e){let l=t.after(),a=r.tr.replaceWith(l,l,o.createAndFill());a.setSelection(k.near(a.doc.resolve(l),1)),e(a.scrollIntoView())}return!0},no=(r,e)=>{let t=r.selection,{$from:n,$to:i}=t;if(t instanceof H||n.parent.inlineContent||i.parent.inlineContent)return!1;let s=kr(i.parent.contentMatchAt(i.indexAfter()));if(!s||!s.isTextblock)return!1;if(e){let o=(!n.parentOffset&&i.index(){let{$cursor:t}=r.selection;if(!t||t.parent.content.size)return!1;if(t.depth>1&&t.after()!=t.end(-1)){let s=t.before();if(he(r.doc,s))return e&&e(r.tr.split(s).scrollIntoView()),!0}let n=t.blockRange(),i=n&&Me(n);return i==null?!1:(e&&e(r.tr.lift(n,i).scrollIntoView()),!0)};function io(r){return(e,t)=>{if(e.selection instanceof S&&e.selection.node.isBlock){let{$from:d}=e.selection;return!d.parentOffset||!he(e.doc,d.pos)?!1:(t&&t(e.tr.split(d.pos).scrollIntoView()),!0)}if(!e.selection.$from.depth)return!1;let n=e.tr;!e.selection.empty&&(e.selection instanceof C||e.selection instanceof H)&&n.deleteSelection();let{$from:i}=n.selection,s=n.steps.length,o=[],l,a,f=!1,c=!1;for(let d=i.depth;;d--)if(i.node(d).isBlock){f=i.end(d)==i.pos+(i.depth-d),c=i.start(d)==i.pos-(i.depth-d),a=kr(i.node(d-1).contentMatchAt(i.indexAfter(d-1)));let m=r&&r(i.parent,f,i);o.unshift(m||(f&&a?{type:a}:null)),l=d;break}else{if(d==1)return!1;o.unshift(null)}let h=i.pos,u=he(n.doc,h,o.length,o);if(u||(o[0]=a?{type:a}:null,u=he(n.doc,h,o.length,o)),!u)return!1;if(n.split(h,o.length,o),!f&&c&&i.node(l).type!=a){let d=n.mapping.slice(s),p=d.map(i.before(l)),m=n.doc.resolve(p);a&&i.node(l-1).canReplaceWith(m.index(),m.index()+1,a)&&n.setNodeMarkup(d.map(i.before(l)),a)}return t&&t(n.scrollIntoView()),!0}}var Cr=io(),Tf=(r,e)=>Cr(r,e&&(t=>{let n=r.storedMarks||r.selection.$to.parentOffset&&r.selection.$from.marks();n&&t.ensureMarks(n),e(t)})),Ef=(r,e)=>{let{$from:t,to:n}=r.selection,i,s=t.sharedDepth(n);return s==0?!1:(i=t.before(s),e&&e(r.tr.setSelection(S.create(r.doc,i))),!0)},so=(r,e)=>(e&&e(r.tr.setSelection(new H(r.doc))),!0);function Af(r,e,t){let n=e.nodeBefore,i=e.nodeAfter,s=e.index();return!n||!i||!n.type.compatibleContent(i.type)?!1:!n.content.size&&e.parent.canReplace(s-1,s)?(t&&t(r.tr.delete(e.pos-n.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(s,s+1)||!(i.isTextblock||Z(r.doc,e.pos))?!1:(t&&t(r.tr.join(e.pos).scrollIntoView()),!0)}function oo(r,e,t,n){let i=e.nodeBefore,s=e.nodeAfter,o,l,a=i.type.spec.isolating||s.type.spec.isolating;if(!a&&Af(r,e,t))return!0;let f=!a&&e.parent.canReplace(e.index(),e.index()+1);if(f&&(o=(l=i.contentMatchAt(i.childCount)).findWrapping(s.type))&&l.matchType(o[0]||s.type).validEnd){if(t){let d=e.pos+s.nodeSize,p=y.empty;for(let b=o.length-1;b>=0;b--)p=y.from(o[b].create(null,p));p=y.from(i.copy(p));let m=r.tr.step(new E(e.pos-1,d,e.pos,d,new x(p,1,0),o.length,!0)),g=m.doc.resolve(d+2*o.length);g.nodeAfter&&g.nodeAfter.type==i.type&&Z(m.doc,g.pos)&&m.join(g.pos),t(m.scrollIntoView())}return!0}let c=s.type.spec.isolating||n>0&&a?null:k.findFrom(e,1),h=c&&c.$from.blockRange(c.$to),u=h&&Me(h);if(u!=null&&u>=e.depth)return t&&t(r.tr.lift(h,u).scrollIntoView()),!0;if(f&&ft(s,"start",!0)&&ft(i,"end")){let d=i,p=[];for(;p.push(d),!d.isTextblock;)d=d.lastChild;let m=s,g=1;for(;!m.isTextblock;m=m.firstChild)g++;if(d.canReplace(d.childCount,d.childCount,m.content)){if(t){let b=y.empty;for(let w=p.length-1;w>=0;w--)b=y.from(p[w].copy(b));let N=r.tr.step(new E(e.pos-p.length,e.pos+s.nodeSize,e.pos+g,e.pos+s.nodeSize-g,new x(b,p.length,0),0,!0));t(N.scrollIntoView())}return!0}}return!1}function lo(r){return function(e,t){let n=e.selection,i=r<0?n.$from:n.$to,s=i.depth;for(;i.node(s).isInline;){if(!s)return!1;s--}return i.node(s).isTextblock?(t&&t(e.tr.setSelection(C.create(e.doc,r<0?i.start(s):i.end(s)))),!0):!1}}var ao=lo(-1),fo=lo(1);function If(r,e=null){return function(t,n){let{$from:i,$to:s}=t.selection,o=i.blockRange(s),l=o&&ze(o,r,e);return l?(n&&n(t.tr.wrap(o,l).scrollIntoView()),!0):!1}}function Rf(r,e=null){return function(t,n){let i=!1;for(let s=0;s{if(i)return!1;if(!(!a.isTextblock||a.hasMarkup(r,e)))if(a.type==r)i=!0;else{let c=t.doc.resolve(f),h=c.index();i=c.parent.canReplaceWith(h,h+1,r)}})}if(!i)return!1;if(n){let s=t.tr;for(let o=0;o{if(l||!n&&a.isAtom&&a.isInline&&f>=s.pos&&f+a.nodeSize<=o.pos)return!1;l=a.inlineContent&&a.type.allowsMarkType(t)}),l)return!0}return!1}function Bf(r){let e=[];for(let t=0;t{if(s.isAtom&&s.content.size&&s.isInline&&o>=n.pos&&o+s.nodeSize<=i.pos)return o+1>n.pos&&e.push(new Fe(n,n.doc.resolve(o+1))),n=n.doc.resolve(o+1+s.content.size),!1}),n.poso.doc.rangeHasMark(d.$from.pos,d.$to.pos,r)):h=!c.every(d=>{let p=!1;return u.doc.nodesBetween(d.$from.pos,d.$to.pos,(m,g,b)=>{if(p)return!1;p=!r.isInSet(m.marks)&&!!b&&b.type.allowsMarkType(r)&&!(m.isText&&/^\s*$/.test(m.textBetween(Math.max(0,d.$from.pos-g),Math.min(m.nodeSize,d.$to.pos-g))))}),!p});for(let d=0;d{if(!t.isGeneric)return r(t);let n=[];for(let s=0;sn.push(f,c))}let i=[];for(let s=0;ss-o);for(let s=i.length-1;s>=0;s--)Z(t.doc,i[s])&&t.join(i[s]);r(t)}}function Ff(r,e){let t=Array.isArray(e)?n=>e.indexOf(n.type.name)>-1:e;return(n,i,s)=>r(n,i&&vf(i,t),s)}function un(...r){return function(e,t,n){for(let i=0;iuo,nodes:()=>ho,schema:()=>Gf});var Wf=["p",0],Jf=["blockquote",0],$f=["hr"],qf=["pre",["code",0]],Kf=["br"],ho={doc:{content:"block+"},paragraph:{content:"inline*",group:"block",parseDOM:[{tag:"p"}],toDOM(){return Wf}},blockquote:{content:"block+",group:"block",defining:!0,parseDOM:[{tag:"blockquote"}],toDOM(){return Jf}},horizontal_rule:{group:"block",parseDOM:[{tag:"hr"}],toDOM(){return $f}},heading:{attrs:{level:{default:1,validate:"number"}},content:"inline*",group:"block",defining:!0,parseDOM:[{tag:"h1",attrs:{level:1}},{tag:"h2",attrs:{level:2}},{tag:"h3",attrs:{level:3}},{tag:"h4",attrs:{level:4}},{tag:"h5",attrs:{level:5}},{tag:"h6",attrs:{level:6}}],toDOM(r){return["h"+r.attrs.level,0]}},code_block:{content:"text*",marks:"",group:"block",code:!0,defining:!0,parseDOM:[{tag:"pre",preserveWhitespace:"full"}],toDOM(){return qf}},text:{group:"inline"},image:{inline:!0,attrs:{src:{validate:"string"},alt:{default:null,validate:"string|null"},title:{default:null,validate:"string|null"}},group:"inline",draggable:!0,parseDOM:[{tag:"img[src]",getAttrs(r){return{src:r.getAttribute("src"),title:r.getAttribute("title"),alt:r.getAttribute("alt")}}}],toDOM(r){let{src:e,alt:t,title:n}=r.attrs;return["img",{src:e,alt:t,title:n}]}},hard_break:{inline:!0,group:"inline",selectable:!1,parseDOM:[{tag:"br"}],toDOM(){return Kf}}},Hf=["em",0],Uf=["strong",0],jf=["code",0],uo={link:{attrs:{href:{validate:"string"},title:{default:null,validate:"string|null"}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs(r){return{href:r.getAttribute("href"),title:r.getAttribute("title")}}}],toDOM(r){let{href:e,title:t}=r.attrs;return["a",{href:e,title:t},0]}},em:{parseDOM:[{tag:"i"},{tag:"em"},{style:"font-style=italic"},{style:"font-style=normal",clearMark:r=>r.type.name=="em"}],toDOM(){return Hf}},strong:{parseDOM:[{tag:"strong"},{tag:"b",getAttrs:r=>r.style.fontWeight!="normal"&&null},{style:"font-weight=400",clearMark:r=>r.type.name=="strong"},{style:"font-weight",getAttrs:r=>/^(bold(er)?|[5-9]\d{2,})$/.test(r)&&null}],toDOM(){return Uf}},code:{code:!0,parseDOM:[{tag:"code"}],toDOM(){return jf}}},Gf=new pt({nodes:ho,marks:uo});var So={};j(So,{addListNodes:()=>Qf,bulletList:()=>go,liftListItem:()=>nc,listItem:()=>yo,orderedList:()=>mo,sinkListItem:()=>sc,splitListItem:()=>bo,splitListItemKeepMarks:()=>tc,wrapInList:()=>Zf,wrapRangeInList:()=>xo});var Yf=["ol",0],Xf=["ul",0],_f=["li",0],mo={attrs:{order:{default:1,validate:"number"}},parseDOM:[{tag:"ol",getAttrs(r){return{order:r.hasAttribute("start")?+r.getAttribute("start"):1}}}],toDOM(r){return r.attrs.order==1?Yf:["ol",{start:r.attrs.order},0]}},go={parseDOM:[{tag:"ul"}],toDOM(){return Xf}},yo={parseDOM:[{tag:"li"}],toDOM(){return _f},defining:!0};function Or(r,e){let t={};for(let n in r)t[n]=r[n];for(let n in e)t[n]=e[n];return t}function Qf(r,e,t){return r.append({ordered_list:Or(mo,{content:"list_item+",group:t}),bullet_list:Or(go,{content:"list_item+",group:t}),list_item:Or(yo,{content:e})})}function Zf(r,e=null){return function(t,n){let{$from:i,$to:s}=t.selection,o=i.blockRange(s);if(!o)return!1;let l=n?t.tr:null;return xo(l,o,r,e)?(n&&n(l.scrollIntoView()),!0):!1}}function xo(r,e,t,n=null){let i=!1,s=e,o=e.$from.doc;if(e.depth>=2&&e.$from.node(e.depth-1).type.compatibleContent(t)&&e.startIndex==0){if(e.$from.index(e.depth-1)==0)return!1;let a=o.resolve(e.start-2);s=new be(a,a,e.depth),e.endIndex=0;c--)s=y.from(t[c].type.create(t[c].attrs,s));r.step(new E(e.start-(n?2:0),e.end,e.start,e.end,new x(s,0,0),t.length,!0));let o=0;for(let c=0;c=i.depth-3;b--)h=y.from(i.node(b).copy(h));let d=i.indexAfter(-1){if(g>-1)return!1;b.isTextblock&&b.content.size==0&&(g=N+1)}),g>-1&&m.setSelection(k.near(m.doc.resolve(g))),n(m.scrollIntoView())}return!0}let a=s.pos==i.end()?l.contentMatchAt(0).defaultType:null,f=t.tr.delete(i.pos,s.pos),c=a?[e?{type:r,attrs:e}:null,{type:a}]:void 0;return he(f.doc,i.pos,2,c)?(n&&n(f.split(i.pos,2,c).scrollIntoView()),!0):!1}}function tc(r,e){let t=bo(r,e);return(n,i)=>t(n,i&&(s=>{let o=n.storedMarks||n.selection.$to.parentOffset&&n.selection.$from.marks();o&&s.ensureMarks(o),i(s)}))}function nc(r){return function(e,t){let{$from:n,$to:i}=e.selection,s=n.blockRange(i,o=>o.childCount>0&&o.firstChild.type==r);return s?t?n.node(s.depth-1).type==r?rc(e,t,r,s):ic(e,t,s):!0:!1}}function rc(r,e,t,n){let i=r.tr,s=n.end,o=n.$to.end(n.depth);sm;p--)d-=i.child(p).nodeSize,n.delete(d-1,d+1);let s=n.doc.resolve(t.start),o=s.nodeAfter;if(n.mapping.map(t.end)!=t.start+s.nodeAfter.nodeSize)return!1;let l=t.startIndex==0,a=t.endIndex==i.childCount,f=s.node(-1),c=s.index(-1);if(!f.canReplace(c+(l?0:1),c+1,o.content.append(a?y.empty:y.from(i))))return!1;let h=s.pos,u=h+o.nodeSize;return n.step(new E(h-(l?1:0),u+(a?1:0),h+1,u-1,new x((l?y.empty:y.from(i.copy(y.empty))).append(a?y.empty:y.from(i.copy(y.empty))),l?0:1,a?0:1),l?0:1)),e(n.scrollIntoView()),!0}function sc(r){return function(e,t){let{$from:n,$to:i}=e.selection,s=n.blockRange(i,f=>f.childCount>0&&f.firstChild.type==r);if(!s)return!1;let o=s.startIndex;if(o==0)return!1;let l=s.parent,a=l.child(o-1);if(a.type!=r)return!1;if(t){let f=a.lastChild&&a.lastChild.type==l.type,c=y.from(f?r.create():null),h=new x(y.from(r.create(null,y.from(l.type.create(null,c)))),f?3:1,0),u=s.start,d=s.end;t(e.tr.step(new E(u-(f?3:1),d,u,d,h,1,!0)).scrollIntoView())}return!0}}var No={};j(No,{InputRule:()=>ne,closeDoubleQuote:()=>Mo,closeSingleQuote:()=>wo,ellipsis:()=>hc,emDash:()=>cc,inputRules:()=>ac,openDoubleQuote:()=>Co,openSingleQuote:()=>Oo,smartQuotes:()=>uc,textblockTypeInputRule:()=>pc,undoInputRule:()=>fc,wrappingInputRule:()=>dc});var ne=class{constructor(e,t,n={}){this.match=e,this.match=e,this.handler=typeof t=="string"?oc(t):t,this.undoable=n.undoable!==!1,this.inCode=n.inCode||!1,this.inCodeMark=n.inCodeMark!==!1}};function oc(r){return function(e,t,n,i){let s=r;if(t[1]){let o=t[0].lastIndexOf(t[1]);s+=t[0].slice(o+t[1].length),n+=o;let l=n-i;l>0&&(s=t[0].slice(o-l,o)+s,n=i)}return e.tr.insertText(s,n,i)}}var lc=500;function ac({rules:r}){let e=new W({state:{init(){return null},apply(t,n){let i=t.getMeta(this);return i||(t.selectionSet||t.docChanged?null:n)}},props:{handleTextInput(t,n,i,s){return ko(t,n,i,s,r,e)},handleDOMEvents:{compositionend:t=>{setTimeout(()=>{let{$cursor:n}=t.state.selection;n&&ko(t,n.pos,n.pos,"",r,e)})}}},isInputRules:!0});return e}function ko(r,e,t,n,i,s){if(r.composing)return!1;let o=r.state,l=o.doc.resolve(e),a=l.parent.textBetween(Math.max(0,l.parentOffset-lc),l.parentOffset,null,"\uFFFC")+n;for(let f=0;fp.type.spec.code))continue;if(l.parent.type.spec.code){if(!c.inCode)continue}else if(c.inCode==="only")continue;let h=c.match.exec(a);if(!h||h[0].length{m.isInline&&m.marks.some(g=>g.type.spec.code)&&(p=!0)}),p)continue}let d=c.handler(o,h,u,t);if(d)return c.undoable&&d.setMeta(s,{transform:d,from:e,to:t,text:n}),r.dispatch(d),!0}return!1}var fc=(r,e)=>{let t=r.plugins;for(let n=0;n=0;a--)o.step(l.steps[a].invert(l.docs[a]));if(s.text){let a=o.doc.resolve(s.from).marks();o.replaceWith(s.from,s.to,r.schema.text(s.text,a))}else o.delete(s.from,s.to);e(o)}return!0}}return!1},cc=new ne(/--$/,"\u2014",{inCodeMark:!1}),hc=new ne(/\.\.\.$/,"\u2026",{inCodeMark:!1}),Co=new ne(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(")$/,"\u201C",{inCodeMark:!1}),Mo=new ne(/"$/,"\u201D",{inCodeMark:!1}),Oo=new ne(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(')$/,"\u2018",{inCodeMark:!1}),wo=new ne(/'$/,"\u2019",{inCodeMark:!1}),uc=[Co,Mo,Oo,wo];function dc(r,e,t=null,n){return new ne(r,(i,s,o,l)=>{let a=t instanceof Function?t(s):t,f=i.tr.delete(o,l),c=f.doc.resolve(o),h=c.blockRange(),u=h&&ze(h,e,a);if(!u)return null;f.wrap(h,u);let d=f.doc.resolve(o-1).nodeBefore;return d&&d.type==e&&Z(f.doc,o-1)&&(!n||n(s,d))&&f.join(o-1),f})}function pc(r,e,t=null){return new ne(r,(n,i,s,o)=>{let l=n.doc.resolve(s),a=t instanceof Function?t(i):t;return l.node(-1).canReplaceWith(l.index(-1),l.indexAfter(-1),e)?n.tr.delete(s,o).setBlockType(s,s,e,a):null})}var Do={};j(Do,{dropCursor:()=>mc});function mc(r={}){return new W({view(e){return new wr(e,r)}})}var wr=class{constructor(e,t){var n;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.lastDragEvent=null,this.width=(n=t.width)!==null&&n!==void 0?n:1,this.color=t.color===!1?void 0:t.color||"black",this.class=t.class,this.handlers=["dragover","dragend","drop","dragleave"].map(i=>{let s=o=>{this[i](o)};return e.dom.addEventListener(i,s),{name:i,handler:s}})}destroy(){this.handlers.forEach(({name:e,handler:t})=>this.editorView.dom.removeEventListener(e,t))}update(e,t){if(this.cursorPos!=null&&t.doc!=e.state.doc)if(this.lastDragEvent){let n=this.computeTarget(this.lastDragEvent);n==this.cursorPos?this.updateOverlay():this.setCursor(n)}else this.updateOverlay()}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),t=!e.parent.inlineContent,n,i=this.editorView.dom,s=i.getBoundingClientRect(),o=s.width/i.offsetWidth,l=s.height/i.offsetHeight;if(t){let h=e.nodeBefore,u=e.nodeAfter;if(h||u){let d=this.editorView.nodeDOM(this.cursorPos-(h?h.nodeSize:0));if(d){let p=d.getBoundingClientRect(),m=h?p.bottom:p.top;h&&u&&(m=(m+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let g=this.width/2*l;n={left:p.left,right:p.right,top:m-g,bottom:m+g}}}}if(!n){let h=this.editorView.coordsAtPos(this.cursorPos),u=this.width/2*o;n={left:h.left-u,right:h.left+u,top:h.top,bottom:h.bottom}}let a=this.editorView.dom.offsetParent;this.element||(this.element=a.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",t),this.element.classList.toggle("prosemirror-dropcursor-inline",!t);let f,c;if(!a||a==document.body&&getComputedStyle(a).position=="static")f=-pageXOffset,c=-pageYOffset;else{let h=a.getBoundingClientRect(),u=h.width/a.offsetWidth,d=h.height/a.offsetHeight;f=h.left-a.scrollLeft*u,c=h.top-a.scrollTop*d}this.element.style.left=(n.left-f)/o+"px",this.element.style.top=(n.top-c)/l+"px",this.element.style.width=(n.right-n.left)/o+"px",this.element.style.height=(n.bottom-n.top)/l+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}computeTarget(e){let t=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),n=t&&t.inside>=0&&this.editorView.state.doc.nodeAt(t.inside),i=n&&n.type.spec.disableDropCursor,s=typeof i=="function"?i(this.editorView,t,e):i;if(!t||s)return null;let o=t.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let l=kt(this.editorView.state.doc,o,this.editorView.dragging.slice);l!=null&&(o=l)}return o}dragover(e){if(!this.editorView.editable)return;this.lastDragEvent=e;let t=this.computeTarget(e);t!=null&&(this.setCursor(t),this.scheduleRemoval(5e3))}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}};var Eo={};j(Eo,{GapCursor:()=>z,gapCursor:()=>xc});var z=class r extends k{constructor(e){super(e,e)}map(e,t){let n=e.resolve(t.map(this.head));return r.valid(n)?new r(n):k.near(n)}content(){return x.empty}eq(e){return e instanceof r&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,t){if(typeof t.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new r(e.resolve(t.pos))}getBookmark(){return new Nr(this.anchor)}static valid(e){let t=e.parent;if(t.inlineContent||!gc(e)||!yc(e))return!1;let n=t.type.spec.allowGapCursor;if(n!=null)return n;let i=t.contentMatchAt(e.index()).defaultType;return i&&i.isTextblock}static findGapCursorFrom(e,t,n=!1){e:for(;;){if(!n&&r.valid(e))return e;let i=e.pos,s=null;for(let o=e.depth;;o--){let l=e.node(o);if(t>0?e.indexAfter(o)0){s=l.child(t>0?e.indexAfter(o):e.index(o)-1);break}else if(o==0)return null;i+=t;let a=e.doc.resolve(i);if(r.valid(a))return a}for(;;){let o=t>0?s.firstChild:s.lastChild;if(!o){if(s.isAtom&&!s.isText&&!S.isSelectable(s)){e=e.doc.resolve(i+s.nodeSize*t),n=!1;continue e}break}s=o,i+=t;let l=e.doc.resolve(i);if(r.valid(l))return l}return null}}};z.prototype.visible=!1;z.findFrom=z.findGapCursorFrom;k.jsonID("gapcursor",z);var Nr=class r{constructor(e){this.pos=e}map(e){return new r(e.map(this.pos))}resolve(e){let t=e.resolve(this.pos);return z.valid(t)?new z(t):k.near(t)}};function To(r){return r.isAtom||r.spec.isolating||r.spec.createGapCursor}function gc(r){for(let e=r.depth;e>=0;e--){let t=r.index(e),n=r.node(e);if(t==0){if(n.type.spec.isolating)return!0;continue}for(let i=n.child(t-1);;i=i.lastChild){if(i.childCount==0&&!i.inlineContent||To(i.type))return!0;if(i.inlineContent)return!1}}return!0}function yc(r){for(let e=r.depth;e>=0;e--){let t=r.indexAfter(e),n=r.node(e);if(t==n.childCount){if(n.type.spec.isolating)return!0;continue}for(let i=n.child(t);;i=i.firstChild){if(i.childCount==0&&!i.inlineContent||To(i.type))return!0;if(i.inlineContent)return!1}}return!0}function xc(){return new W({props:{decorations:Cc,createSelectionBetween(r,e,t){return e.pos==t.pos&&z.valid(t)?new z(t):null},handleClick:Sc,handleKeyDown:bc,handleDOMEvents:{beforeinput:kc}}})}var bc=hn({ArrowLeft:dn("horiz",-1),ArrowRight:dn("horiz",1),ArrowUp:dn("vert",-1),ArrowDown:dn("vert",1)});function dn(r,e){let t=r=="vert"?e>0?"down":"up":e>0?"right":"left";return function(n,i,s){let o=n.selection,l=e>0?o.$to:o.$from,a=o.empty;if(o instanceof C){if(!s.endOfTextblock(t)||l.depth==0)return!1;a=!1,l=n.doc.resolve(e>0?l.after():l.before())}let f=z.findGapCursorFrom(l,e,a);return f?(i&&i(n.tr.setSelection(new z(f))),!0):!1}}function Sc(r,e,t){if(!r||!r.editable)return!1;let n=r.state.doc.resolve(e);if(!z.valid(n))return!1;let i=r.posAtCoords({left:t.clientX,top:t.clientY});return i&&i.inside>-1&&S.isSelectable(r.state.doc.nodeAt(i.inside))?!1:(r.dispatch(r.state.tr.setSelection(new z(n))),!0)}function kc(r,e){if(e.inputType!="insertCompositionText"||!(r.state.selection instanceof z))return!1;let{$from:t}=r.state.selection,n=t.parent.contentMatchAt(t.index()).findWrapping(r.state.schema.nodes.text);if(!n)return!1;let i=y.empty;for(let o=n.length-1;o>=0;o--)i=y.from(n[o].createAndFill(null,i));let s=r.state.tr.replace(t.pos,t.pos,new x(i,0,0));return s.setSelection(C.near(s.doc.resolve(t.pos+1))),r.dispatch(s),!1}function Cc(r){if(!(r.selection instanceof z))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",J.create(r.doc,[te.widget(r.selection.head,e,{key:"gapcursor"})])}export{vs as collab,co as commands,Do as dropcursor,Eo as gapcursor,qs as history,No as inputrules,Hs as keymap,ei as model,po as schemaBasic,So as schemaList,wi as state,gi as transform,Bs as view}; +`);return{dom:c,text:u,slice:e}}function Sc(n,e,t,r,i){let s=i.parent.type.spec.code,o,l;if(!t&&!e)return null;let c=!!e&&(r||s||!t);if(c){if(n.someProp("transformPastedText",u=>{e=u(e,s||r,n)}),s)return l=new b(y.from(n.state.schema.text(e.replace(/\r\n?/g,` +`))),0,0),n.someProp("transformPasted",u=>{l=u(l,n,!0)}),l;let f=n.someProp("clipboardTextParser",u=>u(e,i,r,n));if(f)l=f;else{let u=i.marks(),{schema:d}=n.state,p=$t.fromSchema(d);o=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(m=>{let g=o.appendChild(document.createElement("p"));m&&g.appendChild(p.serializeNode(d.text(m,u)))})}}else n.someProp("transformPastedHTML",f=>{t=f(t,n)}),o=Y0(t),_i&&K0(o);let a=o&&o.querySelector("[data-pm-slice]"),h=a&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(a.getAttribute("data-pm-slice")||"");if(h&&h[3])for(let f=+h[3];f>0;f--){let u=o.firstChild;for(;u&&u.nodeType!=1;)u=u.nextSibling;if(!u)break;o=u}if(l||(l=(n.someProp("clipboardParser")||n.someProp("domParser")||ur.fromSchema(n.state.schema)).parseSlice(o,{preserveWhitespace:!!(c||h),context:i,ruleFromNode(u){return u.nodeName=="BR"&&!u.nextSibling&&u.parentNode&&!J0.test(u.parentNode.nodeName)?{ignore:!0}:null}})),h)l=H0(xu(l,+h[1],+h[2]),h[4]);else if(l=b.maxOpen(W0(l.content,i),!0),l.openStart||l.openEnd){let f=0,u=0;for(let d=l.content.firstChild;f{l=f(l,n,c)}),l}var J0=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function W0(n,e){if(n.childCount<2)return n;for(let t=e.depth;t>=0;t--){let i=e.node(t).contentMatchAt(e.index(t)),s,o=[];if(n.forEach(l=>{if(!o)return;let c=i.findWrapping(l.type),a;if(!c)return o=null;if(a=o.length&&s.length&&ju(c,s,l,o[o.length-1],0))o[o.length-1]=a;else{o.length&&(o[o.length-1]=Yu(o[o.length-1],s.length));let h=Wu(l,c);o.push(h),i=i.matchType(h.type),s=c}}),o)return y.from(o)}return n}function Wu(n,e,t=0){for(let r=e.length-1;r>=t;r--)n=e[r].create(null,y.from(n));return n}function ju(n,e,t,r,i){if(i1&&(s=0),i=t&&(l=e<0?o.contentMatchAt(0).fillBefore(l,s<=i).append(l):l.append(o.contentMatchAt(o.childCount).fillBefore(y.empty,!0))),n.replaceChild(e<0?0:n.childCount-1,o.copy(l))}function xu(n,e,t){return et})),Kl.createHTML(n)):n}function Y0(n){let e=/^(\s*]*>)*/.exec(n);e&&(n=n.slice(e[0].length));let t=Hu(),r=t.body,i=/<([a-z][^>\s]+)/i.exec(n),s;if((s=i&&Ku[i[1].toLowerCase()])&&(n=s.map(o=>"<"+o+">").join("")+n+s.map(o=>"").reverse().join("")),r.innerHTML=j0(n),s)for(let o=0;o=0;l-=2){let c=t.nodes[r[l]];if(!c||c.hasRequiredAttrs())break;i=y.from(c.create(r[l+1],i)),s++,o++}return new b(i,s,o)}var xe={},be={},G0={touchstart:!0,touchmove:!0},hc=class{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:"",button:0},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastChromeDelete=0,this.composing=!1,this.compositionNode=null,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.badSafariComposition=!1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}};function X0(n){for(let e in xe){let t=xe[e];n.dom.addEventListener(e,n.input.eventHandlers[e]=r=>{Q0(n,r)&&!kc(n,r)&&(n.editable||!(r.type in be))&&t(n,r)},G0[e]?{passive:!0}:void 0)}de&&n.dom.addEventListener("input",()=>null),fc(n)}function kt(n,e){n.input.lastSelectionOrigin=e,n.input.lastSelectionTime=Date.now()}function Z0(n){n.input.mouseDown&&n.input.mouseDown.done(),n.domObserver.stop();for(let e in n.input.eventHandlers)n.dom.removeEventListener(e,n.input.eventHandlers[e]);clearTimeout(n.input.composingTimeout),clearTimeout(n.input.lastIOSEnterFallbackTimeout)}function fc(n){n.someProp("handleDOMEvents",e=>{for(let t in e)n.input.eventHandlers[t]||n.dom.addEventListener(t,n.input.eventHandlers[t]=r=>kc(n,r))})}function kc(n,e){return n.someProp("handleDOMEvents",t=>{let r=t[e.type];return r?r(n,e)||e.defaultPrevented:!1})}function Q0(n,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target;t!=n.dom;t=t.parentNode)if(!t||t.nodeType==11||t.pmViewDesc&&t.pmViewDesc.stopEvent(e))return!1;return!0}function ex(n,e){!kc(n,e)&&xe[e.type]&&(n.editable||!(e.type in be))&&xe[e.type](n,e)}be.keydown=(n,e)=>{let t=e;if(n.input.shiftKey=t.keyCode==16||t.shiftKey,!Zu(n)&&(n.input.lastKeyCode=t.keyCode,n.input.lastKeyCodeTime=Date.now(),!(St&&ne&&t.keyCode==13)))if(t.keyCode!=229&&n.domObserver.forceFlush(),Cr&&t.keyCode==13&&!t.ctrlKey&&!t.altKey&&!t.metaKey){let r=Date.now();n.input.lastIOSEnter=r,n.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{n.input.lastIOSEnter==r&&(n.someProp("handleKeyDown",i=>i(n,Mn(13,"Enter"))),n.input.lastIOSEnter=0)},200)}else n.someProp("handleKeyDown",r=>r(n,t))||q0(n,t)?t.preventDefault():kt(n,"key")};be.keyup=(n,e)=>{e.keyCode==16&&(n.input.shiftKey=!1)};be.keypress=(n,e)=>{let t=e;if(Zu(n)||!t.charCode||t.ctrlKey&&!t.altKey||Ue&&t.metaKey)return;if(n.someProp("handleKeyPress",i=>i(n,t))){t.preventDefault();return}let r=n.state.selection;if(!(r instanceof D)||!r.$from.sameParent(r.$to)){let i=String.fromCharCode(t.charCode),s=()=>n.state.tr.insertText(i).scrollIntoView();!/[\r\n]/.test(i)&&!n.someProp("handleTextInput",o=>o(n,r.$from.pos,r.$to.pos,i,s))&&n.dispatch(s()),t.preventDefault()}};function vi(n){return{left:n.clientX,top:n.clientY}}function tx(n,e){let t=e.x-n.clientX,r=e.y-n.clientY;return t*t+r*r<100}function Cc(n,e,t,r,i){if(r==-1)return!1;let s=n.state.doc.resolve(r);for(let o=s.depth+1;o>0;o--)if(n.someProp(e,l=>o>s.depth?l(n,t,s.nodeAfter,s.before(o),i,!0):l(n,t,s.node(o),s.before(o),i,!1)))return!0;return!1}function Vi(n,e,t){if(n.focused||n.focus(),n.state.selection.eq(e))return;let r=n.state.tr.setSelection(e);t=="pointer"&&r.setMeta("pointer",!0),n.dispatch(r)}function nx(n,e){if(e==-1)return!1;let t=n.state.doc.resolve(e),r=t.nodeAfter;return r&&r.isAtom&&w.isSelectable(r)?(Vi(n,new w(t),"pointer"),!0):!1}function rx(n,e){if(e==-1)return!1;let t=n.state.selection,r,i;t instanceof w&&(r=t.node);let s=n.state.doc.resolve(e);for(let o=s.depth+1;o>0;o--){let l=o>s.depth?s.nodeAfter:s.node(o);if(w.isSelectable(l)){r&&t.$from.depth>0&&o>=t.$from.depth&&s.before(t.$from.depth+1)==t.$from.pos?i=s.before(t.$from.depth):i=s.before(o);break}}return i!=null?(Vi(n,w.create(n.state.doc,i),"pointer"),!0):!1}function ix(n,e,t,r,i){return Cc(n,"handleClickOn",e,t,r)||n.someProp("handleClick",s=>s(n,e,r))||(i?rx(n,t):nx(n,t))}function sx(n,e,t,r){return Cc(n,"handleDoubleClickOn",e,t,r)||n.someProp("handleDoubleClick",i=>i(n,e,r))}function ox(n,e,t,r){return Cc(n,"handleTripleClickOn",e,t,r)||n.someProp("handleTripleClick",i=>i(n,e,r))||lx(n,t,r)}function lx(n,e,t){if(t.button!=0)return!1;let r=Gu(n,e,!0),i=n.state.doc;return r?(Vi(n,r,"pointer"),r instanceof D&&i.eq(n.state.doc)&&(n.input.mouseDown=new dc(n,r)),!0):!1}function Gu(n,e,t){let r=n.state.doc;if(e==-1)return r.inlineContent?D.create(r,0,r.content.size):null;let i=r.resolve(e);for(let s=i.depth+1;s>0;s--){let o=s>i.depth?i.nodeAfter:i.node(s),l=i.before(s);if(o.inlineContent)return D.create(r,l+1,l+1+o.content.size);if(t&&w.isSelectable(o))return w.create(r,l)}return null}function Tc(n){return Ei(n)}var Xu=Ue?"metaKey":"ctrlKey";xe.mousedown=(n,e)=>{let t=e;n.input.shiftKey=t.shiftKey;let r=Tc(n),i=Date.now(),s="singleClick";i-n.input.lastClick.time<500&&tx(t,n.input.lastClick)&&!t[Xu]&&n.input.lastClick.button==t.button&&(n.input.lastClick.type=="singleClick"?s="doubleClick":n.input.lastClick.type=="doubleClick"&&(s="tripleClick")),n.input.lastClick={time:i,x:t.clientX,y:t.clientY,type:s,button:t.button},n.input.mouseDown&&n.input.mouseDown.done();let o=n.posAtCoords(vi(t));o&&(s=="singleClick"?n.input.mouseDown=new uc(n,o,t,!!r):(s=="doubleClick"?sx:ox)(n,o.pos,o.inside,t)?t.preventDefault():kt(n,"pointer"))};var Zs=class{constructor(e){this.view=e,this.mightDrag=null,e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this))}up(e){this.done()}move(e){e.buttons==0&&this.done()}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.view.input.mouseDown==this&&(this.view.input.mouseDown=null)}delaySelUpdate(){return!1}},uc=class extends Zs{constructor(e,t,r,i){super(e),this.pos=t,this.event=r,this.flushed=i,this.delayedSelectionSync=!1,this.startDoc=e.state.doc,this.selectNode=!!r[Xu],this.allowDefault=r.shiftKey;let s,o;if(t.inside>-1)s=e.state.doc.nodeAt(t.inside),o=t.inside;else{let h=e.state.doc.resolve(t.pos);s=h.parent,o=h.depth?h.before():0}let l=i?null:r.target,c=l?e.docView.nearestDesc(l,!0):null;this.target=c&&c.nodeDOM.nodeType==1?c.nodeDOM:null;let{selection:a}=e.state;r.button==0&&(s.type.spec.draggable&&s.type.spec.selectable!==!1||a instanceof w&&a.from<=o&&a.to>o)&&(this.mightDrag={node:s,pos:o,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&Pe&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),kt(e,"pointer")}done(){super.done(),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>{this.view.isDestroyed||Ct(this.view)})}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let t=this.pos;this.view.state.doc!=this.startDoc&&(t=this.view.posAtCoords(vi(e))),this.updateAllowDefault(e),this.allowDefault||!t?kt(this.view,"pointer"):ix(this.view,t.pos,t.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||de&&this.mightDrag&&!this.mightDrag.node.isAtom||ne&&!this.view.state.selection.visible&&Math.min(Math.abs(t.pos-this.view.state.selection.from),Math.abs(t.pos-this.view.state.selection.to))<=2)?(Vi(this.view,T.near(this.view.state.doc.resolve(t.pos)),"pointer"),e.preventDefault()):kt(this.view,"pointer")}move(e){this.updateAllowDefault(e),kt(this.view,"pointer"),super.move(e)}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}delaySelUpdate(){return this.allowDefault?(this.delayedSelectionSync=!0,!0):!1}},dc=class extends Zs{constructor(e,t){super(e),this.startSelection=t,this.startDoc=e.state.doc}move(e){if(e.buttons==0||this.view.isDestroyed||!this.view.state.doc.eq(this.startDoc)){this.done();return}e.preventDefault(),kt(this.view,"pointer");let t=this.view.posAtCoords(vi(e)),r=t&&Gu(this.view,t.inside,!1);if(!r)return;let{doc:i}=this.view.state,s=this.startSelection,[o,l]=r.from{n.input.lastTouch=Date.now(),Tc(n),kt(n,"pointer")};xe.touchmove=n=>{n.input.lastTouch=Date.now(),kt(n,"pointer")};xe.contextmenu=n=>Tc(n);function Zu(n,e){return n.composing?!0:de&&Math.abs(Date.now()-n.input.compositionEndedAt)<500?(n.input.compositionEndedAt=-2e8,!0):!1}var cx=St?5e3:-1;be.compositionstart=be.compositionupdate=n=>{if(!n.composing){n.domObserver.flush();let{state:e}=n,t=e.selection.$to;if(e.selection instanceof D&&(e.storedMarks||!t.textOffset&&t.parentOffset&&t.nodeBefore.marks.some(r=>r.type.spec.inclusive===!1)||ne&&Iu&&ax(n)))n.markCursor=n.state.storedMarks||t.marks(),Ei(n,!0),n.markCursor=null;else if(Ei(n,!e.selection.empty),Pe&&e.selection.empty&&t.parentOffset&&!t.textOffset&&t.nodeBefore.marks.length){let r=n.domSelectionRange();for(let i=r.focusNode,s=r.focusOffset;i&&i.nodeType==1&&s!=0;){let o=s<0?i.lastChild:i.childNodes[s-1];if(!o)break;if(o.nodeType==3){let l=n.domSelection();l&&l.collapse(o,o.nodeValue.length);break}else i=o,s=-1}}n.input.composing=!0}Qu(n,cx)};function ax(n){let{focusNode:e,focusOffset:t}=n.domSelectionRange();if(!e||e.nodeType!=1||t>=e.childNodes.length)return!1;let r=e.childNodes[t];return r.nodeType==1&&r.contentEditable=="false"}be.compositionend=(n,e)=>{n.composing&&(n.input.composing=!1,n.input.compositionEndedAt=Date.now(),n.input.compositionPendingChanges=n.domObserver.pendingRecords().length?n.input.compositionID:0,n.input.compositionNode=null,n.input.badSafariComposition?n.domObserver.forceFlush():n.input.compositionPendingChanges&&Promise.resolve().then(()=>n.domObserver.flush()),n.input.compositionID++,Qu(n,20))};function Qu(n,e){clearTimeout(n.input.composingTimeout),e>-1&&(n.input.composingTimeout=setTimeout(()=>Ei(n),e))}function ed(n){for(n.composing&&(n.input.composing=!1,n.input.compositionEndedAt=Date.now());n.input.compositionNodes.length>0;)n.input.compositionNodes.pop().markParentsDirty()}function hx(n){let e=n.domSelectionRange();if(!e.focusNode)return null;let t=l0(e.focusNode,e.focusOffset),r=c0(e.focusNode,e.focusOffset);if(t&&r&&t!=r){let i=r.pmViewDesc,s=n.domObserver.lastChangedTextNode;if(t==s||r==s)return s;if(!i||!i.isText(r.nodeValue))return r;if(n.input.compositionNode==r){let o=t.pmViewDesc;if(!(!o||!o.isText(t.nodeValue)))return r}}return t||r}function Ei(n,e=!1){if(!(St&&n.domObserver.flushingSoon>=0)){if(n.domObserver.forceFlush(),ed(n),e||n.docView&&n.docView.dirty){let t=xc(n),r=n.state.selection;return t&&!t.eq(r)?n.dispatch(n.state.tr.setSelection(t)):(n.markCursor||e)&&!r.$from.node(r.$from.sharedDepth(r.to)).inlineContent?n.dispatch(n.state.tr.deleteSelection()):n.updateState(n.state),!0}return!1}}function fx(n,e){if(!n.dom.parentNode)return;let t=n.dom.parentNode.appendChild(document.createElement("div"));t.appendChild(e),t.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),i=document.createRange();i.selectNodeContents(e),n.dom.blur(),r.removeAllRanges(),r.addRange(i),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),n.focus()},50)}var Ai=Ee&&Yt<15||Cr&&u0<604;xe.copy=be.cut=(n,e)=>{let t=e,r=n.state.selection,i=t.type=="cut";if(r.empty)return;let s=Ai?null:t.clipboardData,o=r.content(),{dom:l,text:c}=wc(n,o);s?(t.preventDefault(),s.clearData(),s.setData("text/html",l.innerHTML),s.setData("text/plain",c)):fx(n,l),i&&n.dispatch(n.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function ux(n){return n.openStart==0&&n.openEnd==0&&n.content.childCount==1?n.content.firstChild:null}function dx(n,e){if(!n.dom.parentNode)return;let t=n.input.shiftKey||n.state.selection.$from.parent.type.spec.code,r=n.dom.parentNode.appendChild(document.createElement(t?"textarea":"div"));t||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let i=n.input.shiftKey&&n.input.lastKeyCode!=45;setTimeout(()=>{n.focus(),r.parentNode&&r.parentNode.removeChild(r),t?Ni(n,r.value,null,i,e):Ni(n,r.textContent,r.innerHTML,i,e)},50)}function Ni(n,e,t,r,i){let s=Sc(n,e,t,r,n.state.selection.$from);if(n.someProp("handlePaste",c=>c(n,i,s||b.empty)))return!0;if(!s)return!1;let o=ux(s),l=o?n.state.tr.replaceSelectionWith(o,r):n.state.tr.replaceSelection(s);return n.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function td(n){let e=n.getData("text/plain")||n.getData("Text");if(e)return e;let t=n.getData("text/uri-list");return t?t.replace(/\r?\n/g," "):""}be.paste=(n,e)=>{let t=e;if(n.composing&&!St)return;let r=Ai?null:t.clipboardData,i=n.input.shiftKey&&n.input.lastKeyCode!=45;r&&Ni(n,td(r),r.getData("text/html"),i,t)?t.preventDefault():dx(n,t)};var Qs=class{constructor(e,t,r){this.slice=e,this.move=t,this.node=r}},px=Ue?"altKey":"ctrlKey";function nd(n,e){let t;return n.someProp("dragCopies",r=>{t=t||r(e)}),t!=null?!t:!e[px]}xe.dragstart=(n,e)=>{let t=e,r=n.input.mouseDown;if(r&&r.done(),!t.dataTransfer)return;let i=n.state.selection,s=i.empty?null:n.posAtCoords(vi(t)),o;if(!(s&&s.pos>=i.from&&s.pos<=(i instanceof w?i.to-1:i.to))){if(r&&r.mightDrag)o=w.create(n.state.doc,r.mightDrag.pos);else if(t.target&&t.target.nodeType==1){let f=n.docView.nearestDesc(t.target,!0);f&&f.node.type.spec.draggable&&f!=n.docView&&(o=w.create(n.state.doc,f.posBefore))}}let l=(o||n.state.selection).content(),{dom:c,text:a,slice:h}=wc(n,l);(!t.dataTransfer.files.length||!ne||Nu>120)&&t.dataTransfer.clearData(),t.dataTransfer.setData(Ai?"Text":"text/html",c.innerHTML),t.dataTransfer.effectAllowed="copyMove",Ai||t.dataTransfer.setData("text/plain",a),n.dragging=new Qs(h,nd(n,t),o)};xe.dragend=n=>{let e=n.dragging;window.setTimeout(()=>{n.dragging==e&&(n.dragging=null)},50)};be.dragover=be.dragenter=(n,e)=>e.preventDefault();be.drop=(n,e)=>{try{mx(n,e,n.dragging)}finally{n.dragging=null}};function mx(n,e,t){if(!e.dataTransfer)return;let r=n.posAtCoords(vi(e));if(!r)return;let i=n.state.doc.resolve(r.pos),s=t&&t.slice;s?n.someProp("transformPasted",d=>{s=d(s,n,!1)}):s=Sc(n,td(e.dataTransfer),Ai?null:e.dataTransfer.getData("text/html"),!1,i);let o=!!(t&&nd(n,e));if(n.someProp("handleDrop",d=>d(n,e,s||b.empty,o))){e.preventDefault();return}if(!s)return;e.preventDefault();let l=s?Ci(n.state.doc,i.pos,s):i.pos;l==null&&(l=i.pos);let c=n.state.tr;if(o){let{node:d}=t;d?d.replace(c):c.deleteSelection()}let a=c.mapping.map(l),h=s.openStart==0&&s.openEnd==0&&s.content.childCount==1,f=c.doc;if(h?c.replaceRangeWith(a,a,s.content.firstChild):c.replaceRange(a,a,s),c.doc.eq(f))return;let u=c.doc.resolve(a);if(h&&w.isSelectable(s.content.firstChild)&&u.nodeAfter&&u.nodeAfter.sameMarkup(s.content.firstChild))c.setSelection(new w(u));else{let d=c.mapping.map(l);c.mapping.maps[c.mapping.maps.length-1].forEach((p,m,g,x)=>d=x),c.setSelection(bc(n,u,c.doc.resolve(d)))}n.focus(),n.dispatch(c.setMeta("uiEvent","drop"))}xe.focus=n=>{n.input.lastFocus=Date.now(),n.focused||(n.domObserver.stop(),n.dom.classList.add("ProseMirror-focused"),n.domObserver.start(),n.focused=!0,setTimeout(()=>{n.docView&&n.hasFocus()&&!n.domObserver.currentSelection.eq(n.domSelectionRange())&&Ct(n)},20))};xe.blur=(n,e)=>{let t=e;n.focused&&(n.domObserver.stop(),n.dom.classList.remove("ProseMirror-focused"),n.domObserver.start(),t.relatedTarget&&n.dom.contains(t.relatedTarget)&&n.domObserver.currentSelection.clear(),n.focused=!1)};xe.beforeinput=(n,e)=>{if(St&&e.inputType=="deleteContentBackward"){n.domObserver.flushSoon();let{domChangeCount:r}=n.input;setTimeout(()=>{if(n.input.domChangeCount!=r||(n.dom.blur(),n.focus(),n.someProp("handleKeyDown",s=>s(n,Mn(8,"Backspace")))))return;let{$cursor:i}=n.state.selection;i&&i.pos>0&&n.dispatch(n.state.tr.delete(i.pos-1,i.pos).scrollIntoView())},50)}};for(let n in be)xe[n]=be[n];function Ii(n,e){if(n==e)return!0;for(let t in n)if(n[t]!==e[t])return!1;for(let t in e)if(!(t in n))return!1;return!0}var eo=class n{constructor(e,t){this.toDOM=e,this.spec=t||Rn,this.side=this.spec.side||0}map(e,t,r,i){let{pos:s,deleted:o}=e.mapResult(t.from+i,this.side<0?-1:1);return o?null:new Ae(s-r,s-r,this)}valid(){return!0}eq(e){return this==e||e instanceof n&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&Ii(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}},In=class n{constructor(e,t){this.attrs=e,this.spec=t||Rn}map(e,t,r,i){let s=e.map(t.from+i,this.spec.inclusiveStart?-1:1)-r,o=e.map(t.to+i,this.spec.inclusiveEnd?1:-1)-r;return s>=o?null:new Ae(s,o,this)}valid(e,t){return t.from=e&&(!s||s(l.spec))&&r.push(l.copy(l.from+i,l.to+i))}for(let o=0;oe){let l=this.children[o]+1;this.children[o+2].findInner(e-l,t-l,r,i+l,s)}}map(e,t,r){return this==ue||e.maps.length==0?this:this.mapInner(e,t,0,0,r||Rn)}mapInner(e,t,r,i,s){let o;for(let l=0;l{let a=c+r,h;if(h=id(t,l,a)){for(i||(i=this.children.slice());sl&&f.to=e){this.children[l]==e&&(r=this.children[l+2]);break}let s=e+1,o=s+t.content.size;for(let l=0;ls&&c.type instanceof In){let a=Math.max(s,c.from)-s,h=Math.min(o,c.to)-s;ai.map(e,t,Rn));return n.from(r)}forChild(e,t){if(t.isLeaf)return H.empty;let r=[];for(let i=0;it instanceof H)?e:e.reduce((t,r)=>t.concat(r instanceof H?r:r.members),[]))}}forEachSet(e){for(let t=0;t{let g=m-p-(d-u);for(let x=0;xN+h-f)continue;let O=l[x]+h-f;d>=O?l[x+1]=u<=O?-2:-1:u>=h&&g&&(l[x]+=g,l[x+1]+=g)}f+=g}),h=t.maps[a].map(h,-1)}let c=!1;for(let a=0;a=r.content.size){c=!0;continue}let u=t.map(n[a+1]+s,-1),d=u-i,{index:p,offset:m}=r.content.findIndex(f),g=r.maybeChild(p);if(g&&m==f&&m+g.nodeSize==d){let x=l[a+2].mapInner(t,g,h+1,n[a]+s+1,o);x!=ue?(l[a]=f,l[a+1]=d,l[a+2]=x):(l[a+1]=-2,c=!0)}else c=!0}if(c){let a=yx(l,n,e,t,i,s,o),h=no(a,r,0,o);e=h.local;for(let f=0;ft&&o.to{let a=id(n,l,c+t);if(a){s=!0;let h=no(a,l,t+c+1,r);h!=ue&&i.push(c,c+l.nodeSize,h)}});let o=rd(s?sd(n):n,-t).sort(_n);for(let l=0;l0;)e++;n.splice(e,0,t)}function Hl(n){let e=[];return n.someProp("decorations",t=>{let r=t(n.state);r&&r!=ue&&e.push(r)}),n.cursorWrapper&&e.push(H.create(n.state.doc,[n.cursorWrapper.deco])),to.from(e)}var xx={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},bx=Ee&&Yt<=11,mc=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}},gc=class{constructor(e,t){this.view=e,this.handleDOMChange=t,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new mc,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver(r=>{for(let i=0;ii.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():de&&e.composing&&r.some(i=>i.type=="childList"&&i.target.nodeName=="TR")?(e.input.badSafariComposition=!0,this.flushSoon()):this.flush()}),bx&&(this.onCharData=r=>{this.queue.push({target:r.target,type:"characterData",oldValue:r.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,xx)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let t=0;tthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(uu(this.view)){if(this.suppressingSelectionUpdates)return Ct(this.view);if(Ee&&Yt<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&vn(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let t=new Set,r;for(let s=e.focusNode;s;s=kr(s))t.add(s);for(let s=e.anchorNode;s;s=kr(s))if(t.has(s)){r=s;break}let i=r&&this.view.docView.nearestDesc(r);if(i&&i.ignoreMutation({type:"selection",target:r.nodeType==3?r.parentNode:r}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let t=this.pendingRecords();t.length&&(this.queue=[]);let r=e.domSelectionRange(),i=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(r)&&uu(e)&&!this.ignoreSelectionChange(r),s=-1,o=-1,l=!1,c=[];if(e.editable)for(let h=0;hh.nodeName=="BR")&&(e.input.lastKeyCode==8||e.input.lastKeyCode==46||ne&&(e.composing||e.input.compositionEndedAt>Date.now()-50)&&t.some(h=>h.type=="childList"&&h.removedNodes.length))){for(let h of c)if(h.nodeName=="BR"&&h.parentNode){let f=h.nextSibling;for(;f&&f.nodeType==1;){if(f.contentEditable=="false"){h.parentNode.removeChild(h);break}f=f.firstChild}}}else if(Pe&&c.length){let h=c.filter(f=>f.nodeName=="BR");if(h.length==2){let[f,u]=h;f.parentNode&&f.parentNode.parentNode==u.parentNode?u.remove():f.remove()}else{let{focusNode:f}=this.currentSelection;for(let u of h){let d=u.parentNode;d&&d.nodeName=="LI"&&(!f||kx(e,f)!=d)&&u.remove()}}}let a=null;s<0&&i&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||i)&&(s>-1&&(e.docView.markDirty(s,o),wx(e)),e.input.badSafariComposition&&(e.input.badSafariComposition=!1,Cx(e,c)),this.handleDOMChange(s,o,l,c),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(r)||Ct(e),this.currentSelection.set(r))}registerMutation(e,t){if(t.indexOf(e.target)>-1)return null;let r=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(r==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!r||r.ignoreMutation(e))return null;if(e.type=="childList"){for(let h=0;hs;x--){let N=i.childNodes[x-1],O=N.pmViewDesc;if(N.nodeName=="BR"&&!O){o=x;break}if(!O||O.size)break}let u=n.state.doc,d=n.someProp("domParser")||ur.fromSchema(n.state.schema),p=u.resolve(l),m=null,g=d.parse(i,{topNode:p.parent,topMatch:p.parent.contentMatchAt(p.index()),topOpen:!0,from:s,to:o,preserveWhitespace:p.parent.type.whitespace=="pre"?"full":!0,findPositions:h,ruleFromNode:Dx(r),context:p});if(h&&h[0].pos!=null){let x=h[0].pos,N=h[1]&&h[1].pos;N==null&&(N=x),m={anchor:x+l,head:N+l}}return{doc:g,sel:m,from:l,to:c}}var Dx=n=>e=>{let t=e.pmViewDesc;if(t)return t.parseRule(n);if(e.nodeName=="BR"&&e.parentNode){if(de&&/^(ul|ol)$/i.test(e.parentNode.nodeName)){let r=document.createElement("div");return r.appendChild(document.createElement("li")),{skip:r}}else if(e.parentNode.lastChild==e||de&&/^(tr|table)$/i.test(e.parentNode.nodeName))return{ignore:!0}}else if(e.nodeName=="IMG"&&e.getAttribute("mark-placeholder"))return{ignore:!0};return null},Ox=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function Mx(n,e,t,r,i){let s=n.input.compositionPendingChanges||(n.composing?n.input.compositionID:0);if(n.input.compositionPendingChanges=0,e<0){let M=n.input.lastSelectionTime>Date.now()-50?n.input.lastSelectionOrigin:null,j=xc(n,M);if(j&&!n.state.selection.eq(j)){if(ne&&St&&n.input.lastKeyCode===13&&Date.now()-100Dp(n,Mn(13,"Enter"))))return;let we=n.state.tr.setSelection(j);M=="pointer"?we.setMeta("pointer",!0):M=="key"&&we.scrollIntoView(),s&&we.setMeta("composition",s),n.dispatch(we)}return}let o=n.state.doc.resolve(e),l=o.sharedDepth(t);e=o.before(l+1),t=n.state.doc.resolve(t).after(l+1);let c=n.state.selection,a=Tx(n,e,t,i),h=n.state.doc,f=h.slice(a.from,a.to),u,d;n.input.lastKeyCode===8&&Date.now()-100Date.now()-225||St)&&i.some(M=>M.nodeType==1&&!Ox.test(M.nodeName))&&(!p||p.endA>=p.endB)&&n.someProp("handleKeyDown",M=>M(n,Mn(13,"Enter")))){n.input.lastIOSEnter=0;return}if(!p)if(r&&c instanceof D&&!c.empty&&c.$head.sameParent(c.$anchor)&&!n.composing&&!(a.sel&&a.sel.anchor!=a.sel.head))p={start:c.from,endA:c.to,endB:c.to};else{if(a.sel){let M=Cu(n,n.state.doc,a.sel);if(M&&!M.eq(n.state.selection)){let j=n.state.tr.setSelection(M);s&&j.setMeta("composition",s),n.dispatch(j)}}return}n.state.selection.fromn.state.selection.from&&p.start<=n.state.selection.from+2&&n.state.selection.from>=a.from?p.start=n.state.selection.from:p.endA=n.state.selection.to-2&&n.state.selection.to<=a.to&&(p.endB+=n.state.selection.to-p.endA,p.endA=n.state.selection.to)),Ee&&Yt<=11&&p.endB==p.start+1&&p.endA==p.start&&p.start>a.from&&a.doc.textBetween(p.start-a.from-1,p.start-a.from+1)==" \xA0"&&(p.start--,p.endA--,p.endB--);let m=a.doc.resolveNoCache(p.start-a.from),g=a.doc.resolveNoCache(p.endB-a.from),x=h.resolve(p.start),N=m.sameParent(g)&&m.parent.inlineContent&&x.end()>=p.endA;if((Cr&&n.input.lastIOSEnter>Date.now()-225&&(!N||i.some(M=>M.nodeName=="DIV"||M.nodeName=="P"))||!N&&m.posM(n,Mn(13,"Enter")))){n.input.lastIOSEnter=0;return}if(n.state.selection.anchor>p.start&&Ax(h,p.start,p.endA,m,g)&&n.someProp("handleKeyDown",M=>M(n,Mn(8,"Backspace")))){St&&ne&&n.domObserver.suppressSelectionUpdates();return}ne&&p.endB==p.start&&(n.input.lastChromeDelete=Date.now()),St&&!N&&m.start()!=g.start()&&g.parentOffset==0&&m.depth==g.depth&&a.sel&&a.sel.anchor==a.sel.head&&a.sel.head==p.endA&&(p.endB-=2,g=a.doc.resolveNoCache(p.endB-a.from),setTimeout(()=>{n.someProp("handleKeyDown",function(M){return M(n,Mn(13,"Enter"))})},20));let O=p.start,We=p.endA,Xt=M=>{let j=M||n.state.tr.replace(O,We,a.doc.slice(p.start-a.from,p.endB-a.from));if(a.sel){let we=Cu(n,j.doc,a.sel);we&&!(ne&&n.composing&&we.empty&&(p.start!=p.endB||n.input.lastChromeDeleteCt(n),20));let M=Xt(n.state.tr.delete(O,We)),j=h.resolve(p.start).marksAcross(h.resolve(p.endA));j&&M.ensureMarks(j),n.dispatch(M)}else if(p.endA==p.endB&&(Fi=Ex(m.parent.content.cut(m.parentOffset,g.parentOffset),x.parent.content.cut(x.parentOffset,p.endA-x.start())))){let M=Xt(n.state.tr);Fi.type=="add"?M.addMark(O,We,Fi.mark):M.removeMark(O,We,Fi.mark),n.dispatch(M)}else if(m.parent.child(m.index()).isText&&m.index()==g.index()-(g.textOffset?0:1)){let M=m.parent.textBetween(m.parentOffset,g.parentOffset),j=()=>Xt(n.state.tr.insertText(M,O,We));n.someProp("handleTextInput",we=>we(n,O,We,M,j))||n.dispatch(j())}else n.dispatch(Xt());else n.dispatch(Xt())}function Cu(n,e,t){return Math.max(t.anchor,t.head)>e.content.size?null:bc(n,e.resolve(t.anchor),e.resolve(t.head))}function Ex(n,e){let t=n.firstChild.marks,r=e.firstChild.marks,i=t,s=r,o,l,c;for(let h=0;hh.mark(l.addToSet(h.marks));else if(i.length==0&&s.length==1)l=s[0],o="remove",c=h=>h.mark(l.removeFromSet(h.marks));else return null;let a=[];for(let h=0;ht||Gl(o,!0,!1)0&&(e||n.indexAfter(r)==n.node(r).childCount);)r--,i++,e=!1;if(t){let s=n.node(r).maybeChild(n.indexAfter(r));for(;s&&!s.isLeaf;)s=s.firstChild,i++}return i}function Nx(n,e,t,r,i){let s=n.findDiffStart(e,t),o=t+n.size,l=t+e.size;if(s==null)return null;let{a:c,b:a}=n.findDiffEnd(e,o,l);if(i=="end"){let h=Math.max(0,s-Math.min(c,a));r-=c+h-s}if(c=c?s-r:0;s-=h,a=s+(a-c),c=s}else if(a=a?s-r:0;s-=h,c=s+(c-a),a=s}return{start:s,endA:c,endB:a}}var Ix=Sc,Rx=Ei,ro=class{constructor(e,t){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new hc,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=t,this.state=t.state,this.directPlugins=t.plugins||[],this.directPlugins.forEach(Eu),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=Ou(this),Du(this),this.nodeViews=Mu(this),this.docView=ou(this.state.doc,Tu(this),Hl(this),this.dom,this),this.domObserver=new gc(this,(r,i,s,o)=>Mx(this,r,i,s,o)),this.domObserver.start(),X0(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let t in e)this._props[t]=e[t];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&fc(this);let t=this._props;this._props=e,e.plugins&&(e.plugins.forEach(Eu),this.directPlugins=e.plugins),this.updateStateInner(e.state,t)}setProps(e){let t={};for(let r in this._props)t[r]=this._props[r];t.state=this.state;for(let r in e)t[r]=e[r];this.update(t)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,t){var r;let i=this.state,s=!1,o=!1;e.storedMarks&&this.composing&&(ed(this),o=!0),this.state=e;let l=i.plugins!=e.plugins||this._props.plugins!=t.plugins;if(l||this._props.plugins!=t.plugins||this._props.nodeViews!=t.nodeViews){let d=Mu(this);vx(d,this.nodeViews)&&(this.nodeViews=d,s=!0)}(l||t.handleDOMEvents!=this._props.handleDOMEvents)&&fc(this),this.editable=Ou(this),Du(this);let c=Hl(this),a=Tu(this),h=i.plugins!=e.plugins&&!i.doc.eq(e.doc)?"reset":e.scrollToSelection>i.scrollToSelection?"to selection":"preserve",f=s||!this.docView.matchesNode(e.doc,a,c);(f||!e.selection.eq(i.selection))&&(o=!0);let u=h=="preserve"&&o&&this.dom.style.overflowAnchor==null&&m0(this);if(o){this.domObserver.stop();let d=f&&(Ee||ne)&&!this.composing&&!i.selection.empty&&!e.selection.empty&&_x(i.selection,e.selection);if(f){let m=ne?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=hx(this)),(s||!this.docView.update(e.doc,a,c,this))&&(this.docView.updateOuterDeco(a),this.docView.destroy(),this.docView=ou(e.doc,a,c,this.dom,this)),m&&(!this.trackWrites||!this.dom.contains(this.trackWrites))&&(d=!0)}let p=this.input.mouseDown;d||!(p&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&U0(this)&&p.delaySelUpdate())?Ct(this,d):($u(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(i),!((r=this.dragging)===null||r===void 0)&&r.node&&!i.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,i),h=="reset"?this.dom.scrollTop=0:h=="to selection"?this.scrollToSelection():u&&g0(u)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!(!e||!this.dom.contains(e.nodeType==1?e:e.parentNode))){if(!this.someProp("handleScrollToSelection",t=>t(this)))if(this.state.selection instanceof w){let t=this.docView.domAfterPos(this.state.selection.from);t.nodeType==1&&tu(this,t.getBoundingClientRect(),e)}else tu(this,this.coordsAtPos(this.state.selection.head,1),e)}}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let t=0;t0&&st.ownerDocument.getSelection()),this._root=t}return e||document}updateRoot(){this._root=null}posAtCoords(e){return k0(this,e)}coordsAtPos(e,t=1){return Uu(this,e,t)}domAtPos(e,t=0){return this.docView.domFromPos(e,t)}nodeDOM(e){let t=this.docView.descAt(e);return t?t.nodeDOM:null}posAtDOM(e,t,r=-1){let i=this.docView.posFromDOM(e,t,r);if(i==null)throw new RangeError("DOM position not inside the editor");return i}endOfTextblock(e,t){return M0(this,t||this.state,e)}pasteHTML(e,t){return Ni(this,"",e,!1,t||new ClipboardEvent("paste"))}pasteText(e,t){return Ni(this,e,null,!0,t||new ClipboardEvent("paste"))}serializeForClipboard(e){return wc(this,e)}destroy(){this.docView&&(Z0(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],Hl(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,s0())}get isDestroyed(){return this.docView==null}dispatchEvent(e){return ex(this,e)}domSelectionRange(){let e=this.domSelection();return e?de&&this.root.nodeType===11&&h0(this.dom.ownerDocument)==this.dom&&Sx(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}};ro.prototype.dispatch=function(n){let e=this._props.dispatchTransaction;e?e.call(this,n):this.updateState(this.state.apply(n))};function Tu(n){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(n.editable),n.someProp("attributes",t=>{if(typeof t=="function"&&(t=t(n.state)),t)for(let r in t)r=="class"?e.class+=" "+t[r]:r=="style"?e.style=(e.style?e.style+";":"")+t[r]:!e[r]&&r!="contenteditable"&&r!="nodeName"&&(e[r]=String(t[r]))}),e.translate||(e.translate="no"),[Ae.node(0,n.state.doc.content.size,e)]}function Du(n){if(n.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),n.cursorWrapper={dom:e,deco:Ae.widget(n.state.selection.from,e,{raw:!0,marks:n.markCursor})}}else n.cursorWrapper=null}function Ou(n){return!n.someProp("editable",e=>e(n.state)===!1)}function _x(n,e){let t=Math.min(n.$anchor.sharedDepth(n.head),e.$anchor.sharedDepth(e.head));return n.$anchor.start(t)!=e.$anchor.start(t)}function Mu(n){let e=Object.create(null);function t(r){for(let i in r)Object.prototype.hasOwnProperty.call(e,i)||(e[i]=r[i])}return n.someProp("nodeViews",t),n.someProp("markViews",t),e}function vx(n,e){let t=0,r=0;for(let i in n){if(n[i]!=e[i])return!0;t++}for(let i in e)r++;return t!=r}function Eu(n){if(n.spec.state||n.spec.filterTransaction||n.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var ld=()=>{let n=!0;return(e,t)=>{if(n){n=!1;try{e()}finally{n=!0}}else t!==void 0&&t()}};var Vx=/[\uD800-\uDBFF]/,Ux=/[\uDC00-\uDFFF]/,Bx=(n,e)=>{let t=0,r=0;for(;t0&&Vx.test(n[t-1])&&t--;r+t0&&Ux.test(n[n.length-r])&&r--,{index:t,remove:n.length-t-r,insert:e.slice(t,e.length-r)}},cd=Bx;var R=new Ve("y-sync"),qe=new Ve("y-undo"),Tr=new Ve("yjs-cursor");var st=(n,e)=>n>>>e|n<<32-e,Px=n=>st(n,2)^st(n,13)^st(n,22),Fx=n=>st(n,6)^st(n,11)^st(n,25),Lx=n=>st(n,7)^st(n,18)^n>>>3,zx=n=>st(n,17)^st(n,19)^n>>>10,$x=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),qx=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Oc=class{constructor(){let e=new ArrayBuffer(320);this._H=new Uint32Array(e,0,8),this._H.set(qx),this._W=new Uint32Array(e,64,64)}_updateHash(){let e=this._H,t=this._W;for(let f=16;f<64;f++)t[f]=zx(t[f-2])+t[f-7]+Lx(t[f-15])+t[f-16];let r=e[0],i=e[1],s=e[2],o=e[3],l=e[4],c=e[5],a=e[6],h=e[7];for(let f=0,u,d;f<64;f++)u=h+Fx(l)+(l&c^~l&a)+$x[f]+t[f]>>>0,d=Px(r)+(r&i^r&s^i&s)>>>0,h=a,a=c,c=l,l=o+u>>>0,o=s,s=i,i=r,r=u+d>>>0;e[0]+=r,e[1]+=i,e[2]+=s,e[3]+=o,e[4]+=l,e[5]+=c,e[6]+=a,e[7]+=h}digest(e){let t=0;for(;t+56<=e.length;){let o=0;for(;o<16&&t+3=0&&t>>(3-l)*8;return s}},ad=n=>new Oc().digest(n);var Wx=n=>{for(let t=6;tDa(Wx(ad(Ma(n))));var Ac=()=>({mapping:new Map,isOMark:new Map}),Dr=(n,e)=>e===void 0?!n.deleted:e.sv.has(n.id.client)&&e.sv.get(n.id.client)>n.id.clock&&!gt(e.ds,n.id),Yx=[{light:"#ecd44433",dark:"#ecd444"}],Kx=(n,e,t)=>{if(!n.has(t)){if(n.sizer.add(i)),e=e.filter(i=>!r.has(i))}n.set(t,fa(e))}return n.get(t)},dd=(n,{colors:e=Yx,colorMapping:t=new Map,permanentUserData:r=null,onFirstRender:i=()=>{},mapping:s}={})=>{let o=!1,l=new Ui(n,s),c=new P({props:{editable:a=>{let h=R.getState(a);return h.snapshot==null&&h.prevSnapshot==null}},key:R,state:{init:(a,h)=>({type:n,doc:n.doc,binding:l,snapshot:null,prevSnapshot:null,isChangeOrigin:!1,isUndoRedoOperation:!1,addToHistory:!0,colors:e,colorMapping:t,permanentUserData:r}),apply:(a,h)=>{let f=a.getMeta(R);if(f!==void 0){h=Object.assign({},h);for(let u in f)h[u]=f[u]}return h.addToHistory=a.getMeta("addToHistory")!==!1,h.isChangeOrigin=f!==void 0&&!!f.isChangeOrigin,h.isUndoRedoOperation=f!==void 0&&!!f.isChangeOrigin&&!!f.isUndoRedoOperation,l.prosemirrorView!==null&&f!==void 0&&(f.snapshot!=null||f.prevSnapshot!=null)&&Kr(0,()=>{l.prosemirrorView!=null&&(f.restore==null?l._renderSnapshot(f.snapshot,f.prevSnapshot,h):(l._renderSnapshot(f.snapshot,f.snapshot,h),delete h.restore,delete h.snapshot,delete h.prevSnapshot,l.mux(()=>{l._prosemirrorChanged(l.prosemirrorView.state.doc)})))}),h}},view:a=>(l.initView(a),s==null&&l._forceRerender(),i(),{update:()=>{let h=c.getState(a.state);if(h.snapshot==null&&h.prevSnapshot==null&&(o||a.state.doc.content.findDiffStart(a.state.doc.type.createAndFill().content)!==null)){if(o=!0,h.addToHistory===!1&&!h.isChangeOrigin){let f=qe.getState(a.state),u=f&&f.undoManager;u&&u.stopCapturing()}l.mux(()=>{h.doc.transact(f=>{f.meta.set("addToHistory",h.addToHistory),l._prosemirrorChanged(a.state.doc)},R)})}},destroy:()=>{l.destroy()}})});return c},Hx=(n,e,t)=>{if(e!==null&&e.anchor!==null&&e.head!==null)if(e.type==="all")n.setSelection(new fe(n.doc));else if(e.type==="node"){let r=ot(t.doc,t.type,e.anchor,t.mapping);n.setSelection(w.create(n.doc,r))}else{let r=ot(t.doc,t.type,e.anchor,t.mapping),i=ot(t.doc,t.type,e.head,t.mapping);if(r!==null&&i!==null){let s=D.between(n.doc.resolve(r),n.doc.resolve(i));n.setSelection(s)}}},Or=(n,e)=>({type:e.selection.jsonID,anchor:Gt(e.selection.anchor,n.type,n.mapping),head:Gt(e.selection.head,n.type,n.mapping)}),Ui=class{constructor(e,t=new Map){this.type=e,this.prosemirrorView=null,this.mux=ld(),this.mapping=t,this.isOMark=new Map,this._observeFunction=this._typeChanged.bind(this),this.doc=e.doc,this.beforeTransactionSelection=null,this.beforeAllTransactions=()=>{this.beforeTransactionSelection===null&&this.prosemirrorView!=null&&(this.beforeTransactionSelection=Or(this,this.prosemirrorView.state))},this.afterAllTransactions=()=>{this.beforeTransactionSelection=null},this._domSelectionInView=null}get _tr(){return this.prosemirrorView.state.tr.setMeta("addToHistory",!1)}_isLocalCursorInView(){return this.prosemirrorView.hasFocus()?($r&&this._domSelectionInView===null&&(Kr(0,()=>{this._domSelectionInView=null}),this._domSelectionInView=this._isDomSelectionInView()),this._domSelectionInView):!1}_isDomSelectionInView(){let e=this.prosemirrorView._root.getSelection();if(e==null||e.anchorNode==null)return!1;let t=this.prosemirrorView._root.createRange();t.setStart(e.anchorNode,e.anchorOffset),t.setEnd(e.focusNode,e.focusOffset),t.getClientRects().length===0&&t.startContainer&&t.collapsed&&t.selectNodeContents(t.startContainer);let i=t.getBoundingClientRect(),s=ut.documentElement;return i.bottom>=0&&i.right>=0&&i.left<=(window.innerWidth||s.clientWidth||0)&&i.top<=(window.innerHeight||s.clientHeight||0)}renderSnapshot(e,t){t||(t=ci(cr(),new Map)),this.prosemirrorView.dispatch(this._tr.setMeta(R,{snapshot:e,prevSnapshot:t}))}unrenderSnapshot(){this.mapping.clear(),this.mux(()=>{let e=this.type.toArray().map(r=>Un(r,this.prosemirrorView.state.schema,this)).filter(r=>r!==null),t=this._tr.replace(0,this.prosemirrorView.state.doc.content.size,new b(y.from(e),0,0));t.setMeta(R,{snapshot:null,prevSnapshot:null}),this.prosemirrorView.dispatch(t)})}_forceRerender(){this.mapping.clear(),this.mux(()=>{let e=this.beforeTransactionSelection!==null?null:this.prosemirrorView.state.selection,t=this.type.toArray().map(i=>Un(i,this.prosemirrorView.state.schema,this)).filter(i=>i!==null),r=this._tr.replace(0,this.prosemirrorView.state.doc.content.size,new b(y.from(t),0,0));if(e){let i=Ne(me(e.anchor,0),r.doc.content.size),s=Ne(me(e.head,0),r.doc.content.size);r.setSelection(D.create(r.doc,i,s))}this.prosemirrorView.dispatch(r.setMeta(R,{isChangeOrigin:!0,binding:this}))})}_renderSnapshot(e,t,r){let i=this.doc,s=this.type;if(e||(e=ai(this.doc)),e instanceof Uint8Array||t instanceof Uint8Array)if((!(e instanceof Uint8Array)||!(t instanceof Uint8Array))&&_(),i=new ve({gc:!1}),yn(i,t),t=ai(i),yn(i,e),e=ai(i),s._item===null){let o=Array.from(this.doc.share.keys()).find(l=>this.doc.share.get(l)===this.type);s=i.getXmlFragment(o)}else{let o=i.store.clients.get(s._item.id.client)??[],l=Oe(o,s._item.id.clock);s=o[l].content.type}this.mapping.clear(),this.mux(()=>{i.transact(o=>{let l=r.permanentUserData;l&&l.dss.forEach(f=>{Ge(o,f,u=>{})});let c=(f,u)=>{let d=f==="added"?l.getUserByClientId(u.client):l.getUserByDeletedId(u);return{user:d,type:f,color:Kx(r.colorMapping,r.colors,d)}},a=Vs(s,new Pt(t.ds,e.sv)).map(f=>!f._item.deleted||Dr(f._item,e)||Dr(f._item,t)?Un(f,this.prosemirrorView.state.schema,{mapping:new Map,isOMark:new Map},e,t,c):null).filter(f=>f!==null),h=this._tr.replace(0,this.prosemirrorView.state.doc.content.size,new b(y.from(a),0,0));this.prosemirrorView.dispatch(h.setMeta(R,{isChangeOrigin:!0}))},R)})}_typeChanged(e,t){if(this.prosemirrorView==null)return;let r=R.getState(this.prosemirrorView.state);if(e.length===0||r.snapshot!=null||r.prevSnapshot!=null){this.renderSnapshot(r.snapshot,r.prevSnapshot);return}this.mux(()=>{let i=(l,c)=>this.mapping.delete(c);Ge(t,t.deleteSet,l=>{if(l.constructor===A){let c=l.content.type;c&&this.mapping.delete(c)}}),t.changed.forEach(i),t.changedParentTypes.forEach(i);let s=this.type.toArray().map(l=>pd(l,this.prosemirrorView.state.schema,this)).filter(l=>l!==null),o=this._tr.replace(0,this.prosemirrorView.state.doc.content.size,new b(y.from(s),0,0));Hx(o,this.beforeTransactionSelection,this),o=o.setMeta(R,{isChangeOrigin:!0,isUndoRedoOperation:t.origin instanceof fn}),this.beforeTransactionSelection!==null&&this._isLocalCursorInView()&&o.scrollIntoView(),this.prosemirrorView.dispatch(o)})}_prosemirrorChanged(e){this.doc.transact(()=>{Bn(this.doc,this.type,e,this),this.beforeTransactionSelection=Or(this,this.prosemirrorView.state)},R)}initView(e){this.prosemirrorView!=null&&this.destroy(),this.prosemirrorView=e,this.doc.on("beforeAllTransactions",this.beforeAllTransactions),this.doc.on("afterAllTransactions",this.afterAllTransactions),this.type.observeDeep(this._observeFunction)}destroy(){this.prosemirrorView!=null&&(this.prosemirrorView=null,this.type.unobserveDeep(this._observeFunction),this.doc.off("beforeAllTransactions",this.beforeAllTransactions),this.doc.off("afterAllTransactions",this.afterAllTransactions))}},pd=(n,e,t,r,i,s)=>{let o=t.mapping.get(n);if(o===void 0){if(n instanceof L)return Un(n,e,t,r,i,s);throw ge()}return o},Un=(n,e,t,r,i,s)=>{let o=[],l=c=>{if(c instanceof L){let a=pd(c,e,t,r,i,s);a!==null&&o.push(a)}else{let a=c._item.right?.content?.type;a instanceof tt&&!a._item.deleted&&a._item.id.client===a.doc.clientID&&(c.applyDelta([{retain:c.length},...a.toDelta()]),a.doc.transact(f=>{a._item.delete(f)}));let h=Gx(c,e,t,r,i,s);h!==null&&h.forEach(f=>{f!==null&&o.push(f)})}};r===void 0||i===void 0?n.toArray().forEach(l):Vs(n,new Pt(i.ds,r.sv)).forEach(l);try{let c=n.getAttributes(r);r!==void 0&&(Dr(n._item,r)?Dr(n._item,i)||(c.ychange=s?s("added",n._item.id):{type:"added"}):c.ychange=s?s("removed",n._item.id):{type:"removed"});let a=e.node(n.nodeName,c,o);return t.mapping.set(n,a),a}catch{return n.doc.transact(a=>{n._item.delete(a)},R),t.mapping.delete(n),null}},Gx=(n,e,t,r,i,s)=>{let o=[],l=n.toDelta(r,i,s);try{for(let c=0;c{n._item.delete(a)},R),null}return o},Xx=(n,e)=>{let t=new le,r=n.map(i=>({insert:i.text,attributes:gd(i.marks,e)}));return t.applyDelta(r),e.mapping.set(t,n),t},Zx=(n,e)=>{let t=new L(n.type.name);for(let r in n.attrs){let i=n.attrs[r];i!==null&&r!=="ychange"&&t.setAttribute(r,i)}return t.insert(0,oo(n).map(r=>Mc(r,e))),e.mapping.set(t,n),t},Mc=(n,e)=>n instanceof Array?Xx(n,e):Zx(n,e),fd=n=>typeof n=="object"&&n!==null,Nc=(n,e)=>{let t=Object.keys(n).filter(i=>n[i]!==null),r=t.length===(e==null?0:Object.keys(e).filter(i=>e[i]!==null).length);for(let i=0;i{let e=n.content.content,t=[];for(let r=0;r{let t=n.toDelta();return t.length===e.length&&t.every((r,i)=>r.insert===e[i].text&&_o(r.attributes||{}).length===e[i].marks.length&&Rt(r.attributes,(s,o)=>{let l=lo(o),c=e[i].marks;return Nc(s,c.find(a=>a.type.name===l)?.attrs)}))},Bi=(n,e)=>{if(n instanceof L&&!(e instanceof Array)&&Ec(n,e)){let t=oo(e);return n._length===t.length&&Nc(n.getAttributes(),e.attrs)&&n.toArray().every((r,i)=>Bi(r,t[i]))}return n instanceof le&&e instanceof Array&&md(n,e)},so=(n,e)=>n===e||n instanceof Array&&e instanceof Array&&n.length===e.length&&n.every((t,r)=>e[r]===t),ud=(n,e,t)=>{let r=n.toArray(),i=oo(e),s=i.length,o=r.length,l=Ne(o,s),c=0,a=0,h=!1;for(;c{let e="",t=n._start,r={};for(;t!==null;)t.deleted||(t.countable&&t.content instanceof _e?e+=t.content.str:t.content instanceof V&&(r[t.content.key]=null)),t=t.right;return{str:e,nAttrs:r}},eb=(n,e,t)=>{t.mapping.set(n,e);let{nAttrs:r,str:i}=Qx(n),s=e.map(a=>({insert:a.text,attributes:Object.assign({},r,gd(a.marks,t))})),{insert:o,remove:l,index:c}=cd(i,s.map(a=>a.insert).join(""));n.delete(c,l),n.insert(c,o),n.applyDelta(s.map(a=>({retain:a.insert.length,attributes:a.attributes})))},tb=/(.*)(--[a-zA-Z0-9+/=]{8})$/,lo=n=>tb.exec(n)?.[1]??n,nb=(n,e)=>{let t=[];for(let r in n)t.push(e.mark(lo(r),n[r]));return t},gd=(n,e)=>{let t={};return n.forEach(r=>{if(r.type.name!=="ychange"){let i=$(e.isOMark,r.type,()=>!r.type.excludes(r.type));t[i?`${r.type.name}--${hd(r.toJSON())}`:r.type.name]=r.attrs}}),t},Bn=(n,e,t,r)=>{if(e instanceof L&&e.nodeName!==t.type.name)throw new Error("node name mismatch!");if(r.mapping.set(e,t),e instanceof L){let f=e.getAttributes(),u=t.attrs;for(let d in u)u[d]!==null?f[d]!==u[d]&&d!=="ychange"&&e.setAttribute(d,u[d]):e.removeAttribute(d);for(let d in f)u[d]===void 0&&e.removeAttribute(d)}let i=oo(t),s=i.length,o=e.toArray(),l=o.length,c=Ne(s,l),a=0,h=0;for(;a{for(;l-a-h>0&&s-a-h>0;){let u=o[a],d=i[a],p=o[l-h-1],m=i[s-h-1];if(u instanceof le&&d instanceof Array)md(u,d)||eb(u,d,r),a+=1;else{let g=u instanceof L&&Ec(u,d),x=p instanceof L&&Ec(p,m);if(g&&x){let N=ud(u,d,r),O=ud(p,m,r);N.foundMappedChild&&!O.foundMappedChild?x=!1:!N.foundMappedChild&&O.foundMappedChild||N.equalityFactor0&&(e.slice(a,a+f).forEach(u=>r.mapping.delete(u)),e.delete(a,f)),a+h!(e instanceof Array)&&n.nodeName===e.type.name;var Pi=null,rb=()=>{let n=Pi;Pi=null,n.forEach((e,t)=>{let r=t.state.tr,i=R.getState(t.state);i&&i.binding&&!i.binding.isDestroyed&&(e.forEach((s,o)=>{r.setMeta(o,s)}),t.dispatch(r))})},co=(n,e,t)=>{Pi||(Pi=new Map,Kr(0,rb)),$(Pi,n,U).set(e,t)},Gt=(n,e,t)=>{if(n===0)return li(e,0,e.length===0?-1:0);let r=e._first===null?null:e._first.content.type;for(;r!==null&&e!==r;){if(r instanceof le){if(r._length>=n)return li(r,n,e.length===0?-1:0);if(n-=r._length,r._item!==null&&r._item.next!==null)r=r._item.next.content.type;else{do r=r._item===null?null:r._item.parent,n--;while(r!==e&&r!==null&&r._item!==null&&r._item.next===null);r!==null&&r!==e&&(r=r._item===null?null:r._item.next.content.type)}}else{let i=(t.get(r)||{nodeSize:0}).nodeSize;if(r._first!==null&&n1)return new Qe(r._item===null?null:r._item.id,r._item===null?xn(r):null,null);if(n-=i,r._item!==null&&r._item.next!==null)r=r._item.next.content.type;else{if(n===0)return r=r._item===null?r:r._item.parent,new Qe(r._item===null?null:r._item.id,r._item===null?xn(r):null,null);do r=r._item.parent,n--;while(r!==e&&r._item.next===null);r!==e&&(r=r._item.next.content.type)}}}if(r===null)throw _();if(n===0&&r.constructor!==le&&r!==e)return ib(r._item.parent,r._item)}return li(e,e._length,e.length===0?-1:0)},ib=(n,e)=>{let t=null,r=null;return n._item===null?r=xn(n):t=k(n._item.id.client,n._item.id.clock),new Qe(t,r,e.id)},ot=(n,e,t,r)=>{let i=bl(t,n);if(i===null||i.type!==e&&!hn(e,i.type._item))return null;let s=i.type,o=0;if(s.constructor===le)o=i.index;else if(s._item===null||!s._item.deleted){let l=s._first,c=0;for(;c{let t=n.toArray().map(r=>Un(r,e,Ac())).filter(r=>r!==null);return y.fromArray(t)},yd=(n,e)=>e.topNodeType.create(null,Ic(n,e)),xd=(n,e)=>{let t=Ac(),r=n.toArray().map(s=>Un(s,e,t)).filter(s=>s!==null);return{doc:e.topNodeType.create(null,y.fromArray(r)),meta:t,mapping:t.mapping}};function Rc(n,e="prosemirror"){let t=new ve,r=t.get(e,nt);return r.doc?(ao(n,r),r.doc):t}function ao(n,e){let t=e||new nt,r=t.doc?t.doc:{transact:i=>i(void 0)};return Bn(r,t,n,{mapping:new Map,isOMark:new Map}),t}function bd(n,e,t="prosemirror"){let r=ae.fromJSON(n,e);return Rc(r,t)}function wd(n,e,t){let r=ae.fromJSON(n,e);return ao(r,t)}function Sd(n,e){let t=_c(e);return ae.fromJSON(n,t)}function kd(n,e){let t=ho(e);return ae.fromJSON(n,t)}function _c(n,e="prosemirror"){return ho(n.getXmlFragment(e))}function ho(n){let e=n.toArray(),t=r=>{let i;if(r instanceof le)i=r.toDelta().map(o=>{let l={type:"text",text:o.insert};return o.attributes&&(l.marks=Object.keys(o.attributes).map(c=>{let a=o.attributes[c],f={type:lo(c)};return Object.keys(a)&&(f.attrs=a),f})),l});else if(r instanceof L){i={type:r.nodeName};let s=r.getAttributes();Object.keys(s).length&&(i.attrs=s);let o=r.toArray();o.length&&(i.content=o.map(t).flat())}else _();return i};return{type:"doc",content:e.map(t)}}var Cd=(n,e,t)=>n!==e,Td=n=>{let e=document.createElement("span");e.classList.add("ProseMirror-yjs-cursor"),e.setAttribute("style",`border-color: ${n.color}`);let t=document.createElement("div");t.setAttribute("style",`background-color: ${n.color}`),t.insertBefore(document.createTextNode(n.name),null);let r=document.createTextNode("\u2060"),i=document.createTextNode("\u2060");return e.insertBefore(r,null),e.insertBefore(t,null),e.insertBefore(i,null),e},Dd=n=>({style:`background-color: ${n.color}70`,class:"ProseMirror-yjs-selection"}),sb=/^#[0-9a-fA-F]{6}$/,vc=(n,e,t,r,i)=>{let s=R.getState(n),o=s.doc,l=[];return s.snapshot!=null||s.prevSnapshot!=null||s.binding.mapping.size===0?H.create(n.doc,[]):(e.getStates().forEach((c,a)=>{if(t(o.clientID,a,c)&&c.cursor!=null){let h=c.user||{};h.color==null?h.color="#ffa500":sb.test(h.color)||console.warn("A user uses an unsupported color format",h),h.name==null&&(h.name=`User: ${a}`);let f=ot(o,s.type,bn(c.cursor.anchor),s.binding.mapping),u=ot(o,s.type,bn(c.cursor.head),s.binding.mapping);if(f!==null&&u!==null){let d=me(n.doc.content.size-1,0);f=Ne(f,d),u=Ne(u,d),l.push(Ae.widget(u,()=>r(h,a),{key:a+"",side:10}));let p=Ne(f,u),m=me(f,u);l.push(Ae.inline(p,m,i(h,a),{inclusiveEnd:!0,inclusiveStart:!1}))}}}),H.create(n.doc,l))},ob=(n,{awarenessStateFilter:e=Cd,cursorBuilder:t=Td,selectionBuilder:r=Dd,getSelection:i=o=>o.selection}={},s="cursor")=>new P({key:Tr,state:{init(o,l){return vc(l,n,e,t,r)},apply(o,l,c,a){let h=R.getState(a),f=o.getMeta(Tr);return h&&h.isChangeOrigin||f&&f.awarenessUpdated?vc(a,n,e,t,r):l.map(o.mapping,o.doc)}},props:{decorations:o=>Tr.getState(o)},view:o=>{let l=()=>{o.docView&&co(o,Tr,{awarenessUpdated:!0})},c=()=>{let a=R.getState(o.state),h=n.getLocalState()||{};if(o.hasFocus()){let f=i(o.state),u=Gt(f.anchor,a.type,a.binding.mapping),d=Gt(f.head,a.type,a.binding.mapping);(h.cursor==null||!Is(bn(h.cursor.anchor),u)||!Is(bn(h.cursor.head),d))&&n.setLocalStateField(s,{anchor:u,head:d})}else h.cursor!=null&&ot(a.doc,a.type,bn(h.cursor.anchor),a.binding.mapping)!==null&&n.setLocalStateField(s,null)};return n.on("change",l),o.dom.addEventListener("focusin",c),o.dom.addEventListener("focusout",c),{update:c,destroy:()=>{o.dom.removeEventListener("focusin",c),o.dom.removeEventListener("focusout",c),n.off("change",l),n.setLocalStateField(s,null)}}}});var Od=n=>qe.getState(n)?.undoManager?.undo()!=null,Md=n=>qe.getState(n)?.undoManager?.redo()!=null,lb=(n,e)=>e==null?qe.getState(n)?.undoManager?.canUndo():Od(n),cb=(n,e)=>e==null?qe.getState(n)?.undoManager?.canRedo():Md(n),Ed=new Set(["paragraph"]),Ad=(n,e)=>!(n instanceof A)||!(n.content instanceof Me)||!(n.content.type instanceof tt||n.content.type instanceof L&&e.has(n.content.type.nodeName))||n.content.type._length===0,ab=({protectedNodes:n=Ed,trackedOrigins:e=[],undoManager:t=null}={})=>new P({key:qe,state:{init:(r,i)=>{let s=R.getState(i),o=t||new fn(s.type,{trackedOrigins:new Set([R].concat(e)),deleteFilter:l=>Ad(l,n),captureTransaction:l=>l.meta.get("addToHistory")!==!1});return{undoManager:o,prevSel:null,hasUndoOps:o.undoStack.length>0,hasRedoOps:o.redoStack.length>0}},apply:(r,i,s,o)=>{let l=R.getState(o).binding,c=i.undoManager,a=c.undoStack.length>0,h=c.redoStack.length>0;return l?{undoManager:c,prevSel:Or(l,s),hasUndoOps:a,hasRedoOps:h}:a!==i.hasUndoOps||h!==i.hasRedoOps?Object.assign({},i,{hasUndoOps:c.undoStack.length>0,hasRedoOps:c.redoStack.length>0}):i}},view:r=>{let i=R.getState(r.state),s=qe.getState(r.state).undoManager;return s.on("stack-item-added",({stackItem:o})=>{let l=i.binding;l&&o.meta.set(l,qe.getState(r.state).prevSel)}),s.on("stack-item-popped",({stackItem:o})=>{let l=i.binding;l&&(l.beforeTransactionSelection=o.meta.get(l)||l.beforeTransactionSelection)}),{destroy:()=>{s.destroy()}}}});var Rd={};pe(Rd,{collab:()=>fb,getVersion:()=>pb,rebaseSteps:()=>Id,receiveTransaction:()=>ub,sendableSteps:()=>db});var fo=class{constructor(e,t,r){this.step=e,this.inverted=t,this.origin=r}};function Id(n,e,t){for(let i=n.length-1;i>=0;i--)t.step(n[i].inverted);for(let i=0;inew Mr(e.version,[]),apply(t,r){let i=t.getMeta(Tt);return i||(t.docChanged?new Mr(r.version,r.unconfirmed.concat(hb(t))):r)}},config:e,historyPreserveItems:!0})}function ub(n,e,t,r={}){let i=Tt.getState(n),s=i.version+e.length,o=Tt.get(n).spec.config.clientID,l=0;for(;lt.step),clientID:Tt.get(n).spec.config.clientID,get origins(){return this._origins||(this._origins=e.unconfirmed.map(t=>t.origin))}}}function pb(n){return Tt.getState(n).version}var Fd={};pe(Fd,{closeHistory:()=>kb,history:()=>Cb,isHistoryTransaction:()=>Eb,redo:()=>Pd,redoDepth:()=>Mb,redoNoScroll:()=>Db,undo:()=>Bd,undoDepth:()=>Ob,undoNoScroll:()=>Tb});var uo=200,re=function(){};re.prototype.append=function(e){return e.length?(e=re.from(e),!this.length&&e||e.length=t?re.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,t))};re.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};re.prototype.forEach=function(e,t,r){t===void 0&&(t=0),r===void 0&&(r=this.length),t<=r?this.forEachInner(e,t,r,0):this.forEachInvertedInner(e,t,r,0)};re.prototype.map=function(e,t,r){t===void 0&&(t=0),r===void 0&&(r=this.length);var i=[];return this.forEach(function(s,o){return i.push(e(s,o))},t,r),i};re.from=function(e){return e instanceof re?e:e&&e.length?new _d(e):re.empty};var _d=function(n){function e(r){n.call(this),this.values=r}n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e;var t={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(i,s){return i==0&&s==this.length?this:new e(this.values.slice(i,s))},e.prototype.getInner=function(i){return this.values[i]},e.prototype.forEachInner=function(i,s,o,l){for(var c=s;c=o;c--)if(i(this.values[c],l+c)===!1)return!1},e.prototype.leafAppend=function(i){if(this.length+i.length<=uo)return new e(this.values.concat(i.flatten()))},e.prototype.leafPrepend=function(i){if(this.length+i.length<=uo)return new e(i.flatten().concat(this.values))},t.length.get=function(){return this.values.length},t.depth.get=function(){return 0},Object.defineProperties(e.prototype,t),e}(re);re.empty=new _d([]);var mb=function(n){function e(t,r){n.call(this),this.left=t,this.right=r,this.length=t.length+r.length,this.depth=Math.max(t.depth,r.depth)+1}return n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(r){return rl&&this.right.forEachInner(r,Math.max(i-l,0),Math.min(this.length,s)-l,o+l)===!1)return!1},e.prototype.forEachInvertedInner=function(r,i,s,o){var l=this.left.length;if(i>l&&this.right.forEachInvertedInner(r,i-l,Math.max(s,l)-l,o+l)===!1||s=s?this.right.slice(r-s,i-s):this.left.slice(r,s).append(this.right.slice(0,i-s))},e.prototype.leafAppend=function(r){var i=this.right.leafAppend(r);if(i)return new e(this.left,i)},e.prototype.leafPrepend=function(r){var i=this.left.leafPrepend(r);if(i)return new e(i,this.right)},e.prototype.appendInner=function(r){return this.left.depth>=Math.max(this.right.depth,r.depth)+1?new e(this.left,new e(this.right,r)):new e(this,r)},e}(re),Vc=re;var gb=500,Pn=class n{constructor(e,t){this.items=e,this.eventCount=t}popEvent(e,t){if(this.eventCount==0)return null;let r=this.items.length;for(;;r--)if(this.items.get(r-1).selection){--r;break}let i,s;t&&(i=this.remapping(r,this.items.length),s=i.maps.length);let o=e.tr,l,c,a=[],h=[];return this.items.forEach((f,u)=>{if(!f.step){i||(i=this.remapping(r,u+1),s=i.maps.length),s--,h.push(f);return}if(i){h.push(new lt(f.map));let d=f.step.map(i.slice(s)),p;d&&o.maybeStep(d).doc&&(p=o.mapping.maps[o.mapping.maps.length-1],a.push(new lt(p,void 0,void 0,a.length+h.length))),s--,p&&i.appendMap(p,s)}else o.maybeStep(f.step);if(f.selection)return l=i?f.selection.map(i.slice(s)):f.selection,c=new n(this.items.slice(0,r).append(h.reverse().concat(a)),this.eventCount-1),!1},this.items.length,0),{remaining:c,transform:o,selection:l}}addTransform(e,t,r,i){let s=[],o=this.eventCount,l=this.items,c=!i&&l.length?l.get(l.length-1):null;for(let h=0;hxb&&(l=yb(l,a),o-=a),new n(l.append(s),o)}remapping(e,t){let r=new pr;return this.items.forEach((i,s)=>{let o=i.mirrorOffset!=null&&s-i.mirrorOffset>=e?r.maps.length-i.mirrorOffset:void 0;r.appendMap(i.map,o)},e,t),r}addMaps(e){return this.eventCount==0?this:new n(this.items.append(e.map(t=>new lt(t))),this.eventCount)}rebased(e,t){if(!this.eventCount)return this;let r=[],i=Math.max(0,this.items.length-t),s=e.mapping,o=e.steps.length,l=this.eventCount;this.items.forEach(u=>{u.selection&&l--},i);let c=t;this.items.forEach(u=>{let d=s.getMirror(--c);if(d==null)return;o=Math.min(o,d);let p=s.maps[d];if(u.step){let m=e.steps[d].invert(e.docs[d]),g=u.selection&&u.selection.map(s.slice(c+1,d));g&&l++,r.push(new lt(p,m,g))}else r.push(new lt(p))},i);let a=[];for(let u=t;ugb&&(f=f.compress(this.items.length-r.length)),f}emptyItemCount(){let e=0;return this.items.forEach(t=>{t.step||e++}),e}compress(e=this.items.length){let t=this.remapping(0,e),r=t.maps.length,i=[],s=0;return this.items.forEach((o,l)=>{if(l>=e)i.push(o),o.selection&&s++;else if(o.step){let c=o.step.map(t.slice(r)),a=c&&c.getMap();if(r--,a&&t.appendMap(a,r),c){let h=o.selection&&o.selection.map(t.slice(r));h&&s++;let f=new lt(a.invert(),c,h),u,d=i.length-1;(u=i.length&&i[d].merge(f))?i[d]=u:i.push(f)}}else o.map&&r--},this.items.length,0),new n(Vc.from(i.reverse()),s)}};Pn.empty=new Pn(Vc.empty,0);function yb(n,e){let t;return n.forEach((r,i)=>{if(r.selection&&e--==0)return t=i,!1}),n.slice(t)}var lt=class n{constructor(e,t,r,i){this.map=e,this.step=t,this.selection=r,this.mirrorOffset=i}merge(e){if(this.step&&e.step&&!e.selection){let t=e.step.merge(this.step);if(t)return new n(t.getMap().invert(),t,this.selection)}}},ct=class{constructor(e,t,r,i,s){this.done=e,this.undone=t,this.prevRanges=r,this.prevTime=i,this.prevComposition=s}},xb=20;function bb(n,e,t,r){let i=t.getMeta(at),s;if(i)return i.historyState;t.getMeta(Ud)&&(n=new ct(n.done,n.undone,null,0,-1));let o=t.getMeta("appendedTransaction");if(t.steps.length==0)return n;if(o&&o.getMeta(at))return o.getMeta(at).redo?new ct(n.done.addTransform(t,void 0,r,po(e)),n.undone,vd(t.mapping.maps),n.prevTime,n.prevComposition):new ct(n.done,n.undone.addTransform(t,void 0,r,po(e)),null,n.prevTime,n.prevComposition);if(t.getMeta("addToHistory")!==!1&&!(o&&o.getMeta("addToHistory")===!1)){let l=t.getMeta("composition"),c=n.prevTime==0||!o&&n.prevComposition!=l&&(n.prevTime<(t.time||0)-r.newGroupDelay||!wb(t,n.prevRanges)),a=o?Uc(n.prevRanges,t.mapping):vd(t.mapping.maps);return new ct(n.done.addTransform(t,c?e.selection.getBookmark():void 0,r,po(e)),Pn.empty,a,t.time,l??n.prevComposition)}else return(s=t.getMeta("rebased"))?new ct(n.done.rebased(t,s),n.undone.rebased(t,s),Uc(n.prevRanges,t.mapping),n.prevTime,n.prevComposition):new ct(n.done.addMaps(t.mapping.maps),n.undone.addMaps(t.mapping.maps),Uc(n.prevRanges,t.mapping),n.prevTime,n.prevComposition)}function wb(n,e){if(!e)return!1;if(!n.docChanged)return!0;let t=!1;return n.mapping.maps[0].forEach((r,i)=>{for(let s=0;s=e[s]&&(t=!0)}),t}function vd(n){let e=[];for(let t=n.length-1;t>=0&&e.length==0;t--)n[t].forEach((r,i,s,o)=>e.push(s,o));return e}function Uc(n,e){if(!n)return null;let t=[];for(let r=0;r{let i=at.getState(t);if(!i||(n?i.undone:i.done).eventCount==0)return!1;if(r){let s=Sb(i,t,n);s&&r(e?s.scrollIntoView():s)}return!0}}var Bd=mo(!1,!0),Pd=mo(!0,!0),Tb=mo(!1,!1),Db=mo(!0,!1);function Ob(n){let e=at.getState(n);return e?e.done.eventCount:0}function Mb(n){let e=at.getState(n);return e?e.undone.eventCount:0}function Eb(n){return n.getMeta(at)!=null}var zd={};pe(zd,{keydownHandler:()=>xo,keymap:()=>Vb});var Dt={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},yo={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Ab=typeof navigator<"u"&&/Mac/.test(navigator.platform),Nb=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(z=0;z<10;z++)Dt[48+z]=Dt[96+z]=String(z);var z;for(z=1;z<=24;z++)Dt[z+111]="F"+z;var z;for(z=65;z<=90;z++)Dt[z]=String.fromCharCode(z+32),yo[z]=String.fromCharCode(z);var z;for(go in Dt)yo.hasOwnProperty(go)||(yo[go]=Dt[go]);var go;function Ld(n){var e=Ab&&n.metaKey&&n.shiftKey&&!n.ctrlKey&&!n.altKey||Nb&&n.shiftKey&&n.key&&n.key.length==1||n.key=="Unidentified",t=!e&&n.key||(n.shiftKey?yo:Dt)[n.keyCode]||n.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}var Ib=typeof navigator<"u"&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),Rb=typeof navigator<"u"&&/Win/.test(navigator.platform);function _b(n){let e=n.split(/-(?!$)/),t=e[e.length-1];t=="Space"&&(t=" ");let r,i,s,o;for(let l=0;lGb,baseKeymap:()=>Zb,chainCommands:()=>bo,createParagraphNear:()=>Zd,deleteSelection:()=>Lc,exitCode:()=>Xd,joinBackward:()=>Jd,joinDown:()=>Fb,joinForward:()=>Kd,joinTextblockBackward:()=>Ub,joinTextblockForward:()=>Bb,joinUp:()=>Pb,lift:()=>Lb,liftEmptyBlock:()=>Qd,macBaseKeymap:()=>Wc,newlineInCode:()=>Gd,pcBaseKeymap:()=>ht,selectAll:()=>tp,selectNodeBackward:()=>jd,selectNodeForward:()=>Hd,selectParentNode:()=>$b,selectTextblockEnd:()=>sp,selectTextblockStart:()=>ip,setBlockType:()=>Wb,splitBlock:()=>Jc,splitBlockAs:()=>ep,splitBlockKeepMarks:()=>zb,toggleMark:()=>Kb,wrapIn:()=>Jb});var Lc=(n,e)=>n.selection.empty?!1:(e&&e(n.tr.deleteSelection().scrollIntoView()),!0);function qd(n,e){let{$cursor:t}=n.selection;return!t||(e?!e.endOfTextblock("backward",n):t.parentOffset>0)?null:t}var Jd=(n,e,t)=>{let r=qd(n,t);if(!r)return!1;let i=zc(r);if(!i){let o=r.blockRange(),l=o&&Jt(o);return l==null?!1:(e&&e(n.tr.lift(o,l).scrollIntoView()),!0)}let s=i.nodeBefore;if(np(n,i,e,-1))return!0;if(r.parent.content.size==0&&(Er(s,"end")||w.isSelectable(s)))for(let o=r.depth;;o--){let l=yr(n.doc,r.before(o),r.after(o),b.empty);if(l&&l.slice.size1)break}return s.isAtom&&i.depth==r.depth-1?(e&&e(n.tr.delete(i.pos-s.nodeSize,i.pos).scrollIntoView()),!0):!1},Ub=(n,e,t)=>{let r=qd(n,t);if(!r)return!1;let i=zc(r);return i?Wd(n,i,e):!1},Bb=(n,e,t)=>{let r=Yd(n,t);if(!r)return!1;let i=$c(r);return i?Wd(n,i,e):!1};function Wd(n,e,t){let r=e.nodeBefore,i=r,s=e.pos-1;for(;!i.isTextblock;s--){if(i.type.spec.isolating)return!1;let h=i.lastChild;if(!h)return!1;i=h}let o=e.nodeAfter,l=o,c=e.pos+1;for(;!l.isTextblock;c++){if(l.type.spec.isolating)return!1;let h=l.firstChild;if(!h)return!1;l=h}let a=yr(n.doc,s,c,b.empty);if(!a||a.from!=s||a instanceof he&&a.slice.size>=c-s)return!1;if(t){let h=n.tr.step(a);h.setSelection(D.create(h.doc,s)),t(h.scrollIntoView())}return!0}function Er(n,e,t=!1){for(let r=n;r;r=e=="start"?r.firstChild:r.lastChild){if(r.isTextblock)return!0;if(t&&r.childCount!=1)return!1}return!1}var jd=(n,e,t)=>{let{$head:r,empty:i}=n.selection,s=r;if(!i)return!1;if(r.parent.isTextblock){if(t?!t.endOfTextblock("backward",n):r.parentOffset>0)return!1;s=zc(r)}let o=s&&s.nodeBefore;return!o||!w.isSelectable(o)?!1:(e&&e(n.tr.setSelection(w.create(n.doc,s.pos-o.nodeSize)).scrollIntoView()),!0)};function zc(n){if(!n.parent.type.spec.isolating)for(let e=n.depth-1;e>=0;e--){if(n.index(e)>0)return n.doc.resolve(n.before(e+1));if(n.node(e).type.spec.isolating)break}return null}function Yd(n,e){let{$cursor:t}=n.selection;return!t||(e?!e.endOfTextblock("forward",n):t.parentOffset{let r=Yd(n,t);if(!r)return!1;let i=$c(r);if(!i)return!1;let s=i.nodeAfter;if(np(n,i,e,1))return!0;if(r.parent.content.size==0&&(Er(s,"start")||w.isSelectable(s))){let o=yr(n.doc,r.before(),r.after(),b.empty);if(o&&o.slice.size{let{$head:r,empty:i}=n.selection,s=r;if(!i)return!1;if(r.parent.isTextblock){if(t?!t.endOfTextblock("forward",n):r.parentOffset=0;e--){let t=n.node(e);if(n.index(e)+1{let t=n.selection,r=t instanceof w,i;if(r){if(t.node.isTextblock||!ze(n.doc,t.from))return!1;i=t.from}else if(i=qs(n.doc,t.from,-1),i==null)return!1;if(e){let s=n.tr.join(i);r&&s.setSelection(w.create(s.doc,i-n.doc.resolve(i).nodeBefore.nodeSize)),e(s.scrollIntoView())}return!0},Fb=(n,e)=>{let t=n.selection,r;if(t instanceof w){if(t.node.isTextblock||!ze(n.doc,t.to))return!1;r=t.to}else if(r=qs(n.doc,t.to,1),r==null)return!1;return e&&e(n.tr.join(r).scrollIntoView()),!0},Lb=(n,e)=>{let{$from:t,$to:r}=n.selection,i=t.blockRange(r),s=i&&Jt(i);return s==null?!1:(e&&e(n.tr.lift(i,s).scrollIntoView()),!0)},Gd=(n,e)=>{let{$head:t,$anchor:r}=n.selection;return!t.parent.type.spec.code||!t.sameParent(r)?!1:(e&&e(n.tr.insertText(` +`).scrollIntoView()),!0)};function qc(n){for(let e=0;e{let{$head:t,$anchor:r}=n.selection;if(!t.parent.type.spec.code||!t.sameParent(r))return!1;let i=t.node(-1),s=t.indexAfter(-1),o=qc(i.contentMatchAt(s));if(!o||!i.canReplaceWith(s,s,o))return!1;if(e){let l=t.after(),c=n.tr.replaceWith(l,l,o.createAndFill());c.setSelection(T.near(c.doc.resolve(l),1)),e(c.scrollIntoView())}return!0},Zd=(n,e)=>{let t=n.selection,{$from:r,$to:i}=t;if(t instanceof fe||r.parent.inlineContent||i.parent.inlineContent)return!1;let s=qc(i.parent.contentMatchAt(i.indexAfter()));if(!s||!s.isTextblock)return!1;if(e){let o=(!r.parentOffset&&i.index(){let{$cursor:t}=n.selection;if(!t||t.parent.content.size)return!1;if(t.depth>1&&t.after()!=t.end(-1)){let s=t.before();if(xt(n.doc,s))return e&&e(n.tr.split(s).scrollIntoView()),!0}let r=t.blockRange(),i=r&&Jt(r);return i==null?!1:(e&&e(n.tr.lift(r,i).scrollIntoView()),!0)};function ep(n){return(e,t)=>{if(e.selection instanceof w&&e.selection.node.isBlock){let{$from:d}=e.selection;return!d.parentOffset||!xt(e.doc,d.pos)?!1:(t&&t(e.tr.split(d.pos).scrollIntoView()),!0)}if(!e.selection.$from.depth)return!1;let r=e.tr;!e.selection.empty&&(e.selection instanceof D||e.selection instanceof fe)&&r.deleteSelection();let{$from:i}=r.selection,s=r.steps.length,o=[],l,c,a=!1,h=!1;for(let d=i.depth;;d--)if(i.node(d).isBlock){a=i.end(d)==i.pos+(i.depth-d),h=i.start(d)==i.pos-(i.depth-d),c=qc(i.node(d-1).contentMatchAt(i.indexAfter(d-1)));let m=n&&n(i.parent,a,i);o.unshift(m||(a&&c?{type:c}:null)),l=d;break}else{if(d==1)return!1;o.unshift(null)}let f=i.pos,u=xt(r.doc,f,o.length,o);if(u||(o[0]=c?{type:c}:null,u=xt(r.doc,f,o.length,o)),!u)return!1;if(r.split(f,o.length,o),!a&&h&&i.node(l).type!=c){let d=r.mapping.slice(s),p=d.map(i.before(l)),m=r.doc.resolve(p);c&&i.node(l-1).canReplaceWith(m.index(),m.index()+1,c)&&r.setNodeMarkup(d.map(i.before(l)),c)}return t&&t(r.scrollIntoView()),!0}}var Jc=ep(),zb=(n,e)=>Jc(n,e&&(t=>{let r=n.storedMarks||n.selection.$to.parentOffset&&n.selection.$from.marks();r&&t.ensureMarks(r),e(t)})),$b=(n,e)=>{let{$from:t,to:r}=n.selection,i,s=t.sharedDepth(r);return s==0?!1:(i=t.before(s),e&&e(n.tr.setSelection(w.create(n.doc,i))),!0)},tp=(n,e)=>(e&&e(n.tr.setSelection(new fe(n.doc))),!0);function qb(n,e,t){let r=e.nodeBefore,i=e.nodeAfter,s=e.index();return!r||!i||!r.type.compatibleContent(i.type)?!1:!r.content.size&&e.parent.canReplace(s-1,s)?(t&&t(n.tr.delete(e.pos-r.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(s,s+1)||!(i.isTextblock||ze(n.doc,e.pos))?!1:(t&&t(n.tr.join(e.pos).scrollIntoView()),!0)}function np(n,e,t,r){let i=e.nodeBefore,s=e.nodeAfter,o,l,c=i.type.spec.isolating||s.type.spec.isolating;if(!c&&qb(n,e,t))return!0;let a=!c&&e.parent.canReplace(e.index(),e.index()+1);if(a&&(o=(l=i.contentMatchAt(i.childCount)).findWrapping(s.type))&&l.matchType(o[0]||s.type).validEnd){if(t){let d=e.pos+s.nodeSize,p=y.empty;for(let x=o.length-1;x>=0;x--)p=y.from(o[x].create(null,p));p=y.from(i.copy(p));let m=n.tr.step(new W(e.pos-1,d,e.pos,d,new b(p,1,0),o.length,!0)),g=m.doc.resolve(d+2*o.length);g.nodeAfter&&g.nodeAfter.type==i.type&&ze(m.doc,g.pos)&&m.join(g.pos),t(m.scrollIntoView())}return!0}let h=s.type.spec.isolating||r>0&&c?null:T.findFrom(e,1),f=h&&h.$from.blockRange(h.$to),u=f&&Jt(f);if(u!=null&&u>=e.depth)return t&&t(n.tr.lift(f,u).scrollIntoView()),!0;if(a&&Er(s,"start",!0)&&Er(i,"end")){let d=i,p=[];for(;p.push(d),!d.isTextblock;)d=d.lastChild;let m=s,g=1;for(;!m.isTextblock;m=m.firstChild)g++;if(d.canReplace(d.childCount,d.childCount,m.content)){if(t){let x=y.empty;for(let O=p.length-1;O>=0;O--)x=y.from(p[O].copy(x));let N=n.tr.step(new W(e.pos-p.length,e.pos+s.nodeSize,e.pos+g,e.pos+s.nodeSize-g,new b(x,p.length,0),0,!0));t(N.scrollIntoView())}return!0}}return!1}function rp(n){return function(e,t){let r=e.selection,i=n<0?r.$from:r.$to,s=i.depth;for(;i.node(s).isInline;){if(!s)return!1;s--}return i.node(s).isTextblock?(t&&t(e.tr.setSelection(D.create(e.doc,n<0?i.start(s):i.end(s)))),!0):!1}}var ip=rp(-1),sp=rp(1);function Jb(n,e=null){return function(t,r){let{$from:i,$to:s}=t.selection,o=i.blockRange(s),l=o&&Tn(o,n,e);return l?(r&&r(t.tr.wrap(o,l).scrollIntoView()),!0):!1}}function Wb(n,e=null){return function(t,r){let i=!1;for(let s=0;s{if(i)return!1;if(!(!c.isTextblock||c.hasMarkup(n,e)))if(c.type==n)i=!0;else{let h=t.doc.resolve(a),f=h.index();i=h.parent.canReplaceWith(f,f+1,n)}})}if(!i)return!1;if(r){let s=t.tr;for(let o=0;o{if(l||!r&&c.isAtom&&c.isInline&&a>=s.pos&&a+c.nodeSize<=o.pos)return!1;l=c.inlineContent&&c.type.allowsMarkType(t)}),l)return!0}return!1}function Yb(n){let e=[];for(let t=0;t{if(s.isAtom&&s.content.size&&s.isInline&&o>=r.pos&&o+s.nodeSize<=i.pos)return o+1>r.pos&&e.push(new On(r,r.doc.resolve(o+1))),r=r.doc.resolve(o+1+s.content.size),!1}),r.poso.doc.rangeHasMark(d.$from.pos,d.$to.pos,n)):f=!h.every(d=>{let p=!1;return u.doc.nodesBetween(d.$from.pos,d.$to.pos,(m,g,x)=>{if(p)return!1;p=!n.isInSet(m.marks)&&!!x&&x.type.allowsMarkType(n)&&!(m.isText&&/^\s*$/.test(m.textBetween(Math.max(0,d.$from.pos-g),Math.min(m.nodeSize,d.$to.pos-g))))}),!p});for(let d=0;d{if(!t.isGeneric)return n(t);let r=[];for(let s=0;sr.push(a,h))}let i=[];for(let s=0;ss-o);for(let s=i.length-1;s>=0;s--)ze(t.doc,i[s])&&t.join(i[s]);n(t)}}function Gb(n,e){let t=Array.isArray(e)?r=>e.indexOf(r.type.name)>-1:e;return(r,i,s)=>n(r,i&&Hb(i,t),s)}function bo(...n){return function(e,t,r){for(let i=0;icp,nodes:()=>lp,schema:()=>lw});var Qb=["p",0],ew=["blockquote",0],tw=["hr"],nw=["pre",["code",0]],rw=["br"],lp={doc:{content:"block+"},paragraph:{content:"inline*",group:"block",parseDOM:[{tag:"p"}],toDOM(){return Qb}},blockquote:{content:"block+",group:"block",defining:!0,parseDOM:[{tag:"blockquote"}],toDOM(){return ew}},horizontal_rule:{group:"block",parseDOM:[{tag:"hr"}],toDOM(){return tw}},heading:{attrs:{level:{default:1,validate:"number"}},content:"inline*",group:"block",defining:!0,parseDOM:[{tag:"h1",attrs:{level:1}},{tag:"h2",attrs:{level:2}},{tag:"h3",attrs:{level:3}},{tag:"h4",attrs:{level:4}},{tag:"h5",attrs:{level:5}},{tag:"h6",attrs:{level:6}}],toDOM(n){return["h"+n.attrs.level,0]}},code_block:{content:"text*",marks:"",group:"block",code:!0,defining:!0,parseDOM:[{tag:"pre",preserveWhitespace:"full"}],toDOM(){return nw}},text:{group:"inline"},image:{inline:!0,attrs:{src:{validate:"string"},alt:{default:null,validate:"string|null"},title:{default:null,validate:"string|null"}},group:"inline",draggable:!0,parseDOM:[{tag:"img[src]",getAttrs(n){return{src:n.getAttribute("src"),title:n.getAttribute("title"),alt:n.getAttribute("alt")}}}],toDOM(n){let{src:e,alt:t,title:r}=n.attrs;return["img",{src:e,alt:t,title:r}]}},hard_break:{inline:!0,group:"inline",selectable:!1,parseDOM:[{tag:"br"}],toDOM(){return rw}}},iw=["em",0],sw=["strong",0],ow=["code",0],cp={link:{attrs:{href:{validate:"string"},title:{default:null,validate:"string|null"}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs(n){return{href:n.getAttribute("href"),title:n.getAttribute("title")}}}],toDOM(n){let{href:e,title:t}=n.attrs;return["a",{href:e,title:t},0]}},em:{parseDOM:[{tag:"i"},{tag:"em"},{style:"font-style=italic"},{style:"font-style=normal",clearMark:n=>n.type.name=="em"}],toDOM(){return iw}},strong:{parseDOM:[{tag:"strong"},{tag:"b",getAttrs:n=>n.style.fontWeight!="normal"&&null},{style:"font-weight=400",clearMark:n=>n.type.name=="strong"},{style:"font-weight",getAttrs:n=>/^(bold(er)?|[5-9]\d{2,})$/.test(n)&&null}],toDOM(){return sw}},code:{code:!0,parseDOM:[{tag:"code"}],toDOM(){return ow}}},lw=new gi({nodes:lp,marks:cp});var mp={};pe(mp,{addListNodes:()=>fw,bulletList:()=>fp,liftListItem:()=>mw,listItem:()=>up,orderedList:()=>hp,sinkListItem:()=>xw,splitListItem:()=>pp,splitListItemKeepMarks:()=>pw,wrapInList:()=>uw,wrapRangeInList:()=>dp});var cw=["ol",0],aw=["ul",0],hw=["li",0],hp={attrs:{order:{default:1,validate:"number"}},parseDOM:[{tag:"ol",getAttrs(n){return{order:n.hasAttribute("start")?+n.getAttribute("start"):1}}}],toDOM(n){return n.attrs.order==1?cw:["ol",{start:n.attrs.order},0]}},fp={parseDOM:[{tag:"ul"}],toDOM(){return aw}},up={parseDOM:[{tag:"li"}],toDOM(){return hw},defining:!0};function jc(n,e){let t={};for(let r in n)t[r]=n[r];for(let r in e)t[r]=e[r];return t}function fw(n,e,t){return n.append({ordered_list:jc(hp,{content:"list_item+",group:t}),bullet_list:jc(fp,{content:"list_item+",group:t}),list_item:jc(up,{content:e})})}function uw(n,e=null){return function(t,r){let{$from:i,$to:s}=t.selection,o=i.blockRange(s);if(!o)return!1;let l=r?t.tr:null;return dp(l,o,n,e)?(r&&r(l.scrollIntoView()),!0):!1}}function dp(n,e,t,r=null){let i=!1,s=e,o=e.$from.doc;if(e.depth>=2&&e.$from.node(e.depth-1).type.compatibleContent(t)&&e.startIndex==0){if(e.$from.index(e.depth-1)==0)return!1;let c=o.resolve(e.start-2);s=new Lt(c,c,e.depth),e.endIndex=0;h--)s=y.from(t[h].type.create(t[h].attrs,s));n.step(new W(e.start-(r?2:0),e.end,e.start,e.end,new b(s,0,0),t.length,!0));let o=0;for(let h=0;h=i.depth-3;x--)f=y.from(i.node(x).copy(f));let d=i.indexAfter(-1){if(g>-1)return!1;x.isTextblock&&x.content.size==0&&(g=N+1)}),g>-1&&m.setSelection(T.near(m.doc.resolve(g))),r(m.scrollIntoView())}return!0}let c=s.pos==i.end()?l.contentMatchAt(0).defaultType:null,a=t.tr.delete(i.pos,s.pos),h=c?[e?{type:n,attrs:e}:null,{type:c}]:void 0;return xt(a.doc,i.pos,2,h)?(r&&r(a.split(i.pos,2,h).scrollIntoView()),!0):!1}}function pw(n,e){let t=pp(n,e);return(r,i)=>t(r,i&&(s=>{let o=r.storedMarks||r.selection.$to.parentOffset&&r.selection.$from.marks();o&&s.ensureMarks(o),i(s)}))}function mw(n){return function(e,t){let{$from:r,$to:i}=e.selection,s=r.blockRange(i,o=>o.childCount>0&&o.firstChild.type==n);return s?t?r.node(s.depth-1).type==n?gw(e,t,n,s):yw(e,t,s):!0:!1}}function gw(n,e,t,r){let i=n.tr,s=r.end,o=r.$to.end(r.depth);sm;p--)d-=i.child(p).nodeSize,r.delete(d-1,d+1);let s=r.doc.resolve(t.start),o=s.nodeAfter;if(r.mapping.map(t.end)!=t.start+s.nodeAfter.nodeSize)return!1;let l=t.startIndex==0,c=t.endIndex==i.childCount,a=s.node(-1),h=s.index(-1);if(!a.canReplace(h+(l?0:1),h+1,o.content.append(c?y.empty:y.from(i))))return!1;let f=s.pos,u=f+o.nodeSize;return r.step(new W(f-(l?1:0),u+(c?1:0),f+1,u-1,new b((l?y.empty:y.from(i.copy(y.empty))).append(c?y.empty:y.from(i.copy(y.empty))),l?0:1,c?0:1),l?0:1)),e(r.scrollIntoView()),!0}function xw(n){return function(e,t){let{$from:r,$to:i}=e.selection,s=r.blockRange(i,a=>a.childCount>0&&a.firstChild.type==n);if(!s)return!1;let o=s.startIndex;if(o==0)return!1;let l=s.parent,c=l.child(o-1);if(c.type!=n)return!1;if(t){let a=c.lastChild&&c.lastChild.type==l.type,h=y.from(a?n.create():null),f=new b(y.from(n.create(null,y.from(l.type.create(null,h)))),a?3:1,0),u=s.start,d=s.end;t(e.tr.step(new W(u-(a?3:1),d,u,d,f,1,!0)).scrollIntoView())}return!0}}var Sp={};pe(Sp,{InputRule:()=>Je,closeDoubleQuote:()=>xp,closeSingleQuote:()=>wp,ellipsis:()=>Tw,emDash:()=>Cw,inputRules:()=>Sw,openDoubleQuote:()=>yp,openSingleQuote:()=>bp,smartQuotes:()=>Dw,textblockTypeInputRule:()=>Mw,undoInputRule:()=>kw,wrappingInputRule:()=>Ow});var Je=class{constructor(e,t,r={}){this.match=e,this.match=e,this.handler=typeof t=="string"?bw(t):t,this.undoable=r.undoable!==!1,this.inCode=r.inCode||!1,this.inCodeMark=r.inCodeMark!==!1}};function bw(n){return function(e,t,r,i){let s=n;if(t[1]){let o=t[0].lastIndexOf(t[1]);s+=t[0].slice(o+t[1].length),r+=o;let l=r-i;l>0&&(s=t[0].slice(o-l,o)+s,r=i)}return e.tr.insertText(s,r,i)}}var ww=500;function Sw({rules:n}){let e=new P({state:{init(){return null},apply(t,r){let i=t.getMeta(this);return i||(t.selectionSet||t.docChanged?null:r)}},props:{handleTextInput(t,r,i,s){return gp(t,r,i,s,n,e)},handleDOMEvents:{compositionend:t=>{setTimeout(()=>{let{$cursor:r}=t.state.selection;r&&gp(t,r.pos,r.pos,"",n,e)})}}},isInputRules:!0});return e}function gp(n,e,t,r,i,s){if(n.composing)return!1;let o=n.state,l=o.doc.resolve(e),c=l.parent.textBetween(Math.max(0,l.parentOffset-ww),l.parentOffset,null,"\uFFFC")+r;for(let a=0;ap.type.spec.code))continue;if(l.parent.type.spec.code){if(!h.inCode)continue}else if(h.inCode==="only")continue;let f=h.match.exec(c);if(!f||f[0].length{m.isInline&&m.marks.some(g=>g.type.spec.code)&&(p=!0)}),p)continue}let d=h.handler(o,f,u,t);if(d)return h.undoable&&d.setMeta(s,{transform:d,from:e,to:t,text:r}),n.dispatch(d),!0}return!1}var kw=(n,e)=>{let t=n.plugins;for(let r=0;r=0;c--)o.step(l.steps[c].invert(l.docs[c]));if(s.text){let c=o.doc.resolve(s.from).marks();o.replaceWith(s.from,s.to,n.schema.text(s.text,c))}else o.delete(s.from,s.to);e(o)}return!0}}return!1},Cw=new Je(/--$/,"\u2014",{inCodeMark:!1}),Tw=new Je(/\.\.\.$/,"\u2026",{inCodeMark:!1}),yp=new Je(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(")$/,"\u201C",{inCodeMark:!1}),xp=new Je(/"$/,"\u201D",{inCodeMark:!1}),bp=new Je(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(')$/,"\u2018",{inCodeMark:!1}),wp=new Je(/'$/,"\u2019",{inCodeMark:!1}),Dw=[yp,xp,bp,wp];function Ow(n,e,t=null,r){return new Je(n,(i,s,o,l)=>{let c=t instanceof Function?t(s):t,a=i.tr.delete(o,l),h=a.doc.resolve(o),f=h.blockRange(),u=f&&Tn(f,e,c);if(!u)return null;a.wrap(f,u);let d=a.doc.resolve(o-1).nodeBefore;return d&&d.type==e&&ze(a.doc,o-1)&&(!r||r(s,d))&&a.join(o-1),a})}function Mw(n,e,t=null){return new Je(n,(r,i,s,o)=>{let l=r.doc.resolve(s),c=t instanceof Function?t(i):t;return l.node(-1).canReplaceWith(l.index(-1),l.indexAfter(-1),e)?r.tr.delete(s,o).setBlockType(s,s,e,c):null})}var kp={};pe(kp,{dropCursor:()=>Ew});function Ew(n={}){return new P({view(e){return new Yc(e,n)}})}var Yc=class{constructor(e,t){var r;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.lastDragEvent=null,this.width=(r=t.width)!==null&&r!==void 0?r:1,this.color=t.color===!1?void 0:t.color||"black",this.class=t.class,this.handlers=["dragover","dragend","drop","dragleave"].map(i=>{let s=o=>{this[i](o)};return e.dom.addEventListener(i,s),{name:i,handler:s}})}destroy(){this.handlers.forEach(({name:e,handler:t})=>this.editorView.dom.removeEventListener(e,t))}update(e,t){if(this.cursorPos!=null&&t.doc!=e.state.doc)if(this.lastDragEvent){let r=this.computeTarget(this.lastDragEvent);r==this.cursorPos?this.updateOverlay():this.setCursor(r)}else this.updateOverlay()}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),t=!e.parent.inlineContent,r,i=this.editorView.dom,s=i.getBoundingClientRect(),o=s.width/i.offsetWidth,l=s.height/i.offsetHeight;if(t){let f=e.nodeBefore,u=e.nodeAfter;if(f||u){let d=this.editorView.nodeDOM(this.cursorPos-(f?f.nodeSize:0));if(d){let p=d.getBoundingClientRect(),m=f?p.bottom:p.top;f&&u&&(m=(m+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let g=this.width/2*l;r={left:p.left,right:p.right,top:m-g,bottom:m+g}}}}if(!r){let f=this.editorView.coordsAtPos(this.cursorPos),u=this.width/2*o;r={left:f.left-u,right:f.left+u,top:f.top,bottom:f.bottom}}let c=this.editorView.dom.offsetParent;this.element||(this.element=c.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",t),this.element.classList.toggle("prosemirror-dropcursor-inline",!t);let a,h;if(!c||c==document.body&&getComputedStyle(c).position=="static")a=-pageXOffset,h=-pageYOffset;else{let f=c.getBoundingClientRect(),u=f.width/c.offsetWidth,d=f.height/c.offsetHeight;a=f.left-c.scrollLeft*u,h=f.top-c.scrollTop*d}this.element.style.left=(r.left-a)/o+"px",this.element.style.top=(r.top-h)/l+"px",this.element.style.width=(r.right-r.left)/o+"px",this.element.style.height=(r.bottom-r.top)/l+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}computeTarget(e){let t=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),r=t&&t.inside>=0&&this.editorView.state.doc.nodeAt(t.inside),i=r&&r.type.spec.disableDropCursor,s=typeof i=="function"?i(this.editorView,t,e):i;if(!t||s)return null;let o=t.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let l=Ci(this.editorView.state.doc,o,this.editorView.dragging.slice);l!=null&&(o=l)}return o}dragover(e){if(!this.editorView.editable)return;this.lastDragEvent=e;let t=this.computeTarget(e);t!=null&&(this.setCursor(t),this.scheduleRemoval(5e3))}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}};var Tp={};pe(Tp,{GapCursor:()=>ie,gapCursor:()=>Iw});var ie=class n extends T{constructor(e){super(e,e)}map(e,t){let r=e.resolve(t.map(this.head));return n.valid(r)?new n(r):T.near(r)}content(){return b.empty}eq(e){return e instanceof n&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,t){if(typeof t.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new n(e.resolve(t.pos))}getBookmark(){return new Kc(this.anchor)}static valid(e){let t=e.parent;if(t.inlineContent||!Aw(e)||!Nw(e))return!1;let r=t.type.spec.allowGapCursor;if(r!=null)return r;let i=t.contentMatchAt(e.index()).defaultType;return i&&i.isTextblock}static findGapCursorFrom(e,t,r=!1){e:for(;;){if(!r&&n.valid(e))return e;let i=e.pos,s=null;for(let o=e.depth;;o--){let l=e.node(o);if(t>0?e.indexAfter(o)0){s=l.child(t>0?e.indexAfter(o):e.index(o)-1);break}else if(o==0)return null;i+=t;let c=e.doc.resolve(i);if(n.valid(c))return c}for(;;){let o=t>0?s.firstChild:s.lastChild;if(!o){if(s.isAtom&&!s.isText&&!w.isSelectable(s)){e=e.doc.resolve(i+s.nodeSize*t),r=!1;continue e}break}s=o,i+=t;let l=e.doc.resolve(i);if(n.valid(l))return l}return null}}};ie.prototype.visible=!1;ie.findFrom=ie.findGapCursorFrom;T.jsonID("gapcursor",ie);var Kc=class n{constructor(e){this.pos=e}map(e){return new n(e.map(this.pos))}resolve(e){let t=e.resolve(this.pos);return ie.valid(t)?new ie(t):T.near(t)}};function Cp(n){return n.isAtom||n.spec.isolating||n.spec.createGapCursor}function Aw(n){for(let e=n.depth;e>=0;e--){let t=n.index(e),r=n.node(e);if(t==0){if(r.type.spec.isolating)return!0;continue}for(let i=r.child(t-1);;i=i.lastChild){if(i.childCount==0&&!i.inlineContent||Cp(i.type))return!0;if(i.inlineContent)return!1}}return!0}function Nw(n){for(let e=n.depth;e>=0;e--){let t=n.indexAfter(e),r=n.node(e);if(t==r.childCount){if(r.type.spec.isolating)return!0;continue}for(let i=r.child(t);;i=i.firstChild){if(i.childCount==0&&!i.inlineContent||Cp(i.type))return!0;if(i.inlineContent)return!1}}return!0}function Iw(){return new P({props:{decorations:Vw,createSelectionBetween(n,e,t){return e.pos==t.pos&&ie.valid(t)?new ie(t):null},handleClick:_w,handleKeyDown:Rw,handleDOMEvents:{beforeinput:vw}}})}var Rw=xo({ArrowLeft:wo("horiz",-1),ArrowRight:wo("horiz",1),ArrowUp:wo("vert",-1),ArrowDown:wo("vert",1)});function wo(n,e){let t=n=="vert"?e>0?"down":"up":e>0?"right":"left";return function(r,i,s){let o=r.selection,l=e>0?o.$to:o.$from,c=o.empty;if(o instanceof D){if(!s.endOfTextblock(t)||l.depth==0)return!1;c=!1,l=r.doc.resolve(e>0?l.after():l.before())}let a=ie.findGapCursorFrom(l,e,c);return a?(i&&i(r.tr.setSelection(new ie(a))),!0):!1}}function _w(n,e,t){if(!n||!n.editable)return!1;let r=n.state.doc.resolve(e);if(!ie.valid(r))return!1;let i=n.posAtCoords({left:t.clientX,top:t.clientY});return i&&i.inside>-1&&w.isSelectable(n.state.doc.nodeAt(i.inside))?!1:(n.dispatch(n.state.tr.setSelection(new ie(r))),!0)}function vw(n,e){if(e.inputType!="insertCompositionText"||!(n.state.selection instanceof ie))return!1;let{$from:t}=n.state.selection,r=t.parent.contentMatchAt(t.index()).findWrapping(n.state.schema.nodes.text);if(!r)return!1;let i=y.empty;for(let o=r.length-1;o>=0;o--)i=y.from(r[o].createAndFill(null,i));let s=n.state.tr.replace(t.pos,t.pos,new b(i,0,0));return s.setSelection(D.near(s.doc.resolve(t.pos+1))),n.dispatch(s),!1}function Vw(n){if(!(n.selection instanceof ie))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",H.create(n.doc,[Ae.widget(n.selection.head,e,{key:"gapcursor"})])}export{fi as Y,Rd as collab,op as commands,kp as dropcursor,Tp as gapcursor,Fd as history,Sp as inputrules,zd as keymap,vl as model,ap as schemaBasic,mp as schemaList,Zf as state,qf as transform,od as view,Nd as ySync}; diff --git a/tiles/tictactoe/index.html b/tiles/tictactoe/index.html index 95e46be..b3f77a6 100644 --- a/tiles/tictactoe/index.html +++ b/tiles/tictactoe/index.html @@ -78,88 +78,77 @@ // The document defines the roles (x: owner, o: one opponent, watcher: // read-only) and this tile enforces what they MEAN: only x and o may // move, only on their turn, only in empty cells. It can enforce that - // because attribution is runtime-attested — a watcher's or off-turn - // move is simply rejected on replay, everywhere, deterministically. + // without any total order: state is the SET of ops seen, and the board + // is a deterministic fold over that set (see logic.js) — same set, same + // board, on every peer, whatever order delivery took. Attribution stays + // runtime-attested: a watcher's or off-turn op simply never wins a slot. const { loadData, putData } = await import('/.well-known/web-tiles/store.js'); const { sync } = await import('/.well-known/web-tiles/sync.js'); + const { derive, opsFromLegacyGames, recordOp, winnerOf } = await import('./logic.js'); const boardEl = document.getElementById('board'); const turnEl = document.getElementById('turn'); const subEl = document.getElementById('sub'); const againEl = document.getElementById('again'); const statusEl = document.getElementById('status'); - // State is the full move history (games: array of move-lists), so the - // snapshot story is trivial and replay is deterministic. + let ops = []; let games = [[]]; let live = false; - const bytes = await loadData('games'); + const newId = () => `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`; + + const bytes = await loadData('ops'); if (bytes) { - try { games = JSON.parse(new TextDecoder().decode(bytes)); } catch { games = [[]]; } - if (!games.length) games = [[]]; + try { ops = JSON.parse(new TextDecoder().decode(bytes)); } catch { ops = []; } + } else { + // Older saves stored the derived games instead of ops. + const legacy = await loadData('games'); + if (legacy) { + try { ops = opsFromLegacyGames(JSON.parse(new TextDecoder().decode(legacy))); } catch { ops = []; } + } } + games = derive(ops); let saveTimer; function save () { clearTimeout(saveTimer); saveTimer = setTimeout(() => { - putData('games', new TextEncoder().encode(JSON.stringify(games))).catch(() => {}); + putData('ops', new TextEncoder().encode(JSON.stringify(ops))).catch(() => {}); }, 250); } const moves = () => games[games.length - 1]; + const gameIndex = () => games.length - 1; const cellOwner = (i) => { const idx = moves().indexOf(i); return idx === -1 ? null : (idx % 2 === 0 ? 'x' : 'o'); }; const turnOf = () => (moves().length % 2 === 0 ? 'x' : 'o'); - - const LINES = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]; - function winner () { - for (const line of LINES) { - const [a, b, c] = line.map(cellOwner); - if (a && a === b && b === c) return { role: a, line }; - } - return moves().length === 9 ? { role: 'draw', line: [] } : null; - } - - // Deterministic rule check — every peer applies the same test in the - // same total order, so boards can never diverge. - function legal (op, author, role) { - if (op.op === 'again') return role === 'x' || role === 'o'; - if (op.op !== 'move' || typeof op.cell !== 'number' || op.cell < 0 || op.cell > 8) return false; - if (winner()) return false; - if (role !== turnOf()) return false; - if (cellOwner(op.cell) !== null) return false; - // One seat per identity: x and o are roles, and the relay caps o at 1. - return true; - } - - function apply (op, author, role) { - if (!legal(op, author, role)) return; - if (op.op === 'again') games.push([]); - else moves().push(op.cell); - } + const winner = () => winnerOf(moves()); function myRole () { return live ? sync.me()?.role : 'x'; // solo: you drive both sides } + function ingest (op, role) { + ops = recordOp(ops, op, role); + games = derive(ops); + } + function act (op) { - if (live) { - sync.send(new TextEncoder().encode(JSON.stringify(op))); - } else { - // Solo mode: alternate seats yourself (thinking board). - apply(op, 'me', op.op === 'again' ? 'x' : turnOf()); - render(); - save(); - } + // Optimistic: our own op joins the set now; the echo is deduped by id. + // Solo mode alternates seats (thinking board); live uses the real seat. + const role = live ? myRole() : (op.op === 'again' ? 'x' : turnOf()); + ingest(op, role); + render(); + save(); + if (live) sync.send(new TextEncoder().encode(JSON.stringify(op))); } sync.onReady(() => { live = true; render(); }); sync.onRoster(() => render()); sync.onMessage(({ author, role, bytes }) => { - try { apply(JSON.parse(new TextDecoder().decode(bytes)), author, role); } catch { return; } + try { ingest(JSON.parse(new TextDecoder().decode(bytes)), role); } catch { return; } render(); save(); }); @@ -176,7 +165,10 @@ btn.textContent = owner ? owner.toUpperCase() : ''; const mayMove = !w && owner === null && (live ? me === turnOf() : true); btn.disabled = !mayMove; - if (mayMove) btn.addEventListener('click', () => act({ op: 'move', cell: i })); + if (mayMove) { + btn.addEventListener('click', () => + act({ op: 'move', id: newId(), game: gameIndex(), n: moves().length, cell: i })); + } cells.push(btn); } boardEl.replaceChildren(...cells); @@ -207,7 +199,7 @@ } } - againEl.addEventListener('click', () => act({ op: 'again' })); + againEl.addEventListener('click', () => act({ op: 'again', id: newId(), game: gameIndex() })); render(); diff --git a/tiles/tictactoe/logic.js b/tiles/tictactoe/logic.js new file mode 100644 index 0000000..634a532 --- /dev/null +++ b/tiles/tictactoe/logic.js @@ -0,0 +1,85 @@ +// Pure game logic for the tictactoe tile — an order-sensitive game made +// convergent without a sequencer (docs/SYNC-SPACES.md, Ordering). +// +// The design doc's parent discipline, taken to its fixed point: a play's +// parent is the previous play, so the whole game is a chain indexed by slot +// number. Instead of accepting or rejecting ops as they arrive (which +// depends on arrival order), the tile keeps the SET of ops it has seen and +// derives the board as a deterministic fold: for each game, for each slot in +// turn, the accepted move is the smallest-id legal candidate among every op +// claiming that slot. The fold only ever looks at the set, so every peer — +// whatever order the ops reached it in, echoes included — derives the same +// board, and a peer that optimistically showed a losing concurrent move +// recomputes to the same winner as everyone else. + +export const LINES = [ + [0, 1, 2], [3, 4, 5], [6, 7, 8], + [0, 3, 6], [1, 4, 7], [2, 5, 8], + [0, 4, 8], [2, 4, 6], +]; + +export function winnerOf(moves) { + const ownerOf = (cell) => { + const idx = moves.indexOf(cell); + return idx === -1 ? null : (idx % 2 === 0 ? 'x' : 'o'); + }; + for (const line of LINES) { + const [a, b, c] = line.map(ownerOf); + if (a && a === b && b === c) return { role: a, line }; + } + return moves.length === 9 ? { role: 'draw', line: [] } : null; +} + +/** Record an op into the set (idempotent by id). Role is delivery-attested: + the runtime stamps it, the fold enforces what it means. */ +export function recordOp(ops, op, role) { + if (op?.id == null || ops.some((o) => o.id === op.id)) return ops; + if (op.op !== 'move' && op.op !== 'again') return ops; + return [...ops, { + id: String(op.id), + op: op.op, + game: Number(op.game ?? 0), + n: op.op === 'move' ? Number(op.n ?? -1) : -1, + cell: op.op === 'move' ? Number(op.cell ?? -1) : -1, + role, + }]; +} + +/** The deterministic fold: op set → array of games (move lists). */ +export function derive(ops) { + const games = [[]]; + for (let g = 0; g < games.length; g++) { + const moves = games[g]; + for (let n = 0; n < 9; n++) { + if (winnerOf(moves)) break; + const want = n % 2 === 0 ? 'x' : 'o'; + const candidates = ops + .filter((o) => + o.op === 'move' && o.game === g && o.n === n && o.role === want && + o.cell >= 0 && o.cell <= 8 && !moves.includes(o.cell) + ) + .sort((a, b) => (a.id < b.id ? -1 : 1)); + if (!candidates.length) break; + moves.push(candidates[0].cell); + } + // 'again' from a seat opens the next game (any time, like the original). + if (ops.some((o) => o.op === 'again' && o.game === g && (o.role === 'x' || o.role === 'o'))) { + games.push([]); + } + } + return games; +} + +/** Older saves stored derived games, not ops; synthesize an equivalent set. */ +export function opsFromLegacyGames(games) { + const ops = []; + games.forEach((moves, g) => { + moves.forEach((cell, n) => { + ops.push({ id: `legacy-${g}-${n}`, op: 'move', game: g, n, cell, role: n % 2 === 0 ? 'x' : 'o' }); + }); + if (g < games.length - 1) { + ops.push({ id: `legacy-again-${g}`, op: 'again', game: g, n: -1, cell: -1, role: 'x' }); + } + }); + return ops; +} diff --git a/tools/entries/pm-entry.ts b/tools/entries/pm-entry.ts index 0a812be..1fcde54 100644 --- a/tools/entries/pm-entry.ts +++ b/tools/entries/pm-entry.ts @@ -1,5 +1,9 @@ // ProseMirror bundle for the rich-text tile (vendored; tiles are // self-contained). deno task build:tiles regenerates. +// The tile's CRDT is Yjs via y-prosemirror (docs/SYNC-SPACES.md, Phase G): +// commutative updates over the causal log instead of steps-with-arbiter. +export * as Y from 'yjs'; +export * as ySync from 'y-prosemirror'; export * as state from 'prosemirror-state'; export * as view from 'prosemirror-view'; export * as model from 'prosemirror-model'; diff --git a/tools/spaces-publish-lexicons.ts b/tools/spaces-publish-lexicons.ts new file mode 100644 index 0000000..07784c4 --- /dev/null +++ b/tools/spaces-publish-lexicons.ts @@ -0,0 +1,191 @@ +// Publish the space.ziran.* lexicons (docs/SYNC-SPACES.md, Phase D). +// +// Follows bulletin's pattern: each lexicon document is stored as a +// com.atproto.lexicon.schema record (rkey = the NSID) in the lexicon +// authority's repo, upserted only when its content changed. Resolution then +// works via the standard chain: NSID → authority domain → `_lexicon.` +// DNS TXT (`did=…`) → that repo's schema records. +// +// The authority account is configured via LEXICON_AUTHORITY_HANDLE / _PASSWORD +// / _PDS, or a KEY=value .env.lex-authority file at the repo root (gitignored). +// Against the devnet: HANDLE=lex-authority.test PASSWORD=hunter2 +// PDS=http://localhost:2583. +// +// Usage: deno task lex:publish (or deno run -A tools/spaces-publish-lexicons.ts) + +import { join, fromFileUrl } from 'jsr:@std/path@1'; + +const ROOT = fromFileUrl(new URL('..', import.meta.url)); +const LEXICON_DIR = join(ROOT, 'lexicons'); +const LEXICON_COLLECTION = 'com.atproto.lexicon.schema'; + +interface LexiconDoc { + lexicon: number; + id: string; + defs: Record; +} + +async function loadLexicons(dir: string): Promise { + const docs: LexiconDoc[] = []; + for await (const entry of Deno.readDir(dir)) { + const path = join(dir, entry.name); + if (entry.isDirectory) docs.push(...(await loadLexicons(path))); + else if (entry.isFile && entry.name.endsWith('.json')) { + const doc = JSON.parse(await Deno.readTextFile(path)) as LexiconDoc; + if (doc.lexicon !== 1) throw new Error(`${path}: "lexicon" must be 1`); + if (!doc.id || typeof doc.id !== 'string') throw new Error(`${path}: missing "id"`); + if (!doc.defs?.main) throw new Error(`${path}: missing defs.main`); + const tail = doc.id.split('.').pop(); + if (entry.name !== `${tail}.json`) { + throw new Error(`${path}: filename does not match id ${doc.id}`); + } + docs.push(doc); + } + } + return docs; +} + +// The DNS name whose TXT record must point at the authority DID: the NSID's +// segments minus the name, reversed, prefixed with _lexicon. +function authorityDomain(nsid: string): string { + return `_lexicon.${nsid.split('.').slice(0, -1).reverse().join('.')}`; +} + +interface Authority { + handle: string; + password: string; + pds: string; +} + +async function getAuthority(): Promise { + const fromEnv = { + handle: Deno.env.get('LEXICON_AUTHORITY_HANDLE'), + password: Deno.env.get('LEXICON_AUTHORITY_PASSWORD'), + pds: Deno.env.get('LEXICON_AUTHORITY_PDS'), + }; + if (fromEnv.handle && fromEnv.password && fromEnv.pds) return fromEnv as Authority; + const envFile = join(ROOT, '.env.lex-authority'); + const vars: Record = {}; + try { + for (const line of (await Deno.readTextFile(envFile)).split('\n')) { + const m = line.match(/^([A-Z_]+)=(.*)$/); + if (m) vars[m[1]!] = m[2]!; + } + } catch { + throw new Error( + 'No lexicon authority configured: set LEXICON_AUTHORITY_HANDLE/_PASSWORD/_PDS or create .env.lex-authority (see tools/spaces-publish-lexicons.ts).', + ); + } + const handle = fromEnv.handle ?? vars.LEXICON_AUTHORITY_HANDLE; + const password = fromEnv.password ?? vars.LEXICON_AUTHORITY_PASSWORD; + const pds = fromEnv.pds ?? vars.LEXICON_AUTHORITY_PDS; + if (!handle || !password || !pds) { + throw new Error(`${envFile} is missing LEXICON_AUTHORITY_HANDLE/_PASSWORD/_PDS`); + } + return { handle, password, pds }; +} + +async function xrpc(base: string, nsid: string, init: { method?: string; params?: Record; body?: unknown; jwt?: string } = {}): Promise { + const url = new URL(`${base}/xrpc/${nsid}`); + for (const [k, v] of Object.entries(init.params ?? {})) url.searchParams.set(k, v); + const headers: Record = {}; + if (init.jwt) headers.authorization = `Bearer ${init.jwt}`; + let body: string | undefined; + if (init.body !== undefined) { + headers['content-type'] = 'application/json'; + body = JSON.stringify(init.body); + } + const res = await fetch(url, { method: init.method ?? (body ? 'POST' : 'GET'), headers, body }); + if (!res.ok) throw new Error(`${nsid} → ${res.status} ${(await res.text()).slice(0, 300)}`); + return await res.json(); +} + +// Canonical digest: the PDS round-trips records with keys in IPLD map order, +// so compare under a recursive key sort rather than raw JSON.stringify. +function canonical(value: unknown): unknown { + if (Array.isArray(value)) return value.map(canonical); + if (value && typeof value === 'object') { + return Object.fromEntries( + Object.entries(value as Record) + .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)) + .map(([k, v]) => [k, canonical(v)]), + ); + } + return value; +} + +async function digest(value: unknown): Promise { + const bytes = new TextEncoder().encode(JSON.stringify(canonical(value))); + const hash = await crypto.subtle.digest('SHA-256', bytes); + return Array.from(new Uint8Array(hash), (b) => b.toString(16).padStart(2, '0')).join(''); +} + +// Check the _lexicon TXT record via DNS-over-HTTPS (informational: local +// devnet domains and not-yet-configured DNS both just report as unresolved). +async function checkDns(domain: string, did: string): Promise { + try { + const res = await fetch(`https://dns.google/resolve?name=${domain}&type=TXT`); + const json = await res.json(); + const values: string[] = (json.Answer ?? []).map((a: { data: string }) => a.data.replaceAll('"', '')); + if (values.some((v) => v === `did=${did}`)) return 'ok'; + if (values.length > 0) return `MISMATCH — found ${values.join(', ')}`; + return 'not set'; + } catch { + return 'unresolvable'; + } +} + +const authority = await getAuthority(); +const session = await xrpc(authority.pds, 'com.atproto.server.createSession', { + body: { identifier: authority.handle, password: authority.password }, +}); +const did = String(session.did); +const jwt = String(session.accessJwt); +console.log(`authority: ${authority.handle} (${did}) on ${authority.pds}`); + +const docs = await loadLexicons(LEXICON_DIR); +if (docs.length === 0) throw new Error(`no lexicon documents under ${LEXICON_DIR}`); +const ids = new Set(); +for (const doc of docs) { + if (ids.has(doc.id)) throw new Error(`duplicate lexicon id ${doc.id}`); + ids.add(doc.id); +} + +for (const doc of docs) { + let existing: { value: unknown } | undefined; + try { + existing = await xrpc(authority.pds, 'com.atproto.repo.getRecord', { + params: { repo: did, collection: LEXICON_COLLECTION, rkey: doc.id }, + jwt, + }); + } catch { + // not published yet + } + const record = { $type: LEXICON_COLLECTION, ...doc }; + if (existing && (await digest(existing.value)) === (await digest(record))) { + console.log(` unchanged ${doc.id}`); + continue; + } + try { + await xrpc(authority.pds, 'com.atproto.repo.putRecord', { + jwt, + body: { repo: did, collection: LEXICON_COLLECTION, rkey: doc.id, record }, + }); + } catch (err) { + // The "space" def type is newer than some PDS builds' lexicon-schema + // validation; the record set is still authoritative, so store unvalidated. + console.warn(` (validation rejected ${doc.id}, storing with validate:false: ${(err as Error).message.slice(0, 120)})`); + await xrpc(authority.pds, 'com.atproto.repo.putRecord', { + jwt, + body: { repo: did, collection: LEXICON_COLLECTION, rkey: doc.id, record, validate: false }, + }); + } + console.log(` published ${doc.id}${existing ? ' (updated)' : ''}`); +} + +const domains = new Set(docs.map((d) => authorityDomain(d.id))); +console.log('\nDNS resolution:'); +for (const domain of domains) { + const status = await checkDns(domain, did); + console.log(` ${domain} TXT "did=${did}" — ${status}`); +} diff --git a/website/site/account/index.html b/website/site/account/index.html new file mode 100644 index 0000000..7aec6f3 --- /dev/null +++ b/website/site/account/index.html @@ -0,0 +1,236 @@ + + + + + +Create your Ziran account + + + + + + +
+
+

Create your account

+

+ An AT identity on Ziran’s server lets your documents sync live between your + devices and with the people you invite. Your documents still live on your + machines — the account is how they find each other. +

+
+
+ +
+ + .pds.ziran.space +
+

Letters, digits, and dashes. This is your public name on the network.

+
+
+ + +
+
+ + +

At least 8 characters. Keep it somewhere safe — there is no reset email during the alpha.

+
+
+ + +

Ziran is in alpha; accounts are invite-only. No code? Ask whoever pointed you here.

+
+ + +
+
+

✓ You’re in

+

Your handle is .

+

Open Ziran, hit Sign in, and enter that handle — that’s it.

+
+

+ Alpha honesty: this server may change or lose data while Ziran is in alpha. + Your documents are safe — they live on your machines and sync through the + account, never only on it. +

+
+ + + diff --git a/website/site/index.html b/website/site/index.html index 0af00fd..14ff2f4 100644 --- a/website/site/index.html +++ b/website/site/index.html @@ -315,8 +315,8 @@

Ziran is a universal document app: a single app to edit documents that can be anything so that you never have to fight over what to use again. It's built in the open on open standards, with no - required cloud so that you never get locked in again. It's built for collaboration, with end-to-end - encryption. + required cloud so that you never get locked in again. It's built for collaboration that syncs + through your own corner of the Atmosphere, with no middleman in the way.

Get Ziran @@ -410,17 +410,20 @@

Collaborate, with no middleman

Go live on any document and invite people by their Atmosphere handle. - (If you have a Bluesky account, you already - have one. If not, you can create one with Eurosky.) - Communications on shared documents are end-to-end encrypted. + During the alpha, live documents need an account on a server that speaks + the new Spaces protocol: create one here with an + invite code. Your edits sync through your own server, in your own repo, + under an open protocol. There is no Ziran server in the middle.

-

End-to-end encrypted

+

Yours all the way down

- Whichever server you pick to sync with others, - they can never read your documents. + Every member's contributions live in their own server, so anyone + can walk away with everything. Honest note for the alpha: your + chosen server can read what it syncs — end-to-end encryption is + the roadmap, not yet the reality.

-- 2.51.2
+ +