{"version":3,"file":"kerebron.cjs","names":["Mark","close","joinable","Node","TextNode","NodeType","DOMParser","doc","lift","setBlockType","Mark","NodeBookmark","Mark","Node","ie","mac","windows","Mark","DOMParser","closeSlice","normalizeSiblings","addToSibling","closeRight","withWrappers","closeRange","handleTripleClick","sliceSingleNode","getText","event","empty","checkStateComponent","getEditable","buildNodeViews","changedNodeViews","createClass","text","Token","Parser"],"sources":["../../../node_modules/.deno/orderedmap@2.1.1/node_modules/orderedmap/dist/index.js","../../../node_modules/.deno/prosemirror-model@1.25.9/node_modules/prosemirror-model/dist/index.js","../../../node_modules/.deno/prosemirror-transform@1.10.4/node_modules/prosemirror-transform/dist/index.js","../../../node_modules/.deno/prosemirror-state@1.4.3/node_modules/prosemirror-state/dist/index.js","../../../node_modules/.deno/prosemirror-view@1.40.0/node_modules/prosemirror-view/dist/index.js","../../workspace/src/Workspace.ts","../../editor/src/plugins/input-rules/InputRulesPlugin.ts","../../editor/src/plugins/keymap/w3c-keyname.ts","../../editor/src/plugins/keymap/keymap.ts","../../editor/src/commands/mod.ts","../../editor/src/utilities/getHtmlAttributes.ts","../../editor/src/plugins/TrackSelecionPlugin.ts","../../editor/src/utilities/yaml.ts","../../editor/src/search/query.ts","../../editor/src/search/search.ts","../../editor/src/utilities/Telemetry.ts","../../editor/src/ExtensionManager.ts","../../editor/src/commands/createChainableState.ts","../../editor/src/commands/baseCommandFactories.ts","../../editor/src/commands/keyCommandFactories.ts","../../editor/src/commands/replaceCommandFactories.ts","../../editor/src/commands/CommandManager.ts","../../editor/src/utilities/SmartOutput.ts","../../editor/src/nodeToTreeString.ts","../../editor/src/DummyEditorView.ts","../../editor/src/utilities/createNodeFromContent.ts","../../editor/src/ui.ts","../../editor/src/Container.ts","../../editor/src/CoreEditor.ts","../../editor/src/Extension.ts","../../editor/src/Mark.ts","../../editor/src/Node.ts","../../editor/src/utilities/getShadowRoot.ts","../../editor/src/utilities/debounce.ts","../../extension-basic-editor/src/ExtensionSelection.ts","../../extension-basic-editor/src/ExtensionBaseKeymap.ts","../../extension-basic-editor/src/ExtensionDropcursor.ts","../../extension-basic-editor/src/ExtensionGapcursor.ts","../../extension-basic-editor/src/ExtensionTextAlign.ts","../../editor/src/user/color.ts","../../extension-basic-editor/src/ExtensionUser.ts","../../extension-basic-editor/src/remote-selection/remoteSelectionPlugin.ts","../../extension-basic-editor/src/remote-selection/ExtensionRemoteSelection.ts","../../extension-basic-editor/src/pairing/pairNodes.ts","../../extension-basic-editor/src/pairing/PairNodesPlugin.ts","../../extension-basic-editor/src/pairing/ExtensionPairing.ts","../../extension-basic-editor/src/media/ExtensionHtml.ts","../../extension-basic-editor/src/media/ExtensionMediaUpload.ts","../../extension-basic-editor/src/media/ExtensionPaste.ts","../../extension-basic-editor/src/MarkLink.ts","../../extension-basic-editor/src/MarkStrong.ts","../../extension-basic-editor/src/MarkItalic.ts","../../extension-basic-editor/src/MarkUnderline.ts","../../extension-basic-editor/src/MarkStrike.ts","../../extension-basic-editor/src/MarkCode.ts","../../extension-basic-editor/src/MarkChange.ts","../../extension-basic-editor/src/MarkBookmark.ts","../../extension-basic-editor/src/MarkTextColor.ts","../../extension-basic-editor/src/MarkHighlight.ts","../../extension-basic-editor/src/MarkSuperscript.ts","../../extension-basic-editor/src/MarkSubscript.ts","../../extension-basic-editor/src/NodeDocument.ts","../../extension-basic-editor/src/NodeText.ts","../../editor/src/plugins/input-rules/rulebuilders.ts","../../extension-basic-editor/src/NodeCodeBlock.ts","../../extension-basic-editor/src/NodeBookmark.ts","../../extension-basic-editor/src/NodeParagraph.ts","../../extension-basic-editor/src/NodeHardBreak.ts","../../extension-basic-editor/src/NodeSoftBreak.ts","../../extension-basic-editor/src/NodeHorizontalRule.ts","../../extension-basic-editor/src/NodeImage.ts","../../extension-basic-editor/src/NodeVideo.ts","../../extension-basic-editor/src/NodeBlockquote.ts","../../extension-basic-editor/src/NodeAside.ts","../../extension-basic-editor/src/NodeHeading.ts","../../../node_modules/.deno/temml@0.13.4/node_modules/temml/dist/temml.mjs","../../extension-basic-editor/src/NodeMath.ts","../../extension-basic-editor/src/NodeDefinitionList.ts","../../extension-basic-editor/src/NodeDefinitionTerm.ts","../../extension-basic-editor/src/NodeDefinitionDesc.ts","../../extension-basic-editor/src/NodeInlineShortCode.ts","../../extension-basic-editor/src/NodeIframe.ts","../../extension-basic-editor/src/NodeCommentAnchor.ts","../../extension-basic-editor/src/lists/commands.ts","../../extension-basic-editor/src/lists/NodeOrderedList.ts","../../extension-basic-editor/src/lists/NodeBulletList.ts","../../extension-basic-editor/src/lists/NodeListItem.ts","../../extension-basic-editor/src/lists/NodeTaskList.ts","../../extension-basic-editor/src/lists/NodeViewTaskItem.ts","../../extension-basic-editor/src/lists/NodeTaskItem.ts","../../extension-basic-editor/src/BasicEditorKit.ts","../../extension-basic-editor/src/ExtensionBasicEditor.ts","../../extension-basic-editor/src/history/RopeSequence.ts","../../extension-basic-editor/src/history/history.ts","../../extension-basic-editor/src/history/ExtensionHistory.ts","../../extension-markdown/src/types.ts","../../../node_modules/.deno/mathml2latex@1.1.3/node_modules/mathml2latex/lib/mathml2latex.browser.es.js","../../extension-markdown/src/utils.ts","../../extension-markdown/src/token_handlers/inline_token_handlers.ts","../../extension-markdown/src/token_handlers/basic_token_handlers.ts","../../extension-markdown/src/token_handlers/footnote_token_handlers.ts","../../extension-markdown/src/TokenSource.ts","../../extension-markdown/src/token_handlers/lists_token_handlers.ts","../../extension-markdown/src/token_handlers/table_token_handlers.ts","../../extension-markdown/src/MarkdownSerializer.ts","../../extension-markdown/src/DocumentMarkdownInlineTokenizer.ts","../../extension-markdown/src/DocumentMarkdownTokenizer.ts","../../extension-markdown/src/pmToMdConverter.ts","../../extension-markdown/src/MarkdownParser.ts","../../extension-markdown/src/mdToPmConverter.ts","../../extension-markdown/src/MarkdownContentMapper.ts","../../extension-markdown/src/pm2md/addEmptyLines.ts","../../extension-markdown/src/pm2md/fixIdLinkts.ts","../../extension-markdown/src/pm2md/fixShortCodes.ts","../../extension-markdown/src/pm2md/removeEmptyTags.ts","../../extension-markdown/src/pm2md/removeSuggest.ts","../../extension-markdown/src/pm2md/rewriteUrls.ts","../../extension-markdown/src/pm2md/trimLines.ts","../../extension-markdown/src/pm2md/insertToc.ts","../../extension-markdown/src/pm2md/addEnterAfterImage.ts","../../extension-markdown/src/pm2md/fixParaEnding.ts","../../extension-markdown/src/pm2md/preProcess.ts","../../extension-markdown/src/createMarkdownPlugin.ts","../../../node_modules/.deno/web-tree-sitter@0.26.12/node_modules/web-tree-sitter/web-tree-sitter.js","../../tree-sitter/src/Query.ts","../../tree-sitter/src/ExtendedNode.ts","../../tree-sitter/src/parser.ts","../../wasm/src/wasm.json","../../extension-markdown/src/StackableMarkdownParser.ts","../../extension-markdown/src/treeSitterTokenizer.ts","../../extension-markdown/src/ExtensionMarkdown.ts","../../extension-odt/src/node_handlers/basic_node_handlers.ts","../../extension-odt/src/node_handlers/list_node_handlers.ts","../../extension-odt/src/node_handlers/table_node_handlers.ts","../../extension-odt/src/lists.ts","../../extension-odt/src/OdtParser.ts","../../extension-odt/src/postprocess/convertCodeParagraphsToCodeBlocks.ts","../../extension-odt/src/postprocess/fixContinuedLists.ts","../../extension-odt/src/postprocess/convertMathMl.ts","../../extension-odt/src/postprocess/mergeCodeBlocks.ts","../../extension-odt/src/postprocess/fixListsLevels.ts","../../extension-odt/src/postprocess/postProcess.ts","../../extension-odt/src/postprocess/urlRewrite.ts","../../extension-odt/src/ExtensionOdt.ts","../../extension-tables/src/utilities/createCell.ts","../../extension-tables/src/utilities/getTableNodeTypes.ts","../../extension-tables/src/utilities/createTable.ts","../../extension-tables/src/utilities/TableMap.ts","../../extension-tables/src/utilities/tableNodeTypes.ts","../../extension-tables/src/utilities/util.ts","../../extension-tables/src/utilities/CellSelection.ts","../../extension-tables/src/utilities/TableView.ts","../../extension-tables/src/utilities/columnResizing.ts","../../extension-tables/src/utilities/fixTables.ts","../../extension-tables/src/utilities/commands.ts","../../extension-tables/src/utilities/copypaste.ts","../../extension-tables/src/utilities/input.ts","../../extension-tables/src/utilities/tableEditing.ts","../../extension-tables/src/NodeTable.ts","../../extension-tables/src/NodeTableRow.ts","../../extension-tables/src/NodeTableHeader.ts","../../extension-tables/src/NodeTableCell.ts","../../extension-tables/src/ExtensionTables.ts","../../extension-codecrock/src/TreeSitterHighlighter.ts","../../extension-codecrock/src/Decorator.ts","../../extension-codecrock/src/codeCrockLineNumbers.ts","../../extension-codecrock/src/utils.ts","../../extension-codecrock/src/CodeCrock.ts","../../extension-codecrock/src/ui.ts","../../extension-codecrock/src/NodeViewCodeCrock.ts","../../extension-codecrock/src/NodeCodeCrock.ts","../../extension-codecrock/src/ExtensionCodeCrock.ts","../../../node_modules/.deno/html@1.0.0/node_modules/html/lib/html.js","../../../node_modules/.deno/prosemirror-dev-toolkit@1.1.8/node_modules/prosemirror-dev-toolkit/dist/index.js","../../extension-dev-toolkit/src/mod.ts","../../extension-menu/src/icons.ts","../../extension-menu/src/menu.ts","../../extension-menu/src/prompt.ts","../../extension-menu/src/buildMenu.ts","../../extension-menu/src/CustomMenuPlugin.ts","../../extension-menu/src/ExtensionCustomMenu.ts","../../extension-ui/src/ExtensionUi.ts","../../extension-ui/src/overlayer/mod.ts","../../extension-ui/src/autocomplete/DefaultRenderer.ts","../../extension-ui/src/autocomplete/createDefaultMatcher.ts","../../extension-ui/src/autocomplete/AutocompletePlugin.ts","../../extension-ui/src/autocomplete/ExtensionAutocomplete.ts","../../extension-ui/src/hover/MarkdownRenderer.ts","../../extension-ui/src/hover/HoverPlugin.ts","../../extension-ui/src/hover/ExtensionHover.ts"],"sourcesContent":["// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n  this.content = content;\n}\n\nOrderedMap.prototype = {\n  constructor: OrderedMap,\n\n  find: function(key) {\n    for (var i = 0; i < this.content.length; i += 2)\n      if (this.content[i] === key) return i\n    return -1\n  },\n\n  // :: (string) → ?any\n  // Retrieve the value stored under `key`, or return undefined when\n  // no such key exists.\n  get: function(key) {\n    var found = this.find(key);\n    return found == -1 ? undefined : this.content[found + 1]\n  },\n\n  // :: (string, any, ?string) → OrderedMap\n  // Create a new map by replacing the value of `key` with a new\n  // value, or adding a binding to the end of the map. If `newKey` is\n  // given, the key of the binding will be replaced with that key.\n  update: function(key, value, newKey) {\n    var self = newKey && newKey != key ? this.remove(newKey) : this;\n    var found = self.find(key), content = self.content.slice();\n    if (found == -1) {\n      content.push(newKey || key, value);\n    } else {\n      content[found + 1] = value;\n      if (newKey) content[found] = newKey;\n    }\n    return new OrderedMap(content)\n  },\n\n  // :: (string) → OrderedMap\n  // Return a map with the given key removed, if it existed.\n  remove: function(key) {\n    var found = this.find(key);\n    if (found == -1) return this\n    var content = this.content.slice();\n    content.splice(found, 2);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the start of the map.\n  addToStart: function(key, value) {\n    return new OrderedMap([key, value].concat(this.remove(key).content))\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the end of the map.\n  addToEnd: function(key, value) {\n    var content = this.remove(key).content.slice();\n    content.push(key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, string, any) → OrderedMap\n  // Add a key after the given key. If `place` is not found, the new\n  // key is added to the end.\n  addBefore: function(place, key, value) {\n    var without = this.remove(key), content = without.content.slice();\n    var found = without.find(place);\n    content.splice(found == -1 ? content.length : found, 0, key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: ((key: string, value: any))\n  // Call the given function for each key/value pair in the map, in\n  // order.\n  forEach: function(f) {\n    for (var i = 0; i < this.content.length; i += 2)\n      f(this.content[i], this.content[i + 1]);\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by prepending the keys in this map that don't\n  // appear in `map` before the keys in `map`.\n  prepend: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(map.content.concat(this.subtract(map).content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by appending the keys in this map that don't\n  // appear in `map` after the keys in `map`.\n  append: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(this.subtract(map).content.concat(map.content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a map containing all the keys in this map that don't\n  // appear in `map`.\n  subtract: function(map) {\n    var result = this;\n    map = OrderedMap.from(map);\n    for (var i = 0; i < map.content.length; i += 2)\n      result = result.remove(map.content[i]);\n    return result\n  },\n\n  // :: () → Object\n  // Turn ordered map into a plain object.\n  toObject: function() {\n    var result = {};\n    this.forEach(function(key, value) { result[key] = value; });\n    return result\n  },\n\n  // :: number\n  // The amount of keys in this map.\n  get size() {\n    return this.content.length >> 1\n  }\n};\n\n// :: (?union<Object, OrderedMap>) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n  if (value instanceof OrderedMap) return value\n  var content = [];\n  if (value) for (var prop in value) content.push(prop, value[prop]);\n  return new OrderedMap(content)\n};\n\nexport default OrderedMap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n    for (let i = 0;; i++) {\n        if (i == a.childCount || i == b.childCount)\n            return a.childCount == b.childCount ? null : pos;\n        let childA = a.child(i), childB = b.child(i);\n        if (childA == childB) {\n            pos += childA.nodeSize;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return pos;\n        if (childA.isText && childA.text != childB.text) {\n            let tA = childA.text, tB = childB.text, j = 0;\n            for (; tA[j] == tB[j]; j++)\n                pos++;\n            if (j && j < tA.length && j < tB.length && surrogateHigh(tA.charCodeAt(j - 1)) && surrogateLow(tA.charCodeAt(j)))\n                pos--;\n            return pos;\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffStart(childA.content, childB.content, pos + 1);\n            if (inner != null)\n                return inner;\n        }\n        pos += childA.nodeSize;\n    }\n}\nfunction findDiffEnd(a, b, posA, posB) {\n    for (let iA = a.childCount, iB = b.childCount;;) {\n        if (iA == 0 || iB == 0)\n            return iA == iB ? null : { a: posA, b: posB };\n        let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n        if (childA == childB) {\n            posA -= size;\n            posB -= size;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return { a: posA, b: posB };\n        if (childA.isText && childA.text != childB.text) {\n            let tA = childA.text, tB = childB.text, iA = tA.length, iB = tB.length;\n            while (iA > 0 && iB > 0 && tA[iA - 1] == tB[iB - 1]) {\n                iA--;\n                iB--;\n                posA--;\n                posB--;\n            }\n            if (iA && iB && iA < tA.length && surrogateHigh(tA.charCodeAt(iA - 1)) && surrogateLow(tA.charCodeAt(iA))) {\n                posA++;\n                posB++;\n            }\n            return { a: posA, b: posB };\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n            if (inner)\n                return inner;\n        }\n        posA -= size;\n        posB -= size;\n    }\n}\nfunction surrogateLow(ch) { return ch >= 0xDC00 && ch < 0xE000; }\nfunction surrogateHigh(ch) { return ch >= 0xD800 && ch < 0xDC00; }\n\n/**\nA fragment represents a node's collection of child nodes.\n\nLike nodes, fragments are persistent data structures, and you\nshould not mutate them or their content. Rather, you create new\ninstances whenever needed. The API tries to make this easy.\n*/\nclass Fragment {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The child nodes in this fragment.\n    */\n    content, size) {\n        this.content = content;\n        this.size = size || 0;\n        if (size == null)\n            for (let i = 0; i < content.length; i++)\n                this.size += content[i].nodeSize;\n    }\n    /**\n    Invoke a callback for all descendant nodes between the given two\n    positions (relative to start of this fragment). Doesn't descend\n    into a node when the callback returns `false`.\n    */\n    nodesBetween(from, to, f, nodeStart = 0, parent) {\n        for (let i = 0, pos = 0; pos < to; i++) {\n            let child = this.content[i], end = pos + child.nodeSize;\n            if (end > from && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) {\n                let start = pos + 1;\n                child.nodesBetween(Math.max(0, from - start), Math.min(child.content.size, to - start), f, nodeStart + start);\n            }\n            pos = end;\n        }\n    }\n    /**\n    Call the given callback for every descendant node. `pos` will be\n    relative to the start of the fragment. The callback may return\n    `false` to prevent traversal of a given node's children.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.size, f);\n    }\n    /**\n    Extract the text between `from` and `to`. See the same method on\n    [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        let text = \"\", first = true;\n        this.nodesBetween(from, to, (node, pos) => {\n            let nodeText = node.isText ? node.text.slice(Math.max(from, pos) - pos, to - pos)\n                : !node.isLeaf ? \"\"\n                    : leafText ? (typeof leafText === \"function\" ? leafText(node) : leafText)\n                        : node.type.spec.leafText ? node.type.spec.leafText(node)\n                            : \"\";\n            if (node.isBlock && (node.isLeaf && nodeText || node.isTextblock) && blockSeparator) {\n                if (first)\n                    first = false;\n                else\n                    text += blockSeparator;\n            }\n            text += nodeText;\n        }, 0);\n        return text;\n    }\n    /**\n    Create a new fragment containing the combined content of this\n    fragment and the other.\n    */\n    append(other) {\n        if (!other.size)\n            return this;\n        if (!this.size)\n            return other;\n        let last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n        if (last.isText && last.sameMarkup(first)) {\n            content[content.length - 1] = last.withText(last.text + first.text);\n            i = 1;\n        }\n        for (; i < other.content.length; i++)\n            content.push(other.content[i]);\n        return new Fragment(content, this.size + other.size);\n    }\n    /**\n    Cut out the sub-fragment between the two given positions.\n    */\n    cut(from, to = this.size) {\n        if (from == 0 && to == this.size)\n            return this;\n        let result = [], size = 0;\n        if (to > from)\n            for (let i = 0, pos = 0; pos < to; i++) {\n                let child = this.content[i], end = pos + child.nodeSize;\n                if (end > from) {\n                    if (pos < from || end > to) {\n                        if (child.isText)\n                            child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos));\n                        else\n                            child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1));\n                    }\n                    result.push(child);\n                    size += child.nodeSize;\n                }\n                pos = end;\n            }\n        return new Fragment(result, size);\n    }\n    /**\n    @internal\n    */\n    cutByIndex(from, to) {\n        if (from == to)\n            return Fragment.empty;\n        if (from == 0 && to == this.content.length)\n            return this;\n        return new Fragment(this.content.slice(from, to));\n    }\n    /**\n    Create a new fragment in which the node at the given index is\n    replaced by the given node.\n    */\n    replaceChild(index, node) {\n        let current = this.content[index];\n        if (current == node)\n            return this;\n        let copy = this.content.slice();\n        let size = this.size + node.nodeSize - current.nodeSize;\n        copy[index] = node;\n        return new Fragment(copy, size);\n    }\n    /**\n    Create a new fragment by prepending the given node to this\n    fragment.\n    */\n    addToStart(node) {\n        return new Fragment([node].concat(this.content), this.size + node.nodeSize);\n    }\n    /**\n    Create a new fragment by appending the given node to this\n    fragment.\n    */\n    addToEnd(node) {\n        return new Fragment(this.content.concat(node), this.size + node.nodeSize);\n    }\n    /**\n    Compare this fragment to another one.\n    */\n    eq(other) {\n        if (this.content.length != other.content.length)\n            return false;\n        for (let i = 0; i < this.content.length; i++)\n            if (!this.content[i].eq(other.content[i]))\n                return false;\n        return true;\n    }\n    /**\n    The first child of the fragment, or `null` if it is empty.\n    */\n    get firstChild() { return this.content.length ? this.content[0] : null; }\n    /**\n    The last child of the fragment, or `null` if it is empty.\n    */\n    get lastChild() { return this.content.length ? this.content[this.content.length - 1] : null; }\n    /**\n    The number of child nodes in this fragment.\n    */\n    get childCount() { return this.content.length; }\n    /**\n    Get the child node at the given index. Raise an error when the\n    index is out of range.\n    */\n    child(index) {\n        let found = this.content[index];\n        if (!found)\n            throw new RangeError(\"Index \" + index + \" out of range for \" + this);\n        return found;\n    }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) {\n        return this.content[index] || null;\n    }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) {\n        for (let i = 0, p = 0; i < this.content.length; i++) {\n            let child = this.content[i];\n            f(child, p, i);\n            p += child.nodeSize;\n        }\n    }\n    /**\n    Find the first position at which this fragment and another\n    fragment differ, or `null` if they are the same.\n    */\n    findDiffStart(other, pos = 0) {\n        return findDiffStart(this, other, pos);\n    }\n    /**\n    Find the first position, searching from the end, at which this\n    fragment and the given fragment differ, or `null` if they are\n    the same. Since this position will not be the same in both\n    nodes, an object with two separate positions is returned.\n    */\n    findDiffEnd(other, pos = this.size, otherPos = other.size) {\n        return findDiffEnd(this, other, pos, otherPos);\n    }\n    /**\n    Find the index and inner offset corresponding to a given relative\n    position in this fragment. The result object will be reused\n    (overwritten) the next time the function is called. @internal\n    */\n    findIndex(pos) {\n        if (pos == 0)\n            return retIndex(0, pos);\n        if (pos == this.size)\n            return retIndex(this.content.length, pos);\n        if (pos > this.size || pos < 0)\n            throw new RangeError(`Position ${pos} outside of fragment (${this})`);\n        for (let i = 0, curPos = 0;; i++) {\n            let cur = this.child(i), end = curPos + cur.nodeSize;\n            if (end >= pos) {\n                if (end == pos)\n                    return retIndex(i + 1, end);\n                return retIndex(i, curPos);\n            }\n            curPos = end;\n        }\n    }\n    /**\n    Return a debugging string that describes this fragment.\n    */\n    toString() { return \"<\" + this.toStringInner() + \">\"; }\n    /**\n    @internal\n    */\n    toStringInner() { return this.content.join(\", \"); }\n    /**\n    Create a JSON-serializeable representation of this fragment.\n    */\n    toJSON() {\n        return this.content.length ? this.content.map(n => n.toJSON()) : null;\n    }\n    /**\n    Deserialize a fragment from its JSON representation.\n    */\n    static fromJSON(schema, value) {\n        if (!value)\n            return Fragment.empty;\n        if (!Array.isArray(value))\n            throw new RangeError(\"Invalid input for Fragment.fromJSON\");\n        return Fragment.fromArray(value.map(schema.nodeFromJSON));\n    }\n    /**\n    Build a fragment from an array of nodes. Ensures that adjacent\n    text nodes with the same marks are joined together.\n    */\n    static fromArray(array) {\n        if (!array.length)\n            return Fragment.empty;\n        let joined, size = 0;\n        for (let i = 0; i < array.length; i++) {\n            let node = array[i];\n            size += node.nodeSize;\n            if (i && node.isText && array[i - 1].sameMarkup(node)) {\n                if (!joined)\n                    joined = array.slice(0, i);\n                joined[joined.length - 1] = node\n                    .withText(joined[joined.length - 1].text + node.text);\n            }\n            else if (joined) {\n                joined.push(node);\n            }\n        }\n        return new Fragment(joined || array, size);\n    }\n    /**\n    Create a fragment from something that can be interpreted as a\n    set of nodes. For `null`, it returns the empty fragment. For a\n    fragment, the fragment itself. For a node or array of nodes, a\n    fragment containing those nodes.\n    */\n    static from(nodes) {\n        if (!nodes)\n            return Fragment.empty;\n        if (nodes instanceof Fragment)\n            return nodes;\n        if (Array.isArray(nodes))\n            return this.fromArray(nodes);\n        if (nodes.attrs)\n            return new Fragment([nodes], nodes.nodeSize);\n        throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n            (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"));\n    }\n}\n/**\nAn empty fragment. Intended to be reused whenever a node doesn't\ncontain anything (rather than allocating a new empty fragment for\neach leaf node).\n*/\nFragment.empty = new Fragment([], 0);\nconst found = { index: 0, offset: 0 };\nfunction retIndex(index, offset) {\n    found.index = index;\n    found.offset = offset;\n    return found;\n}\n\nfunction compareDeep(a, b) {\n    if (a === b)\n        return true;\n    if (!(a && typeof a == \"object\") ||\n        !(b && typeof b == \"object\"))\n        return false;\n    let array = Array.isArray(a);\n    if (Array.isArray(b) != array)\n        return false;\n    if (array) {\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!compareDeep(a[i], b[i]))\n                return false;\n    }\n    else {\n        for (let p in a)\n            if (!(p in b) || !compareDeep(a[p], b[p]))\n                return false;\n        for (let p in b)\n            if (!(p in a))\n                return false;\n    }\n    return true;\n}\n\n/**\nA mark is a piece of information that can be attached to a node,\nsuch as it being emphasized, in code font, or a link. It has a\ntype and optionally a set of attributes that provide further\ninformation (such as the target of the link). Marks are created\nthrough a `Schema`, which controls which types exist and which\nattributes they have.\n*/\nclass Mark {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of this mark.\n    */\n    type, \n    /**\n    The attributes associated with this mark.\n    */\n    attrs) {\n        this.type = type;\n        this.attrs = attrs;\n    }\n    /**\n    Given a set of marks, create a new set which contains this one as\n    well, in the right position. If this mark is already in the set,\n    the set itself is returned. If any marks that are set to be\n    [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,\n    those are replaced by this one.\n    */\n    addToSet(set) {\n        let copy, placed = false;\n        for (let i = 0; i < set.length; i++) {\n            let other = set[i];\n            if (this.eq(other))\n                return set;\n            if (this.type.excludes(other.type)) {\n                if (!copy)\n                    copy = set.slice(0, i);\n            }\n            else if (other.type.excludes(this.type)) {\n                return set;\n            }\n            else {\n                if (!placed && other.type.rank > this.type.rank) {\n                    if (!copy)\n                        copy = set.slice(0, i);\n                    copy.push(this);\n                    placed = true;\n                }\n                if (copy)\n                    copy.push(other);\n            }\n        }\n        if (!copy)\n            copy = set.slice();\n        if (!placed)\n            copy.push(this);\n        return copy;\n    }\n    /**\n    Remove this mark from the given set, returning a new set. If this\n    mark is not in the set, the set itself is returned.\n    */\n    removeFromSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return set.slice(0, i).concat(set.slice(i + 1));\n        return set;\n    }\n    /**\n    Test whether this mark is in the given set of marks.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return true;\n        return false;\n    }\n    /**\n    Test whether this mark has the same type and attributes as\n    another mark.\n    */\n    eq(other) {\n        return this == other ||\n            (this.type == other.type && compareDeep(this.attrs, other.attrs));\n    }\n    /**\n    Convert this mark to a JSON-serializeable representation.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        return obj;\n    }\n    /**\n    Deserialize a mark from JSON.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Mark.fromJSON\");\n        let type = schema.marks[json.type];\n        if (!type)\n            throw new RangeError(`There is no mark type ${json.type} in this schema`);\n        let mark = type.create(json.attrs);\n        type.checkAttrs(mark.attrs);\n        return mark;\n    }\n    /**\n    Test whether two sets of marks are identical.\n    */\n    static sameSet(a, b) {\n        if (a == b)\n            return true;\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!a[i].eq(b[i]))\n                return false;\n        return true;\n    }\n    /**\n    Create a properly sorted mark set from null, a single mark, or an\n    unsorted array of marks.\n    */\n    static setFrom(marks) {\n        if (!marks || Array.isArray(marks) && marks.length == 0)\n            return Mark.none;\n        if (marks instanceof Mark)\n            return [marks];\n        let copy = marks.slice();\n        copy.sort((a, b) => a.type.rank - b.type.rank);\n        return copy;\n    }\n}\n/**\nThe empty set of marks.\n*/\nMark.none = [];\n\n/**\nError type raised by [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) when\ngiven an invalid replacement.\n*/\nclass ReplaceError extends Error {\n}\n/**\nA slice represents a piece cut out of a larger document. It\nstores not only a fragment, but also the depth up to which nodes on\nboth side are ‘open’ (cut through).\n*/\nclass Slice {\n    /**\n    Create a slice. When specifying a non-zero open depth, you must\n    make sure that there are nodes of at least that depth at the\n    appropriate side of the fragment—i.e. if the fragment is an\n    empty paragraph node, `openStart` and `openEnd` can't be greater\n    than 1.\n    \n    It is not necessary for the content of open nodes to conform to\n    the schema's content constraints, though it should be a valid\n    start/end/middle for such a node, depending on which sides are\n    open.\n    */\n    constructor(\n    /**\n    The slice's content.\n    */\n    content, \n    /**\n    The open depth at the start of the fragment.\n    */\n    openStart, \n    /**\n    The open depth at the end.\n    */\n    openEnd) {\n        this.content = content;\n        this.openStart = openStart;\n        this.openEnd = openEnd;\n    }\n    /**\n    The size this slice would add when inserted into a document.\n    */\n    get size() {\n        return this.content.size - this.openStart - this.openEnd;\n    }\n    /**\n    @internal\n    */\n    insertAt(pos, fragment) {\n        let content = insertInto(this.content, pos + this.openStart, fragment, this.openStart + 1, this.openEnd + 1);\n        return content && new Slice(content, this.openStart, this.openEnd);\n    }\n    /**\n    @internal\n    */\n    removeBetween(from, to) {\n        return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd);\n    }\n    /**\n    Tests whether this slice is equal to another slice.\n    */\n    eq(other) {\n        return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\";\n    }\n    /**\n    Convert a slice to a JSON-serializable representation.\n    */\n    toJSON() {\n        if (!this.content.size)\n            return null;\n        let json = { content: this.content.toJSON() };\n        if (this.openStart > 0)\n            json.openStart = this.openStart;\n        if (this.openEnd > 0)\n            json.openEnd = this.openEnd;\n        return json;\n    }\n    /**\n    Deserialize a slice from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            return Slice.empty;\n        let openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n        if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n            throw new RangeError(\"Invalid input for Slice.fromJSON\");\n        return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd);\n    }\n    /**\n    Create a slice from a fragment by taking the maximum possible\n    open value on both side of the fragment.\n    */\n    static maxOpen(fragment, openIsolating = true) {\n        let openStart = 0, openEnd = 0;\n        for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild)\n            openStart++;\n        for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild)\n            openEnd++;\n        return new Slice(fragment, openStart, openEnd);\n    }\n}\n/**\nThe empty slice.\n*/\nSlice.empty = new Slice(Fragment.empty, 0, 0);\nfunction removeRange(content, from, to) {\n    let { index, offset } = content.findIndex(from), child = content.maybeChild(index);\n    let { index: indexTo, offset: offsetTo } = content.findIndex(to);\n    if (offset == from || child.isText) {\n        if (offsetTo != to && !content.child(indexTo).isText)\n            throw new RangeError(\"Removing non-flat range\");\n        return content.cut(0, from).append(content.cut(to));\n    }\n    if (index != indexTo)\n        throw new RangeError(\"Removing non-flat range\");\n    return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)));\n}\nfunction insertInto(content, dist, insert, openStart, openEnd, parent) {\n    let { index, offset } = content.findIndex(dist), child = content.maybeChild(index);\n    if (offset == dist || child.isText) {\n        if (parent && openStart <= 0 && openEnd <= 0 && !parent.canReplace(index, index, insert))\n            return null;\n        return content.cut(0, dist).append(insert).append(content.cut(dist));\n    }\n    let inner = insertInto(child.content, dist - offset - 1, insert, index == 0 ? openStart - 1 : 0, index == content.childCount - 1 ? openEnd - 1 : 0, child);\n    return inner && content.replaceChild(index, child.copy(inner));\n}\nfunction replace($from, $to, slice) {\n    if (slice.openStart > $from.depth)\n        throw new ReplaceError(\"Inserted content deeper than insertion position\");\n    if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n        throw new ReplaceError(\"Inconsistent open depths\");\n    return replaceOuter($from, $to, slice, 0);\n}\nfunction replaceOuter($from, $to, slice, depth) {\n    let index = $from.index(depth), node = $from.node(depth);\n    if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n        let inner = replaceOuter($from, $to, slice, depth + 1);\n        return node.copy(node.content.replaceChild(index, inner));\n    }\n    else if (!slice.content.size) {\n        return close(node, replaceTwoWay($from, $to, depth));\n    }\n    else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n        let parent = $from.parent, content = parent.content;\n        return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)));\n    }\n    else {\n        let { start, end } = prepareSliceForReplace(slice, $from);\n        return close(node, replaceThreeWay($from, start, end, $to, depth));\n    }\n}\nfunction checkJoin(main, sub) {\n    if (!sub.type.compatibleContent(main.type))\n        throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name);\n}\nfunction joinable($before, $after, depth) {\n    let node = $before.node(depth);\n    checkJoin(node, $after.node(depth));\n    return node;\n}\nfunction addNode(child, target) {\n    let last = target.length - 1;\n    if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n        target[last] = child.withText(target[last].text + child.text);\n    else\n        target.push(child);\n}\nfunction addRange($start, $end, depth, target) {\n    let node = ($end || $start).node(depth);\n    let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n    if ($start) {\n        startIndex = $start.index(depth);\n        if ($start.depth > depth) {\n            startIndex++;\n        }\n        else if ($start.textOffset) {\n            addNode($start.nodeAfter, target);\n            startIndex++;\n        }\n    }\n    for (let i = startIndex; i < endIndex; i++)\n        addNode(node.child(i), target);\n    if ($end && $end.depth == depth && $end.textOffset)\n        addNode($end.nodeBefore, target);\n}\nfunction close(node, content) {\n    if (!node.type.validContent(content))\n        throw new ReplaceError(\"Invalid content for node \" + node.type.name);\n    return node.copy(content);\n}\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n    let openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n    let openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n    let content = [];\n    addRange(null, $from, depth, content);\n    if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n        checkJoin(openStart, openEnd);\n        addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n    }\n    else {\n        if (openStart)\n            addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content);\n        addRange($start, $end, depth, content);\n        if (openEnd)\n            addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction replaceTwoWay($from, $to, depth) {\n    let content = [];\n    addRange(null, $from, depth, content);\n    if ($from.depth > depth) {\n        let type = joinable($from, $to, depth + 1);\n        addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction prepareSliceForReplace(slice, $along) {\n    let extra = $along.depth - slice.openStart, parent = $along.node(extra);\n    let node = parent.copy(slice.content);\n    for (let i = extra - 1; i >= 0; i--)\n        node = $along.node(i).copy(Fragment.from(node));\n    return { start: node.resolveNoCache(slice.openStart + extra),\n        end: node.resolveNoCache(node.content.size - slice.openEnd - extra) };\n}\n\n/**\nYou can [_resolve_](https://prosemirror.net/docs/ref/#model.Node.resolve) a position to get more\ninformation about it. Objects of this class represent such a\nresolved position, providing various pieces of context\ninformation, and some helper methods.\n\nThroughout this interface, methods that take an optional `depth`\nparameter will interpret undefined as `this.depth` and negative\nnumbers as `this.depth + value`.\n*/\nclass ResolvedPos {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The position that was resolved.\n    */\n    pos, \n    /**\n    @internal\n    */\n    path, \n    /**\n    The offset this position has into its parent node.\n    */\n    parentOffset) {\n        this.pos = pos;\n        this.path = path;\n        this.parentOffset = parentOffset;\n        this.depth = path.length / 3 - 1;\n    }\n    /**\n    @internal\n    */\n    resolveDepth(val) {\n        if (val == null)\n            return this.depth;\n        if (val < 0)\n            return this.depth + val;\n        return val;\n    }\n    /**\n    The parent node that the position points into. Note that even if\n    a position points into a text node, that node is not considered\n    the parent—text nodes are ‘flat’ in this model, and have no content.\n    */\n    get parent() { return this.node(this.depth); }\n    /**\n    The root node in which the position was resolved.\n    */\n    get doc() { return this.node(0); }\n    /**\n    The ancestor node at the given level. `p.node(p.depth)` is the\n    same as `p.parent`.\n    */\n    node(depth) { return this.path[this.resolveDepth(depth) * 3]; }\n    /**\n    The index into the ancestor at the given level. If this points\n    at the 3rd node in the 2nd paragraph on the top level, for\n    example, `p.index(0)` is 1 and `p.index(1)` is 2.\n    */\n    index(depth) { return this.path[this.resolveDepth(depth) * 3 + 1]; }\n    /**\n    The index pointing after this position into the ancestor at the\n    given level.\n    */\n    indexAfter(depth) {\n        depth = this.resolveDepth(depth);\n        return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1);\n    }\n    /**\n    The (absolute) position at the start of the node at the given\n    level.\n    */\n    start(depth) {\n        depth = this.resolveDepth(depth);\n        return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n    }\n    /**\n    The (absolute) position at the end of the node at the given\n    level.\n    */\n    end(depth) {\n        depth = this.resolveDepth(depth);\n        return this.start(depth) + this.node(depth).content.size;\n    }\n    /**\n    The (absolute) position directly before the wrapping node at the\n    given level, or, when `depth` is `this.depth + 1`, the original\n    position.\n    */\n    before(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position before the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1];\n    }\n    /**\n    The (absolute) position directly after the wrapping node at the\n    given level, or the original position when `depth` is `this.depth + 1`.\n    */\n    after(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position after the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize;\n    }\n    /**\n    When this position points into a text node, this returns the\n    distance between the position and the start of the text node.\n    Will be zero for positions that point between nodes.\n    */\n    get textOffset() { return this.pos - this.path[this.path.length - 1]; }\n    /**\n    Get the node directly after the position, if any. If the position\n    points into a text node, only the part of that node after the\n    position is returned.\n    */\n    get nodeAfter() {\n        let parent = this.parent, index = this.index(this.depth);\n        if (index == parent.childCount)\n            return null;\n        let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n        return dOff ? parent.child(index).cut(dOff) : child;\n    }\n    /**\n    Get the node directly before the position, if any. If the\n    position points into a text node, only the part of that node\n    before the position is returned.\n    */\n    get nodeBefore() {\n        let index = this.index(this.depth);\n        let dOff = this.pos - this.path[this.path.length - 1];\n        if (dOff)\n            return this.parent.child(index).cut(0, dOff);\n        return index == 0 ? null : this.parent.child(index - 1);\n    }\n    /**\n    Get the position at the given index in the parent node at the\n    given depth (which defaults to `this.depth`).\n    */\n    posAtIndex(index, depth) {\n        depth = this.resolveDepth(depth);\n        let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n        for (let i = 0; i < index; i++)\n            pos += node.child(i).nodeSize;\n        return pos;\n    }\n    /**\n    Get the marks at this position, factoring in the surrounding\n    marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the\n    position is at the start of a non-empty node, the marks of the\n    node after it (if any) are returned.\n    */\n    marks() {\n        let parent = this.parent, index = this.index();\n        // In an empty parent, return the empty array\n        if (parent.content.size == 0)\n            return Mark.none;\n        // When inside a text node, just return the text node's marks\n        if (this.textOffset)\n            return parent.child(index).marks;\n        let main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n        // If the `after` flag is true of there is no node before, make\n        // the node after this position the main reference.\n        if (!main) {\n            let tmp = main;\n            main = other;\n            other = tmp;\n        }\n        // Use all marks in the main node, except those that have\n        // `inclusive` set to false and are not present in the other node.\n        let marks = main.marks;\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    Get the marks after the current position, if any, except those\n    that are non-inclusive and not present at position `$end`. This\n    is mostly useful for getting the set of marks to preserve after a\n    deletion. Will return `null` if this position is at the end of\n    its parent node or its parent node isn't a textblock (in which\n    case no marks should be preserved).\n    */\n    marksAcross($end) {\n        let after = this.parent.maybeChild(this.index());\n        if (!after || !after.isInline)\n            return null;\n        let marks = after.marks, next = $end.parent.maybeChild($end.index());\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    The depth up to which this position and the given (non-resolved)\n    position share the same parent nodes.\n    */\n    sharedDepth(pos) {\n        for (let depth = this.depth; depth > 0; depth--)\n            if (this.start(depth) <= pos && this.end(depth) >= pos)\n                return depth;\n        return 0;\n    }\n    /**\n    Returns a range based on the place where this position and the\n    given position diverge around block content. If both point into\n    the same textblock, for example, a range around that textblock\n    will be returned. If they point into different blocks, the range\n    around those blocks in their shared ancestor is returned. You can\n    pass in an optional predicate that will be called with a parent\n    node to see if a range into that parent is acceptable.\n    */\n    blockRange(other = this, pred) {\n        if (other.pos < this.pos)\n            return other.blockRange(this);\n        for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n            if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n                return new NodeRange(this, other, d);\n        return null;\n    }\n    /**\n    Query whether the given position shares the same parent node.\n    */\n    sameParent(other) {\n        return this.pos - this.parentOffset == other.pos - other.parentOffset;\n    }\n    /**\n    Return the greater of this and the given position.\n    */\n    max(other) {\n        return other.pos > this.pos ? other : this;\n    }\n    /**\n    Return the smaller of this and the given position.\n    */\n    min(other) {\n        return other.pos < this.pos ? other : this;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let str = \"\";\n        for (let i = 1; i <= this.depth; i++)\n            str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1);\n        return str + \":\" + this.parentOffset;\n    }\n    /**\n    @internal\n    */\n    static resolve(doc, pos) {\n        if (!(pos >= 0 && pos <= doc.content.size))\n            throw new RangeError(\"Position \" + pos + \" out of range\");\n        let path = [];\n        let start = 0, parentOffset = pos;\n        for (let node = doc;;) {\n            let { index, offset } = node.content.findIndex(parentOffset);\n            let rem = parentOffset - offset;\n            path.push(node, index, start + offset);\n            if (!rem)\n                break;\n            node = node.child(index);\n            if (node.isText)\n                break;\n            parentOffset = rem - 1;\n            start += offset + 1;\n        }\n        return new ResolvedPos(pos, path, parentOffset);\n    }\n    /**\n    @internal\n    */\n    static resolveCached(doc, pos) {\n        let cache = resolveCache.get(doc);\n        if (cache) {\n            for (let i = 0; i < cache.elts.length; i++) {\n                let elt = cache.elts[i];\n                if (elt.pos == pos)\n                    return elt;\n            }\n        }\n        else {\n            resolveCache.set(doc, cache = new ResolveCache);\n        }\n        let result = cache.elts[cache.i] = ResolvedPos.resolve(doc, pos);\n        cache.i = (cache.i + 1) % resolveCacheSize;\n        return result;\n    }\n}\nclass ResolveCache {\n    constructor() {\n        this.elts = [];\n        this.i = 0;\n    }\n}\nconst resolveCacheSize = 12, resolveCache = new WeakMap();\n/**\nRepresents a flat range of content, i.e. one that starts and\nends in the same node.\n*/\nclass NodeRange {\n    /**\n    Construct a node range. `$from` and `$to` should point into the\n    same node until at least the given `depth`, since a node range\n    denotes an adjacent set of nodes in a single parent node.\n    */\n    constructor(\n    /**\n    A resolved position along the start of the content. May have a\n    `depth` greater than this object's `depth` property, since\n    these are the positions that were used to compute the range,\n    not re-resolved positions directly at its boundaries.\n    */\n    $from, \n    /**\n    A position along the end of the content. See\n    caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).\n    */\n    $to, \n    /**\n    The depth of the node that this range points into.\n    */\n    depth) {\n        this.$from = $from;\n        this.$to = $to;\n        this.depth = depth;\n    }\n    /**\n    The position at the start of the range.\n    */\n    get start() { return this.$from.before(this.depth + 1); }\n    /**\n    The position at the end of the range.\n    */\n    get end() { return this.$to.after(this.depth + 1); }\n    /**\n    The parent node that the range points into.\n    */\n    get parent() { return this.$from.node(this.depth); }\n    /**\n    The start index of the range in the parent node.\n    */\n    get startIndex() { return this.$from.index(this.depth); }\n    /**\n    The end index of the range in the parent node.\n    */\n    get endIndex() { return this.$to.indexAfter(this.depth); }\n}\n\nconst emptyAttrs = Object.create(null);\n/**\nThis class represents a node in the tree that makes up a\nProseMirror document. So a document is an instance of `Node`, with\nchildren that are also instances of `Node`.\n\nNodes are persistent data structures. Instead of changing them, you\ncreate new ones with the content you want. Old ones keep pointing\nat the old document shape. This is made cheaper by sharing\nstructure between the old and new data as much as possible, which a\ntree shape like this (without back pointers) makes easy.\n\n**Do not** directly mutate the properties of a `Node` object. See\n[the guide](https://prosemirror.net/docs/guide/#doc) for more information.\n*/\nclass Node {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of node that this is.\n    */\n    type, \n    /**\n    An object mapping attribute names to values. The kind of\n    attributes allowed and required are\n    [determined](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) by the node type.\n    */\n    attrs, \n    // A fragment holding the node's children.\n    content, \n    /**\n    The marks (things like whether it is emphasized or part of a\n    link) applied to this node.\n    */\n    marks = Mark.none) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.content = content || Fragment.empty;\n    }\n    /**\n    The array of this node's child nodes.\n    */\n    get children() { return this.content.content; }\n    /**\n    The size of this node, as defined by the integer-based [indexing\n    scheme](https://prosemirror.net/docs/guide/#doc.indexing). For text nodes, this is the\n    amount of characters. For other leaf nodes, it is one. For\n    non-leaf nodes, it is the size of the content plus two (the\n    start and end token).\n    */\n    get nodeSize() { return this.isLeaf ? 1 : 2 + this.content.size; }\n    /**\n    The number of children that the node has.\n    */\n    get childCount() { return this.content.childCount; }\n    /**\n    Get the child node at the given index. Raises an error when the\n    index is out of range.\n    */\n    child(index) { return this.content.child(index); }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) { return this.content.maybeChild(index); }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) { this.content.forEach(f); }\n    /**\n    Invoke a callback for all descendant nodes recursively overlapping\n    the given two positions that are relative to start of this\n    node's content. This includes all ancestors of the nodes\n    containing the two positions. The callback is invoked with the\n    node, its position relative to the original node (method receiver),\n    its parent node, and its child index. When the callback returns\n    false for a given node, that node's children will not be\n    recursed over. The last parameter can be used to specify a\n    starting position to count from.\n    */\n    nodesBetween(from, to, f, startPos = 0) {\n        this.content.nodesBetween(from, to, f, startPos, this);\n    }\n    /**\n    Call the given callback for every descendant node. Doesn't\n    descend into a node when the callback returns `false`.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.content.size, f);\n    }\n    /**\n    Concatenates all the text nodes found in this fragment and its\n    children.\n    */\n    get textContent() {\n        return (this.isLeaf && this.type.spec.leafText)\n            ? this.type.spec.leafText(this)\n            : this.textBetween(0, this.content.size, \"\");\n    }\n    /**\n    Get all text between positions `from` and `to`. When\n    `blockSeparator` is given, it will be inserted to separate text\n    from different block nodes. If `leafText` is given, it'll be\n    inserted for every non-text leaf node encountered, otherwise\n    [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec.leafText) will be used.\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        return this.content.textBetween(from, to, blockSeparator, leafText);\n    }\n    /**\n    Returns this node's first child, or `null` if there are no\n    children.\n    */\n    get firstChild() { return this.content.firstChild; }\n    /**\n    Returns this node's last child, or `null` if there are no\n    children.\n    */\n    get lastChild() { return this.content.lastChild; }\n    /**\n    Test whether two nodes represent the same piece of document.\n    */\n    eq(other) {\n        return this == other || (this.sameMarkup(other) && this.content.eq(other.content));\n    }\n    /**\n    Compare the markup (type, attributes, and marks) of this node to\n    those of another. Returns `true` if both have the same markup.\n    */\n    sameMarkup(other) {\n        return this.hasMarkup(other.type, other.attrs, other.marks);\n    }\n    /**\n    Check whether this node's markup correspond to the given type,\n    attributes, and marks.\n    */\n    hasMarkup(type, attrs, marks) {\n        return this.type == type &&\n            compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n            Mark.sameSet(this.marks, marks || Mark.none);\n    }\n    /**\n    Create a new node with the same markup as this node, containing\n    the given content (or empty, if no content is given).\n    */\n    copy(content = null) {\n        if (content == this.content)\n            return this;\n        return new Node(this.type, this.attrs, content, this.marks);\n    }\n    /**\n    Create a copy of this node, with the given set of marks instead\n    of the node's own marks.\n    */\n    mark(marks) {\n        return marks == this.marks ? this : new Node(this.type, this.attrs, this.content, marks);\n    }\n    /**\n    Create a copy of this node with only the content between the\n    given positions. If `to` is not given, it defaults to the end of\n    the node.\n    */\n    cut(from, to = this.content.size) {\n        if (from == 0 && to == this.content.size)\n            return this;\n        return this.copy(this.content.cut(from, to));\n    }\n    /**\n    Cut out the part of the document between the given positions, and\n    return it as a `Slice` object.\n    */\n    slice(from, to = this.content.size, includeParents = false) {\n        if (from == to)\n            return Slice.empty;\n        let $from = this.resolve(from), $to = this.resolve(to);\n        let depth = includeParents ? 0 : $from.sharedDepth(to);\n        let start = $from.start(depth), node = $from.node(depth);\n        let content = node.content.cut($from.pos - start, $to.pos - start);\n        return new Slice(content, $from.depth - depth, $to.depth - depth);\n    }\n    /**\n    Replace the part of the document between the given positions with\n    the given slice. The slice must 'fit', meaning its open sides\n    must be able to connect to the surrounding content, and its\n    content nodes must be valid children for the node they are placed\n    into. If any of this is violated, an error of type\n    [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.\n    */\n    replace(from, to, slice) {\n        return replace(this.resolve(from), this.resolve(to), slice);\n    }\n    /**\n    Find the node directly after the given position.\n    */\n    nodeAt(pos) {\n        for (let node = this;;) {\n            let { index, offset } = node.content.findIndex(pos);\n            node = node.maybeChild(index);\n            if (!node)\n                return null;\n            if (offset == pos || node.isText)\n                return node;\n            pos -= offset + 1;\n        }\n    }\n    /**\n    Find the (direct) child node after the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childAfter(pos) {\n        let { index, offset } = this.content.findIndex(pos);\n        return { node: this.content.maybeChild(index), index, offset };\n    }\n    /**\n    Find the (direct) child node before the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childBefore(pos) {\n        if (pos == 0)\n            return { node: null, index: 0, offset: 0 };\n        let { index, offset } = this.content.findIndex(pos);\n        if (offset < pos)\n            return { node: this.content.child(index), index, offset };\n        let node = this.content.child(index - 1);\n        return { node, index: index - 1, offset: offset - node.nodeSize };\n    }\n    /**\n    Resolve the given position in the document, returning an\n    [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.\n    */\n    resolve(pos) { return ResolvedPos.resolveCached(this, pos); }\n    /**\n    @internal\n    */\n    resolveNoCache(pos) { return ResolvedPos.resolve(this, pos); }\n    /**\n    Test whether a given mark or mark type occurs in this document\n    between the two given positions.\n    */\n    rangeHasMark(from, to, type) {\n        let found = false;\n        if (to > from)\n            this.nodesBetween(from, to, node => {\n                if (type.isInSet(node.marks))\n                    found = true;\n                return !found;\n            });\n        return found;\n    }\n    /**\n    True when this is a block (non-inline node)\n    */\n    get isBlock() { return this.type.isBlock; }\n    /**\n    True when this is a textblock node, a block node with inline\n    content.\n    */\n    get isTextblock() { return this.type.isTextblock; }\n    /**\n    True when this node allows inline content.\n    */\n    get inlineContent() { return this.type.inlineContent; }\n    /**\n    True when this is an inline node (a text node or a node that can\n    appear among text).\n    */\n    get isInline() { return this.type.isInline; }\n    /**\n    True when this is a text node.\n    */\n    get isText() { return this.type.isText; }\n    /**\n    True when this is a leaf node.\n    */\n    get isLeaf() { return this.type.isLeaf; }\n    /**\n    True when this is an atom, i.e. when it does not have directly\n    editable content. This is usually the same as `isLeaf`, but can\n    be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)\n    on a node's spec (typically used when the node is displayed as\n    an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).\n    */\n    get isAtom() { return this.type.isAtom; }\n    /**\n    Return a string representation of this node for debugging\n    purposes.\n    */\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        let name = this.type.name;\n        if (this.content.size)\n            name += \"(\" + this.content.toStringInner() + \")\";\n        return wrapMarks(this.marks, name);\n    }\n    /**\n    Get the content match in this node at the given index.\n    */\n    contentMatchAt(index) {\n        let match = this.type.contentMatch.matchFragment(this.content, 0, index);\n        if (!match)\n            throw new Error(\"Called contentMatchAt on a node with invalid content\");\n        return match;\n    }\n    /**\n    Test whether replacing the range between `from` and `to` (by\n    child index) with the given replacement fragment (which defaults\n    to the empty fragment) would leave the node's content valid. You\n    can optionally pass `start` and `end` indices into the\n    replacement fragment.\n    */\n    canReplace(from, to, replacement = Fragment.empty, start = 0, end = replacement.childCount) {\n        let one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n        let two = one && one.matchFragment(this.content, to);\n        if (!two || !two.validEnd)\n            return false;\n        for (let i = start; i < end; i++)\n            if (!this.type.allowsMarks(replacement.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Test whether replacing the range `from` to `to` (by index) with\n    a node of the given type would leave the node's content valid.\n    */\n    canReplaceWith(from, to, type, marks) {\n        if (marks && !this.type.allowsMarks(marks))\n            return false;\n        let start = this.contentMatchAt(from).matchType(type);\n        let end = start && start.matchFragment(this.content, to);\n        return end ? end.validEnd : false;\n    }\n    /**\n    Test whether the given node's content could be appended to this\n    node. If that node is empty, this will only return true if there\n    is at least one node type that can appear in both nodes (to avoid\n    merging completely incompatible nodes).\n    */\n    canAppend(other) {\n        if (other.content.size)\n            return this.canReplace(this.childCount, this.childCount, other.content);\n        else\n            return this.type.compatibleContent(other.type);\n    }\n    /**\n    Check whether this node and its descendants conform to the\n    schema, and raise an exception when they do not.\n    */\n    check() {\n        this.type.checkContent(this.content);\n        this.type.checkAttrs(this.attrs);\n        let copy = Mark.none;\n        for (let i = 0; i < this.marks.length; i++) {\n            let mark = this.marks[i];\n            mark.type.checkAttrs(mark.attrs);\n            copy = mark.addToSet(copy);\n        }\n        if (!Mark.sameSet(copy, this.marks))\n            throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map(m => m.type.name)}`);\n        this.content.forEach(node => node.check());\n    }\n    /**\n    Return a JSON-serializeable representation of this node.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        if (this.content.size)\n            obj.content = this.content.toJSON();\n        if (this.marks.length)\n            obj.marks = this.marks.map(n => n.toJSON());\n        return obj;\n    }\n    /**\n    Deserialize a node from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Node.fromJSON\");\n        let marks = undefined;\n        if (json.marks) {\n            if (!Array.isArray(json.marks))\n                throw new RangeError(\"Invalid mark data for Node.fromJSON\");\n            marks = json.marks.map(schema.markFromJSON);\n        }\n        if (json.type == \"text\") {\n            if (typeof json.text != \"string\")\n                throw new RangeError(\"Invalid text node in JSON\");\n            return schema.text(json.text, marks);\n        }\n        let content = Fragment.fromJSON(schema, json.content);\n        let node = schema.nodeType(json.type).create(json.attrs, content, marks);\n        node.type.checkAttrs(node.attrs);\n        return node;\n    }\n}\nNode.prototype.text = undefined;\nclass TextNode extends Node {\n    /**\n    @internal\n    */\n    constructor(type, attrs, content, marks) {\n        super(type, attrs, null, marks);\n        if (!content)\n            throw new RangeError(\"Empty text nodes are not allowed\");\n        this.text = content;\n    }\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        return wrapMarks(this.marks, JSON.stringify(this.text));\n    }\n    get textContent() { return this.text; }\n    textBetween(from, to) { return this.text.slice(from, to); }\n    get nodeSize() { return this.text.length; }\n    mark(marks) {\n        return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks);\n    }\n    withText(text) {\n        if (text == this.text)\n            return this;\n        return new TextNode(this.type, this.attrs, text, this.marks);\n    }\n    cut(from = 0, to = this.text.length) {\n        if (from == 0 && to == this.text.length)\n            return this;\n        return this.withText(this.text.slice(from, to));\n    }\n    eq(other) {\n        return this.sameMarkup(other) && this.text == other.text;\n    }\n    toJSON() {\n        let base = super.toJSON();\n        base.text = this.text;\n        return base;\n    }\n}\nfunction wrapMarks(marks, str) {\n    for (let i = marks.length - 1; i >= 0; i--)\n        str = marks[i].type.name + \"(\" + str + \")\";\n    return str;\n}\n\n/**\nInstances of this class represent a match state of a node type's\n[content expression](https://prosemirror.net/docs/ref/#model.NodeSpec.content), and can be used to\nfind out whether further content matches here, and whether a given\nposition is a valid end of the node.\n*/\nclass ContentMatch {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    True when this match state represents a valid end of the node.\n    */\n    validEnd) {\n        this.validEnd = validEnd;\n        /**\n        @internal\n        */\n        this.next = [];\n        /**\n        @internal\n        */\n        this.wrapCache = [];\n    }\n    /**\n    @internal\n    */\n    static parse(string, nodeTypes) {\n        let stream = new TokenStream(string, nodeTypes);\n        if (stream.next == null)\n            return ContentMatch.empty;\n        let expr = parseExpr(stream);\n        if (stream.next)\n            stream.err(\"Unexpected trailing text\");\n        let match = dfa(nfa(expr));\n        checkForDeadEnds(match, stream);\n        return match;\n    }\n    /**\n    Match a node type, returning a match after that node if\n    successful.\n    */\n    matchType(type) {\n        for (let i = 0; i < this.next.length; i++)\n            if (this.next[i].type == type)\n                return this.next[i].next;\n        return null;\n    }\n    /**\n    Try to match a fragment. Returns the resulting match when\n    successful.\n    */\n    matchFragment(frag, start = 0, end = frag.childCount) {\n        let cur = this;\n        for (let i = start; cur && i < end; i++)\n            cur = cur.matchType(frag.child(i).type);\n        return cur;\n    }\n    /**\n    @internal\n    */\n    get inlineContent() {\n        return this.next.length != 0 && this.next[0].type.isInline;\n    }\n    /**\n    Get the first matching node type at this match position that can\n    be generated.\n    */\n    get defaultType() {\n        for (let i = 0; i < this.next.length; i++) {\n            let { type } = this.next[i];\n            if (!(type.isText || type.hasRequiredAttrs()))\n                return type;\n        }\n        return null;\n    }\n    /**\n    @internal\n    */\n    compatible(other) {\n        for (let i = 0; i < this.next.length; i++)\n            for (let j = 0; j < other.next.length; j++)\n                if (this.next[i].type == other.next[j].type)\n                    return true;\n        return false;\n    }\n    /**\n    Try to match the given fragment, and if that fails, see if it can\n    be made to match by inserting nodes in front of it. When\n    successful, return a fragment of inserted nodes (which may be\n    empty if nothing had to be inserted). When `toEnd` is true, only\n    return a fragment if the resulting match goes to the end of the\n    content expression.\n    */\n    fillBefore(after, toEnd = false, startIndex = 0) {\n        let seen = [this];\n        function search(match, types) {\n            let finished = match.matchFragment(after, startIndex);\n            if (finished && (!toEnd || finished.validEnd))\n                return Fragment.from(types.map(tp => tp.createAndFill()));\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n                    seen.push(next);\n                    let found = search(next, types.concat(type));\n                    if (found)\n                        return found;\n                }\n            }\n            return null;\n        }\n        return search(this, []);\n    }\n    /**\n    Find a set of wrapping node types that would allow a node of the\n    given type to appear at this position. The result may be empty\n    (when it fits directly) and will be null when no such wrapping\n    exists.\n    */\n    findWrapping(target) {\n        for (let i = 0; i < this.wrapCache.length; i += 2)\n            if (this.wrapCache[i] == target)\n                return this.wrapCache[i + 1];\n        let computed = this.computeWrapping(target);\n        this.wrapCache.push(target, computed);\n        return computed;\n    }\n    /**\n    @internal\n    */\n    computeWrapping(target) {\n        let seen = Object.create(null), active = [{ match: this, type: null, via: null }];\n        while (active.length) {\n            let current = active.shift(), match = current.match;\n            if (match.matchType(target)) {\n                let result = [];\n                for (let obj = current; obj.type; obj = obj.via)\n                    result.push(obj.type);\n                return result.reverse();\n            }\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) {\n                    active.push({ match: type.contentMatch, type, via: current });\n                    seen[type.name] = true;\n                }\n            }\n        }\n        return null;\n    }\n    /**\n    The number of outgoing edges this node has in the finite\n    automaton that describes the content expression.\n    */\n    get edgeCount() {\n        return this.next.length;\n    }\n    /**\n    Get the _n_​th outgoing edge from this node in the finite\n    automaton that describes the content expression.\n    */\n    edge(n) {\n        if (n >= this.next.length)\n            throw new RangeError(`There's no ${n}th edge in this content match`);\n        return this.next[n];\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let seen = [];\n        function scan(m) {\n            seen.push(m);\n            for (let i = 0; i < m.next.length; i++)\n                if (seen.indexOf(m.next[i].next) == -1)\n                    scan(m.next[i].next);\n        }\n        scan(this);\n        return seen.map((m, i) => {\n            let out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n            for (let i = 0; i < m.next.length; i++)\n                out += (i ? \", \" : \"\") + m.next[i].type.name + \"->\" + seen.indexOf(m.next[i].next);\n            return out;\n        }).join(\"\\n\");\n    }\n}\n/**\n@internal\n*/\nContentMatch.empty = new ContentMatch(true);\nclass TokenStream {\n    constructor(string, nodeTypes) {\n        this.string = string;\n        this.nodeTypes = nodeTypes;\n        this.inline = null;\n        this.pos = 0;\n        this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n        if (this.tokens[this.tokens.length - 1] == \"\")\n            this.tokens.pop();\n        if (this.tokens[0] == \"\")\n            this.tokens.shift();\n    }\n    get next() { return this.tokens[this.pos]; }\n    eat(tok) { return this.next == tok && (this.pos++ || true); }\n    err(str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\"); }\n}\nfunction parseExpr(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSeq(stream));\n    } while (stream.eat(\"|\"));\n    return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n}\nfunction parseExprSeq(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSubscript(stream));\n    } while (stream.next && stream.next != \")\" && stream.next != \"|\");\n    return exprs.length == 1 ? exprs[0] : { type: \"seq\", exprs };\n}\nfunction parseExprSubscript(stream) {\n    let expr = parseExprAtom(stream);\n    for (;;) {\n        if (stream.eat(\"+\"))\n            expr = { type: \"plus\", expr };\n        else if (stream.eat(\"*\"))\n            expr = { type: \"star\", expr };\n        else if (stream.eat(\"?\"))\n            expr = { type: \"opt\", expr };\n        else if (stream.eat(\"{\"))\n            expr = parseExprRange(stream, expr);\n        else\n            break;\n    }\n    return expr;\n}\nfunction parseNum(stream) {\n    if (/\\D/.test(stream.next))\n        stream.err(\"Expected number, got '\" + stream.next + \"'\");\n    let result = Number(stream.next);\n    stream.pos++;\n    return result;\n}\nfunction parseExprRange(stream, expr) {\n    let min = parseNum(stream), max = min;\n    if (stream.eat(\",\")) {\n        if (stream.next != \"}\")\n            max = parseNum(stream);\n        else\n            max = -1;\n    }\n    if (!stream.eat(\"}\"))\n        stream.err(\"Unclosed braced range\");\n    return { type: \"range\", min, max, expr };\n}\nfunction resolveName(stream, name) {\n    let types = stream.nodeTypes, type = types[name];\n    if (type)\n        return [type];\n    let result = [];\n    for (let typeName in types) {\n        let type = types[typeName];\n        if (type.isInGroup(name))\n            result.push(type);\n    }\n    if (result.length == 0)\n        stream.err(\"No node type or group '\" + name + \"' found\");\n    return result;\n}\nfunction parseExprAtom(stream) {\n    if (stream.eat(\"(\")) {\n        let expr = parseExpr(stream);\n        if (!stream.eat(\")\"))\n            stream.err(\"Missing closing paren\");\n        return expr;\n    }\n    else if (!/\\W/.test(stream.next)) {\n        let exprs = resolveName(stream, stream.next).map(type => {\n            if (stream.inline == null)\n                stream.inline = type.isInline;\n            else if (stream.inline != type.isInline)\n                stream.err(\"Mixing inline and block content\");\n            return { type: \"name\", value: type };\n        });\n        stream.pos++;\n        return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n    }\n    else {\n        stream.err(\"Unexpected token '\" + stream.next + \"'\");\n    }\n}\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n    let nfa = [[]];\n    connect(compile(expr, 0), node());\n    return nfa;\n    function node() { return nfa.push([]) - 1; }\n    function edge(from, to, term) {\n        let edge = { term, to };\n        nfa[from].push(edge);\n        return edge;\n    }\n    function connect(edges, to) {\n        edges.forEach(edge => edge.to = to);\n    }\n    function compile(expr, from) {\n        if (expr.type == \"choice\") {\n            return expr.exprs.reduce((out, expr) => out.concat(compile(expr, from)), []);\n        }\n        else if (expr.type == \"seq\") {\n            for (let i = 0;; i++) {\n                let next = compile(expr.exprs[i], from);\n                if (i == expr.exprs.length - 1)\n                    return next;\n                connect(next, from = node());\n            }\n        }\n        else if (expr.type == \"star\") {\n            let loop = node();\n            edge(from, loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"plus\") {\n            let loop = node();\n            connect(compile(expr.expr, from), loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"opt\") {\n            return [edge(from)].concat(compile(expr.expr, from));\n        }\n        else if (expr.type == \"range\") {\n            let cur = from;\n            for (let i = 0; i < expr.min; i++) {\n                let next = node();\n                connect(compile(expr.expr, cur), next);\n                cur = next;\n            }\n            if (expr.max == -1) {\n                connect(compile(expr.expr, cur), cur);\n            }\n            else {\n                for (let i = expr.min; i < expr.max; i++) {\n                    let next = node();\n                    edge(cur, next);\n                    connect(compile(expr.expr, cur), next);\n                    cur = next;\n                }\n            }\n            return [edge(cur)];\n        }\n        else if (expr.type == \"name\") {\n            return [edge(from, undefined, expr.value)];\n        }\n        else {\n            throw new Error(\"Unknown expr type\");\n        }\n    }\n}\nfunction cmp(a, b) { return b - a; }\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n    let result = [];\n    scan(node);\n    return result.sort(cmp);\n    function scan(node) {\n        let edges = nfa[node];\n        if (edges.length == 1 && !edges[0].term)\n            return scan(edges[0].to);\n        result.push(node);\n        for (let i = 0; i < edges.length; i++) {\n            let { term, to } = edges[i];\n            if (!term && result.indexOf(to) == -1)\n                scan(to);\n        }\n    }\n}\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n    let labeled = Object.create(null);\n    return explore(nullFrom(nfa, 0));\n    function explore(states) {\n        let out = [];\n        states.forEach(node => {\n            nfa[node].forEach(({ term, to }) => {\n                if (!term)\n                    return;\n                let set;\n                for (let i = 0; i < out.length; i++)\n                    if (out[i][0] == term)\n                        set = out[i][1];\n                nullFrom(nfa, to).forEach(node => {\n                    if (!set)\n                        out.push([term, set = []]);\n                    if (set.indexOf(node) == -1)\n                        set.push(node);\n                });\n            });\n        });\n        let state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n        for (let i = 0; i < out.length; i++) {\n            let states = out[i][1].sort(cmp);\n            state.next.push({ type: out[i][0], next: labeled[states.join(\",\")] || explore(states) });\n        }\n        return state;\n    }\n}\nfunction checkForDeadEnds(match, stream) {\n    for (let i = 0, work = [match]; i < work.length; i++) {\n        let state = work[i], dead = !state.validEnd, nodes = [];\n        for (let j = 0; j < state.next.length; j++) {\n            let { type, next } = state.next[j];\n            nodes.push(type.name);\n            if (dead && !(type.isText || type.hasRequiredAttrs()))\n                dead = false;\n            if (work.indexOf(next) == -1)\n                work.push(next);\n        }\n        if (dead)\n            stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\");\n    }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n    let defaults = Object.create(null);\n    for (let attrName in attrs) {\n        let attr = attrs[attrName];\n        if (!attr.hasDefault)\n            return null;\n        defaults[attrName] = attr.default;\n    }\n    return defaults;\n}\nfunction computeAttrs(attrs, value) {\n    let built = Object.create(null);\n    for (let name in attrs) {\n        let given = value && value[name];\n        if (given === undefined) {\n            let attr = attrs[name];\n            if (attr.hasDefault)\n                given = attr.default;\n            else\n                throw new RangeError(\"No value supplied for attribute \" + name);\n        }\n        built[name] = given;\n    }\n    return built;\n}\nfunction checkAttrs(attrs, values, type, name) {\n    for (let attr in values)\n        if (!(attr in attrs))\n            throw new RangeError(`Unsupported attribute ${attr} for ${type} of type ${name}`);\n    for (let attr in attrs) {\n        if (attrs[attr].validate)\n            attrs[attr].validate(values[attr]);\n    }\n}\nfunction initAttrs(typeName, attrs) {\n    let result = Object.create(null);\n    if (attrs)\n        for (let name in attrs)\n            result[name] = new Attribute(typeName, name, attrs[name]);\n    return result;\n}\n/**\nNode types are objects allocated once per `Schema` and used to\n[tag](https://prosemirror.net/docs/ref/#model.Node.type) `Node` instances. They contain information\nabout the node type, such as its name and what kind of node it\nrepresents.\n*/\nclass NodeType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name the node type has in this schema.\n    */\n    name, \n    /**\n    A link back to the `Schema` the node type belongs to.\n    */\n    schema, \n    /**\n    The spec that this type is based on\n    */\n    spec) {\n        this.name = name;\n        this.schema = schema;\n        this.spec = spec;\n        /**\n        The set of marks allowed in this node. `null` means all marks\n        are allowed.\n        */\n        this.markSet = null;\n        this.groups = spec.group ? spec.group.split(\" \") : [];\n        this.attrs = initAttrs(name, spec.attrs);\n        this.defaultAttrs = defaultAttrs(this.attrs);\n        this.contentMatch = null;\n        this.inlineContent = null;\n        this.isBlock = !(spec.inline || name == \"text\");\n        this.isText = name == \"text\";\n    }\n    /**\n    True if this is an inline type.\n    */\n    get isInline() { return !this.isBlock; }\n    /**\n    True if this is a textblock type, a block that contains inline\n    content.\n    */\n    get isTextblock() { return this.isBlock && this.inlineContent; }\n    /**\n    True for node types that allow no content.\n    */\n    get isLeaf() { return this.contentMatch == ContentMatch.empty; }\n    /**\n    True when this node is an atom, i.e. when it does not have\n    directly editable content.\n    */\n    get isAtom() { return this.isLeaf || !!this.spec.atom; }\n    /**\n    Return true when this node type is part of the given\n    [group](https://prosemirror.net/docs/ref/#model.NodeSpec.group).\n    */\n    isInGroup(group) {\n        return this.groups.indexOf(group) > -1;\n    }\n    /**\n    The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.\n    */\n    get whitespace() {\n        return this.spec.whitespace || (this.spec.code ? \"pre\" : \"normal\");\n    }\n    /**\n    Tells you whether this node type has any required attributes.\n    */\n    hasRequiredAttrs() {\n        for (let n in this.attrs)\n            if (this.attrs[n].isRequired)\n                return true;\n        return false;\n    }\n    /**\n    Indicates whether this node allows some of the same content as\n    the given node type.\n    */\n    compatibleContent(other) {\n        return this == other || this.contentMatch.compatible(other.contentMatch);\n    }\n    /**\n    @internal\n    */\n    computeAttrs(attrs) {\n        if (!attrs && this.defaultAttrs)\n            return this.defaultAttrs;\n        else\n            return computeAttrs(this.attrs, attrs);\n    }\n    /**\n    Create a `Node` of this type. The given attributes are\n    checked and defaulted (you can pass `null` to use the type's\n    defaults entirely, if no required attributes exist). `content`\n    may be a `Fragment`, a node, an array of nodes, or\n    `null`. Similarly `marks` may be `null` to default to the empty\n    set of marks.\n    */\n    create(attrs = null, content, marks) {\n        if (this.isText)\n            throw new Error(\"NodeType.create can't construct text nodes\");\n        return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content\n    against the node type's content restrictions, and throw an error\n    if it doesn't match.\n    */\n    createChecked(attrs = null, content, marks) {\n        content = Fragment.from(content);\n        this.checkContent(content);\n        return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is\n    necessary to add nodes to the start or end of the given fragment\n    to make it fit the node. If no fitting wrapping can be found,\n    return null. Note that, due to the fact that required nodes can\n    always be created, this will always succeed if you pass null or\n    `Fragment.empty` as content.\n    */\n    createAndFill(attrs = null, content, marks) {\n        attrs = this.computeAttrs(attrs);\n        content = Fragment.from(content);\n        if (content.size) {\n            let before = this.contentMatch.fillBefore(content);\n            if (!before)\n                return null;\n            content = before.append(content);\n        }\n        let matched = this.contentMatch.matchFragment(content);\n        let after = matched && matched.fillBefore(Fragment.empty, true);\n        if (!after)\n            return null;\n        return new Node(this, attrs, content.append(after), Mark.setFrom(marks));\n    }\n    /**\n    Returns true if the given fragment is valid content for this node\n    type.\n    */\n    validContent(content) {\n        let result = this.contentMatch.matchFragment(content);\n        if (!result || !result.validEnd)\n            return false;\n        for (let i = 0; i < content.childCount; i++)\n            if (!this.allowsMarks(content.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Throws a RangeError if the given fragment is not valid content for this\n    node type.\n    @internal\n    */\n    checkContent(content) {\n        if (!this.validContent(content))\n            throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`);\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"node\", this.name);\n    }\n    /**\n    Check whether the given mark type is allowed in this node.\n    */\n    allowsMarkType(markType) {\n        return this.markSet == null || this.markSet.indexOf(markType) > -1;\n    }\n    /**\n    Test whether the given set of marks are allowed in this node.\n    */\n    allowsMarks(marks) {\n        if (this.markSet == null)\n            return true;\n        for (let i = 0; i < marks.length; i++)\n            if (!this.allowsMarkType(marks[i].type))\n                return false;\n        return true;\n    }\n    /**\n    Removes the marks that are not allowed in this node from the given set.\n    */\n    allowedMarks(marks) {\n        if (this.markSet == null)\n            return marks;\n        let copy;\n        for (let i = 0; i < marks.length; i++) {\n            if (!this.allowsMarkType(marks[i].type)) {\n                if (!copy)\n                    copy = marks.slice(0, i);\n            }\n            else if (copy) {\n                copy.push(marks[i]);\n            }\n        }\n        return !copy ? marks : copy.length ? copy : Mark.none;\n    }\n    /**\n    @internal\n    */\n    static compile(nodes, schema) {\n        let result = Object.create(null);\n        nodes.forEach((name, spec) => result[name] = new NodeType(name, schema, spec));\n        let topType = schema.spec.topNode || \"doc\";\n        if (!result[topType])\n            throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\");\n        if (!result.text)\n            throw new RangeError(\"Every schema needs a 'text' type\");\n        for (let _ in result.text.attrs)\n            throw new RangeError(\"The text node type should not have attributes\");\n        return result;\n    }\n}\nfunction validateType(typeName, attrName, type) {\n    let types = type.split(\"|\");\n    return (value) => {\n        let name = value === null ? \"null\" : typeof value;\n        if (types.indexOf(name) < 0)\n            throw new RangeError(`Expected value of type ${types} for attribute ${attrName} on type ${typeName}, got ${name}`);\n    };\n}\n// Attribute descriptors\nclass Attribute {\n    constructor(typeName, attrName, options) {\n        this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n        this.default = options.default;\n        this.validate = typeof options.validate == \"string\" ? validateType(typeName, attrName, options.validate) : options.validate;\n    }\n    get isRequired() {\n        return !this.hasDefault;\n    }\n}\n// Marks\n/**\nLike nodes, marks (which are associated with nodes to signify\nthings like emphasis or being part of a link) are\n[tagged](https://prosemirror.net/docs/ref/#model.Mark.type) with type objects, which are\ninstantiated once per `Schema`.\n*/\nclass MarkType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name of the mark type.\n    */\n    name, \n    /**\n    @internal\n    */\n    rank, \n    /**\n    The schema that this mark type instance is part of.\n    */\n    schema, \n    /**\n    The spec on which the type is based.\n    */\n    spec) {\n        this.name = name;\n        this.rank = rank;\n        this.schema = schema;\n        this.spec = spec;\n        this.attrs = initAttrs(name, spec.attrs);\n        this.excluded = null;\n        let defaults = defaultAttrs(this.attrs);\n        this.instance = defaults ? new Mark(this, defaults) : null;\n    }\n    /**\n    Create a mark of this type. `attrs` may be `null` or an object\n    containing only some of the mark's attributes. The others, if\n    they have defaults, will be added.\n    */\n    create(attrs = null) {\n        if (!attrs && this.instance)\n            return this.instance;\n        return new Mark(this, computeAttrs(this.attrs, attrs));\n    }\n    /**\n    @internal\n    */\n    static compile(marks, schema) {\n        let result = Object.create(null), rank = 0;\n        marks.forEach((name, spec) => result[name] = new MarkType(name, rank++, schema, spec));\n        return result;\n    }\n    /**\n    When there is a mark of this type in the given set, a new set\n    without it is returned. Otherwise, the input set is returned.\n    */\n    removeFromSet(set) {\n        for (var i = 0; i < set.length; i++)\n            if (set[i].type == this) {\n                set = set.slice(0, i).concat(set.slice(i + 1));\n                i--;\n            }\n        return set;\n    }\n    /**\n    Tests whether there is a mark of this type in the given set.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (set[i].type == this)\n                return set[i];\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"mark\", this.name);\n    }\n    /**\n    Queries whether a given mark type is\n    [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.\n    */\n    excludes(other) {\n        return this.excluded.indexOf(other) > -1;\n    }\n}\n/**\nA document schema. Holds [node](https://prosemirror.net/docs/ref/#model.NodeType) and [mark\ntype](https://prosemirror.net/docs/ref/#model.MarkType) objects for the nodes and marks that may\noccur in conforming documents, and provides functionality for\ncreating and deserializing such documents.\n\nWhen given, the type parameters provide the names of the nodes and\nmarks in this schema.\n*/\nclass Schema {\n    /**\n    Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).\n    */\n    constructor(spec) {\n        /**\n        The [linebreak\n        replacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement) node defined\n        in this schema, if any.\n        */\n        this.linebreakReplacement = null;\n        /**\n        An object for storing whatever values modules may want to\n        compute and cache per schema. (If you want to store something\n        in it, try to use property names unlikely to clash.)\n        */\n        this.cached = Object.create(null);\n        let instanceSpec = this.spec = {};\n        for (let prop in spec)\n            instanceSpec[prop] = spec[prop];\n        instanceSpec.nodes = OrderedMap.from(spec.nodes),\n            instanceSpec.marks = OrderedMap.from(spec.marks || {}),\n            this.nodes = NodeType.compile(this.spec.nodes, this);\n        this.marks = MarkType.compile(this.spec.marks, this);\n        let contentExprCache = Object.create(null);\n        for (let prop in this.nodes) {\n            if (prop in this.marks)\n                throw new RangeError(prop + \" can not be both a node and a mark\");\n            let type = this.nodes[prop], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n            type.contentMatch = contentExprCache[contentExpr] ||\n                (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n            type.inlineContent = type.contentMatch.inlineContent;\n            if (type.spec.linebreakReplacement) {\n                if (this.linebreakReplacement)\n                    throw new RangeError(\"Multiple linebreak nodes defined\");\n                if (!type.isInline || !type.isLeaf)\n                    throw new RangeError(\"Linebreak replacement nodes must be inline leaf nodes\");\n                this.linebreakReplacement = type;\n            }\n            type.markSet = markExpr == \"_\" ? null :\n                markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n                    markExpr == \"\" || !type.inlineContent ? [] : null;\n        }\n        for (let prop in this.marks) {\n            let type = this.marks[prop], excl = type.spec.excludes;\n            type.excluded = excl == null ? [type] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n        }\n        this.nodeFromJSON = json => Node.fromJSON(this, json);\n        this.markFromJSON = json => Mark.fromJSON(this, json);\n        this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n        this.cached.wrappings = Object.create(null);\n    }\n    /**\n    Create a node in this schema. The `type` may be a string or a\n    `NodeType` instance. Attributes will be extended with defaults,\n    `content` may be a `Fragment`, `null`, a `Node`, or an array of\n    nodes.\n    */\n    node(type, attrs = null, content, marks) {\n        if (typeof type == \"string\")\n            type = this.nodeType(type);\n        else if (!(type instanceof NodeType))\n            throw new RangeError(\"Invalid node type: \" + type);\n        else if (type.schema != this)\n            throw new RangeError(\"Node type from different schema used (\" + type.name + \")\");\n        return type.createChecked(attrs, content, marks);\n    }\n    /**\n    Create a text node in the schema. Empty text nodes are not\n    allowed.\n    */\n    text(text, marks) {\n        let type = this.nodes.text;\n        return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks));\n    }\n    /**\n    Create a mark with the given type and attributes.\n    */\n    mark(type, attrs) {\n        if (typeof type == \"string\")\n            type = this.marks[type];\n        return type.create(attrs);\n    }\n    /**\n    @internal\n    */\n    nodeType(name) {\n        let found = this.nodes[name];\n        if (!found)\n            throw new RangeError(\"Unknown node type: \" + name);\n        return found;\n    }\n}\nfunction gatherMarks(schema, marks) {\n    let found = [];\n    for (let i = 0; i < marks.length; i++) {\n        let name = marks[i], mark = schema.marks[name], ok = mark;\n        if (mark) {\n            found.push(mark);\n        }\n        else {\n            for (let prop in schema.marks) {\n                let mark = schema.marks[prop];\n                if (name == \"_\" || (mark.spec.group && mark.spec.group.split(\" \").indexOf(name) > -1))\n                    found.push(ok = mark);\n            }\n        }\n        if (!ok)\n            throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\");\n    }\n    return found;\n}\n\nfunction isTagRule(rule) { return rule.tag != null; }\nfunction isStyleRule(rule) { return rule.style != null; }\n/**\nA DOM parser represents a strategy for parsing DOM content into a\nProseMirror document conforming to a given schema. Its behavior is\ndefined by an array of [rules](https://prosemirror.net/docs/ref/#model.ParseRule).\n*/\nclass DOMParser {\n    /**\n    Create a parser that targets the given schema, using the given\n    parsing rules.\n    */\n    constructor(\n    /**\n    The schema into which the parser parses.\n    */\n    schema, \n    /**\n    The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser\n    uses, in order of precedence.\n    */\n    rules) {\n        this.schema = schema;\n        this.rules = rules;\n        /**\n        @internal\n        */\n        this.tags = [];\n        /**\n        @internal\n        */\n        this.styles = [];\n        let matchedStyles = this.matchedStyles = [];\n        rules.forEach(rule => {\n            if (isTagRule(rule)) {\n                this.tags.push(rule);\n            }\n            else if (isStyleRule(rule)) {\n                let prop = /[^=]*/.exec(rule.style)[0];\n                if (matchedStyles.indexOf(prop) < 0)\n                    matchedStyles.push(prop);\n                this.styles.push(rule);\n            }\n        });\n        // Only normalize list elements when lists in the schema can't directly contain themselves\n        this.normalizeLists = !this.tags.some(r => {\n            if (!/^(ul|ol)\\b/.test(r.tag) || !r.node)\n                return false;\n            let node = schema.nodes[r.node];\n            return node.contentMatch.matchType(node);\n        });\n    }\n    /**\n    Parse a document from the content of a DOM node.\n    */\n    parse(dom, options = {}) {\n        let context = new ParseContext(this, options, false);\n        context.addAll(dom, Mark.none, options.from, options.to);\n        return context.finish();\n    }\n    /**\n    Parses the content of the given DOM node, like\n    [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of\n    options. But unlike that method, which produces a whole node,\n    this one returns a slice that is open at the sides, meaning that\n    the schema constraints aren't applied to the start of nodes to\n    the left of the input and the end of nodes at the end.\n    */\n    parseSlice(dom, options = {}) {\n        let context = new ParseContext(this, options, true);\n        context.addAll(dom, Mark.none, options.from, options.to);\n        return Slice.maxOpen(context.finish());\n    }\n    /**\n    @internal\n    */\n    matchTag(dom, context, after) {\n        for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n            let rule = this.tags[i];\n            if (matches(dom, rule.tag) &&\n                (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n                (!rule.context || context.matchesContext(rule.context))) {\n                if (rule.getAttrs) {\n                    let result = rule.getAttrs(dom);\n                    if (result === false)\n                        continue;\n                    rule.attrs = result || undefined;\n                }\n                return rule;\n            }\n        }\n    }\n    /**\n    @internal\n    */\n    matchStyle(prop, value, context, after) {\n        for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n            let rule = this.styles[i], style = rule.style;\n            if (style.indexOf(prop) != 0 ||\n                rule.context && !context.matchesContext(rule.context) ||\n                // Test that the style string either precisely matches the prop,\n                // or has an '=' sign after the prop, followed by the given\n                // value.\n                style.length > prop.length &&\n                    (style.charCodeAt(prop.length) != 61 || style.slice(prop.length + 1) != value))\n                continue;\n            if (rule.getAttrs) {\n                let result = rule.getAttrs(value);\n                if (result === false)\n                    continue;\n                rule.attrs = result || undefined;\n            }\n            return rule;\n        }\n    }\n    /**\n    @internal\n    */\n    static schemaRules(schema) {\n        let result = [];\n        function insert(rule) {\n            let priority = rule.priority == null ? 50 : rule.priority, i = 0;\n            for (; i < result.length; i++) {\n                let next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n                if (nextPriority < priority)\n                    break;\n            }\n            result.splice(i, 0, rule);\n        }\n        for (let name in schema.marks) {\n            let rules = schema.marks[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.mark || rule.ignore || rule.clearMark))\n                        rule.mark = name;\n                });\n        }\n        for (let name in schema.nodes) {\n            let rules = schema.nodes[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.node || rule.ignore || rule.mark))\n                        rule.node = name;\n                });\n        }\n        return result;\n    }\n    /**\n    Construct a DOM parser using the parsing rules listed in a\n    schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by\n    [priority](https://prosemirror.net/docs/ref/#model.GenericParseRule.priority).\n    */\n    static fromSchema(schema) {\n        return schema.cached.domParser ||\n            (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));\n    }\n}\nconst blockTags = {\n    address: true, article: true, aside: true, blockquote: true, canvas: true,\n    dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n    footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n    h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n    output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\nconst ignoreTags = {\n    head: true, noscript: true, object: true, script: true, style: true, title: true\n};\nconst listTags = { ol: true, ul: true };\n// Using a bitfield for node context options\nconst OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\nfunction wsOptionsFor(type, preserveWhitespace, base) {\n    if (preserveWhitespace != null)\n        return (preserveWhitespace ? OPT_PRESERVE_WS : 0) |\n            (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0);\n    return type && type.whitespace == \"pre\" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;\n}\nclass NodeContext {\n    constructor(type, attrs, marks, solid, match, options) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.solid = solid;\n        this.options = options;\n        this.content = [];\n        // Marks applied to the node's children\n        this.activeMarks = Mark.none;\n        this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n    }\n    findWrapping(node) {\n        if (!this.match) {\n            if (!this.type)\n                return [];\n            let fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n            if (fill) {\n                this.match = this.type.contentMatch.matchFragment(fill);\n            }\n            else {\n                let start = this.type.contentMatch, wrap;\n                if (wrap = start.findWrapping(node.type)) {\n                    this.match = start;\n                    return wrap;\n                }\n                else {\n                    return null;\n                }\n            }\n        }\n        return this.match.findWrapping(node.type);\n    }\n    finish(openEnd) {\n        if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n            let last = this.content[this.content.length - 1], m;\n            if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n                let text = last;\n                if (last.text.length == m[0].length)\n                    this.content.pop();\n                else\n                    this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length));\n            }\n        }\n        let content = Fragment.from(this.content);\n        if (!openEnd && this.match)\n            content = content.append(this.match.fillBefore(Fragment.empty, true));\n        return this.type ? this.type.create(this.attrs, content, this.marks) : content;\n    }\n    inlineContext(node) {\n        if (this.type)\n            return this.type.inlineContent;\n        if (this.content.length)\n            return this.content[0].isInline;\n        return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase());\n    }\n}\nclass ParseContext {\n    constructor(\n    // The parser we are using.\n    parser, \n    // The options passed to this parse.\n    options, isOpen) {\n        this.parser = parser;\n        this.options = options;\n        this.isOpen = isOpen;\n        this.open = 0;\n        this.localPreserveWS = false;\n        let topNode = options.topNode, topContext;\n        let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);\n        if (topNode)\n            topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions);\n        else if (isOpen)\n            topContext = new NodeContext(null, null, Mark.none, true, null, topOptions);\n        else\n            topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, true, null, topOptions);\n        this.nodes = [topContext];\n        this.find = options.findPositions;\n        this.needsBlock = false;\n    }\n    get top() {\n        return this.nodes[this.open];\n    }\n    // Add a DOM node to the content. Text is inserted as text node,\n    // otherwise, the node is passed to `addElement` or, if it has a\n    // `style` attribute, `addElementWithStyles`.\n    addDOM(dom, marks) {\n        if (dom.nodeType == 3)\n            this.addTextNode(dom, marks);\n        else if (dom.nodeType == 1)\n            this.addElement(dom, marks);\n    }\n    addTextNode(dom, marks) {\n        let value = dom.nodeValue;\n        let top = this.top, preserveWS = (top.options & OPT_PRESERVE_WS_FULL) ? \"full\"\n            : this.localPreserveWS || (top.options & OPT_PRESERVE_WS) > 0;\n        let { schema } = this.parser;\n        if (preserveWS === \"full\" ||\n            top.inlineContext(dom) ||\n            /[^ \\t\\r\\n\\u000c]/.test(value)) {\n            if (!preserveWS) {\n                value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n                // If this starts with whitespace, and there is no node before it, or\n                // a hard break, or a text node that ends with whitespace, strip the\n                // leading space.\n                if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n                    let nodeBefore = top.content[top.content.length - 1];\n                    let domNodeBefore = dom.previousSibling;\n                    if (!nodeBefore ||\n                        (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n                        (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n                        value = value.slice(1);\n                }\n            }\n            else if (preserveWS === \"full\") {\n                value = value.replace(/\\r\\n?/g, \"\\n\");\n            }\n            else if (schema.linebreakReplacement && /[\\r\\n]/.test(value) && this.top.findWrapping(schema.linebreakReplacement.create())) {\n                let lines = value.split(/\\r?\\n|\\r/);\n                for (let i = 0; i < lines.length; i++) {\n                    if (i)\n                        this.insertNode(schema.linebreakReplacement.create(), marks, true);\n                    if (lines[i])\n                        this.insertNode(schema.text(lines[i]), marks, !/\\S/.test(lines[i]));\n                }\n                value = \"\";\n            }\n            else {\n                value = value.replace(/\\r?\\n|\\r/g, \" \");\n            }\n            if (value)\n                this.insertNode(schema.text(value), marks, !/\\S/.test(value));\n            this.findInText(dom);\n        }\n        else {\n            this.findInside(dom);\n        }\n    }\n    // Try to find a handler for the given tag and use that to parse. If\n    // none is found, the element's content nodes are added directly.\n    addElement(dom, marks, matchAfter) {\n        let outerWS = this.localPreserveWS, top = this.top;\n        if (dom.tagName == \"PRE\" || /pre/.test(dom.style && dom.style.whiteSpace))\n            this.localPreserveWS = true;\n        let name = dom.nodeName.toLowerCase(), ruleID;\n        if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)\n            normalizeList(dom);\n        let rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n            (ruleID = this.parser.matchTag(dom, this, matchAfter));\n        out: if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n            this.findInside(dom);\n            this.ignoreFallback(dom, marks);\n        }\n        else if (!rule || rule.skip || rule.closeParent) {\n            if (rule && rule.closeParent)\n                this.open = Math.max(0, this.open - 1);\n            else if (rule && rule.skip.nodeType)\n                dom = rule.skip;\n            let sync, oldNeedsBlock = this.needsBlock;\n            if (blockTags.hasOwnProperty(name)) {\n                if (top.content.length && top.content[0].isInline && this.open) {\n                    this.open--;\n                    top = this.top;\n                }\n                sync = true;\n                if (!top.type)\n                    this.needsBlock = true;\n            }\n            else if (!dom.firstChild) {\n                this.leafFallback(dom, marks);\n                break out;\n            }\n            let innerMarks = rule && rule.skip ? marks : this.readStyles(dom, marks);\n            if (innerMarks)\n                this.addAll(dom, innerMarks);\n            if (sync)\n                this.sync(top);\n            this.needsBlock = oldNeedsBlock;\n        }\n        else {\n            let innerMarks = this.readStyles(dom, marks);\n            if (innerMarks)\n                this.addElementByRule(dom, rule, innerMarks, rule.consuming === false ? ruleID : undefined);\n        }\n        this.localPreserveWS = outerWS;\n    }\n    // Called for leaf DOM nodes that would otherwise be ignored\n    leafFallback(dom, marks) {\n        if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n            this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\"), marks);\n    }\n    // Called for ignored nodes\n    ignoreFallback(dom, marks) {\n        // Ignored BR nodes should at least create an inline context\n        if (dom.nodeName == \"BR\" && (!this.top.type || !this.top.type.inlineContent))\n            this.findPlace(this.parser.schema.text(\"-\"), marks, true);\n    }\n    // Run any style parser associated with the node's styles. Either\n    // return an updated array of marks, or null to indicate some of the\n    // styles had a rule with `ignore` set.\n    readStyles(dom, marks) {\n        let styles = dom.style;\n        // Because many properties will only show up in 'normalized' form\n        // in `style.item` (i.e. text-decoration becomes\n        // text-decoration-line, text-decoration-color, etc), we directly\n        // query the styles mentioned in our rules instead of iterating\n        // over the items.\n        if (styles && styles.length)\n            for (let i = 0; i < this.parser.matchedStyles.length; i++) {\n                let name = this.parser.matchedStyles[i], value = styles.getPropertyValue(name);\n                if (value)\n                    for (let after = undefined;;) {\n                        let rule = this.parser.matchStyle(name, value, this, after);\n                        if (!rule)\n                            break;\n                        if (rule.ignore)\n                            return null;\n                        if (rule.clearMark)\n                            marks = marks.filter(m => !rule.clearMark(m));\n                        else\n                            marks = marks.concat(this.parser.schema.marks[rule.mark].create(rule.attrs));\n                        if (rule.consuming === false)\n                            after = rule;\n                        else\n                            break;\n                    }\n            }\n        return marks;\n    }\n    // Look up a handler for the given node. If none are found, return\n    // false. Otherwise, apply it, use its return value to drive the way\n    // the node's content is wrapped, and return true.\n    addElementByRule(dom, rule, marks, continueAfter) {\n        let sync, nodeType;\n        if (rule.node) {\n            nodeType = this.parser.schema.nodes[rule.node];\n            if (!nodeType.isLeaf) {\n                let inner = this.enter(nodeType, rule.attrs || null, marks, rule.preserveWhitespace);\n                if (inner) {\n                    sync = true;\n                    marks = inner;\n                }\n            }\n            else if (!this.insertNode(nodeType.create(rule.attrs), marks, dom.nodeName == \"BR\")) {\n                this.leafFallback(dom, marks);\n            }\n        }\n        else {\n            let markType = this.parser.schema.marks[rule.mark];\n            marks = marks.concat(markType.create(rule.attrs));\n        }\n        let startIn = this.top;\n        if (nodeType && nodeType.isLeaf) {\n            this.findInside(dom);\n        }\n        else if (continueAfter) {\n            this.addElement(dom, marks, continueAfter);\n        }\n        else if (rule.getContent) {\n            this.findInside(dom);\n            rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node, marks, false));\n        }\n        else {\n            let contentDOM = dom;\n            if (typeof rule.contentElement == \"string\")\n                contentDOM = dom.querySelector(rule.contentElement);\n            else if (typeof rule.contentElement == \"function\")\n                contentDOM = rule.contentElement(dom);\n            else if (rule.contentElement)\n                contentDOM = rule.contentElement;\n            this.findAround(dom, contentDOM, true);\n            this.addAll(contentDOM, marks);\n            this.findAround(dom, contentDOM, false);\n        }\n        if (sync && this.sync(startIn))\n            this.open--;\n    }\n    // Add all child nodes between `startIndex` and `endIndex` (or the\n    // whole node, if not given). If `sync` is passed, use it to\n    // synchronize after every block element.\n    addAll(parent, marks, startIndex, endIndex) {\n        let index = startIndex || 0;\n        for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {\n            this.findAtPoint(parent, index);\n            this.addDOM(dom, marks);\n        }\n        this.findAtPoint(parent, index);\n    }\n    // Try to find a way to fit the given node type into the current\n    // context. May add intermediate wrappers and/or leave non-solid\n    // nodes that we're in.\n    findPlace(node, marks, cautious) {\n        let route, sync;\n        for (let depth = this.open, penalty = 0; depth >= 0; depth--) {\n            let cx = this.nodes[depth];\n            let found = cx.findWrapping(node);\n            if (found && (!route || route.length > found.length + penalty)) {\n                route = found;\n                sync = cx;\n                if (!found.length)\n                    break;\n            }\n            if (cx.solid) {\n                if (cautious)\n                    break;\n                penalty += 2;\n            }\n        }\n        if (!route)\n            return null;\n        this.sync(sync);\n        for (let i = 0; i < route.length; i++)\n            marks = this.enterInner(route[i], null, marks, false);\n        return marks;\n    }\n    // Try to insert the given node, adjusting the context when needed.\n    insertNode(node, marks, cautious) {\n        if (node.isInline && this.needsBlock && !this.top.type) {\n            let block = this.textblockFromContext();\n            if (block)\n                marks = this.enterInner(block, null, marks);\n        }\n        let innerMarks = this.findPlace(node, marks, cautious);\n        if (innerMarks) {\n            this.closeExtra();\n            let top = this.top;\n            if (top.match)\n                top.match = top.match.matchType(node.type);\n            let nodeMarks = Mark.none;\n            for (let m of innerMarks.concat(node.marks))\n                if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, node.type))\n                    nodeMarks = m.addToSet(nodeMarks);\n            top.content.push(node.mark(nodeMarks));\n            return true;\n        }\n        return false;\n    }\n    // Try to start a node of the given type, adjusting the context when\n    // necessary.\n    enter(type, attrs, marks, preserveWS) {\n        let innerMarks = this.findPlace(type.create(attrs), marks, false);\n        if (innerMarks)\n            innerMarks = this.enterInner(type, attrs, marks, true, preserveWS);\n        return innerMarks;\n    }\n    // Open a node of the given type\n    enterInner(type, attrs, marks, solid = false, preserveWS) {\n        this.closeExtra();\n        let top = this.top;\n        top.match = top.match && top.match.matchType(type);\n        let options = wsOptionsFor(type, preserveWS, top.options);\n        if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0)\n            options |= OPT_OPEN_LEFT;\n        let applyMarks = Mark.none;\n        marks = marks.filter(m => {\n            if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, type)) {\n                applyMarks = m.addToSet(applyMarks);\n                return false;\n            }\n            return true;\n        });\n        this.nodes.push(new NodeContext(type, attrs, applyMarks, solid, null, options));\n        this.open++;\n        return marks;\n    }\n    // Make sure all nodes above this.open are finished and added to\n    // their parents\n    closeExtra(openEnd = false) {\n        let i = this.nodes.length - 1;\n        if (i > this.open) {\n            for (; i > this.open; i--)\n                this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd));\n            this.nodes.length = this.open + 1;\n        }\n    }\n    finish() {\n        this.open = 0;\n        this.closeExtra(this.isOpen);\n        return this.nodes[0].finish(!!(this.isOpen || this.options.topOpen));\n    }\n    sync(to) {\n        for (let i = this.open; i >= 0; i--) {\n            if (this.nodes[i] == to) {\n                this.open = i;\n                return true;\n            }\n            else if (this.localPreserveWS) {\n                this.nodes[i].options |= OPT_PRESERVE_WS;\n            }\n        }\n        return false;\n    }\n    get currentPos() {\n        this.closeExtra();\n        let pos = 0;\n        for (let i = this.open; i >= 0; i--) {\n            let content = this.nodes[i].content;\n            for (let j = content.length - 1; j >= 0; j--)\n                pos += content[j].nodeSize;\n            if (i)\n                pos++;\n        }\n        return pos;\n    }\n    findAtPoint(parent, offset) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == parent && this.find[i].offset == offset)\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findInside(parent) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findAround(parent, content, before) {\n        if (parent != content && this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n                    let pos = content.compareDocumentPosition(this.find[i].node);\n                    if (pos & (before ? 2 : 4))\n                        this.find[i].pos = this.currentPos;\n                }\n            }\n    }\n    findInText(textNode) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == textNode)\n                    this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset);\n            }\n    }\n    // Determines whether the given context string matches this context.\n    matchesContext(context) {\n        if (context.indexOf(\"|\") > -1)\n            return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this);\n        let parts = context.split(\"/\");\n        let option = this.options.context;\n        let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n        let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n        let match = (i, depth) => {\n            for (; i >= 0; i--) {\n                let part = parts[i];\n                if (part == \"\") {\n                    if (i == parts.length - 1 || i == 0)\n                        continue;\n                    for (; depth >= minDepth; depth--)\n                        if (match(i - 1, depth))\n                            return true;\n                    return false;\n                }\n                else {\n                    let next = depth > 0 || (depth == 0 && useRoot) ? this.nodes[depth].type\n                        : option && depth >= minDepth ? option.node(depth - minDepth).type\n                            : null;\n                    if (!next || (next.name != part && !next.isInGroup(part)))\n                        return false;\n                    depth--;\n                }\n            }\n            return true;\n        };\n        return match(parts.length - 1, this.open);\n    }\n    textblockFromContext() {\n        let $context = this.options.context;\n        if ($context)\n            for (let d = $context.depth; d >= 0; d--) {\n                let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n                if (deflt && deflt.isTextblock && deflt.defaultAttrs)\n                    return deflt;\n            }\n        for (let name in this.parser.schema.nodes) {\n            let type = this.parser.schema.nodes[name];\n            if (type.isTextblock && type.defaultAttrs)\n                return type;\n        }\n    }\n}\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n    for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n        let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n        if (name && listTags.hasOwnProperty(name) && prevItem) {\n            prevItem.appendChild(child);\n            child = prevItem;\n        }\n        else if (name == \"li\") {\n            prevItem = child;\n        }\n        else if (name) {\n            prevItem = null;\n        }\n    }\n}\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n    return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector);\n}\nfunction copy(obj) {\n    let copy = {};\n    for (let prop in obj)\n        copy[prop] = obj[prop];\n    return copy;\n}\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n    let nodes = nodeType.schema.nodes;\n    for (let name in nodes) {\n        let parent = nodes[name];\n        if (!parent.allowsMarkType(markType))\n            continue;\n        let seen = [], scan = (match) => {\n            seen.push(match);\n            for (let i = 0; i < match.edgeCount; i++) {\n                let { type, next } = match.edge(i);\n                if (type == nodeType)\n                    return true;\n                if (seen.indexOf(next) < 0 && scan(next))\n                    return true;\n            }\n        };\n        if (scan(parent.contentMatch))\n            return true;\n    }\n}\n\n/**\nA DOM serializer knows how to convert ProseMirror nodes and\nmarks of various types to DOM nodes.\n*/\nclass DOMSerializer {\n    /**\n    Create a serializer. `nodes` should map node names to functions\n    that take a node and return a description of the corresponding\n    DOM. `marks` does the same for mark names, but also gets an\n    argument that tells it whether the mark's content is block or\n    inline content (for typical use, it'll always be inline). A mark\n    serializer may be `null` to indicate that marks of that type\n    should not be serialized.\n    */\n    constructor(\n    /**\n    The node serialization functions.\n    */\n    nodes, \n    /**\n    The mark serialization functions.\n    */\n    marks) {\n        this.nodes = nodes;\n        this.marks = marks;\n    }\n    /**\n    Serialize the content of this fragment to a DOM fragment. When\n    not in the browser, the `document` option, containing a DOM\n    document, should be passed so that the serializer can create\n    nodes.\n    */\n    serializeFragment(fragment, options = {}, target) {\n        if (!target)\n            target = doc(options).createDocumentFragment();\n        let top = target, active = [];\n        fragment.forEach(node => {\n            if (active.length || node.marks.length) {\n                let keep = 0, rendered = 0;\n                while (keep < active.length && rendered < node.marks.length) {\n                    let next = node.marks[rendered];\n                    if (!this.marks[next.type.name]) {\n                        rendered++;\n                        continue;\n                    }\n                    if (!next.eq(active[keep][0]) || next.type.spec.spanning === false)\n                        break;\n                    keep++;\n                    rendered++;\n                }\n                while (keep < active.length)\n                    top = active.pop()[1];\n                while (rendered < node.marks.length) {\n                    let add = node.marks[rendered++];\n                    let markDOM = this.serializeMark(add, node.isInline, options);\n                    if (markDOM) {\n                        active.push([add, top]);\n                        top.appendChild(markDOM.dom);\n                        top = markDOM.contentDOM || markDOM.dom;\n                    }\n                }\n            }\n            top.appendChild(this.serializeNodeInner(node, options));\n        });\n        return target;\n    }\n    /**\n    @internal\n    */\n    serializeNodeInner(node, options) {\n        if (node.isText)\n            return doc(options).createTextNode(node.text);\n        let { dom, contentDOM } = renderSpec(doc(options), this.nodes[node.type.name](node), null, node.attrs);\n        if (contentDOM) {\n            if (node.isLeaf)\n                throw new RangeError(\"Content hole not allowed in a leaf node spec\");\n            this.serializeFragment(node.content, options, contentDOM);\n        }\n        return dom;\n    }\n    /**\n    Serialize this node to a DOM node. This can be useful when you\n    need to serialize a part of a document, as opposed to the whole\n    document. To serialize a whole document, use\n    [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on\n    its [content](https://prosemirror.net/docs/ref/#model.Node.content).\n    */\n    serializeNode(node, options = {}) {\n        let dom = this.serializeNodeInner(node, options);\n        for (let i = node.marks.length - 1; i >= 0; i--) {\n            let wrap = this.serializeMark(node.marks[i], node.isInline, options);\n            if (wrap) {\n                (wrap.contentDOM || wrap.dom).appendChild(dom);\n                dom = wrap.dom;\n            }\n        }\n        return dom;\n    }\n    /**\n    @internal\n    */\n    serializeMark(mark, inline, options = {}) {\n        let toDOM = this.marks[mark.type.name];\n        return toDOM && renderSpec(doc(options), toDOM(mark, inline), null, mark.attrs);\n    }\n    static renderSpec(doc, structure, xmlNS = null, blockArraysIn) {\n        // Kludge for backwards-compatibility with accidental original behavious\n        if (typeof structure == \"string\")\n            return { dom: doc.createTextNode(structure) };\n        return renderSpec(doc, structure, xmlNS, blockArraysIn);\n    }\n    /**\n    Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)\n    properties in a schema's node and mark specs.\n    */\n    static fromSchema(schema) {\n        return schema.cached.domSerializer ||\n            (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)));\n    }\n    /**\n    Gather the serializers in a schema's node specs into an object.\n    This can be useful as a base to build a custom serializer from.\n    */\n    static nodesFromSchema(schema) {\n        let result = gatherToDOM(schema.nodes);\n        if (!result.text)\n            result.text = node => node.text;\n        return result;\n    }\n    /**\n    Gather the serializers in a schema's mark specs into an object.\n    */\n    static marksFromSchema(schema) {\n        return gatherToDOM(schema.marks);\n    }\n}\nfunction gatherToDOM(obj) {\n    let result = {};\n    for (let name in obj) {\n        let toDOM = obj[name].spec.toDOM;\n        if (toDOM)\n            result[name] = toDOM;\n    }\n    return result;\n}\nfunction doc(options) {\n    return options.document || window.document;\n}\nconst suspiciousAttributeCache = new WeakMap();\nfunction suspiciousAttributes(attrs) {\n    let value = suspiciousAttributeCache.get(attrs);\n    if (value === undefined)\n        suspiciousAttributeCache.set(attrs, value = suspiciousAttributesInner(attrs));\n    return value;\n}\nfunction suspiciousAttributesInner(attrs) {\n    let result = null;\n    function scan(value) {\n        if (value && typeof value == \"object\") {\n            if (Array.isArray(value)) {\n                if (typeof value[0] == \"string\") {\n                    if (!result)\n                        result = [];\n                    result.push(value);\n                }\n                else {\n                    for (let i = 0; i < value.length; i++)\n                        scan(value[i]);\n                }\n            }\n            else {\n                for (let prop in value)\n                    scan(value[prop]);\n            }\n        }\n    }\n    scan(attrs);\n    return result;\n}\nfunction renderSpec(doc, structure, xmlNS, blockArraysIn) {\n    if (structure.nodeType == 1)\n        return { dom: structure };\n    if (structure.dom && structure.dom.nodeType == 1)\n        return structure;\n    let tagName = structure[0], suspicious;\n    if (typeof tagName != \"string\")\n        throw new RangeError(\"Invalid array passed to renderSpec\");\n    if (blockArraysIn && (suspicious = suspiciousAttributes(blockArraysIn)) &&\n        suspicious.indexOf(structure) > -1)\n        throw new RangeError(\"Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.\");\n    let space = tagName.indexOf(\" \");\n    if (space > 0) {\n        xmlNS = tagName.slice(0, space);\n        tagName = tagName.slice(space + 1);\n    }\n    let contentDOM;\n    let dom = (xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName));\n    let attrs = structure[1], start = 1;\n    if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n        start = 2;\n        for (let name in attrs)\n            if (attrs[name] != null) {\n                let space = name.indexOf(\" \");\n                if (space > 0)\n                    dom.setAttributeNS(name.slice(0, space), name.slice(space + 1), attrs[name]);\n                else if (name == \"style\" && dom.style)\n                    dom.style.cssText = attrs[name];\n                else\n                    dom.setAttribute(name, attrs[name]);\n            }\n    }\n    for (let i = start; i < structure.length; i++) {\n        let child = structure[i];\n        if (child === 0) {\n            if (i < structure.length - 1 || i > start)\n                throw new RangeError(\"Content hole must be the only child of its parent node\");\n            return { dom, contentDOM: dom };\n        }\n        else if (typeof child == \"string\") {\n            dom.appendChild(doc.createTextNode(child));\n        }\n        else {\n            let { dom: inner, contentDOM: innerContent } = renderSpec(doc, child, xmlNS, blockArraysIn);\n            dom.appendChild(inner);\n            if (innerContent) {\n                if (contentDOM)\n                    throw new RangeError(\"Multiple content holes\");\n                contentDOM = innerContent;\n            }\n        }\n    }\n    return { dom, contentDOM };\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The mapped version of the position.\n    */\n    pos, \n    /**\n    @internal\n    */\n    delInfo, \n    /**\n    @internal\n    */\n    recover) {\n        this.pos = pos;\n        this.delInfo = delInfo;\n        this.recover = recover;\n    }\n    /**\n    Tells you whether the position was deleted, that is, whether the\n    step removed the token on the side queried (via the `assoc`)\n    argument from the document.\n    */\n    get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n    /**\n    Tells you whether the token before the mapped position was deleted.\n    */\n    get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n    /**\n    True when the token after the mapped position was deleted.\n    */\n    get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n    /**\n    Tells whether any of the steps mapped through deletes across the\n    position (including both the token before and after the\n    position).\n    */\n    get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n    /**\n    Create a position map. The modifications to the document are\n    represented as an array of numbers, in which each group of three\n    represents a modified chunk as `[start, oldSize, newSize]`.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    ranges, \n    /**\n    @internal\n    */\n    inverted = false) {\n        this.ranges = ranges;\n        this.inverted = inverted;\n        if (!ranges.length && StepMap.empty)\n            return StepMap.empty;\n    }\n    /**\n    @internal\n    */\n    recover(value) {\n        let diff = 0, index = recoverIndex(value);\n        if (!this.inverted)\n            for (let i = 0; i < index; i++)\n                diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n        return this.ranges[index * 3] + diff + recoverOffset(value);\n    }\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n            if (pos <= end) {\n                let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n                let result = start + diff + (side < 0 ? 0 : newSize);\n                if (simple)\n                    return result;\n                let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n                let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n                if (assoc < 0 ? pos != start : pos != end)\n                    del |= DEL_SIDE;\n                return new MapResult(result, del, recover);\n            }\n            diff += newSize - oldSize;\n        }\n        return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n    }\n    /**\n    @internal\n    */\n    touches(pos, recover) {\n        let diff = 0, index = recoverIndex(recover);\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n            if (pos <= end && i == index * 3)\n                return true;\n            diff += this.ranges[i + newIndex] - oldSize;\n        }\n        return false;\n    }\n    /**\n    Calls the given function on each of the changed ranges included in\n    this map.\n    */\n    forEach(f) {\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n            f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n            diff += newSize - oldSize;\n        }\n    }\n    /**\n    Create an inverted version of this map. The result can be used to\n    map positions in the post-step document to the pre-step document.\n    */\n    invert() {\n        return new StepMap(this.ranges, !this.inverted);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n    }\n    /**\n    Create a map that moves all positions by offset `n` (which may be\n    negative). This can be useful when applying steps meant for a\n    sub-document to a larger document, or vice-versa.\n    */\n    static offset(n) {\n        return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n    }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](https://prosemirror.net/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n    /**\n    Create a new mapping with the given position maps.\n    */\n    constructor(maps, \n    /**\n    @internal\n    */\n    mirror, \n    /**\n    The starting position in the `maps` array, used when `map` or\n    `mapResult` is called.\n    */\n    from = 0, \n    /**\n    The end position in the `maps` array.\n    */\n    to = maps ? maps.length : 0) {\n        this.mirror = mirror;\n        this.from = from;\n        this.to = to;\n        this._maps = maps || [];\n        this.ownData = !(maps || mirror);\n    }\n    /**\n    The step maps in this mapping.\n    */\n    get maps() { return this._maps; }\n    /**\n    Create a mapping that maps only through a part of this one.\n    */\n    slice(from = 0, to = this.maps.length) {\n        return new Mapping(this._maps, this.mirror, from, to);\n    }\n    /**\n    Add a step map to the end of this mapping. If `mirrors` is\n    given, it should be the index of the step map that is the mirror\n    image of this one.\n    */\n    appendMap(map, mirrors) {\n        if (!this.ownData) {\n            this._maps = this._maps.slice();\n            this.mirror = this.mirror && this.mirror.slice();\n            this.ownData = true;\n        }\n        this.to = this._maps.push(map);\n        if (mirrors != null)\n            this.setMirror(this._maps.length - 1, mirrors);\n    }\n    /**\n    Add all the step maps in a given mapping to this one (preserving\n    mirroring information).\n    */\n    appendMapping(mapping) {\n        for (let i = 0, startSize = this._maps.length; i < mapping._maps.length; i++) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping._maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n        }\n    }\n    /**\n    Finds the offset of the step map that mirrors the map at the\n    given offset, in this mapping (as per the second argument to\n    `appendMap`).\n    */\n    getMirror(n) {\n        if (this.mirror)\n            for (let i = 0; i < this.mirror.length; i++)\n                if (this.mirror[i] == n)\n                    return this.mirror[i + (i % 2 ? -1 : 1)];\n    }\n    /**\n    @internal\n    */\n    setMirror(n, m) {\n        if (!this.mirror)\n            this.mirror = [];\n        this.mirror.push(n, m);\n    }\n    /**\n    Append the inverse of the given mapping to this one.\n    */\n    appendMappingInverted(mapping) {\n        for (let i = mapping.maps.length - 1, totalSize = this._maps.length + mapping._maps.length; i >= 0; i--) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping._maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n        }\n    }\n    /**\n    Create an inverted version of this mapping.\n    */\n    invert() {\n        let inverse = new Mapping;\n        inverse.appendMappingInverted(this);\n        return inverse;\n    }\n    /**\n    Map a position through this mapping.\n    */\n    map(pos, assoc = 1) {\n        if (this.mirror)\n            return this._map(pos, assoc, true);\n        for (let i = this.from; i < this.to; i++)\n            pos = this._maps[i].map(pos, assoc);\n        return pos;\n    }\n    /**\n    Map a position through this mapping, returning a mapping\n    result.\n    */\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let delInfo = 0;\n        for (let i = this.from; i < this.to; i++) {\n            let map = this._maps[i], result = map.mapResult(pos, assoc);\n            if (result.recover != null) {\n                let corr = this.getMirror(i);\n                if (corr != null && corr > i && corr < this.to) {\n                    i = corr;\n                    pos = this._maps[corr].recover(result.recover);\n                    continue;\n                }\n            }\n            delInfo |= result.delInfo;\n            pos = result.pos;\n        }\n        return simple ? pos : new MapResult(pos, delInfo, null);\n    }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n    /**\n    Get the step map that represents the changes made by this step,\n    and which can be used to transform between positions in the old\n    and the new document.\n    */\n    getMap() { return StepMap.empty; }\n    /**\n    Try to merge this step with another one, to be applied directly\n    after it. Returns the merged step when possible, null if the\n    steps can't be merged.\n    */\n    merge(other) { return null; }\n    /**\n    Deserialize a step from its JSON representation. Will call\n    through to the step class' own implementation of this method.\n    */\n    static fromJSON(schema, json) {\n        if (!json || !json.stepType)\n            throw new RangeError(\"Invalid input for Step.fromJSON\");\n        let type = stepsByID[json.stepType];\n        if (!type)\n            throw new RangeError(`No step type ${json.stepType} defined`);\n        return type.fromJSON(schema, json);\n    }\n    /**\n    To be able to serialize steps to JSON, each step needs a string\n    ID to attach to its JSON representation. Use this method to\n    register an ID for your step classes. Try to pick something\n    that's unlikely to clash with steps from other modules.\n    */\n    static jsonID(id, stepClass) {\n        if (id in stepsByID)\n            throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n        stepsByID[id] = stepClass;\n        stepClass.prototype.jsonID = id;\n        return stepClass;\n    }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The transformed document, if successful.\n    */\n    doc, \n    /**\n    The failure message, if unsuccessful.\n    */\n    failed) {\n        this.doc = doc;\n        this.failed = failed;\n    }\n    /**\n    Create a successful step result.\n    */\n    static ok(doc) { return new StepResult(doc, null); }\n    /**\n    Create a failed step result.\n    */\n    static fail(message) { return new StepResult(null, message); }\n    /**\n    Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n    arguments. Create a successful result if it succeeds, and a\n    failed one if it throws a `ReplaceError`.\n    */\n    static fromReplace(doc, from, to, slice) {\n        try {\n            return StepResult.ok(doc.replace(from, to, slice));\n        }\n        catch (e) {\n            if (e instanceof ReplaceError)\n                return StepResult.fail(e.message);\n            throw e;\n        }\n    }\n}\n\nfunction mapFragment(fragment, f, parent) {\n    let mapped = [];\n    for (let i = 0; i < fragment.childCount; i++) {\n        let child = fragment.child(i);\n        if (child.content.size)\n            child = child.copy(mapFragment(child.content, f, child));\n        if (child.isInline)\n            child = f(child, parent, i);\n        mapped.push(child);\n    }\n    return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n    /**\n    Create a mark step.\n    */\n    constructor(\n    /**\n    The start of the marked range.\n    */\n    from, \n    /**\n    The end of the marked range.\n    */\n    to, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n        let parent = $from.node($from.sharedDepth(this.to));\n        let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n            if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n                return node;\n            return node.mark(this.mark.addToSet(node.marks));\n        }, parent), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new RemoveMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new AddMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof AddMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"addMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n        return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The start of the unmarked range.\n    */\n    from, \n    /**\n    The end of the unmarked range.\n    */\n    to, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to);\n        let slice = new Slice(mapFragment(oldSlice.content, node => {\n            return node.mark(this.mark.removeFromSet(node.marks));\n        }, doc), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new AddMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new RemoveMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof RemoveMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n        return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n    /**\n    Create a node mark step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (node) {\n            let newSet = this.mark.addToSet(node.marks);\n            if (newSet.length == node.marks.length) {\n                for (let i = 0; i < node.marks.length; i++)\n                    if (!node.marks[i].isInSet(newSet))\n                        return new AddNodeMarkStep(this.pos, node.marks[i]);\n                return new AddNodeMarkStep(this.pos, this.mark);\n            }\n        }\n        return new RemoveNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n        return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node || !this.mark.isInSet(node.marks))\n            return this;\n        return new AddNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n        return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n    /**\n    The given `slice` should fit the 'gap' between `from` and\n    `to`—the depths must line up, and the surrounding nodes must be\n    able to be joined with the open sides of the slice. When\n    `structure` is true, the step will fail if the content between\n    from and to is not just a sequence of closing and then opening\n    tokens (this is to guard against rebased replace steps\n    overwriting something they weren't supposed to).\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.slice = slice;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && contentBetween(doc, this.from, this.to))\n            return StepResult.fail(\"Structure replace would overwrite content\");\n        return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n    }\n    getMap() {\n        return new StepMap([this.from, this.to - this.from, this.slice.size]);\n    }\n    invert(doc) {\n        return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deletedAcross && to.deletedAcross)\n            return null;\n        return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice, this.structure);\n    }\n    merge(other) {\n        if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n            return null;\n        if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n            return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n        }\n        else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n            return new ReplaceStep(other.from, this.to, slice, this.structure);\n        }\n        else {\n            return null;\n        }\n    }\n    toJSON() {\n        let json = { stepType: \"replace\", from: this.from, to: this.to };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n        return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n    }\n}\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n    /**\n    Create a replace-around step with the given range and gap.\n    `insert` should be the point in the slice into which the content\n    of the gap should be moved. `structure` has the same meaning as\n    it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The start of preserved range.\n    */\n    gapFrom, \n    /**\n    The end of preserved range.\n    */\n    gapTo, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    The position in the slice where the preserved range should be\n    inserted.\n    */\n    insert, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.gapFrom = gapFrom;\n        this.gapTo = gapTo;\n        this.slice = slice;\n        this.insert = insert;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n            contentBetween(doc, this.gapTo, this.to)))\n            return StepResult.fail(\"Structure gap-replace would overwrite content\");\n        let gap = doc.slice(this.gapFrom, this.gapTo);\n        if (gap.openStart || gap.openEnd)\n            return StepResult.fail(\"Gap is not a flat range\");\n        let inserted = this.slice.insertAt(this.insert, gap.content);\n        if (!inserted)\n            return StepResult.fail(\"Content does not fit in gap\");\n        return StepResult.fromReplace(doc, this.from, this.to, inserted);\n    }\n    getMap() {\n        return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n            this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n    }\n    invert(doc) {\n        let gap = this.gapTo - this.gapFrom;\n        return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        let gapFrom = this.from == this.gapFrom ? from.pos : mapping.map(this.gapFrom, -1);\n        let gapTo = this.to == this.gapTo ? to.pos : mapping.map(this.gapTo, 1);\n        if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n            return null;\n        return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n    }\n    toJSON() {\n        let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n            gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n            typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n        return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n    }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n    let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n    while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n        depth--;\n        dist--;\n    }\n    if (dist > 0) {\n        let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n        while (dist > 0) {\n            if (!next || next.isLeaf)\n                return true;\n            next = next.firstChild;\n            dist--;\n        }\n    }\n    return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n    let removed = [], added = [];\n    let removing, adding;\n    tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n        if (!node.isInline)\n            return;\n        let marks = node.marks;\n        if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n            let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n            let newSet = mark.addToSet(marks);\n            for (let i = 0; i < marks.length; i++) {\n                if (!marks[i].isInSet(newSet)) {\n                    if (removing && removing.to == start && removing.mark.eq(marks[i]))\n                        removing.to = end;\n                    else\n                        removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n                }\n            }\n            if (adding && adding.to == start)\n                adding.to = end;\n            else\n                added.push(adding = new AddMarkStep(start, end, mark));\n        }\n    });\n    removed.forEach(s => tr.step(s));\n    added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n    let matched = [], step = 0;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isInline)\n            return;\n        step++;\n        let toRemove = null;\n        if (mark instanceof MarkType) {\n            let set = node.marks, found;\n            while (found = mark.isInSet(set)) {\n                (toRemove || (toRemove = [])).push(found);\n                set = found.removeFromSet(set);\n            }\n        }\n        else if (mark) {\n            if (mark.isInSet(node.marks))\n                toRemove = [mark];\n        }\n        else {\n            toRemove = node.marks;\n        }\n        if (toRemove && toRemove.length) {\n            let end = Math.min(pos + node.nodeSize, to);\n            for (let i = 0; i < toRemove.length; i++) {\n                let style = toRemove[i], found;\n                for (let j = 0; j < matched.length; j++) {\n                    let m = matched[j];\n                    if (m.step == step - 1 && style.eq(matched[j].style))\n                        found = m;\n                }\n                if (found) {\n                    found.to = end;\n                    found.step = step;\n                }\n                else {\n                    matched.push({ style, from: Math.max(pos, from), to: end, step });\n                }\n            }\n        }\n    });\n    matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch, clearNewlines = true) {\n    let node = tr.doc.nodeAt(pos);\n    let replSteps = [], cur = pos + 1;\n    for (let i = 0; i < node.childCount; i++) {\n        let child = node.child(i), end = cur + child.nodeSize;\n        let allowed = match.matchType(child.type);\n        if (!allowed) {\n            replSteps.push(new ReplaceStep(cur, end, Slice.empty));\n        }\n        else {\n            match = allowed;\n            for (let j = 0; j < child.marks.length; j++)\n                if (!parentType.allowsMarkType(child.marks[j].type))\n                    tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n            if (clearNewlines && child.isText && parentType.whitespace != \"pre\") {\n                let m, newline = /\\r?\\n|\\r/g, slice;\n                while (m = newline.exec(child.text)) {\n                    if (!slice)\n                        slice = new Slice(Fragment.from(parentType.schema.text(\" \", parentType.allowedMarks(child.marks))), 0, 0);\n                    replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice));\n                }\n            }\n        }\n        cur = end;\n    }\n    if (!match.validEnd) {\n        let fill = match.fillBefore(Fragment.empty, true);\n        tr.replace(cur, cur, new Slice(fill, 0, 0));\n    }\n    for (let i = replSteps.length - 1; i >= 0; i--)\n        tr.step(replSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n    return (start == 0 || node.canReplace(start, node.childCount)) &&\n        (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n    let parent = range.parent;\n    let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n    for (let depth = range.depth;; --depth) {\n        let node = range.$from.node(depth);\n        let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n        if (depth < range.depth && node.canReplace(index, endIndex, content))\n            return depth;\n        if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n            break;\n    }\n    return null;\n}\nfunction lift(tr, range, target) {\n    let { $from, $to, depth } = range;\n    let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n    let start = gapStart, end = gapEnd;\n    let before = Fragment.empty, openStart = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $from.index(d) > 0) {\n            splitting = true;\n            before = Fragment.from($from.node(d).copy(before));\n            openStart++;\n        }\n        else {\n            start--;\n        }\n    let after = Fragment.empty, openEnd = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $to.after(d + 1) < $to.end(d)) {\n            splitting = true;\n            after = Fragment.from($to.node(d).copy(after));\n            openEnd++;\n        }\n        else {\n            end++;\n        }\n    tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n    let around = findWrappingOutside(range, nodeType);\n    let inner = around && findWrappingInside(innerRange, nodeType);\n    if (!inner)\n        return null;\n    return around.map(withAttrs)\n        .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let around = parent.contentMatchAt(startIndex).findWrapping(type);\n    if (!around)\n        return null;\n    let outer = around.length ? around[0] : type;\n    return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let inner = parent.child(startIndex);\n    let inside = type.contentMatch.findWrapping(inner.type);\n    if (!inside)\n        return null;\n    let lastType = inside.length ? inside[inside.length - 1] : type;\n    let innerMatch = lastType.contentMatch;\n    for (let i = startIndex; innerMatch && i < endIndex; i++)\n        innerMatch = innerMatch.matchType(parent.child(i).type);\n    if (!innerMatch || !innerMatch.validEnd)\n        return null;\n    return inside;\n}\nfunction wrap(tr, range, wrappers) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--) {\n        if (content.size) {\n            let match = wrappers[i].type.contentMatch.matchFragment(content);\n            if (!match || !match.validEnd)\n                throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n        }\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    }\n    let start = range.start, end = range.end;\n    tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n    if (!type.isTextblock)\n        throw new RangeError(\"Type given to setBlockType should be a textblock\");\n    let mapFrom = tr.steps.length;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        let attrsHere = typeof attrs == \"function\" ? attrs(node) : attrs;\n        if (node.isTextblock && !node.hasMarkup(type, attrsHere) &&\n            canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n            let convertNewlines = null;\n            if (type.schema.linebreakReplacement) {\n                let pre = type.whitespace == \"pre\", supportLinebreak = !!type.contentMatch.matchType(type.schema.linebreakReplacement);\n                if (pre && !supportLinebreak)\n                    convertNewlines = false;\n                else if (!pre && supportLinebreak)\n                    convertNewlines = true;\n            }\n            // Ensure all markup that isn't allowed in the new node type is cleared\n            if (convertNewlines === false)\n                replaceLinebreaks(tr, node, pos, mapFrom);\n            clearIncompatible(tr, tr.mapping.slice(mapFrom).map(pos, 1), type, undefined, convertNewlines === null);\n            let mapping = tr.mapping.slice(mapFrom);\n            let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n            tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrsHere, null, node.marks)), 0, 0), 1, true));\n            if (convertNewlines === true)\n                replaceNewlines(tr, node, pos, mapFrom);\n            return false;\n        }\n    });\n}\nfunction replaceNewlines(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.isText) {\n            let m, newline = /\\r?\\n|\\r/g;\n            while (m = newline.exec(child.text)) {\n                let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset + m.index);\n                tr.replaceWith(start, start + 1, node.type.schema.linebreakReplacement.create());\n            }\n        }\n    });\n}\nfunction replaceLinebreaks(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.type == child.type.schema.linebreakReplacement) {\n            let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset);\n            tr.replaceWith(start, start + 1, node.type.schema.text(\"\\n\"));\n        }\n    });\n}\nfunction canChangeType(doc, pos, type) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n    let node = tr.doc.nodeAt(pos);\n    if (!node)\n        throw new RangeError(\"No node at given position\");\n    if (!type)\n        type = node.type;\n    let newNode = type.create(attrs, null, marks || node.marks);\n    if (node.isLeaf)\n        return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n    if (!type.validContent(node.content))\n        throw new RangeError(\"Invalid content for node type \" + type.name);\n    tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n    let $pos = doc.resolve(pos), base = $pos.depth - depth;\n    let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n    if (base < 0 || $pos.parent.type.spec.isolating ||\n        !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n        !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n        return false;\n    for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n        let node = $pos.node(d), index = $pos.index(d);\n        if (node.type.spec.isolating)\n            return false;\n        let rest = node.content.cutByIndex(index, node.childCount);\n        let overrideChild = typesAfter && typesAfter[i + 1];\n        if (overrideChild)\n            rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));\n        let after = (typesAfter && typesAfter[i]) || node;\n        if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n            return false;\n    }\n    let index = $pos.indexAfter(base);\n    let baseType = typesAfter && typesAfter[0];\n    return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n    let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n    for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n        before = Fragment.from($pos.node(d).copy(before));\n        let typeAfter = typesAfter && typesAfter[i];\n        after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n    }\n    tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n        $pos.parent.canReplace(index, index + 1);\n}\nfunction canAppendWithSubstitutedLinebreaks(a, b) {\n    if (!b.content.size)\n        a.type.compatibleContent(b.type);\n    let match = a.contentMatchAt(a.childCount);\n    let { linebreakReplacement } = a.type.schema;\n    for (let i = 0; i < b.childCount; i++) {\n        let child = b.child(i);\n        let type = child.type == linebreakReplacement ? a.type.schema.nodes.text : child.type;\n        match = match.matchType(type);\n        if (!match)\n            return false;\n        if (!a.type.allowsMarks(child.marks))\n            return false;\n    }\n    return match.validEnd;\n}\nfunction joinable(a, b) {\n    return !!(a && b && !a.isLeaf && canAppendWithSubstitutedLinebreaks(a, b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n    let $pos = doc.resolve(pos);\n    for (let d = $pos.depth;; d--) {\n        let before, after, index = $pos.index(d);\n        if (d == $pos.depth) {\n            before = $pos.nodeBefore;\n            after = $pos.nodeAfter;\n        }\n        else if (dir > 0) {\n            before = $pos.node(d + 1);\n            index++;\n            after = $pos.node(d).maybeChild(index);\n        }\n        else {\n            before = $pos.node(d).maybeChild(index - 1);\n            after = $pos.node(d + 1);\n        }\n        if (before && !before.isTextblock && joinable(before, after) &&\n            $pos.node(d).canReplace(index, index + 1))\n            return pos;\n        if (d == 0)\n            break;\n        pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n    }\n}\nfunction join(tr, pos, depth) {\n    let convertNewlines = null;\n    let { linebreakReplacement } = tr.doc.type.schema;\n    let $before = tr.doc.resolve(pos - depth), beforeType = $before.node().type;\n    if (linebreakReplacement && beforeType.inlineContent) {\n        let pre = beforeType.whitespace == \"pre\";\n        let supportLinebreak = !!beforeType.contentMatch.matchType(linebreakReplacement);\n        if (pre && !supportLinebreak)\n            convertNewlines = false;\n        else if (!pre && supportLinebreak)\n            convertNewlines = true;\n    }\n    let mapFrom = tr.steps.length;\n    if (convertNewlines === false) {\n        let $after = tr.doc.resolve(pos + depth);\n        replaceLinebreaks(tr, $after.node(), $after.before(), mapFrom);\n    }\n    if (beforeType.inlineContent)\n        clearIncompatible(tr, pos + depth - 1, beforeType, $before.node().contentMatchAt($before.index()), convertNewlines == null);\n    let mapping = tr.mapping.slice(mapFrom), start = mapping.map(pos - depth);\n    tr.step(new ReplaceStep(start, mapping.map(pos + depth, -1), Slice.empty, true));\n    if (convertNewlines === true) {\n        let $full = tr.doc.resolve(start);\n        replaceNewlines(tr, $full.node(), $full.before(), tr.steps.length);\n    }\n    return tr;\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n    let $pos = doc.resolve(pos);\n    if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n        return pos;\n    if ($pos.parentOffset == 0)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.index(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.before(d + 1);\n            if (index > 0)\n                return null;\n        }\n    if ($pos.parentOffset == $pos.parent.content.size)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.indexAfter(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.after(d + 1);\n            if (index < $pos.node(d).childCount)\n                return null;\n        }\n    return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n    let $pos = doc.resolve(pos);\n    if (!slice.content.size)\n        return pos;\n    let content = slice.content;\n    for (let i = 0; i < slice.openStart; i++)\n        content = content.firstChild.content;\n    for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n        for (let d = $pos.depth; d >= 0; d--) {\n            let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n            let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n            let parent = $pos.node(d), fits = false;\n            if (pass == 1) {\n                fits = parent.canReplace(insertPos, insertPos, content);\n            }\n            else {\n                let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n                fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n            }\n            if (fits)\n                return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n        }\n    }\n    return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n    if (from == to && !slice.size)\n        return null;\n    let $from = doc.resolve(from), $to = doc.resolve(to);\n    // Optimization -- avoid work if it's obvious that it's not needed.\n    if (fitsTrivially($from, $to, slice))\n        return new ReplaceStep(from, to, slice);\n    return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n    return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n        $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n//  - `frontier` holds a stack of `{type, match}` objects that\n//    represent the open side of the replacement. It starts at\n//    `$from`, then moves forward as content is placed, and is finally\n//    reconciled with `$to`.\n//\n//  - `unplaced` is a slice that represents the content that hasn't\n//    been placed yet.\n//\n//  - `placed` is a fragment of placed content. Its open-start value\n//    is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n    constructor($from, $to, unplaced) {\n        this.$from = $from;\n        this.$to = $to;\n        this.unplaced = unplaced;\n        this.frontier = [];\n        this.placed = Fragment.empty;\n        for (let i = 0; i <= $from.depth; i++) {\n            let node = $from.node(i);\n            this.frontier.push({\n                type: node.type,\n                match: node.contentMatchAt($from.indexAfter(i))\n            });\n        }\n        for (let i = $from.depth; i > 0; i--)\n            this.placed = Fragment.from($from.node(i).copy(this.placed));\n    }\n    get depth() { return this.frontier.length - 1; }\n    fit() {\n        // As long as there's unplaced content, try to place some of it.\n        // If that fails, either increase the open score of the unplaced\n        // slice, or drop nodes from it, and then try again.\n        while (this.unplaced.size) {\n            let fit = this.findFittable();\n            if (fit)\n                this.placeNodes(fit);\n            else\n                this.openMore() || this.dropNode();\n        }\n        // When there's inline content directly after the frontier _and_\n        // directly after `this.$to`, we must generate a `ReplaceAround`\n        // step that pulls that content into the node after the frontier.\n        // That means the fitting must be done to the end of the textblock\n        // node after `this.$to`, not `this.$to` itself.\n        let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n        let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n        if (!$to)\n            return null;\n        // If closing to `$to` succeeded, create a step\n        let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n        while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n            content = content.firstChild.content;\n            openStart--;\n            openEnd--;\n        }\n        let slice = new Slice(content, openStart, openEnd);\n        if (moveInline > -1)\n            return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n        if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n            return new ReplaceStep($from.pos, $to.pos, slice);\n        return null;\n    }\n    // Find a position on the start spine of `this.unplaced` that has\n    // content that can be moved somewhere on the frontier. Returns two\n    // depths, one for the slice and one for the frontier.\n    findFittable() {\n        let startDepth = this.unplaced.openStart;\n        for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n            let node = cur.firstChild;\n            if (cur.childCount > 1)\n                openEnd = 0;\n            if (node.type.spec.isolating && openEnd <= d) {\n                startDepth = d;\n                break;\n            }\n            cur = node.content;\n        }\n        // Only try wrapping nodes (pass 2) after finding a place without\n        // wrapping failed.\n        for (let pass = 1; pass <= 2; pass++) {\n            for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n                let fragment, parent = null;\n                if (sliceDepth) {\n                    parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n                    fragment = parent.content;\n                }\n                else {\n                    fragment = this.unplaced.content;\n                }\n                let first = fragment.firstChild;\n                for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n                    let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n                    // In pass 1, if the next node matches, or there is no next\n                    // node but the parents look compatible, we've found a\n                    // place.\n                    if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n                        : parent && type.compatibleContent(parent.type)))\n                        return { sliceDepth, frontierDepth, parent, inject };\n                    // In pass 2, look for a set of wrapping nodes that make\n                    // `first` fit here.\n                    else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n                        return { sliceDepth, frontierDepth, parent, wrap };\n                    // Don't continue looking further up if the parent node\n                    // would fit here.\n                    if (parent && match.matchType(parent.type))\n                        break;\n                }\n            }\n        }\n    }\n    openMore() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (!inner.childCount || inner.firstChild.isLeaf)\n            return false;\n        this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n        return true;\n    }\n    dropNode() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (inner.childCount <= 1 && openStart > 0) {\n            let openAtEnd = content.size - openStart <= openStart + inner.size;\n            this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n        }\n        else {\n            this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n        }\n    }\n    // Move content from the unplaced slice at `sliceDepth` to the\n    // frontier node at `frontierDepth`. Close that frontier node when\n    // applicable.\n    placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n        while (this.depth > frontierDepth)\n            this.closeFrontierNode();\n        if (wrap)\n            for (let i = 0; i < wrap.length; i++)\n                this.openFrontierNode(wrap[i]);\n        let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n        let openStart = slice.openStart - sliceDepth;\n        let taken = 0, add = [];\n        let { match, type } = this.frontier[frontierDepth];\n        if (inject) {\n            for (let i = 0; i < inject.childCount; i++)\n                add.push(inject.child(i));\n            match = match.matchFragment(inject);\n        }\n        // Computes the amount of (end) open nodes at the end of the\n        // fragment. When 0, the parent is open, but no more. When\n        // negative, nothing is open.\n        let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n        // Scan over the fragment, fitting as many child nodes as\n        // possible.\n        while (taken < fragment.childCount) {\n            let next = fragment.child(taken), matches = match.matchType(next.type);\n            if (!matches)\n                break;\n            taken++;\n            if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n                match = matches;\n                add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n            }\n        }\n        let toEnd = taken == fragment.childCount;\n        if (!toEnd)\n            openEndCount = -1;\n        this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n        this.frontier[frontierDepth].match = match;\n        // If the parent types match, and the entire node was moved, and\n        // it's not open, close this frontier node right away.\n        if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n            this.closeFrontierNode();\n        // Add new frontier nodes for any open nodes at the end.\n        for (let i = 0, cur = fragment; i < openEndCount; i++) {\n            let node = cur.lastChild;\n            this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n            cur = node.content;\n        }\n        // Update `this.unplaced`. Drop the entire node from which we\n        // placed it we got to its end, otherwise just drop the placed\n        // nodes.\n        this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n            : sliceDepth == 0 ? Slice.empty\n                : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n    }\n    mustMoveInline() {\n        if (!this.$to.parent.isTextblock)\n            return -1;\n        let top = this.frontier[this.depth], level;\n        if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n            (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n            return -1;\n        let { depth } = this.$to, after = this.$to.after(depth);\n        while (depth > 1 && after == this.$to.end(--depth))\n            ++after;\n        return after;\n    }\n    findCloseLevel($to) {\n        scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n            let { match, type } = this.frontier[i];\n            let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n            let fit = contentAfterFits($to, i, type, match, dropInner);\n            if (!fit)\n                continue;\n            for (let d = i - 1; d >= 0; d--) {\n                let { match, type } = this.frontier[d];\n                let matches = contentAfterFits($to, d, type, match, true);\n                if (!matches || matches.childCount)\n                    continue scan;\n            }\n            return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n        }\n    }\n    close($to) {\n        let close = this.findCloseLevel($to);\n        if (!close)\n            return null;\n        while (this.depth > close.depth)\n            this.closeFrontierNode();\n        if (close.fit.childCount)\n            this.placed = addToFragment(this.placed, close.depth, close.fit);\n        $to = close.move;\n        for (let d = close.depth + 1; d <= $to.depth; d++) {\n            let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n            this.openFrontierNode(node.type, node.attrs, add);\n        }\n        return $to;\n    }\n    openFrontierNode(type, attrs = null, content) {\n        let top = this.frontier[this.depth];\n        top.match = top.match.matchType(type);\n        this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n        this.frontier.push({ type, match: type.contentMatch });\n    }\n    closeFrontierNode() {\n        let open = this.frontier.pop();\n        let add = open.match.fillBefore(Fragment.empty, true);\n        if (add.childCount)\n            this.placed = addToFragment(this.placed, this.frontier.length, add);\n    }\n}\nfunction dropFromFragment(fragment, depth, count) {\n    if (depth == 0)\n        return fragment.cutByIndex(count, fragment.childCount);\n    return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n    if (depth == 0)\n        return fragment.append(content);\n    return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n    for (let i = 0; i < depth; i++)\n        fragment = fragment.firstChild.content;\n    return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n    if (openStart <= 0)\n        return node;\n    let frag = node.content;\n    if (openStart > 1)\n        frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n    if (openStart > 0) {\n        frag = node.type.contentMatch.fillBefore(frag).append(frag);\n        if (openEnd <= 0)\n            frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n    }\n    return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n    let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n    if (index == node.childCount && !type.compatibleContent(node.type))\n        return null;\n    let fit = match.fillBefore(node.content, true, index);\n    return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n    for (let i = start; i < fragment.childCount; i++)\n        if (!type.allowsMarks(fragment.child(i).marks))\n            return true;\n    return false;\n}\nfunction definesContent(type) {\n    return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n    if (!slice.size)\n        return tr.deleteRange(from, to);\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    if (fitsTrivially($from, $to, slice))\n        return tr.step(new ReplaceStep(from, to, slice));\n    let targetDepths = coveredDepths($from, tr.doc.resolve(to));\n    // Can't replace the whole document, so remove 0 if it's present\n    if (targetDepths[targetDepths.length - 1] == 0)\n        targetDepths.pop();\n    // Negative numbers represent not expansion over the whole node at\n    // that depth, but replacing from $from.before(-D) to $to.pos.\n    let preferredTarget = -($from.depth + 1);\n    targetDepths.unshift(preferredTarget);\n    // This loop picks a preferred target depth, if one of the covering\n    // depths is not outside of a defining node, and adds negative\n    // depths for any depth that has $from at its start and does not\n    // cross a defining node.\n    for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n        let spec = $from.node(d).type.spec;\n        if (spec.defining || spec.definingAsContext || spec.isolating)\n            break;\n        if (targetDepths.indexOf(d) > -1)\n            preferredTarget = d;\n        else if ($from.before(d) == pos)\n            targetDepths.splice(1, 0, -d);\n    }\n    // Try to fit each possible depth of the slice into each possible\n    // target depth, starting with the preferred depths.\n    let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n    let leftNodes = [], preferredDepth = slice.openStart;\n    for (let content = slice.content, i = 0;; i++) {\n        let node = content.firstChild;\n        leftNodes.push(node);\n        if (i == slice.openStart)\n            break;\n        content = node.content;\n    }\n    // Back up preferredDepth to cover defining textblocks directly\n    // above it, possibly skipping a non-defining textblock.\n    for (let d = preferredDepth - 1; d >= 0; d--) {\n        let leftNode = leftNodes[d], def = definesContent(leftNode.type);\n        if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1)))\n            preferredDepth = d;\n        else if (def || !leftNode.type.isTextblock)\n            break;\n    }\n    for (let j = slice.openStart; j >= 0; j--) {\n        let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n        let insert = leftNodes[openDepth];\n        if (!insert)\n            continue;\n        for (let i = 0; i < targetDepths.length; i++) {\n            // Loop over possible expansion levels, starting with the\n            // preferred one\n            let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n            if (targetDepth < 0) {\n                expand = false;\n                targetDepth = -targetDepth;\n            }\n            let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n            if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n                return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n        }\n    }\n    let startSteps = tr.steps.length;\n    for (let i = targetDepths.length - 1; i >= 0; i--) {\n        tr.replace(from, to, slice);\n        if (tr.steps.length > startSteps)\n            break;\n        let depth = targetDepths[i];\n        if (depth < 0)\n            continue;\n        from = $from.before(depth);\n        to = $to.after(depth);\n    }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n    if (depth < oldOpen) {\n        let first = fragment.firstChild;\n        fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n    }\n    if (depth > newOpen) {\n        let match = parent.contentMatchAt(0);\n        let start = match.fillBefore(fragment).append(fragment);\n        fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n    }\n    return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n    if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n        let point = insertPoint(tr.doc, from, node.type);\n        if (point != null)\n            from = to = point;\n    }\n    tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    let covered = coveredDepths($from, $to);\n    for (let i = 0; i < covered.length; i++) {\n        let depth = covered[i], last = i == covered.length - 1;\n        if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n            return tr.delete($from.start(depth), $to.end(depth));\n        if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n            return tr.delete($from.before(depth), $to.after(depth));\n    }\n    for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n        if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d &&\n            $from.start(d - 1) == $to.start(d - 1) && $from.node(d - 1).canReplace($from.index(d - 1), $to.index(d - 1)))\n            return tr.delete($from.before(d), to);\n    }\n    tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n    let result = [], minDepth = Math.min($from.depth, $to.depth);\n    for (let d = minDepth; d >= 0; d--) {\n        let start = $from.start(d);\n        if (start < $from.pos - ($from.depth - d) ||\n            $to.end(d) > $to.pos + ($to.depth - d) ||\n            $from.node(d).type.spec.isolating ||\n            $to.node(d).type.spec.isolating)\n            break;\n        if (start == $to.start(d) ||\n            (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n                d && $to.start(d - 1) == start - 1))\n            result.push(d);\n    }\n    return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.pos = pos;\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at attribute step's position\");\n        let attrs = Object.create(null);\n        for (let name in node.attrs)\n            attrs[name] = node.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = node.type.create(attrs, null, node.marks);\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n    }\n    toJSON() {\n        return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n        return new AttrStep(json.pos, json.attr, json.value);\n    }\n}\nStep.jsonID(\"attr\", AttrStep);\n/**\nUpdate an attribute in the doc node.\n*/\nclass DocAttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let attrs = Object.create(null);\n        for (let name in doc.attrs)\n            attrs[name] = doc.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = doc.type.create(attrs, doc.content, doc.marks);\n        return StepResult.ok(updated);\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new DocAttrStep(this.attr, doc.attrs[this.attr]);\n    }\n    map(mapping) {\n        return this;\n    }\n    toJSON() {\n        return { stepType: \"docAttr\", attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for DocAttrStep.fromJSON\");\n        return new DocAttrStep(json.attr, json.value);\n    }\n}\nStep.jsonID(\"docAttr\", DocAttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n    let err = Error.call(this, message);\n    err.__proto__ = TransformError.prototype;\n    return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n    /**\n    Create a transform that starts with the given document.\n    */\n    constructor(\n    /**\n    The current document (the result of applying the steps in the\n    transform).\n    */\n    doc) {\n        this.doc = doc;\n        /**\n        The steps in this transform.\n        */\n        this.steps = [];\n        /**\n        The documents before each of the steps.\n        */\n        this.docs = [];\n        /**\n        A mapping with the maps for each of the steps in this transform.\n        */\n        this.mapping = new Mapping;\n    }\n    /**\n    The starting document.\n    */\n    get before() { return this.docs.length ? this.docs[0] : this.doc; }\n    /**\n    Apply a new step in this transform, saving the result. Throws an\n    error when the step fails.\n    */\n    step(step) {\n        let result = this.maybeStep(step);\n        if (result.failed)\n            throw new TransformError(result.failed);\n        return this;\n    }\n    /**\n    Try to apply a step in this transformation, ignoring it if it\n    fails. Returns the step result.\n    */\n    maybeStep(step) {\n        let result = step.apply(this.doc);\n        if (!result.failed)\n            this.addStep(step, result.doc);\n        return result;\n    }\n    /**\n    True when the document has been changed (when there are any\n    steps).\n    */\n    get docChanged() {\n        return this.steps.length > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        this.docs.push(this.doc);\n        this.steps.push(step);\n        this.mapping.appendMap(step.getMap());\n        this.doc = doc;\n    }\n    /**\n    Replace the part of the document between `from` and `to` with the\n    given `slice`.\n    */\n    replace(from, to = from, slice = Slice.empty) {\n        let step = replaceStep(this.doc, from, to, slice);\n        if (step)\n            this.step(step);\n        return this;\n    }\n    /**\n    Replace the given range with the given content, which may be a\n    fragment, node, or array of nodes.\n    */\n    replaceWith(from, to, content) {\n        return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n    }\n    /**\n    Delete the content between the given positions.\n    */\n    delete(from, to) {\n        return this.replace(from, to, Slice.empty);\n    }\n    /**\n    Insert the given content at the given position.\n    */\n    insert(pos, content) {\n        return this.replaceWith(pos, pos, content);\n    }\n    /**\n    Replace a range of the document with a given slice, using\n    `from`, `to`, and the slice's\n    [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n    than fixed start and end points. This method may grow the\n    replaced area or close open nodes in the slice in order to get a\n    fit that is more in line with WYSIWYG expectations, by dropping\n    fully covered parent nodes of the replaced region when they are\n    marked [non-defining as\n    context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n    open parent node from the slice that _is_ marked as [defining\n    its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n    \n    This is the method, for example, to handle paste. The similar\n    [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n    primitive tool which will _not_ move the start and end of its given\n    range, and is useful in situations where you need more precise\n    control over what happens.\n    */\n    replaceRange(from, to, slice) {\n        replaceRange(this, from, to, slice);\n        return this;\n    }\n    /**\n    Replace the given range with a node, but use `from` and `to` as\n    hints, rather than precise positions. When from and to are the same\n    and are at the start or end of a parent node in which the given\n    node doesn't fit, this method may _move_ them out towards a parent\n    that does allow the given node to be placed. When the given range\n    completely covers a parent node, this method may completely replace\n    that parent node.\n    */\n    replaceRangeWith(from, to, node) {\n        replaceRangeWith(this, from, to, node);\n        return this;\n    }\n    /**\n    Delete the given range, expanding it to cover fully covered\n    parent nodes until a valid replace is found.\n    */\n    deleteRange(from, to) {\n        deleteRange(this, from, to);\n        return this;\n    }\n    /**\n    Split the content in the given range off from its parent, if there\n    is sibling content before or after it, and move it up the tree to\n    the depth specified by `target`. You'll probably want to use\n    [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n    sure the lift is valid.\n    */\n    lift(range, target) {\n        lift(this, range, target);\n        return this;\n    }\n    /**\n    Join the blocks around the given position. If depth is 2, their\n    last and first siblings are also joined, and so on.\n    */\n    join(pos, depth = 1) {\n        join(this, pos, depth);\n        return this;\n    }\n    /**\n    Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n    The wrappers are assumed to be valid in this position, and should\n    probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n    */\n    wrap(range, wrappers) {\n        wrap(this, range, wrappers);\n        return this;\n    }\n    /**\n    Set the type of all textblocks (partly) between `from` and `to` to\n    the given node type with the given attributes.\n    */\n    setBlockType(from, to = from, type, attrs = null) {\n        setBlockType(this, from, to, type, attrs);\n        return this;\n    }\n    /**\n    Change the type, attributes, and/or marks of the node at `pos`.\n    When `type` isn't given, the existing node type is preserved,\n    */\n    setNodeMarkup(pos, type, attrs = null, marks) {\n        setNodeMarkup(this, pos, type, attrs, marks);\n        return this;\n    }\n    /**\n    Set a single attribute on a given node to a new value.\n    The `pos` addresses the document content. Use `setDocAttribute`\n    to set attributes on the document itself.\n    */\n    setNodeAttribute(pos, attr, value) {\n        this.step(new AttrStep(pos, attr, value));\n        return this;\n    }\n    /**\n    Set a single attribute on the document to a new value.\n    */\n    setDocAttribute(attr, value) {\n        this.step(new DocAttrStep(attr, value));\n        return this;\n    }\n    /**\n    Add a mark to the node at position `pos`.\n    */\n    addNodeMark(pos, mark) {\n        this.step(new AddNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Remove a mark (or all marks of the given type) from the node at\n    position `pos`.\n    */\n    removeNodeMark(pos, mark) {\n        let node = this.doc.nodeAt(pos);\n        if (!node)\n            throw new RangeError(\"No node at position \" + pos);\n        if (mark instanceof Mark) {\n            if (mark.isInSet(node.marks))\n                this.step(new RemoveNodeMarkStep(pos, mark));\n        }\n        else {\n            let set = node.marks, found, steps = [];\n            while (found = mark.isInSet(set)) {\n                steps.push(new RemoveNodeMarkStep(pos, found));\n                set = found.removeFromSet(set);\n            }\n            for (let i = steps.length - 1; i >= 0; i--)\n                this.step(steps[i]);\n        }\n        return this;\n    }\n    /**\n    Split the node at the given position, and optionally, if `depth` is\n    greater than one, any number of nodes above that. By default, the\n    parts split off will inherit the node type of the original node.\n    This can be changed by passing an array of types and attributes to\n    use after the split (with the outermost nodes coming first).\n    */\n    split(pos, depth = 1, typesAfter) {\n        split(this, pos, depth, typesAfter);\n        return this;\n    }\n    /**\n    Add the given mark to the inline content between `from` and `to`.\n    */\n    addMark(from, to, mark) {\n        addMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Remove marks from inline nodes between `from` and `to`. When\n    `mark` is a single mark, remove precisely that mark. When it is\n    a mark type, remove all marks of that type. When it is null,\n    remove all marks of any type.\n    */\n    removeMark(from, to, mark) {\n        removeMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Removes all marks and nodes from the content of the node at\n    `pos` that don't match the given new parent node type. Accepts\n    an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n    third argument.\n    */\n    clearIncompatible(pos, parentType, match) {\n        clearIncompatible(this, pos, parentType, match);\n        return this;\n    }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, DocAttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nconst classesById = Object.create(null);\n/**\nSuperclass for editor selections. Every selection type should\nextend this. Should not be instantiated directly.\n*/\nclass Selection {\n    /**\n    Initialize a selection with the head and anchor and ranges. If no\n    ranges are given, constructs a single range across `$anchor` and\n    `$head`.\n    */\n    constructor(\n    /**\n    The resolved anchor of the selection (the side that stays in\n    place when the selection is modified).\n    */\n    $anchor, \n    /**\n    The resolved head of the selection (the side that moves when\n    the selection is modified).\n    */\n    $head, ranges) {\n        this.$anchor = $anchor;\n        this.$head = $head;\n        this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n    }\n    /**\n    The selection's anchor, as an unresolved position.\n    */\n    get anchor() { return this.$anchor.pos; }\n    /**\n    The selection's head.\n    */\n    get head() { return this.$head.pos; }\n    /**\n    The lower bound of the selection's main range.\n    */\n    get from() { return this.$from.pos; }\n    /**\n    The upper bound of the selection's main range.\n    */\n    get to() { return this.$to.pos; }\n    /**\n    The resolved lower  bound of the selection's main range.\n    */\n    get $from() {\n        return this.ranges[0].$from;\n    }\n    /**\n    The resolved upper bound of the selection's main range.\n    */\n    get $to() {\n        return this.ranges[0].$to;\n    }\n    /**\n    Indicates whether the selection contains any content.\n    */\n    get empty() {\n        let ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++)\n            if (ranges[i].$from.pos != ranges[i].$to.pos)\n                return false;\n        return true;\n    }\n    /**\n    Get the content of this selection as a slice.\n    */\n    content() {\n        return this.$from.doc.slice(this.from, this.to, true);\n    }\n    /**\n    Replace the selection with a slice or, if no slice is given,\n    delete the selection. Will append to the given transaction.\n    */\n    replace(tr, content = Slice.empty) {\n        // Put the new selection at the position after the inserted\n        // content. When that ended in an inline node, search backwards,\n        // to get the position after that node. If not, search forward.\n        let lastNode = content.content.lastChild, lastParent = null;\n        for (let i = 0; i < content.openEnd; i++) {\n            lastParent = lastNode;\n            lastNode = lastNode.lastChild;\n        }\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content);\n            if (i == 0)\n                selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1);\n        }\n    }\n    /**\n    Replace the selection with the given node, appending the changes\n    to the given transaction.\n    */\n    replaceWith(tr, node) {\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            let from = mapping.map($from.pos), to = mapping.map($to.pos);\n            if (i) {\n                tr.deleteRange(from, to);\n            }\n            else {\n                tr.replaceRangeWith(from, to, node);\n                selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n            }\n        }\n    }\n    /**\n    Find a valid cursor or leaf node selection starting at the given\n    position and searching back if `dir` is negative, and forward if\n    positive. When `textOnly` is true, only consider cursor\n    selections. Will return null when no valid selection position is\n    found.\n    */\n    static findFrom($pos, dir, textOnly = false) {\n        let inner = $pos.parent.inlineContent ? new TextSelection($pos)\n            : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n        if (inner)\n            return inner;\n        for (let depth = $pos.depth - 1; depth >= 0; depth--) {\n            let found = dir < 0\n                ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n                : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n            if (found)\n                return found;\n        }\n        return null;\n    }\n    /**\n    Find a valid cursor or leaf node selection near the given\n    position. Searches forward first by default, but if `bias` is\n    negative, it will search backwards first.\n    */\n    static near($pos, bias = 1) {\n        return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0));\n    }\n    /**\n    Find the cursor or leaf node selection closest to the start of\n    the given document. Will return an\n    [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position\n    exists.\n    */\n    static atStart(doc) {\n        return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc);\n    }\n    /**\n    Find the cursor or leaf node selection closest to the end of the\n    given document.\n    */\n    static atEnd(doc) {\n        return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc);\n    }\n    /**\n    Deserialize the JSON representation of a selection. Must be\n    implemented for custom classes (as a static class method).\n    */\n    static fromJSON(doc, json) {\n        if (!json || !json.type)\n            throw new RangeError(\"Invalid input for Selection.fromJSON\");\n        let cls = classesById[json.type];\n        if (!cls)\n            throw new RangeError(`No selection type ${json.type} defined`);\n        return cls.fromJSON(doc, json);\n    }\n    /**\n    To be able to deserialize selections from JSON, custom selection\n    classes must register themselves with an ID string, so that they\n    can be disambiguated. Try to pick something that's unlikely to\n    clash with classes from other modules.\n    */\n    static jsonID(id, selectionClass) {\n        if (id in classesById)\n            throw new RangeError(\"Duplicate use of selection JSON ID \" + id);\n        classesById[id] = selectionClass;\n        selectionClass.prototype.jsonID = id;\n        return selectionClass;\n    }\n    /**\n    Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection,\n    which is a value that can be mapped without having access to a\n    current document, and later resolved to a real selection for a\n    given document again. (This is used mostly by the history to\n    track and restore old selections.) The default implementation of\n    this method just converts the selection to a text selection and\n    returns the bookmark for that.\n    */\n    getBookmark() {\n        return TextSelection.between(this.$anchor, this.$head).getBookmark();\n    }\n}\nSelection.prototype.visible = true;\n/**\nRepresents a selected range in a document.\n*/\nclass SelectionRange {\n    /**\n    Create a range.\n    */\n    constructor(\n    /**\n    The lower bound of the range.\n    */\n    $from, \n    /**\n    The upper bound of the range.\n    */\n    $to) {\n        this.$from = $from;\n        this.$to = $to;\n    }\n}\nlet warnedAboutTextSelection = false;\nfunction checkTextSelection($pos) {\n    if (!warnedAboutTextSelection && !$pos.parent.inlineContent) {\n        warnedAboutTextSelection = true;\n        console[\"warn\"](\"TextSelection endpoint not pointing into a node with inline content (\" + $pos.parent.type.name + \")\");\n    }\n}\n/**\nA text selection represents a classical editor selection, with a\nhead (the moving side) and anchor (immobile side), both of which\npoint into textblock nodes. It can be empty (a regular cursor\nposition).\n*/\nclass TextSelection extends Selection {\n    /**\n    Construct a text selection between the given points.\n    */\n    constructor($anchor, $head = $anchor) {\n        checkTextSelection($anchor);\n        checkTextSelection($head);\n        super($anchor, $head);\n    }\n    /**\n    Returns a resolved position if this is a cursor selection (an\n    empty text selection), and null otherwise.\n    */\n    get $cursor() { return this.$anchor.pos == this.$head.pos ? this.$head : null; }\n    map(doc, mapping) {\n        let $head = doc.resolve(mapping.map(this.head));\n        if (!$head.parent.inlineContent)\n            return Selection.near($head);\n        let $anchor = doc.resolve(mapping.map(this.anchor));\n        return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head);\n    }\n    replace(tr, content = Slice.empty) {\n        super.replace(tr, content);\n        if (content == Slice.empty) {\n            let marks = this.$from.marksAcross(this.$to);\n            if (marks)\n                tr.ensureMarks(marks);\n        }\n    }\n    eq(other) {\n        return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head;\n    }\n    getBookmark() {\n        return new TextBookmark(this.anchor, this.head);\n    }\n    toJSON() {\n        return { type: \"text\", anchor: this.anchor, head: this.head };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n            throw new RangeError(\"Invalid input for TextSelection.fromJSON\");\n        return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n    }\n    /**\n    Create a text selection from non-resolved positions.\n    */\n    static create(doc, anchor, head = anchor) {\n        let $anchor = doc.resolve(anchor);\n        return new this($anchor, head == anchor ? $anchor : doc.resolve(head));\n    }\n    /**\n    Return a text selection that spans the given positions or, if\n    they aren't text positions, find a text selection near them.\n    `bias` determines whether the method searches forward (default)\n    or backwards (negative number) first. Will fall back to calling\n    [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document\n    doesn't contain a valid text position.\n    */\n    static between($anchor, $head, bias) {\n        let dPos = $anchor.pos - $head.pos;\n        if (!bias || dPos)\n            bias = dPos >= 0 ? 1 : -1;\n        if (!$head.parent.inlineContent) {\n            let found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n            if (found)\n                $head = found.$head;\n            else\n                return Selection.near($head, bias);\n        }\n        if (!$anchor.parent.inlineContent) {\n            if (dPos == 0) {\n                $anchor = $head;\n            }\n            else {\n                $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n                if (($anchor.pos < $head.pos) != (dPos < 0))\n                    $anchor = $head;\n            }\n        }\n        return new TextSelection($anchor, $head);\n    }\n}\nSelection.jsonID(\"text\", TextSelection);\nclass TextBookmark {\n    constructor(anchor, head) {\n        this.anchor = anchor;\n        this.head = head;\n    }\n    map(mapping) {\n        return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head));\n    }\n    resolve(doc) {\n        return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head));\n    }\n}\n/**\nA node selection is a selection that points at a single node. All\nnodes marked [selectable](https://prosemirror.net/docs/ref/#model.NodeSpec.selectable) can be the\ntarget of a node selection. In such a selection, `from` and `to`\npoint directly before and after the selected node, `anchor` equals\n`from`, and `head` equals `to`..\n*/\nclass NodeSelection extends Selection {\n    /**\n    Create a node selection. Does not verify the validity of its\n    argument.\n    */\n    constructor($pos) {\n        let node = $pos.nodeAfter;\n        let $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n        super($pos, $end);\n        this.node = node;\n    }\n    map(doc, mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        let $pos = doc.resolve(pos);\n        if (deleted)\n            return Selection.near($pos);\n        return new NodeSelection($pos);\n    }\n    content() {\n        return new Slice(Fragment.from(this.node), 0, 0);\n    }\n    eq(other) {\n        return other instanceof NodeSelection && other.anchor == this.anchor;\n    }\n    toJSON() {\n        return { type: \"node\", anchor: this.anchor };\n    }\n    getBookmark() { return new NodeBookmark(this.anchor); }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\")\n            throw new RangeError(\"Invalid input for NodeSelection.fromJSON\");\n        return new NodeSelection(doc.resolve(json.anchor));\n    }\n    /**\n    Create a node selection from non-resolved positions.\n    */\n    static create(doc, from) {\n        return new NodeSelection(doc.resolve(from));\n    }\n    /**\n    Determines whether the given node may be selected as a node\n    selection.\n    */\n    static isSelectable(node) {\n        return !node.isText && node.type.spec.selectable !== false;\n    }\n}\nNodeSelection.prototype.visible = false;\nSelection.jsonID(\"node\", NodeSelection);\nclass NodeBookmark {\n    constructor(anchor) {\n        this.anchor = anchor;\n    }\n    map(mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos);\n    }\n    resolve(doc) {\n        let $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n        if (node && NodeSelection.isSelectable(node))\n            return new NodeSelection($pos);\n        return Selection.near($pos);\n    }\n}\n/**\nA selection type that represents selecting the whole document\n(which can not necessarily be expressed with a text selection, when\nthere are for example leaf block nodes at the start or end of the\ndocument).\n*/\nclass AllSelection extends Selection {\n    /**\n    Create an all-selection over the given document.\n    */\n    constructor(doc) {\n        super(doc.resolve(0), doc.resolve(doc.content.size));\n    }\n    replace(tr, content = Slice.empty) {\n        if (content == Slice.empty) {\n            tr.delete(0, tr.doc.content.size);\n            let sel = Selection.atStart(tr.doc);\n            if (!sel.eq(tr.selection))\n                tr.setSelection(sel);\n        }\n        else {\n            super.replace(tr, content);\n        }\n    }\n    toJSON() { return { type: \"all\" }; }\n    /**\n    @internal\n    */\n    static fromJSON(doc) { return new AllSelection(doc); }\n    map(doc) { return new AllSelection(doc); }\n    eq(other) { return other instanceof AllSelection; }\n    getBookmark() { return AllBookmark; }\n}\nSelection.jsonID(\"all\", AllSelection);\nconst AllBookmark = {\n    map() { return this; },\n    resolve(doc) { return new AllSelection(doc); }\n};\n// FIXME we'll need some awareness of text direction when scanning for selections\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text = false) {\n    if (node.inlineContent)\n        return TextSelection.create(doc, pos);\n    for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n        let child = node.child(i);\n        if (!child.isAtom) {\n            let inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n            if (inner)\n                return inner;\n        }\n        else if (!text && NodeSelection.isSelectable(child)) {\n            return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0));\n        }\n        pos += child.nodeSize * dir;\n    }\n    return null;\n}\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n    let last = tr.steps.length - 1;\n    if (last < startLen)\n        return;\n    let step = tr.steps[last];\n    if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep))\n        return;\n    let map = tr.mapping.maps[last], end;\n    map.forEach((_from, _to, _newFrom, newTo) => { if (end == null)\n        end = newTo; });\n    tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nconst UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n/**\nAn editor state transaction, which can be applied to a state to\ncreate an updated state. Use\n[`EditorState.tr`](https://prosemirror.net/docs/ref/#state.EditorState.tr) to create an instance.\n\nTransactions track changes to the document (they are a subclass of\n[`Transform`](https://prosemirror.net/docs/ref/#transform.Transform)), but also other state changes,\nlike selection updates and adjustments of the set of [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks). In addition, you can store\nmetadata properties in a transaction, which are extra pieces of\ninformation that client code or plugins can use to describe what a\ntransaction represents, so that they can update their [own\nstate](https://prosemirror.net/docs/ref/#state.StateField) accordingly.\n\nThe [editor view](https://prosemirror.net/docs/ref/#view.EditorView) uses a few metadata\nproperties: it will attach a property `\"pointer\"` with the value\n`true` to selection transactions directly caused by mouse or touch\ninput, a `\"composition\"` property holding an ID identifying the\ncomposition that caused it to transactions caused by composed DOM\ninput, and a `\"uiEvent\"` property of that may be `\"paste\"`,\n`\"cut\"`, or `\"drop\"`.\n*/\nclass Transaction extends Transform {\n    /**\n    @internal\n    */\n    constructor(state) {\n        super(state.doc);\n        // The step count for which the current selection is valid.\n        this.curSelectionFor = 0;\n        // Bitfield to track which aspects of the state were updated by\n        // this transaction.\n        this.updated = 0;\n        // Object used to store metadata properties for the transaction.\n        this.meta = Object.create(null);\n        this.time = Date.now();\n        this.curSelection = state.selection;\n        this.storedMarks = state.storedMarks;\n    }\n    /**\n    The transaction's current selection. This defaults to the editor\n    selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the\n    transaction, but can be overwritten with\n    [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection).\n    */\n    get selection() {\n        if (this.curSelectionFor < this.steps.length) {\n            this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n            this.curSelectionFor = this.steps.length;\n        }\n        return this.curSelection;\n    }\n    /**\n    Update the transaction's current selection. Will determine the\n    selection that the editor gets when the transaction is applied.\n    */\n    setSelection(selection) {\n        if (selection.$from.doc != this.doc)\n            throw new RangeError(\"Selection passed to setSelection must point at the current document\");\n        this.curSelection = selection;\n        this.curSelectionFor = this.steps.length;\n        this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n        this.storedMarks = null;\n        return this;\n    }\n    /**\n    Whether the selection was explicitly updated by this transaction.\n    */\n    get selectionSet() {\n        return (this.updated & UPDATED_SEL) > 0;\n    }\n    /**\n    Set the current stored marks.\n    */\n    setStoredMarks(marks) {\n        this.storedMarks = marks;\n        this.updated |= UPDATED_MARKS;\n        return this;\n    }\n    /**\n    Make sure the current stored marks or, if that is null, the marks\n    at the selection, match the given set of marks. Does nothing if\n    this is already the case.\n    */\n    ensureMarks(marks) {\n        if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n            this.setStoredMarks(marks);\n        return this;\n    }\n    /**\n    Add a mark to the set of stored marks.\n    */\n    addStoredMark(mark) {\n        return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Remove a mark or mark type from the set of stored marks.\n    */\n    removeStoredMark(mark) {\n        return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Whether the stored marks were explicitly set for this transaction.\n    */\n    get storedMarksSet() {\n        return (this.updated & UPDATED_MARKS) > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        super.addStep(step, doc);\n        this.updated = this.updated & ~UPDATED_MARKS;\n        this.storedMarks = null;\n    }\n    /**\n    Update the timestamp for the transaction.\n    */\n    setTime(time) {\n        this.time = time;\n        return this;\n    }\n    /**\n    Replace the current selection with the given slice.\n    */\n    replaceSelection(slice) {\n        this.selection.replace(this, slice);\n        return this;\n    }\n    /**\n    Replace the selection with the given node. When `inheritMarks` is\n    true and the content is inline, it inherits the marks from the\n    place where it is inserted.\n    */\n    replaceSelectionWith(node, inheritMarks = true) {\n        let selection = this.selection;\n        if (inheritMarks)\n            node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none)));\n        selection.replaceWith(this, node);\n        return this;\n    }\n    /**\n    Delete the selection.\n    */\n    deleteSelection() {\n        this.selection.replace(this);\n        return this;\n    }\n    /**\n    Replace the given range, or the selection if no range is given,\n    with a text node containing the given string.\n    */\n    insertText(text, from, to) {\n        let schema = this.doc.type.schema;\n        if (from == null) {\n            if (!text)\n                return this.deleteSelection();\n            return this.replaceSelectionWith(schema.text(text), true);\n        }\n        else {\n            if (to == null)\n                to = from;\n            to = to == null ? from : to;\n            if (!text)\n                return this.deleteRange(from, to);\n            let marks = this.storedMarks;\n            if (!marks) {\n                let $from = this.doc.resolve(from);\n                marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n            }\n            this.replaceRangeWith(from, to, schema.text(text, marks));\n            if (!this.selection.empty)\n                this.setSelection(Selection.near(this.selection.$to));\n            return this;\n        }\n    }\n    /**\n    Store a metadata property in this transaction, keyed either by\n    name or by plugin.\n    */\n    setMeta(key, value) {\n        this.meta[typeof key == \"string\" ? key : key.key] = value;\n        return this;\n    }\n    /**\n    Retrieve a metadata property for a given name or plugin.\n    */\n    getMeta(key) {\n        return this.meta[typeof key == \"string\" ? key : key.key];\n    }\n    /**\n    Returns true if this transaction doesn't contain any metadata,\n    and can thus safely be extended.\n    */\n    get isGeneric() {\n        for (let _ in this.meta)\n            return false;\n        return true;\n    }\n    /**\n    Indicate that the editor should scroll the selection into view\n    when updated to the state produced by this transaction.\n    */\n    scrollIntoView() {\n        this.updated |= UPDATED_SCROLL;\n        return this;\n    }\n    /**\n    True when this transaction has had `scrollIntoView` called on it.\n    */\n    get scrolledIntoView() {\n        return (this.updated & UPDATED_SCROLL) > 0;\n    }\n}\n\nfunction bind(f, self) {\n    return !self || !f ? f : f.bind(self);\n}\nclass FieldDesc {\n    constructor(name, desc, self) {\n        this.name = name;\n        this.init = bind(desc.init, self);\n        this.apply = bind(desc.apply, self);\n    }\n}\nconst baseFields = [\n    new FieldDesc(\"doc\", {\n        init(config) { return config.doc || config.schema.topNodeType.createAndFill(); },\n        apply(tr) { return tr.doc; }\n    }),\n    new FieldDesc(\"selection\", {\n        init(config, instance) { return config.selection || Selection.atStart(instance.doc); },\n        apply(tr) { return tr.selection; }\n    }),\n    new FieldDesc(\"storedMarks\", {\n        init(config) { return config.storedMarks || null; },\n        apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null; }\n    }),\n    new FieldDesc(\"scrollToSelection\", {\n        init() { return 0; },\n        apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev; }\n    })\n];\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nclass Configuration {\n    constructor(schema, plugins) {\n        this.schema = schema;\n        this.plugins = [];\n        this.pluginsByKey = Object.create(null);\n        this.fields = baseFields.slice();\n        if (plugins)\n            plugins.forEach(plugin => {\n                if (this.pluginsByKey[plugin.key])\n                    throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\");\n                this.plugins.push(plugin);\n                this.pluginsByKey[plugin.key] = plugin;\n                if (plugin.spec.state)\n                    this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin));\n            });\n    }\n}\n/**\nThe state of a ProseMirror editor is represented by an object of\nthis type. A state is a persistent data structure—it isn't\nupdated, but rather a new state value is computed from an old one\nusing the [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) method.\n\nA state holds a number of built-in fields, and plugins can\n[define](https://prosemirror.net/docs/ref/#state.PluginSpec.state) additional fields.\n*/\nclass EditorState {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    @internal\n    */\n    config) {\n        this.config = config;\n    }\n    /**\n    The schema of the state's document.\n    */\n    get schema() {\n        return this.config.schema;\n    }\n    /**\n    The plugins that are active in this state.\n    */\n    get plugins() {\n        return this.config.plugins;\n    }\n    /**\n    Apply the given transaction to produce a new state.\n    */\n    apply(tr) {\n        return this.applyTransaction(tr).state;\n    }\n    /**\n    @internal\n    */\n    filterTransaction(tr, ignore = -1) {\n        for (let i = 0; i < this.config.plugins.length; i++)\n            if (i != ignore) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n                    return false;\n            }\n        return true;\n    }\n    /**\n    Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that\n    returns the precise transactions that were applied (which might\n    be influenced by the [transaction\n    hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of\n    plugins) along with the new state.\n    */\n    applyTransaction(rootTr) {\n        if (!this.filterTransaction(rootTr))\n            return { state: this, transactions: [] };\n        let trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n        // This loop repeatedly gives plugins a chance to respond to\n        // transactions as new transactions are added, making sure to only\n        // pass the transactions the plugin did not see before.\n        for (;;) {\n            let haveNew = false;\n            for (let i = 0; i < this.config.plugins.length; i++) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.appendTransaction) {\n                    let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n                    let tr = n < trs.length &&\n                        plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n                    if (tr && newState.filterTransaction(tr, i)) {\n                        tr.setMeta(\"appendedTransaction\", rootTr);\n                        if (!seen) {\n                            seen = [];\n                            for (let j = 0; j < this.config.plugins.length; j++)\n                                seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 });\n                        }\n                        trs.push(tr);\n                        newState = newState.applyInner(tr);\n                        haveNew = true;\n                    }\n                    if (seen)\n                        seen[i] = { state: newState, n: trs.length };\n                }\n            }\n            if (!haveNew)\n                return { state: newState, transactions: trs };\n        }\n    }\n    /**\n    @internal\n    */\n    applyInner(tr) {\n        if (!tr.before.eq(this.doc))\n            throw new RangeError(\"Applying a mismatched transaction\");\n        let newInstance = new EditorState(this.config), fields = this.config.fields;\n        for (let i = 0; i < fields.length; i++) {\n            let field = fields[i];\n            newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n        }\n        return newInstance;\n    }\n    /**\n    Start a [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state.\n    */\n    get tr() { return new Transaction(this); }\n    /**\n    Create a new state.\n    */\n    static create(config) {\n        let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n        let instance = new EditorState($config);\n        for (let i = 0; i < $config.fields.length; i++)\n            instance[$config.fields[i].name] = $config.fields[i].init(config, instance);\n        return instance;\n    }\n    /**\n    Create a new state based on this one, but with an adjusted set\n    of active plugins. State fields that exist in both sets of\n    plugins are kept unchanged. Those that no longer exist are\n    dropped, and those that are new are initialized using their\n    [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new\n    configuration object..\n    */\n    reconfigure(config) {\n        let $config = new Configuration(this.schema, config.plugins);\n        let fields = $config.fields, instance = new EditorState($config);\n        for (let i = 0; i < fields.length; i++) {\n            let name = fields[i].name;\n            instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n        }\n        return instance;\n    }\n    /**\n    Serialize this state to JSON. If you want to serialize the state\n    of plugins, pass an object mapping property names to use in the\n    resulting JSON object to plugin objects. The argument may also be\n    a string or number, in which case it is ignored, to support the\n    way `JSON.stringify` calls `toString` methods.\n    */\n    toJSON(pluginFields) {\n        let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() };\n        if (this.storedMarks)\n            result.storedMarks = this.storedMarks.map(m => m.toJSON());\n        if (pluginFields && typeof pluginFields == 'object')\n            for (let prop in pluginFields) {\n                if (prop == \"doc\" || prop == \"selection\")\n                    throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\");\n                let plugin = pluginFields[prop], state = plugin.spec.state;\n                if (state && state.toJSON)\n                    result[prop] = state.toJSON.call(plugin, this[plugin.key]);\n            }\n        return result;\n    }\n    /**\n    Deserialize a JSON representation of a state. `config` should\n    have at least a `schema` field, and should contain array of\n    plugins to initialize the state with. `pluginFields` can be used\n    to deserialize the state of plugins, by associating plugin\n    instances with the property names they use in the JSON object.\n    */\n    static fromJSON(config, json, pluginFields) {\n        if (!json)\n            throw new RangeError(\"Invalid input for EditorState.fromJSON\");\n        if (!config.schema)\n            throw new RangeError(\"Required config field 'schema' missing\");\n        let $config = new Configuration(config.schema, config.plugins);\n        let instance = new EditorState($config);\n        $config.fields.forEach(field => {\n            if (field.name == \"doc\") {\n                instance.doc = Node.fromJSON(config.schema, json.doc);\n            }\n            else if (field.name == \"selection\") {\n                instance.selection = Selection.fromJSON(instance.doc, json.selection);\n            }\n            else if (field.name == \"storedMarks\") {\n                if (json.storedMarks)\n                    instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON);\n            }\n            else {\n                if (pluginFields)\n                    for (let prop in pluginFields) {\n                        let plugin = pluginFields[prop], state = plugin.spec.state;\n                        if (plugin.key == field.name && state && state.fromJSON &&\n                            Object.prototype.hasOwnProperty.call(json, prop)) {\n                            instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n                            return;\n                        }\n                    }\n                instance[field.name] = field.init(config, instance);\n            }\n        });\n        return instance;\n    }\n}\n\nfunction bindProps(obj, self, target) {\n    for (let prop in obj) {\n        let val = obj[prop];\n        if (val instanceof Function)\n            val = val.bind(self);\n        else if (prop == \"handleDOMEvents\")\n            val = bindProps(val, self, {});\n        target[prop] = val;\n    }\n    return target;\n}\n/**\nPlugins bundle functionality that can be added to an editor.\nThey are part of the [editor state](https://prosemirror.net/docs/ref/#state.EditorState) and\nmay influence that state and the view that contains it.\n*/\nclass Plugin {\n    /**\n    Create a plugin.\n    */\n    constructor(\n    /**\n    The plugin's [spec object](https://prosemirror.net/docs/ref/#state.PluginSpec).\n    */\n    spec) {\n        this.spec = spec;\n        /**\n        The [props](https://prosemirror.net/docs/ref/#view.EditorProps) exported by this plugin.\n        */\n        this.props = {};\n        if (spec.props)\n            bindProps(spec.props, this, this.props);\n        this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n    }\n    /**\n    Extract the plugin's state field from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\nconst keys = Object.create(null);\nfunction createKey(name) {\n    if (name in keys)\n        return name + \"$\" + ++keys[name];\n    keys[name] = 0;\n    return name + \"$\";\n}\n/**\nA key is used to [tag](https://prosemirror.net/docs/ref/#state.PluginSpec.key) plugins in a way\nthat makes it possible to find them, given an editor state.\nAssigning a key does mean only one plugin of that type can be\nactive in a state.\n*/\nclass PluginKey {\n    /**\n    Create a plugin key.\n    */\n    constructor(name = \"key\") { this.key = createKey(name); }\n    /**\n    Get the active plugin with this key, if any, from an editor\n    state.\n    */\n    get(state) { return state.config.pluginsByKey[this.key]; }\n    /**\n    Get the plugin's state from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n","import { TextSelection, NodeSelection, AllSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n    for (var index = 0;; index++) {\n        node = node.previousSibling;\n        if (!node)\n            return index;\n    }\n};\nconst parentNode = function (node) {\n    let parent = node.assignedSlot || node.parentNode;\n    return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n    let range = reusedRange || (reusedRange = document.createRange());\n    range.setEnd(node, to == null ? node.nodeValue.length : to);\n    range.setStart(node, from || 0);\n    return range;\n};\nconst clearReusedRange = function () {\n    reusedRange = null;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n    return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n        scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n    var _a;\n    for (;;) {\n        if (node == targetNode && off == targetOff)\n            return true;\n        if (off == (dir < 0 ? 0 : nodeSize(node))) {\n            let parent = node.parentNode;\n            if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n                node.contentEditable == \"false\")\n                return false;\n            off = domIndex(node) + (dir < 0 ? 0 : 1);\n            node = parent;\n        }\n        else if (node.nodeType == 1) {\n            let child = node.childNodes[off + (dir < 0 ? -1 : 0)];\n            if (child.nodeType == 1 && child.contentEditable == \"false\") {\n                if ((_a = child.pmViewDesc) === null || _a === void 0 ? void 0 : _a.ignoreForSelection)\n                    off += dir;\n                else\n                    return false;\n            }\n            else {\n                node = child;\n                off = dir < 0 ? nodeSize(node) : 0;\n            }\n        }\n        else {\n            return false;\n        }\n    }\n}\nfunction nodeSize(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction textNodeBefore$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset)\n            return node;\n        if (node.nodeType == 1 && offset > 0) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset - 1];\n            offset = nodeSize(node);\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node);\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction textNodeAfter$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset < node.nodeValue.length)\n            return node;\n        if (node.nodeType == 1 && offset < node.childNodes.length) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset];\n            offset = 0;\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node) + 1;\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction isOnEdge(node, offset, parent) {\n    for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n        if (node == parent)\n            return true;\n        let index = domIndex(node);\n        node = node.parentNode;\n        if (!node)\n            return false;\n        atStart = atStart && index == 0;\n        atEnd = atEnd && index == nodeSize(node);\n    }\n}\nfunction hasBlockDesc(dom) {\n    let desc;\n    for (let cur = dom; cur; cur = cur.parentNode)\n        if (desc = cur.pmViewDesc)\n            break;\n    return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n    return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"keydown\", true, true);\n    event.keyCode = keyCode;\n    event.key = event.code = key;\n    return event;\n}\nfunction deepActiveElement(doc) {\n    let elt = doc.activeElement;\n    while (elt && elt.shadowRoot)\n        elt = elt.shadowRoot.activeElement;\n    return elt;\n}\nfunction caretFromPoint(doc, x, y) {\n    if (doc.caretPositionFromPoint) {\n        try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n            let pos = doc.caretPositionFromPoint(x, y);\n            // Clip the offset, because Chrome will return a text offset\n            // into <input> nodes, which can't be treated as a regular DOM\n            // offset\n            if (pos)\n                return { node: pos.offsetNode, offset: Math.min(nodeSize(pos.offsetNode), pos.offset) };\n        }\n        catch (_) { }\n    }\n    if (doc.caretRangeFromPoint) {\n        let range = doc.caretRangeFromPoint(x, y);\n        if (range)\n            return { node: range.startContainer, offset: Math.min(nodeSize(range.startContainer), range.startOffset) };\n    }\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n    let vp = doc.defaultView && doc.defaultView.visualViewport;\n    if (vp)\n        return {\n            left: 0, right: vp.width,\n            top: 0, bottom: vp.height\n        };\n    return { left: 0, right: doc.documentElement.clientWidth,\n        top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n    return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n    let rect = node.getBoundingClientRect();\n    // Adjust for elements with style \"transform: scale()\"\n    let scaleX = (rect.width / node.offsetWidth) || 1;\n    let scaleY = (rect.height / node.offsetHeight) || 1;\n    // Make sure scrollbar width isn't included in the rectangle\n    return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n        top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n    let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n    let doc = view.dom.ownerDocument;\n    for (let parent = startDOM || view.dom;;) {\n        if (!parent)\n            break;\n        if (parent.nodeType != 1) {\n            parent = parentNode(parent);\n            continue;\n        }\n        let elt = parent;\n        let atTop = elt == doc.body;\n        let bounding = atTop ? windowRect(doc) : clientRect(elt);\n        let moveX = 0, moveY = 0;\n        if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n            moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n        else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n            moveY = rect.bottom - rect.top > bounding.bottom - bounding.top\n                ? rect.top + getSide(scrollMargin, \"top\") - bounding.top\n                : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n        if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n            moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n        else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n            moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n        if (moveX || moveY) {\n            if (atTop) {\n                doc.defaultView.scrollBy(moveX, moveY);\n            }\n            else {\n                let startX = elt.scrollLeft, startY = elt.scrollTop;\n                if (moveY)\n                    elt.scrollTop += moveY;\n                if (moveX)\n                    elt.scrollLeft += moveX;\n                let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n                rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n            }\n        }\n        let pos = atTop ? \"fixed\" : getComputedStyle(parent).position;\n        if (/^(fixed|sticky)$/.test(pos))\n            break;\n        parent = pos == \"absolute\" ? parent.offsetParent : parentNode(parent);\n    }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n    let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n    let refDOM, refTop;\n    for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n        let dom = view.root.elementFromPoint(x, y);\n        if (!dom || dom == view.dom || !view.dom.contains(dom))\n            continue;\n        let localRect = dom.getBoundingClientRect();\n        if (localRect.top >= startY - 20) {\n            refDOM = dom;\n            refTop = localRect.top;\n            break;\n        }\n    }\n    return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n    let stack = [], doc = dom.ownerDocument;\n    for (let cur = dom; cur; cur = parentNode(cur)) {\n        stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n        if (dom == doc)\n            break;\n    }\n    return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n    let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n    restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n    for (let i = 0; i < stack.length; i++) {\n        let { dom, top, left } = stack[i];\n        if (dom.scrollTop != top + dTop)\n            dom.scrollTop = top + dTop;\n        if (dom.scrollLeft != left)\n            dom.scrollLeft = left;\n    }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n    if (dom.setActive)\n        return dom.setActive(); // in IE\n    if (preventScrollSupported)\n        return dom.focus(preventScrollSupported);\n    let stored = scrollStack(dom);\n    dom.focus(preventScrollSupported == null ? {\n        get preventScroll() {\n            preventScrollSupported = { preventScroll: true };\n            return true;\n        }\n    } : undefined);\n    if (!preventScrollSupported) {\n        preventScrollSupported = false;\n        restoreScrollStack(stored, 0);\n    }\n}\nfunction findOffsetInNode(node, coords) {\n    let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n    let rowBot = coords.top, rowTop = coords.top;\n    let firstBelow, coordsBelow;\n    for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n        let rects;\n        if (child.nodeType == 1)\n            rects = child.getClientRects();\n        else if (child.nodeType == 3)\n            rects = textRange(child).getClientRects();\n        else\n            continue;\n        for (let i = 0; i < rects.length; i++) {\n            let rect = rects[i];\n            if (rect.top <= rowBot && rect.bottom >= rowTop) {\n                rowBot = Math.max(rect.bottom, rowBot);\n                rowTop = Math.min(rect.top, rowTop);\n                let dx = rect.left > coords.left ? rect.left - coords.left\n                    : rect.right < coords.left ? coords.left - rect.right : 0;\n                if (dx < dxClosest) {\n                    closest = child;\n                    dxClosest = dx;\n                    coordsClosest = dx && closest.nodeType == 3 ? {\n                        left: rect.right < coords.left ? rect.right : rect.left,\n                        top: coords.top\n                    } : coords;\n                    if (child.nodeType == 1 && dx)\n                        offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n                    continue;\n                }\n            }\n            else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n                firstBelow = child;\n                coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n            }\n            if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n                coords.left >= rect.left && coords.top >= rect.bottom))\n                offset = childIndex + 1;\n        }\n    }\n    if (!closest && firstBelow) {\n        closest = firstBelow;\n        coordsClosest = coordsBelow;\n        dxClosest = 0;\n    }\n    if (closest && closest.nodeType == 3)\n        return findOffsetInText(closest, coordsClosest);\n    if (!closest || (dxClosest && closest.nodeType == 1))\n        return { node, offset };\n    return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n    let len = node.nodeValue.length;\n    let range = document.createRange();\n    for (let i = 0; i < len; i++) {\n        range.setEnd(node, i + 1);\n        range.setStart(node, i);\n        let rect = singleRect(range, 1);\n        if (rect.top == rect.bottom)\n            continue;\n        if (inRect(coords, rect))\n            return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n    }\n    return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n    return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n        coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n    let parent = dom.parentNode;\n    if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n        return parent;\n    return dom;\n}\nfunction posFromElement(view, elt, coords) {\n    let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n    if (node.nodeType == 1 && !node.firstChild) {\n        let rect = node.getBoundingClientRect();\n        bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n    }\n    return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n    // Browser (in caretPosition/RangeFromPoint) will agressively\n    // normalize towards nearby inline nodes. Since we are interested in\n    // positions between block nodes too, we first walk up the hierarchy\n    // of nodes to see if there are block nodes that the coordinates\n    // fall outside of. If so, we take the position before/after that\n    // block. If not, we call `posFromDOM` on the raw node/offset.\n    let outsideBlock = -1;\n    for (let cur = node, sawBlock = false;;) {\n        if (cur == view.dom)\n            break;\n        let desc = view.docView.nearestDesc(cur, true), rect;\n        if (!desc)\n            return null;\n        if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&\n            // Ignore elements with zero-size bounding rectangles\n            ((rect = desc.dom.getBoundingClientRect()).width || rect.height)) {\n            if (desc.node.isBlock && desc.parent) {\n                // Only apply the horizontal test to the innermost block. Vertical for any parent.\n                if (!sawBlock && rect.left > coords.left || rect.top > coords.top)\n                    outsideBlock = desc.posBefore;\n                else if (!sawBlock && rect.right < coords.left || rect.bottom < coords.top)\n                    outsideBlock = desc.posAfter;\n                sawBlock = true;\n            }\n            if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n                // If we are inside a leaf, return the side of the leaf closer to the coords\n                let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n                    : coords.left < (rect.left + rect.right) / 2;\n                return before ? desc.posBefore : desc.posAfter;\n            }\n        }\n        cur = desc.dom.parentNode;\n    }\n    return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n    let len = element.childNodes.length;\n    if (len && box.top < box.bottom) {\n        for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n            let child = element.childNodes[i];\n            if (child.nodeType == 1) {\n                let rects = child.getClientRects();\n                for (let j = 0; j < rects.length; j++) {\n                    let rect = rects[j];\n                    if (inRect(coords, rect))\n                        return elementFromPoint(child, coords, rect);\n                }\n            }\n            if ((i = (i + 1) % len) == startI)\n                break;\n        }\n    }\n    return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n    let doc = view.dom.ownerDocument, node, offset = 0;\n    let caret = caretFromPoint(doc, coords.left, coords.top);\n    if (caret)\n        ({ node, offset } = caret);\n    let elt = (view.root.elementFromPoint ? view.root : doc)\n        .elementFromPoint(coords.left, coords.top);\n    let pos;\n    if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n        let box = view.dom.getBoundingClientRect();\n        if (!inRect(coords, box))\n            return null;\n        elt = elementFromPoint(view.dom, coords, box);\n        if (!elt)\n            return null;\n    }\n    // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n    if (safari) {\n        for (let p = elt; node && p; p = parentNode(p))\n            if (p.draggable)\n                node = undefined;\n    }\n    elt = targetKludge(elt, coords);\n    if (node) {\n        if (gecko && node.nodeType == 1) {\n            // Firefox will sometimes return offsets into <input> nodes, which\n            // have no actual children, from caretPositionFromPoint (#953)\n            offset = Math.min(offset, node.childNodes.length);\n            // It'll also move the returned position before image nodes,\n            // even if those are behind it.\n            if (offset < node.childNodes.length) {\n                let next = node.childNodes[offset], box;\n                if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n                    box.bottom > coords.top)\n                    offset++;\n            }\n        }\n        let prev;\n        // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.\n        if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&\n            prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n            offset--;\n        // Suspiciously specific kludge to work around caret*FromPoint\n        // never returning a position at the end of the document\n        if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n            coords.top > node.lastChild.getBoundingClientRect().bottom)\n            pos = view.state.doc.content.size;\n        // Ignore positions directly after a BR, since caret*FromPoint\n        // 'round up' positions that would be more accurately placed\n        // before the BR node.\n        else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n            pos = posFromCaret(view, node, offset, coords);\n    }\n    if (pos == null)\n        pos = posFromElement(view, elt, coords);\n    let desc = view.docView.nearestDesc(elt, true);\n    return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n    return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n    let rects = target.getClientRects();\n    if (rects.length) {\n        let first = rects[bias < 0 ? 0 : rects.length - 1];\n        if (nonZero(first))\n            return first;\n    }\n    return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n    let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n    let supportEmptyRange = webkit || gecko;\n    if (node.nodeType == 3) {\n        // These browsers support querying empty text ranges. Prefer that in\n        // bidi context or when at the end of a node.\n        if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n            let rect = singleRect(textRange(node, offset, offset), side);\n            // Firefox returns bad results (the position before the space)\n            // when querying a position directly after line-broken\n            // whitespace. Detect this situation and and kludge around it\n            if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n                let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n                if (rectBefore.top == rect.top) {\n                    let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n                    if (rectAfter.top != rect.top)\n                        return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n                }\n            }\n            return rect;\n        }\n        else {\n            let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n            if (side < 0 && !offset) {\n                to++;\n                takeSide = -1;\n            }\n            else if (side >= 0 && offset == node.nodeValue.length) {\n                from--;\n                takeSide = 1;\n            }\n            else if (side < 0) {\n                from--;\n            }\n            else {\n                to++;\n            }\n            return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n        }\n    }\n    let $dom = view.state.doc.resolve(pos - (atom || 0));\n    // Return a horizontal line in block context\n    if (!$dom.parent.inlineContent) {\n        if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n            let before = node.childNodes[offset - 1];\n            if (before.nodeType == 1)\n                return flattenH(before.getBoundingClientRect(), false);\n        }\n        if (atom == null && offset < nodeSize(node)) {\n            let after = node.childNodes[offset];\n            if (after.nodeType == 1)\n                return flattenH(after.getBoundingClientRect(), true);\n        }\n        return flattenH(node.getBoundingClientRect(), side >= 0);\n    }\n    // Inline, not in text node (this is not Bidi-safe)\n    if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n        let before = node.childNodes[offset - 1];\n        let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n            // BR nodes tend to only return the rectangle before them.\n            // Only use them if they are the last element in their parent\n            : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n        if (target)\n            return flattenV(singleRect(target, 1), false);\n    }\n    if (atom == null && offset < nodeSize(node)) {\n        let after = node.childNodes[offset];\n        while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n            after = after.nextSibling;\n        let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n            : after.nodeType == 1 ? after : null;\n        if (target)\n            return flattenV(singleRect(target, -1), true);\n    }\n    // All else failed, just try to get a rectangle for the target node\n    return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n    if (rect.width == 0)\n        return rect;\n    let x = left ? rect.left : rect.right;\n    return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n    if (rect.height == 0)\n        return rect;\n    let y = top ? rect.top : rect.bottom;\n    return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n    let viewState = view.state, active = view.root.activeElement;\n    if (viewState != state)\n        view.updateState(state);\n    if (active != view.dom)\n        view.focus();\n    try {\n        return f();\n    }\n    finally {\n        if (viewState != state)\n            view.updateState(viewState);\n        if (active != view.dom && active)\n            active.focus();\n    }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n    let sel = state.selection;\n    let $pos = dir == \"up\" ? sel.$from : sel.$to;\n    return withFlushedState(view, state, () => {\n        let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n        for (;;) {\n            let nearest = view.docView.nearestDesc(dom, true);\n            if (!nearest)\n                break;\n            if (nearest.node.isBlock) {\n                dom = nearest.contentDOM || nearest.dom;\n                break;\n            }\n            dom = nearest.dom.parentNode;\n        }\n        let coords = coordsAtPos(view, $pos.pos, 1);\n        for (let child = dom.firstChild; child; child = child.nextSibling) {\n            let boxes;\n            if (child.nodeType == 1)\n                boxes = child.getClientRects();\n            else if (child.nodeType == 3)\n                boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n            else\n                continue;\n            for (let i = 0; i < boxes.length; i++) {\n                let box = boxes[i];\n                if (box.bottom > box.top + 1 &&\n                    (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n                        : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n                    return false;\n            }\n        }\n        return true;\n    });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n    let { $head } = state.selection;\n    if (!$head.parent.isTextblock)\n        return false;\n    let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n    let sel = view.domSelection();\n    if (!sel)\n        return $head.pos == $head.start() || $head.pos == $head.end();\n    // If the textblock is all LTR, or the browser doesn't support\n    // Selection.modify (Edge), fall back to a primitive approach\n    if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n        return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n    return withFlushedState(view, state, () => {\n        // This is a huge hack, but appears to be the best we can\n        // currently do: use `Selection.modify` to move the selection by\n        // one character, and see if that moves the cursor out of the\n        // textblock (or doesn't move it at all, when at the start/end of\n        // the document).\n        let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n        let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n        ;\n        sel.modify(\"move\", dir, \"character\");\n        let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n        let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n        let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n            (oldNode == newNode && oldOff == newOff);\n        // Restore the previous selection\n        try {\n            sel.collapse(anchorNode, anchorOffset);\n            if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n                sel.extend(oldNode, oldOff);\n        }\n        catch (_) { }\n        if (oldBidiLevel != null)\n            sel.caretBidiLevel = oldBidiLevel;\n        return result;\n    });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n    if (cachedState == state && cachedDir == dir)\n        return cachedResult;\n    cachedState = state;\n    cachedDir = dir;\n    return cachedResult = dir == \"up\" || dir == \"down\"\n        ? endOfTextblockVertical(view, state, dir)\n        : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n//   corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n//   given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n    constructor(parent, children, dom, \n    // This is the node that holds the child views. It may be null for\n    // descs that don't have children.\n    contentDOM) {\n        this.parent = parent;\n        this.children = children;\n        this.dom = dom;\n        this.contentDOM = contentDOM;\n        this.dirty = NOT_DIRTY;\n        // An expando property on the DOM node provides a link back to its\n        // description.\n        dom.pmViewDesc = this;\n    }\n    // Used to check whether a given description corresponds to a\n    // widget/mark/node.\n    matchesWidget(widget) { return false; }\n    matchesMark(mark) { return false; }\n    matchesNode(node, outerDeco, innerDeco) { return false; }\n    matchesHack(nodeName) { return false; }\n    // When parsing in-editor content (in domchange.js), we allow\n    // descriptions to determine the parse rules that should be used to\n    // parse them.\n    parseRule() { return null; }\n    // Used by the editor's event handler to ignore events that come\n    // from certain descs.\n    stopEvent(event) { return false; }\n    // The size of the content represented by this desc.\n    get size() {\n        let size = 0;\n        for (let i = 0; i < this.children.length; i++)\n            size += this.children[i].size;\n        return size;\n    }\n    // For block nodes, this represents the space taken up by their\n    // start/end tokens.\n    get border() { return 0; }\n    destroy() {\n        this.parent = undefined;\n        if (this.dom.pmViewDesc == this)\n            this.dom.pmViewDesc = undefined;\n        for (let i = 0; i < this.children.length; i++)\n            this.children[i].destroy();\n    }\n    posBeforeChild(child) {\n        for (let i = 0, pos = this.posAtStart;; i++) {\n            let cur = this.children[i];\n            if (cur == child)\n                return pos;\n            pos += cur.size;\n        }\n    }\n    get posBefore() {\n        return this.parent.posBeforeChild(this);\n    }\n    get posAtStart() {\n        return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n    }\n    get posAfter() {\n        return this.posBefore + this.size;\n    }\n    get posAtEnd() {\n        return this.posAtStart + this.size - 2 * this.border;\n    }\n    localPosFromDOM(dom, offset, bias) {\n        // If the DOM position is in the content, use the child desc after\n        // it to figure out a position.\n        if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n            if (bias < 0) {\n                let domBefore, desc;\n                if (dom == this.contentDOM) {\n                    domBefore = dom.childNodes[offset - 1];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domBefore = dom.previousSibling;\n                }\n                while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n                    domBefore = domBefore.previousSibling;\n                return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n            }\n            else {\n                let domAfter, desc;\n                if (dom == this.contentDOM) {\n                    domAfter = dom.childNodes[offset];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domAfter = dom.nextSibling;\n                }\n                while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n                    domAfter = domAfter.nextSibling;\n                return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n            }\n        }\n        // Otherwise, use various heuristics, falling back on the bias\n        // parameter, to determine whether to return the position at the\n        // start or at the end of this view desc.\n        let atEnd;\n        if (dom == this.dom && this.contentDOM) {\n            atEnd = offset > domIndex(this.contentDOM);\n        }\n        else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n            atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n        }\n        else if (this.dom.firstChild) {\n            if (offset == 0)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = false;\n                        break;\n                    }\n                    if (search.previousSibling)\n                        break;\n                }\n            if (atEnd == null && offset == dom.childNodes.length)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = true;\n                        break;\n                    }\n                    if (search.nextSibling)\n                        break;\n                }\n        }\n        return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n    }\n    nearestDesc(dom, onlyNodes = false) {\n        for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n            let desc = this.getDesc(cur), nodeDOM;\n            if (desc && (!onlyNodes || desc.node)) {\n                // If dom is outside of this desc's nodeDOM, don't count it.\n                if (first && (nodeDOM = desc.nodeDOM) &&\n                    !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n                    first = false;\n                else\n                    return desc;\n            }\n        }\n    }\n    getDesc(dom) {\n        let desc = dom.pmViewDesc;\n        for (let cur = desc; cur; cur = cur.parent)\n            if (cur == this)\n                return desc;\n    }\n    posFromDOM(dom, offset, bias) {\n        for (let scan = dom; scan; scan = scan.parentNode) {\n            let desc = this.getDesc(scan);\n            if (desc)\n                return desc.localPosFromDOM(dom, offset, bias);\n        }\n        return -1;\n    }\n    // Find the desc for the node after the given pos, if any. (When a\n    // parent node overrode rendering, there might not be one.)\n    descAt(pos) {\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == pos && end != offset) {\n                while (!child.border && child.children.length) {\n                    for (let i = 0; i < child.children.length; i++) {\n                        let inner = child.children[i];\n                        if (inner.size) {\n                            child = inner;\n                            break;\n                        }\n                    }\n                }\n                return child;\n            }\n            if (pos < end)\n                return child.descAt(pos - offset - child.border);\n            offset = end;\n        }\n    }\n    domFromPos(pos, side) {\n        if (!this.contentDOM)\n            return { node: this.dom, offset: 0, atom: pos + 1 };\n        // First find the position in the child array\n        let i = 0, offset = 0;\n        for (let curPos = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = curPos + child.size;\n            if (end > pos || child instanceof TrailingHackViewDesc) {\n                offset = pos - curPos;\n                break;\n            }\n            curPos = end;\n        }\n        // If this points into the middle of a child, call through\n        if (offset)\n            return this.children[i].domFromPos(offset - this.children[i].border, side);\n        // Go back if there were any zero-length widgets with side >= 0 before this point\n        for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n        // Scan towards the first useable node\n        if (side <= 0) {\n            let prev, enter = true;\n            for (;; i--, enter = false) {\n                prev = i ? this.children[i - 1] : null;\n                if (!prev || prev.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (prev && side && enter && !prev.border && !prev.domAtom)\n                return prev.domFromPos(prev.size, side);\n            return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n        }\n        else {\n            let next, enter = true;\n            for (;; i++, enter = false) {\n                next = i < this.children.length ? this.children[i] : null;\n                if (!next || next.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (next && enter && !next.border && !next.domAtom)\n                return next.domFromPos(0, side);\n            return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n        }\n    }\n    // Used to find a DOM range in a single parent for a given changed\n    // range.\n    parseRange(from, to, base = 0) {\n        if (this.children.length == 0)\n            return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n        let fromOffset = -1, toOffset = -1;\n        for (let offset = base, i = 0;; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (fromOffset == -1 && from <= end) {\n                let childBase = offset + child.border;\n                // FIXME maybe descend mark views to parse a narrower range?\n                if (from >= childBase && to <= end - child.border && child.node &&\n                    child.contentDOM && this.contentDOM.contains(child.contentDOM))\n                    return child.parseRange(from, to, childBase);\n                from = offset;\n                for (let j = i; j > 0; j--) {\n                    let prev = this.children[j - 1];\n                    if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n                        fromOffset = domIndex(prev.dom) + 1;\n                        break;\n                    }\n                    from -= prev.size;\n                }\n                if (fromOffset == -1)\n                    fromOffset = 0;\n            }\n            if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n                to = end;\n                for (let j = i + 1; j < this.children.length; j++) {\n                    let next = this.children[j];\n                    if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n                        toOffset = domIndex(next.dom);\n                        break;\n                    }\n                    to += next.size;\n                }\n                if (toOffset == -1)\n                    toOffset = this.contentDOM.childNodes.length;\n                break;\n            }\n            offset = end;\n        }\n        return { node: this.contentDOM, from, to, fromOffset, toOffset };\n    }\n    emptyChildAt(side) {\n        if (this.border || !this.contentDOM || !this.children.length)\n            return false;\n        let child = this.children[side < 0 ? 0 : this.children.length - 1];\n        return child.size == 0 || child.emptyChildAt(side);\n    }\n    domAfterPos(pos) {\n        let { node, offset } = this.domFromPos(pos, 0);\n        if (node.nodeType != 1 || offset == node.childNodes.length)\n            throw new RangeError(\"No node after pos \" + pos);\n        return node.childNodes[offset];\n    }\n    // View descs are responsible for setting any selection that falls\n    // entirely inside of them, so that custom implementations can do\n    // custom things with the selection. Note that this falls apart when\n    // a selection starts in such a node and ends in another, in which\n    // case we just use whatever domFromPos produces as a best effort.\n    setSelection(anchor, head, view, force = false) {\n        // If the selection falls entirely in a child, give it to that child\n        let from = Math.min(anchor, head), to = Math.max(anchor, head);\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (from > offset && to < end)\n                return child.setSelection(anchor - offset - child.border, head - offset - child.border, view, force);\n            offset = end;\n        }\n        let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n        let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n        let domSel = view.root.getSelection();\n        let selRange = view.domSelectionRange();\n        let brKludge = false;\n        // On Firefox, using Selection.collapse to put the cursor after a\n        // BR node for some reason doesn't always work (#1073). On Safari,\n        // the cursor sometimes inexplicable visually lags behind its\n        // reported position in such situations (#1092).\n        if ((gecko || safari) && anchor == head) {\n            let { node, offset } = anchorDOM;\n            if (node.nodeType == 3) {\n                brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n                // Issue #1128\n                if (brKludge && offset == node.nodeValue.length) {\n                    for (let scan = node, after; scan; scan = scan.parentNode) {\n                        if (after = scan.nextSibling) {\n                            if (after.nodeName == \"BR\")\n                                anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n                            break;\n                        }\n                        let desc = scan.pmViewDesc;\n                        if (desc && desc.node && desc.node.isBlock)\n                            break;\n                    }\n                }\n            }\n            else {\n                let prev = node.childNodes[offset - 1];\n                brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n            }\n        }\n        // Firefox can act strangely when the selection is in front of an\n        // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n        if (gecko && selRange.focusNode && selRange.focusNode != headDOM.node && selRange.focusNode.nodeType == 1) {\n            let after = selRange.focusNode.childNodes[selRange.focusOffset];\n            if (after && after.contentEditable == \"false\")\n                force = true;\n        }\n        if (!(force || brKludge && safari) &&\n            isEquivalentPosition(anchorDOM.node, anchorDOM.offset, selRange.anchorNode, selRange.anchorOffset) &&\n            isEquivalentPosition(headDOM.node, headDOM.offset, selRange.focusNode, selRange.focusOffset))\n            return;\n        // Selection.extend can be used to create an 'inverted' selection\n        // (one where the focus is before the anchor), but not all\n        // browsers support it yet.\n        let domSelExtended = false;\n        if ((domSel.extend || anchor == head) && !brKludge) {\n            domSel.collapse(anchorDOM.node, anchorDOM.offset);\n            try {\n                if (anchor != head)\n                    domSel.extend(headDOM.node, headDOM.offset);\n                domSelExtended = true;\n            }\n            catch (_) {\n                // In some cases with Chrome the selection is empty after calling\n                // collapse, even when it should be valid. This appears to be a bug, but\n                // it is difficult to isolate. If this happens fallback to the old path\n                // without using extend.\n                // Similarly, this could crash on Safari if the editor is hidden, and\n                // there was no selection.\n            }\n        }\n        if (!domSelExtended) {\n            if (anchor > head) {\n                let tmp = anchorDOM;\n                anchorDOM = headDOM;\n                headDOM = tmp;\n            }\n            let range = document.createRange();\n            range.setEnd(headDOM.node, headDOM.offset);\n            range.setStart(anchorDOM.node, anchorDOM.offset);\n            domSel.removeAllRanges();\n            domSel.addRange(range);\n        }\n    }\n    ignoreMutation(mutation) {\n        return !this.contentDOM && mutation.type != \"selection\";\n    }\n    get contentLost() {\n        return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n    }\n    // Remove a subtree of the element tree that has been touched\n    // by a DOM change, so that the next update will redraw it.\n    markDirty(from, to) {\n        for (let offset = 0, i = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n                let startInside = offset + child.border, endInside = end - child.border;\n                if (from >= startInside && to <= endInside) {\n                    this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n                    if (from == startInside && to == endInside &&\n                        (child.contentLost || child.dom.parentNode != this.contentDOM))\n                        child.dirty = NODE_DIRTY;\n                    else\n                        child.markDirty(from - startInside, to - startInside);\n                    return;\n                }\n                else {\n                    child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n                        ? CONTENT_DIRTY : NODE_DIRTY;\n                }\n            }\n            offset = end;\n        }\n        this.dirty = CONTENT_DIRTY;\n    }\n    markParentsDirty() {\n        let level = 1;\n        for (let node = this.parent; node; node = node.parent, level++) {\n            let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n            if (node.dirty < dirty)\n                node.dirty = dirty;\n        }\n    }\n    get domAtom() { return false; }\n    get ignoreForCoords() { return false; }\n    get ignoreForSelection() { return false; }\n    isText(text) { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n    constructor(parent, widget, view, pos) {\n        let self, dom = widget.type.toDOM;\n        if (typeof dom == \"function\")\n            dom = dom(view, () => {\n                if (!self)\n                    return pos;\n                if (self.parent)\n                    return self.parent.posBeforeChild(self);\n            });\n        if (!widget.type.spec.raw) {\n            if (dom.nodeType != 1) {\n                let wrap = document.createElement(\"span\");\n                wrap.appendChild(dom);\n                dom = wrap;\n            }\n            dom.contentEditable = \"false\";\n            dom.classList.add(\"ProseMirror-widget\");\n        }\n        super(parent, [], dom, null);\n        this.widget = widget;\n        this.widget = widget;\n        self = this;\n    }\n    matchesWidget(widget) {\n        return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n    }\n    parseRule() { return { ignore: true }; }\n    stopEvent(event) {\n        let stop = this.widget.spec.stopEvent;\n        return stop ? stop(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n    }\n    destroy() {\n        this.widget.type.destroy(this.dom);\n        super.destroy();\n    }\n    get domAtom() { return true; }\n    get ignoreForSelection() { return !!this.widget.type.spec.relaxedSide; }\n    get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n    constructor(parent, dom, textDOM, text) {\n        super(parent, [], dom, null);\n        this.textDOM = textDOM;\n        this.text = text;\n    }\n    get size() { return this.text.length; }\n    localPosFromDOM(dom, offset) {\n        if (dom != this.textDOM)\n            return this.posAtStart + (offset ? this.size : 0);\n        return this.posAtStart + offset;\n    }\n    domFromPos(pos) {\n        return { node: this.textDOM, offset: pos };\n    }\n    ignoreMutation(mut) {\n        return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n    }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n    constructor(parent, mark, dom, contentDOM, spec) {\n        super(parent, [], dom, contentDOM);\n        this.mark = mark;\n        this.spec = spec;\n    }\n    static create(parent, mark, inline, view) {\n        let custom = view.nodeViews[mark.type.name];\n        let spec = custom && custom(mark, view, inline);\n        if (!spec || !spec.dom)\n            spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline), null, mark.attrs);\n        return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom, spec);\n    }\n    parseRule() {\n        if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n            return null;\n        return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n    }\n    matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        // Move dirty info to nearest node view\n        if (this.dirty != NOT_DIRTY) {\n            let parent = this.parent;\n            while (!parent.node)\n                parent = parent.parent;\n            if (parent.dirty < this.dirty)\n                parent.dirty = this.dirty;\n            this.dirty = NOT_DIRTY;\n        }\n    }\n    slice(from, to, view) {\n        let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n        let nodes = this.children, size = this.size;\n        if (to < size)\n            nodes = replaceNodes(nodes, to, size, view);\n        if (from > 0)\n            nodes = replaceNodes(nodes, 0, from, view);\n        for (let i = 0; i < nodes.length; i++)\n            nodes[i].parent = copy;\n        copy.children = nodes;\n        return copy;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n        super(parent, [], dom, contentDOM);\n        this.node = node;\n        this.outerDeco = outerDeco;\n        this.innerDeco = innerDeco;\n        this.nodeDOM = nodeDOM;\n    }\n    // By default, a node is rendered using the `toDOM` method from the\n    // node type spec. But client code can use the `nodeViews` spec to\n    // supply a custom node view, which can influence various aspects of\n    // the way the node works.\n    //\n    // (Using subclassing for this was intentionally decided against,\n    // since it'd require exposing a whole slew of finicky\n    // implementation details to the user code that they probably will\n    // never need.)\n    static create(parent, node, outerDeco, innerDeco, view, pos) {\n        let custom = view.nodeViews[node.type.name], descObj;\n        let spec = custom && custom(node, view, () => {\n            // (This is a function that allows the custom view to find its\n            // own position)\n            if (!descObj)\n                return pos;\n            if (descObj.parent)\n                return descObj.parent.posBeforeChild(descObj);\n        }, outerDeco, innerDeco);\n        let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n        if (node.isText) {\n            if (!dom)\n                dom = document.createTextNode(node.text);\n            else if (dom.nodeType != 3)\n                throw new RangeError(\"Text must be rendered as a DOM text node\");\n        }\n        else if (!dom) {\n            let spec = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node), null, node.attrs);\n            ({ dom, contentDOM } = spec);\n        }\n        if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n            if (!dom.hasAttribute(\"contenteditable\"))\n                dom.contentEditable = \"false\";\n            if (node.type.spec.draggable)\n                dom.draggable = true;\n        }\n        let nodeDOM = dom;\n        dom = applyOuterDeco(dom, outerDeco, node);\n        if (spec)\n            return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n        else if (node.isText)\n            return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n        else\n            return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n    }\n    parseRule() {\n        // Experimental kludge to allow opt-in re-parsing of nodes\n        if (this.node.type.spec.reparseInView)\n            return null;\n        // FIXME the assumption that this can always return the current\n        // attrs means that if the user somehow manages to change the\n        // attrs in the dom, that won't be picked up. Not entirely sure\n        // whether this is a problem\n        let rule = { node: this.node.type.name, attrs: this.node.attrs };\n        if (this.node.type.whitespace == \"pre\")\n            rule.preserveWhitespace = \"full\";\n        if (!this.contentDOM) {\n            rule.getContent = () => this.node.content;\n        }\n        else if (!this.contentLost) {\n            rule.contentElement = this.contentDOM;\n        }\n        else {\n            // Chrome likes to randomly recreate parent nodes when\n            // backspacing things. When that happens, this tries to find the\n            // new parent.\n            for (let i = this.children.length - 1; i >= 0; i--) {\n                let child = this.children[i];\n                if (this.dom.contains(child.dom.parentNode)) {\n                    rule.contentElement = child.dom.parentNode;\n                    break;\n                }\n            }\n            if (!rule.contentElement)\n                rule.getContent = () => Fragment.empty;\n        }\n        return rule;\n    }\n    matchesNode(node, outerDeco, innerDeco) {\n        return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n            sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n    }\n    get size() { return this.node.nodeSize; }\n    get border() { return this.node.isLeaf ? 0 : 1; }\n    // Syncs `this.children` to match `this.node.content` and the local\n    // decorations, possibly introducing nesting for marks. Then, in a\n    // separate step, syncs the DOM inside `this.contentDOM` to\n    // `this.children`.\n    updateChildren(view, pos) {\n        let inline = this.node.inlineContent, off = pos;\n        let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n        let localComposition = composition && composition.pos > -1 ? composition : null;\n        let compositionInChild = composition && composition.pos < 0;\n        let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n        iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n            if (widget.spec.marks)\n                updater.syncToMarks(widget.spec.marks, inline, view);\n            else if (widget.type.side >= 0 && !insideNode)\n                updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n            // If the next node is a desc matching this widget, reuse it,\n            // otherwise insert the widget as a new view desc.\n            updater.placeWidget(widget, view, off);\n        }, (child, outerDeco, innerDeco, i) => {\n            // Make sure the wrapping mark descs match the node's marks.\n            updater.syncToMarks(child.marks, inline, view);\n            // Try several strategies for drawing this node\n            let compIndex;\n            if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n            else if (compositionInChild && view.state.selection.from > off &&\n                view.state.selection.to < off + child.nodeSize &&\n                (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n                updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n            else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) ;\n            else {\n                // Add it as a new view\n                updater.addNode(child, outerDeco, innerDeco, view, off);\n            }\n            off += child.nodeSize;\n        });\n        // Drop all remaining descs after the current position.\n        updater.syncToMarks([], inline, view);\n        if (this.node.isTextblock)\n            updater.addTextblockHacks();\n        updater.destroyRest();\n        // Sync the DOM if anything changed\n        if (updater.changed || this.dirty == CONTENT_DIRTY) {\n            // May have to protect focused DOM from being changed if a composition is active\n            if (localComposition)\n                this.protectLocalComposition(view, localComposition);\n            renderDescs(this.contentDOM, this.children, view);\n            if (ios)\n                iosHacks(this.dom);\n        }\n    }\n    localCompositionInfo(view, pos) {\n        // Only do something if both the selection and a focused text node\n        // are inside of this node\n        let { from, to } = view.state.selection;\n        if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n            return null;\n        let textNode = view.input.compositionNode;\n        if (!textNode || !this.dom.contains(textNode.parentNode))\n            return null;\n        if (this.node.inlineContent) {\n            // Find the text in the focused node in the node, stop if it's not\n            // there (may have been modified through other means, in which\n            // case it should overwritten)\n            let text = textNode.nodeValue;\n            let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n            return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n        }\n        else {\n            return { node: textNode, pos: -1, text: \"\" };\n        }\n    }\n    protectLocalComposition(view, { node, pos, text }) {\n        // The node is already part of a local view desc, leave it there\n        if (this.getDesc(node))\n            return;\n        // Create a composition view for the orphaned nodes\n        let topNode = node;\n        for (;; topNode = topNode.parentNode) {\n            if (topNode.parentNode == this.contentDOM)\n                break;\n            while (topNode.previousSibling)\n                topNode.parentNode.removeChild(topNode.previousSibling);\n            while (topNode.nextSibling)\n                topNode.parentNode.removeChild(topNode.nextSibling);\n            if (topNode.pmViewDesc)\n                topNode.pmViewDesc = undefined;\n        }\n        let desc = new CompositionViewDesc(this, topNode, node, text);\n        view.input.compositionNodes.push(desc);\n        // Patch up this.children to contain the composition view\n        this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n    }\n    // If this desc must be updated to match the given node decoration,\n    // do so and return true.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateInner(node, outerDeco, innerDeco, view);\n        return true;\n    }\n    updateInner(node, outerDeco, innerDeco, view) {\n        this.updateOuterDeco(outerDeco);\n        this.node = node;\n        this.innerDeco = innerDeco;\n        if (this.contentDOM)\n            this.updateChildren(view, this.posAtStart);\n        this.dirty = NOT_DIRTY;\n    }\n    updateOuterDeco(outerDeco) {\n        if (sameOuterDeco(outerDeco, this.outerDeco))\n            return;\n        let needsWrap = this.nodeDOM.nodeType != 1;\n        let oldDOM = this.dom;\n        this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n        if (this.dom != oldDOM) {\n            oldDOM.pmViewDesc = undefined;\n            this.dom.pmViewDesc = this;\n        }\n        this.outerDeco = outerDeco;\n    }\n    // Mark this node as being the selected node.\n    selectNode() {\n        if (this.nodeDOM.nodeType == 1)\n            this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n        if (this.contentDOM || !this.node.type.spec.draggable)\n            this.dom.draggable = true;\n    }\n    // Remove selected node marking from this node.\n    deselectNode() {\n        if (this.nodeDOM.nodeType == 1) {\n            this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n            if (this.contentDOM || !this.node.type.spec.draggable)\n                this.dom.removeAttribute(\"draggable\");\n        }\n    }\n    get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n    applyOuterDeco(dom, outerDeco, doc);\n    let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);\n    if (docView.contentDOM)\n        docView.updateChildren(view, 0);\n    return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n        super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n    }\n    parseRule() {\n        let skip = this.nodeDOM.parentNode;\n        while (skip && skip != this.dom && !skip.pmIsDeco)\n            skip = skip.parentNode;\n        return { skip: (skip || true) };\n    }\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateOuterDeco(outerDeco);\n        if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n            this.nodeDOM.nodeValue = node.text;\n            if (view.trackWrites == this.nodeDOM)\n                view.trackWrites = null;\n        }\n        this.node = node;\n        this.dirty = NOT_DIRTY;\n        return true;\n    }\n    inParent() {\n        let parentDOM = this.parent.contentDOM;\n        for (let n = this.nodeDOM; n; n = n.parentNode)\n            if (n == parentDOM)\n                return true;\n        return false;\n    }\n    domFromPos(pos) {\n        return { node: this.nodeDOM, offset: pos };\n    }\n    localPosFromDOM(dom, offset, bias) {\n        if (dom == this.nodeDOM)\n            return this.posAtStart + Math.min(offset, this.node.text.length);\n        return super.localPosFromDOM(dom, offset, bias);\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"characterData\" && mutation.type != \"selection\";\n    }\n    slice(from, to, view) {\n        let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n        return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n    }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n            this.dirty = NODE_DIRTY;\n    }\n    get domAtom() { return false; }\n    isText(text) { return this.node.text == text; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n    parseRule() { return { ignore: true }; }\n    matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n    get domAtom() { return true; }\n    get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n        super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n        this.spec = spec;\n    }\n    // A custom `update` method gets to decide whether the update goes\n    // through. If it does, and there's a `contentDOM` node, our logic\n    // updates the children.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY)\n            return false;\n        if (this.spec.update && (this.node.type == node.type || this.spec.multiType)) {\n            let result = this.spec.update(node, outerDeco, innerDeco);\n            if (result)\n                this.updateInner(node, outerDeco, innerDeco, view);\n            return result;\n        }\n        else if (!this.contentDOM && !node.isLeaf) {\n            return false;\n        }\n        else {\n            return super.update(node, outerDeco, innerDeco, view);\n        }\n    }\n    selectNode() {\n        this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n    }\n    deselectNode() {\n        this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n    }\n    setSelection(anchor, head, view, force) {\n        this.spec.setSelection ? this.spec.setSelection(anchor, head, view.root)\n            : super.setSelection(anchor, head, view, force);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n    stopEvent(event) {\n        return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n    let dom = parentDOM.firstChild, written = false;\n    for (let i = 0; i < descs.length; i++) {\n        let desc = descs[i], childDOM = desc.dom;\n        if (childDOM.parentNode == parentDOM) {\n            while (childDOM != dom) {\n                dom = rm(dom);\n                written = true;\n            }\n            dom = dom.nextSibling;\n        }\n        else {\n            written = true;\n            parentDOM.insertBefore(childDOM, dom);\n        }\n        if (desc instanceof MarkViewDesc) {\n            let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n            renderDescs(desc.contentDOM, desc.children, view);\n            dom = pos ? pos.nextSibling : parentDOM.firstChild;\n        }\n    }\n    while (dom) {\n        dom = rm(dom);\n        written = true;\n    }\n    if (written && view.trackWrites == parentDOM)\n        view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n    if (nodeName)\n        this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n    if (outerDeco.length == 0)\n        return noDeco;\n    let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n    for (let i = 0; i < outerDeco.length; i++) {\n        let attrs = outerDeco[i].type.attrs;\n        if (!attrs)\n            continue;\n        if (attrs.nodeName)\n            result.push(top = new OuterDecoLevel(attrs.nodeName));\n        for (let name in attrs) {\n            let val = attrs[name];\n            if (val == null)\n                continue;\n            if (needsWrap && result.length == 1)\n                result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n            if (name == \"class\")\n                top.class = (top.class ? top.class + \" \" : \"\") + val;\n            else if (name == \"style\")\n                top.style = (top.style ? top.style + \";\" : \"\") + val;\n            else if (name != \"nodeName\")\n                top[name] = val;\n        }\n    }\n    return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n    // Shortcut for trivial case\n    if (prevComputed == noDeco && curComputed == noDeco)\n        return nodeDOM;\n    let curDOM = nodeDOM;\n    for (let i = 0; i < curComputed.length; i++) {\n        let deco = curComputed[i], prev = prevComputed[i];\n        if (i) {\n            let parent;\n            if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n                (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n                curDOM = parent;\n            }\n            else {\n                parent = document.createElement(deco.nodeName);\n                parent.pmIsDeco = true;\n                parent.appendChild(curDOM);\n                prev = noDeco[0];\n                curDOM = parent;\n            }\n        }\n        patchAttributes(curDOM, prev || noDeco[0], deco);\n    }\n    return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n    for (let name in prev)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n            dom.removeAttribute(name);\n    for (let name in cur)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n            dom.setAttribute(name, cur[name]);\n    if (prev.class != cur.class) {\n        let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n        let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n        for (let i = 0; i < prevList.length; i++)\n            if (curList.indexOf(prevList[i]) == -1)\n                dom.classList.remove(prevList[i]);\n        for (let i = 0; i < curList.length; i++)\n            if (prevList.indexOf(curList[i]) == -1)\n                dom.classList.add(curList[i]);\n        if (dom.classList.length == 0)\n            dom.removeAttribute(\"class\");\n    }\n    if (prev.style != cur.style) {\n        if (prev.style) {\n            let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n            while (m = prop.exec(prev.style))\n                dom.style.removeProperty(m[1]);\n        }\n        if (cur.style)\n            dom.style.cssText += cur.style;\n    }\n}\nfunction applyOuterDeco(dom, deco, node) {\n    return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n    if (a.length != b.length)\n        return false;\n    for (let i = 0; i < a.length; i++)\n        if (!a[i].type.eq(b[i].type))\n            return false;\n    return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n    let next = dom.nextSibling;\n    dom.parentNode.removeChild(dom);\n    return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n    constructor(top, lock, view) {\n        this.lock = lock;\n        this.view = view;\n        // Index into `this.top`'s child array, represents the current\n        // update position.\n        this.index = 0;\n        // When entering a mark, the current top and index are pushed\n        // onto this.\n        this.stack = [];\n        // Tracks whether anything was changed\n        this.changed = false;\n        this.top = top;\n        this.preMatch = preMatch(top.node.content, top);\n    }\n    // Destroy and remove the children between the given indices in\n    // `this.top`.\n    destroyBetween(start, end) {\n        if (start == end)\n            return;\n        for (let i = start; i < end; i++)\n            this.top.children[i].destroy();\n        this.top.children.splice(start, end - start);\n        this.changed = true;\n    }\n    // Destroy all remaining children in `this.top`.\n    destroyRest() {\n        this.destroyBetween(this.index, this.top.children.length);\n    }\n    // Sync the current stack of mark descs with the given array of\n    // marks, reusing existing mark descs when possible.\n    syncToMarks(marks, inline, view) {\n        let keep = 0, depth = this.stack.length >> 1;\n        let maxKeep = Math.min(depth, marks.length);\n        while (keep < maxKeep &&\n            (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n                .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n            keep++;\n        while (keep < depth) {\n            this.destroyRest();\n            this.top.dirty = NOT_DIRTY;\n            this.index = this.stack.pop();\n            this.top = this.stack.pop();\n            depth--;\n        }\n        while (depth < marks.length) {\n            this.stack.push(this.top, this.index + 1);\n            let found = -1;\n            for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n                let next = this.top.children[i];\n                if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n                    found = i;\n                    break;\n                }\n            }\n            if (found > -1) {\n                if (found > this.index) {\n                    this.changed = true;\n                    this.destroyBetween(this.index, found);\n                }\n                this.top = this.top.children[this.index];\n            }\n            else {\n                let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n                this.top.children.splice(this.index, 0, markDesc);\n                this.top = markDesc;\n                this.changed = true;\n            }\n            this.index = 0;\n            depth++;\n        }\n    }\n    // Try to find a node desc matching the given data. Skip over it and\n    // return true when successful.\n    findNodeMatch(node, outerDeco, innerDeco, index) {\n        let found = -1, targetDesc;\n        if (index >= this.preMatch.index &&\n            (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n            targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n            found = this.top.children.indexOf(targetDesc, this.index);\n        }\n        else {\n            for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n                let child = this.top.children[i];\n                if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n                    found = i;\n                    break;\n                }\n            }\n        }\n        if (found < 0)\n            return false;\n        this.destroyBetween(this.index, found);\n        this.index++;\n        return true;\n    }\n    updateNodeAt(node, outerDeco, innerDeco, index, view) {\n        let child = this.top.children[index];\n        if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n            child.dirty = CONTENT_DIRTY;\n        if (!child.update(node, outerDeco, innerDeco, view))\n            return false;\n        this.destroyBetween(this.index, index);\n        this.index++;\n        return true;\n    }\n    findIndexWithChild(domNode) {\n        for (;;) {\n            let parent = domNode.parentNode;\n            if (!parent)\n                return -1;\n            if (parent == this.top.contentDOM) {\n                let desc = domNode.pmViewDesc;\n                if (desc)\n                    for (let i = this.index; i < this.top.children.length; i++) {\n                        if (this.top.children[i] == desc)\n                            return i;\n                    }\n                return -1;\n            }\n            domNode = parent;\n        }\n    }\n    // Try to update the next node, if any, to the given data. Checks\n    // pre-matches to avoid overwriting nodes that could still be used.\n    updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n        for (let i = this.index; i < this.top.children.length; i++) {\n            let next = this.top.children[i];\n            if (next instanceof NodeViewDesc) {\n                let preMatch = this.preMatch.matched.get(next);\n                if (preMatch != null && preMatch != index)\n                    return false;\n                let nextDOM = next.dom, updated;\n                // Can't update if nextDOM is or contains this.lock, except if\n                // it's a text node whose content already matches the new text\n                // and whose decorations match the new ones.\n                let locked = this.isLocked(nextDOM) &&\n                    !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n                        next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n                if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n                    this.destroyBetween(this.index, i);\n                    if (next.dom != nextDOM)\n                        this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n                    this.destroyBetween(this.index, i);\n                    this.top.children[this.index] = updated;\n                    if (updated.contentDOM) {\n                        updated.dirty = CONTENT_DIRTY;\n                        updated.updateChildren(view, pos + 1);\n                        updated.dirty = NOT_DIRTY;\n                    }\n                    this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                break;\n            }\n        }\n        return false;\n    }\n    // When a node with content is replaced by a different node with\n    // identical content, move over its children.\n    recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n        if (next.dirty || node.isAtom || !next.children.length ||\n            !next.node.content.eq(node.content) ||\n            !sameOuterDeco(outerDeco, next.outerDeco) || !innerDeco.eq(next.innerDeco))\n            return null;\n        let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (wrapper.contentDOM) {\n            wrapper.children = next.children;\n            next.children = [];\n            for (let ch of wrapper.children)\n                ch.parent = wrapper;\n        }\n        next.destroy();\n        return wrapper;\n    }\n    // Insert the node as a newly created node desc.\n    addNode(node, outerDeco, innerDeco, view, pos) {\n        let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (desc.contentDOM)\n            desc.updateChildren(view, pos + 1);\n        this.top.children.splice(this.index++, 0, desc);\n        this.changed = true;\n    }\n    placeWidget(widget, view, pos) {\n        let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n        if (next && next.matchesWidget(widget) &&\n            (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n            this.index++;\n        }\n        else {\n            let desc = new WidgetViewDesc(this.top, widget, view, pos);\n            this.top.children.splice(this.index++, 0, desc);\n            this.changed = true;\n        }\n    }\n    // Make sure a textblock looks and behaves correctly in\n    // contentEditable.\n    addTextblockHacks() {\n        let lastChild = this.top.children[this.index - 1], parent = this.top;\n        while (lastChild instanceof MarkViewDesc) {\n            parent = lastChild;\n            lastChild = parent.children[parent.children.length - 1];\n        }\n        if (!lastChild || // Empty textblock\n            !(lastChild instanceof TextViewDesc) ||\n            /\\n$/.test(lastChild.node.text) ||\n            (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n            // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n            if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n                this.addHackNode(\"IMG\", parent);\n            this.addHackNode(\"BR\", this.top);\n        }\n    }\n    addHackNode(nodeName, parent) {\n        if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n            this.index++;\n        }\n        else {\n            let dom = document.createElement(nodeName);\n            if (nodeName == \"IMG\") {\n                dom.className = \"ProseMirror-separator\";\n                dom.alt = \"\";\n            }\n            if (nodeName == \"BR\")\n                dom.className = \"ProseMirror-trailingBreak\";\n            let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n            if (parent != this.top)\n                parent.children.push(hack);\n            else\n                parent.children.splice(this.index++, 0, hack);\n            this.changed = true;\n        }\n    }\n    isLocked(node) {\n        return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n    }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes. Returns the fragment index of the first node that\n// is part of the sequence of matched nodes at the end of the\n// fragment.\nfunction preMatch(frag, parentDesc) {\n    let curDesc = parentDesc, descI = curDesc.children.length;\n    let fI = frag.childCount, matched = new Map, matches = [];\n    outer: while (fI > 0) {\n        let desc;\n        for (;;) {\n            if (descI) {\n                let next = curDesc.children[descI - 1];\n                if (next instanceof MarkViewDesc) {\n                    curDesc = next;\n                    descI = next.children.length;\n                }\n                else {\n                    desc = next;\n                    descI--;\n                    break;\n                }\n            }\n            else if (curDesc == parentDesc) {\n                break outer;\n            }\n            else {\n                // FIXME\n                descI = curDesc.parent.children.indexOf(curDesc);\n                curDesc = curDesc.parent;\n            }\n        }\n        let node = desc.node;\n        if (!node)\n            continue;\n        if (node != frag.child(fI - 1))\n            break;\n        --fI;\n        matched.set(desc, fI);\n        matches.push(desc);\n    }\n    return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n    return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n    let locals = deco.locals(parent), offset = 0;\n    // Simple, cheap variant for when there are no local decorations\n    if (locals.length == 0) {\n        for (let i = 0; i < parent.childCount; i++) {\n            let child = parent.child(i);\n            onNode(child, locals, deco.forChild(offset, child), i);\n            offset += child.nodeSize;\n        }\n        return;\n    }\n    let decoIndex = 0, active = [], restNode = null;\n    for (let parentIndex = 0;;) {\n        let widget, widgets;\n        while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n            let next = locals[decoIndex++];\n            if (next.widget) {\n                if (!widget)\n                    widget = next;\n                else\n                    (widgets || (widgets = [widget])).push(next);\n            }\n        }\n        if (widget) {\n            if (widgets) {\n                widgets.sort(compareSide);\n                for (let i = 0; i < widgets.length; i++)\n                    onWidget(widgets[i], parentIndex, !!restNode);\n            }\n            else {\n                onWidget(widget, parentIndex, !!restNode);\n            }\n        }\n        let child, index;\n        if (restNode) {\n            index = -1;\n            child = restNode;\n            restNode = null;\n        }\n        else if (parentIndex < parent.childCount) {\n            index = parentIndex;\n            child = parent.child(parentIndex++);\n        }\n        else {\n            break;\n        }\n        for (let i = 0; i < active.length; i++)\n            if (active[i].to <= offset)\n                active.splice(i--, 1);\n        while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n            active.push(locals[decoIndex++]);\n        let end = offset + child.nodeSize;\n        if (child.isText) {\n            let cutAt = end;\n            if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n                cutAt = locals[decoIndex].from;\n            for (let i = 0; i < active.length; i++)\n                if (active[i].to < cutAt)\n                    cutAt = active[i].to;\n            if (cutAt < end) {\n                restNode = child.cut(cutAt - offset);\n                child = child.cut(0, cutAt - offset);\n                end = cutAt;\n                index = -1;\n            }\n        }\n        else {\n            while (decoIndex < locals.length && locals[decoIndex].to < end)\n                decoIndex++;\n        }\n        let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n        onNode(child, outerDeco, deco.forChild(offset, child), index);\n        offset = end;\n    }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n    if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n        let oldCSS = dom.style.cssText;\n        dom.style.cssText = oldCSS + \"; list-style: square !important\";\n        window.getComputedStyle(dom).listStyle;\n        dom.style.cssText = oldCSS;\n    }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n    for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n        let child = frag.child(i++), childStart = pos;\n        pos += child.nodeSize;\n        if (!child.isText)\n            continue;\n        let str = child.text;\n        while (i < frag.childCount) {\n            let next = frag.child(i++);\n            pos += next.nodeSize;\n            if (!next.isText)\n                break;\n            str += next.text;\n        }\n        if (pos >= from) {\n            if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n                return to - text.length;\n            let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n            if (found >= 0 && found + text.length + childStart >= from)\n                return childStart + found;\n            if (from == to && str.length >= (to + text.length) - childStart &&\n                str.slice(to - childStart, to - childStart + text.length) == text)\n                return to;\n        }\n    }\n    return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n    let result = [];\n    for (let i = 0, off = 0; i < nodes.length; i++) {\n        let child = nodes[i], start = off, end = off += child.size;\n        if (start >= to || end <= from) {\n            result.push(child);\n        }\n        else {\n            if (start < from)\n                result.push(child.slice(0, from - start, view));\n            if (replacement) {\n                result.push(replacement);\n                replacement = undefined;\n            }\n            if (end > to)\n                result.push(child.slice(to - start, child.size, view));\n        }\n    }\n    return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n    let domSel = view.domSelectionRange(), doc = view.state.doc;\n    if (!domSel.focusNode)\n        return null;\n    let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n    let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n    if (head < 0)\n        return null;\n    let $head = doc.resolve(head), anchor, selection;\n    if (selectionCollapsed(domSel)) {\n        anchor = head;\n        while (nearestDesc && !nearestDesc.node)\n            nearestDesc = nearestDesc.parent;\n        let nearestDescNode = nearestDesc.node;\n        if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n            && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n            let pos = nearestDesc.posBefore;\n            selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n        }\n    }\n    else {\n        if (domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {\n            let min = head, max = head;\n            for (let i = 0; i < domSel.rangeCount; i++) {\n                let range = domSel.getRangeAt(i);\n                min = Math.min(min, view.docView.posFromDOM(range.startContainer, range.startOffset, 1));\n                max = Math.max(max, view.docView.posFromDOM(range.endContainer, range.endOffset, -1));\n            }\n            if (min < 0)\n                return null;\n            [anchor, head] = max == view.state.selection.anchor ? [max, min] : [min, max];\n            $head = doc.resolve(head);\n        }\n        else {\n            anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n        }\n        if (anchor < 0)\n            return null;\n    }\n    let $anchor = doc.resolve(anchor);\n    if (!selection) {\n        let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n        selection = selectionBetween(view, $anchor, $head, bias);\n    }\n    return selection;\n}\nfunction editorOwnsSelection(view) {\n    return view.editable ? view.hasFocus() :\n        hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n    let sel = view.state.selection;\n    syncNodeSelection(view, sel);\n    if (!editorOwnsSelection(view))\n        return;\n    // The delayed drag selection causes issues with Cell Selections\n    // in Safari. And the drag selection delay is to workarond issues\n    // which only present in Chrome.\n    if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n        let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n        if (domSel.anchorNode && curSel.anchorNode &&\n            isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n            view.input.mouseDown.delayedSelectionSync = true;\n            view.domObserver.setCurSelection();\n            return;\n        }\n    }\n    view.domObserver.disconnectSelection();\n    if (view.cursorWrapper) {\n        selectCursorWrapper(view);\n    }\n    else {\n        let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n        if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n            if (!sel.$from.parent.inlineContent)\n                resetEditableFrom = temporarilyEditableNear(view, sel.from);\n            if (!sel.empty && !sel.$from.parent.inlineContent)\n                resetEditableTo = temporarilyEditableNear(view, sel.to);\n        }\n        view.docView.setSelection(anchor, head, view, force);\n        if (brokenSelectBetweenUneditable) {\n            if (resetEditableFrom)\n                resetEditable(resetEditableFrom);\n            if (resetEditableTo)\n                resetEditable(resetEditableTo);\n        }\n        if (sel.visible) {\n            view.dom.classList.remove(\"ProseMirror-hideselection\");\n        }\n        else {\n            view.dom.classList.add(\"ProseMirror-hideselection\");\n            if (\"onselectionchange\" in document)\n                removeClassOnSelectionChange(view);\n        }\n    }\n    view.domObserver.setCurSelection();\n    view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n    let { node, offset } = view.docView.domFromPos(pos, 0);\n    let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n    let before = offset ? node.childNodes[offset - 1] : null;\n    if (safari && after && after.contentEditable == \"false\")\n        return setEditable(after);\n    if ((!after || after.contentEditable == \"false\") &&\n        (!before || before.contentEditable == \"false\")) {\n        if (after)\n            return setEditable(after);\n        else if (before)\n            return setEditable(before);\n    }\n}\nfunction setEditable(element) {\n    element.contentEditable = \"true\";\n    if (safari && element.draggable) {\n        element.draggable = false;\n        element.wasDraggable = true;\n    }\n    return element;\n}\nfunction resetEditable(element) {\n    element.contentEditable = \"false\";\n    if (element.wasDraggable) {\n        element.draggable = true;\n        element.wasDraggable = null;\n    }\n}\nfunction removeClassOnSelectionChange(view) {\n    let doc = view.dom.ownerDocument;\n    doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n    let domSel = view.domSelectionRange();\n    let node = domSel.anchorNode, offset = domSel.anchorOffset;\n    doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n        if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n            doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n            setTimeout(() => {\n                if (!editorOwnsSelection(view) || view.state.selection.visible)\n                    view.dom.classList.remove(\"ProseMirror-hideselection\");\n            }, 20);\n        }\n    });\n}\nfunction selectCursorWrapper(view) {\n    let domSel = view.domSelection(), range = document.createRange();\n    if (!domSel)\n        return;\n    let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n    if (img)\n        range.setStart(node.parentNode, domIndex(node) + 1);\n    else\n        range.setStart(node, 0);\n    range.collapse(true);\n    domSel.removeAllRanges();\n    domSel.addRange(range);\n    // Kludge to kill 'control selection' in IE11 when selecting an\n    // invisible cursor wrapper, since that would result in those weird\n    // resize handles and a selection that considers the absolutely\n    // positioned wrapper, rather than the root editable node, the\n    // focused element.\n    if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n        node.disabled = true;\n        node.disabled = false;\n    }\n}\nfunction syncNodeSelection(view, sel) {\n    if (sel instanceof NodeSelection) {\n        let desc = view.docView.descAt(sel.from);\n        if (desc != view.lastSelectedViewDesc) {\n            clearNodeSelection(view);\n            if (desc)\n                desc.selectNode();\n            view.lastSelectedViewDesc = desc;\n        }\n    }\n    else {\n        clearNodeSelection(view);\n    }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n    if (view.lastSelectedViewDesc) {\n        if (view.lastSelectedViewDesc.parent)\n            view.lastSelectedViewDesc.deselectNode();\n        view.lastSelectedViewDesc = undefined;\n    }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n    return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n        || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n    if (view.editable && !view.hasFocus())\n        return false;\n    return hasSelection(view);\n}\nfunction hasSelection(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.anchorNode)\n        return false;\n    try {\n        // Firefox will raise 'permission denied' errors when accessing\n        // properties of `sel.anchorNode` when it's in a generated CSS\n        // element.\n        return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n            (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n    }\n    catch (_) {\n        return false;\n    }\n}\nfunction anchorInRightPlace(view) {\n    let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n    let domSel = view.domSelectionRange();\n    return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n    let { $anchor, $head } = state.selection;\n    let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n    let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n    return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n    view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n    return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection) {\n        if (mods.indexOf(\"s\") > -1) {\n            let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n            if (!node || node.isText || !node.isLeaf)\n                return false;\n            let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n            return apply(view, new TextSelection(sel.$anchor, $newHead));\n        }\n        else if (!sel.empty) {\n            return false;\n        }\n        else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n            let next = moveSelectionBlock(view.state, dir);\n            if (next && (next instanceof NodeSelection))\n                return apply(view, next);\n            return false;\n        }\n        else if (!(mac && mods.indexOf(\"m\") > -1)) {\n            let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n            if (!node || node.isText)\n                return false;\n            let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n            if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n                return false;\n            if (NodeSelection.isSelectable(node)) {\n                return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n            }\n            else if (webkit) {\n                // Chrome and Safari will introduce extra pointless cursor\n                // positions around inline uneditable nodes, so we have to\n                // take over and move the cursor past them (#937)\n                return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    else if (sel instanceof NodeSelection && sel.node.isInline) {\n        return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n    }\n    else {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next)\n            return apply(view, next);\n        return false;\n    }\n}\nfunction nodeLen(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n    return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesBefore(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let moveNode, moveOffset, force = false;\n    // Gecko will do odd things when the selection is directly in front\n    // of a non-editable node, so in that case, move it into the next\n    // node if possible. Issue prosemirror/prosemirror#832.\n    if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n        force = true;\n    for (;;) {\n        if (offset > 0) {\n            if (node.nodeType != 1) {\n                break;\n            }\n            else {\n                let before = node.childNodes[offset - 1];\n                if (isIgnorable(before, -1)) {\n                    moveNode = node;\n                    moveOffset = --offset;\n                }\n                else if (before.nodeType == 3) {\n                    node = before;\n                    offset = node.nodeValue.length;\n                }\n                else\n                    break;\n            }\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let prev = node.previousSibling;\n            while (prev && isIgnorable(prev, -1)) {\n                moveNode = node.parentNode;\n                moveOffset = domIndex(prev);\n                prev = prev.previousSibling;\n            }\n            if (!prev) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = 0;\n            }\n            else {\n                node = prev;\n                offset = nodeLen(node);\n            }\n        }\n    }\n    if (force)\n        setSelFocus(view, node, offset);\n    else if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesAfter(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let len = nodeLen(node);\n    let moveNode, moveOffset;\n    for (;;) {\n        if (offset < len) {\n            if (node.nodeType != 1)\n                break;\n            let after = node.childNodes[offset];\n            if (isIgnorable(after, 1)) {\n                moveNode = node;\n                moveOffset = ++offset;\n            }\n            else\n                break;\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let next = node.nextSibling;\n            while (next && isIgnorable(next, 1)) {\n                moveNode = next.parentNode;\n                moveOffset = domIndex(next) + 1;\n                next = next.nextSibling;\n            }\n            if (!next) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = len = 0;\n            }\n            else {\n                node = next;\n                offset = 0;\n                len = nodeLen(node);\n            }\n        }\n    }\n    if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n    while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n        offset = domIndex(node) + 1;\n        node = node.parentNode;\n    }\n    while (node && offset < node.childNodes.length) {\n        let next = node.childNodes[offset];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = 0;\n    }\n}\nfunction textNodeBefore(node, offset) {\n    while (node && !offset && !hasBlockDesc(node)) {\n        offset = domIndex(node);\n        node = node.parentNode;\n    }\n    while (node && offset) {\n        let next = node.childNodes[offset - 1];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = node.childNodes.length;\n    }\n}\nfunction setSelFocus(view, node, offset) {\n    if (node.nodeType != 3) {\n        let before, after;\n        if (after = textNodeAfter(node, offset)) {\n            node = after;\n            offset = 0;\n        }\n        else if (before = textNodeBefore(node, offset)) {\n            node = before;\n            offset = before.nodeValue.length;\n        }\n    }\n    let sel = view.domSelection();\n    if (!sel)\n        return;\n    if (selectionCollapsed(sel)) {\n        let range = document.createRange();\n        range.setEnd(node, offset);\n        range.setStart(node, offset);\n        sel.removeAllRanges();\n        sel.addRange(range);\n    }\n    else if (sel.extend) {\n        sel.extend(node, offset);\n    }\n    view.domObserver.setCurSelection();\n    let { state } = view;\n    // If no state update ends up happening, reset the selection.\n    setTimeout(() => {\n        if (view.state == state)\n            selectionToDOM(view);\n    }, 50);\n}\nfunction findDirection(view, pos) {\n    let $pos = view.state.doc.resolve(pos);\n    if (!(chrome || windows) && $pos.parent.inlineContent) {\n        let coords = view.coordsAtPos(pos);\n        if (pos > $pos.start()) {\n            let before = view.coordsAtPos(pos - 1);\n            let mid = (before.top + before.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n                return before.left < coords.left ? \"ltr\" : \"rtl\";\n        }\n        if (pos < $pos.end()) {\n            let after = view.coordsAtPos(pos + 1);\n            let mid = (after.top + after.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n                return after.left > coords.left ? \"ltr\" : \"rtl\";\n        }\n    }\n    let computed = getComputedStyle(view.dom).direction;\n    return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n        return false;\n    if (mac && mods.indexOf(\"m\") > -1)\n        return false;\n    let { $from, $to } = sel;\n    if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next && (next instanceof NodeSelection))\n            return apply(view, next);\n    }\n    if (!$from.parent.inlineContent) {\n        let side = dir < 0 ? $from : $to;\n        let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n        return beyond ? apply(view, beyond) : false;\n    }\n    return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n    if (!(view.state.selection instanceof TextSelection))\n        return true;\n    let { $head, $anchor, empty } = view.state.selection;\n    if (!$head.sameParent($anchor))\n        return true;\n    if (!empty)\n        return false;\n    if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n        return true;\n    let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n    if (nextNode && !nextNode.isText) {\n        let tr = view.state.tr;\n        if (dir < 0)\n            tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n        else\n            tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n        view.dispatch(tr);\n        return true;\n    }\n    return false;\n}\nfunction switchEditable(view, node, state) {\n    view.domObserver.stop();\n    node.contentEditable = state;\n    view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n    if (!safari || view.state.selection.$head.parentOffset > 0)\n        return false;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n        focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n        let child = focusNode.firstChild;\n        switchEditable(view, child, \"true\");\n        setTimeout(() => switchEditable(view, child, \"false\"), 20);\n    }\n    return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n    let result = \"\";\n    if (event.ctrlKey)\n        result += \"c\";\n    if (event.metaKey)\n        result += \"m\";\n    if (event.altKey)\n        result += \"a\";\n    if (event.shiftKey)\n        result += \"s\";\n    return result;\n}\nfunction captureKeyDown(view, event) {\n    let code = event.keyCode, mods = getMods(event);\n    if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n        return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n    }\n    else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n        return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n    }\n    else if (code == 13 || code == 27) { // Enter, Esc\n        return true;\n    }\n    else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n        let dir = code == 37 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1) : -1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n        let dir = code == 39 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1) : 1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n        return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n    }\n    else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n        return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n    }\n    else if (mods == (mac ? \"m\" : \"c\") &&\n        (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n        return true;\n    }\n    return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n    view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n    let context = [], { content, openStart, openEnd } = slice;\n    while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n        openStart--;\n        openEnd--;\n        let node = content.firstChild;\n        context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n        content = node.content;\n    }\n    let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n    let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n    wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n    let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n    while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n        for (let i = needsWrap.length - 1; i >= 0; i--) {\n            let wrapper = doc.createElement(needsWrap[i]);\n            while (wrap.firstChild)\n                wrapper.appendChild(wrap.firstChild);\n            wrap.appendChild(wrapper);\n            wrappers++;\n        }\n        firstChild = wrap.firstChild;\n    }\n    if (firstChild && firstChild.nodeType == 1)\n        firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n    let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n        slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n    return { dom: wrap, text, slice };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n    let inCode = $context.parent.type.spec.code;\n    let dom, slice;\n    if (!html && !text)\n        return null;\n    let asText = text && (plainText || inCode || !html);\n    if (asText) {\n        view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n        if (inCode)\n            return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n        let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n        if (parsed) {\n            slice = parsed;\n        }\n        else {\n            let marks = $context.marks();\n            let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n            dom = document.createElement(\"div\");\n            text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n                let p = dom.appendChild(document.createElement(\"p\"));\n                if (block)\n                    p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n            });\n        }\n    }\n    else {\n        view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n        dom = readHTML(html);\n        if (webkit)\n            restoreReplacedSpaces(dom);\n    }\n    let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n    let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n    if (sliceData && sliceData[3])\n        for (let i = +sliceData[3]; i > 0; i--) {\n            let child = dom.firstChild;\n            while (child && child.nodeType != 1)\n                child = child.nextSibling;\n            if (!child)\n                break;\n            dom = child;\n        }\n    if (!slice) {\n        let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n        slice = parser.parseSlice(dom, {\n            preserveWhitespace: !!(asText || sliceData),\n            context: $context,\n            ruleFromNode(dom) {\n                if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n                    dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n                    return { ignore: true };\n                return null;\n            }\n        });\n    }\n    if (sliceData) {\n        slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n    }\n    else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n        slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n        if (slice.openStart || slice.openEnd) {\n            let openStart = 0, openEnd = 0;\n            for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n            for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n            slice = closeSlice(slice, openStart, openEnd);\n        }\n    }\n    view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n    return slice;\n}\nconst inlineParents = /^(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;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n    if (fragment.childCount < 2)\n        return fragment;\n    for (let d = $context.depth; d >= 0; d--) {\n        let parent = $context.node(d);\n        let match = parent.contentMatchAt($context.index(d));\n        let lastWrap, result = [];\n        fragment.forEach(node => {\n            if (!result)\n                return;\n            let wrap = match.findWrapping(node.type), inLast;\n            if (!wrap)\n                return result = null;\n            if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n                result[result.length - 1] = inLast;\n            }\n            else {\n                if (result.length)\n                    result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n                let wrapped = withWrappers(node, wrap);\n                result.push(wrapped);\n                match = match.matchType(wrapped.type);\n                lastWrap = wrap;\n            }\n        });\n        if (result)\n            return Fragment.from(result);\n    }\n    return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n    for (let i = wrap.length - 1; i >= from; i--)\n        node = wrap[i].create(null, Fragment.from(node));\n    return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n    if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n        let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n        if (inner)\n            return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n        let match = sibling.contentMatchAt(sibling.childCount);\n        if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n            return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n    }\n}\nfunction closeRight(node, depth) {\n    if (depth == 0)\n        return node;\n    let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n    let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n    return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n    let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n    if (fragment.childCount > 1)\n        openEnd = 0;\n    if (depth < to - 1)\n        inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n    if (depth >= from)\n        inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner)\n            : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n    return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n    if (openStart < slice.openStart)\n        slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n    if (openEnd < slice.openEnd)\n        slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n    return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n    thead: [\"table\"],\n    tbody: [\"table\"],\n    tfoot: [\"table\"],\n    caption: [\"table\"],\n    colgroup: [\"table\"],\n    col: [\"table\", \"colgroup\"],\n    tr: [\"table\", \"tbody\"],\n    td: [\"table\", \"tbody\", \"tr\"],\n    th: [\"table\", \"tbody\", \"tr\"]\n};\nlet _detachedDoc = null;\nfunction detachedDoc() {\n    return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"));\n}\nlet _policy = null;\nfunction maybeWrapTrusted(html) {\n    let trustedTypes = window.trustedTypes;\n    if (!trustedTypes)\n        return html;\n    // With the require-trusted-types-for CSP, Chrome will block\n    // innerHTML, even on a detached document. This wraps the string in\n    // a way that makes the browser allow us to use its parser again.\n    if (!_policy)\n        _policy = trustedTypes.defaultPolicy || trustedTypes.createPolicy(\"ProseMirrorClipboard\", { createHTML: (s) => s });\n    return _policy.createHTML(html);\n}\nfunction readHTML(html) {\n    let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n    if (metas)\n        html = html.slice(metas[0].length);\n    let elt = detachedDoc().createElement(\"div\");\n    let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n    if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n        html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n    elt.innerHTML = maybeWrapTrusted(html);\n    if (wrap)\n        for (let i = 0; i < wrap.length; i++)\n            elt = elt.querySelector(wrap[i]) || elt;\n    return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n    let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n    for (let i = 0; i < nodes.length; i++) {\n        let node = nodes[i];\n        if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n            node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n    }\n}\nfunction addContext(slice, context) {\n    if (!slice.size)\n        return slice;\n    let schema = slice.content.firstChild.type.schema, array;\n    try {\n        array = JSON.parse(context);\n    }\n    catch (e) {\n        return slice;\n    }\n    let { content, openStart, openEnd } = slice;\n    for (let i = array.length - 2; i >= 0; i -= 2) {\n        let type = schema.nodes[array[i]];\n        if (!type || type.hasRequiredAttrs())\n            break;\n        content = Fragment.from(type.create(array[i + 1], content));\n        openStart++;\n        openEnd++;\n    }\n    return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n    constructor() {\n        this.shiftKey = false;\n        this.mouseDown = null;\n        this.lastKeyCode = null;\n        this.lastKeyCodeTime = 0;\n        this.lastClick = { time: 0, x: 0, y: 0, type: \"\", button: 0 };\n        this.lastSelectionOrigin = null;\n        this.lastSelectionTime = 0;\n        this.lastIOSEnter = 0;\n        this.lastIOSEnterFallbackTimeout = -1;\n        this.lastFocus = 0;\n        this.lastTouch = 0;\n        this.lastChromeDelete = 0;\n        this.composing = false;\n        this.compositionNode = null;\n        this.composingTimeout = -1;\n        this.compositionNodes = [];\n        this.compositionEndedAt = -2e8;\n        this.compositionID = 1;\n        // Set to a composition ID when there are pending changes at compositionend\n        this.compositionPendingChanges = 0;\n        this.domChangeCount = 0;\n        this.eventHandlers = Object.create(null);\n        this.hideSelectionGuard = null;\n    }\n}\nfunction initInput(view) {\n    for (let event in handlers) {\n        let handler = handlers[event];\n        view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n            if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n                (view.editable || !(event.type in editHandlers)))\n                handler(view, event);\n        }, passiveHandlers[event] ? { passive: true } : undefined);\n    }\n    // On Safari, for reasons beyond my understanding, adding an input\n    // event handler makes an issue where the composition vanishes when\n    // you press enter go away.\n    if (safari)\n        view.dom.addEventListener(\"input\", () => null);\n    ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n    view.input.lastSelectionOrigin = origin;\n    view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n    view.domObserver.stop();\n    for (let type in view.input.eventHandlers)\n        view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n    clearTimeout(view.input.composingTimeout);\n    clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n    view.someProp(\"handleDOMEvents\", currentHandlers => {\n        for (let type in currentHandlers)\n            if (!view.input.eventHandlers[type])\n                view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n    });\n}\nfunction runCustomHandler(view, event) {\n    return view.someProp(\"handleDOMEvents\", handlers => {\n        let handler = handlers[event.type];\n        return handler ? handler(view, event) || event.defaultPrevented : false;\n    });\n}\nfunction eventBelongsToView(view, event) {\n    if (!event.bubbles)\n        return true;\n    if (event.defaultPrevented)\n        return false;\n    for (let node = event.target; node != view.dom; node = node.parentNode)\n        if (!node || node.nodeType == 11 ||\n            (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n            return false;\n    return true;\n}\nfunction dispatchEvent(view, event) {\n    if (!runCustomHandler(view, event) && handlers[event.type] &&\n        (view.editable || !(event.type in editHandlers)))\n        handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n    if (inOrNearComposition(view, event))\n        return;\n    view.input.lastKeyCode = event.keyCode;\n    view.input.lastKeyCodeTime = Date.now();\n    // Suppress enter key events on Chrome Android, because those tend\n    // to be part of a confused sequence of composition events fired,\n    // and handling them eagerly tends to corrupt the input.\n    if (android && chrome && event.keyCode == 13)\n        return;\n    if (event.keyCode != 229)\n        view.domObserver.forceFlush();\n    // On iOS, if we preventDefault enter key presses, the virtual\n    // keyboard gets confused. So the hack here is to set a flag that\n    // makes the DOM change code recognize that what just happens should\n    // be replaced by whatever the Enter key handlers do.\n    if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n        let now = Date.now();\n        view.input.lastIOSEnter = now;\n        view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n            if (view.input.lastIOSEnter == now) {\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n                view.input.lastIOSEnter = 0;\n            }\n        }, 200);\n    }\n    else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"key\");\n    }\n};\neditHandlers.keyup = (view, event) => {\n    if (event.keyCode == 16)\n        view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n    let event = _event;\n    if (inOrNearComposition(view, event) || !event.charCode ||\n        event.ctrlKey && !event.altKey || mac && event.metaKey)\n        return;\n    if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n        event.preventDefault();\n        return;\n    }\n    let sel = view.state.selection;\n    if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n        let text = String.fromCharCode(event.charCode);\n        let deflt = () => view.state.tr.insertText(text).scrollIntoView();\n        if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text, deflt)))\n            view.dispatch(deflt());\n        event.preventDefault();\n    }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n    let dx = click.x - event.clientX, dy = click.y - event.clientY;\n    return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n            : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n            return true;\n    }\n    return false;\n}\nfunction updateSelection(view, selection, origin) {\n    if (!view.focused)\n        view.focus();\n    if (view.state.selection.eq(selection))\n        return;\n    let tr = view.state.tr.setSelection(selection);\n    if (origin == \"pointer\")\n        tr.setMeta(\"pointer\", true);\n    view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n    if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n        updateSelection(view, new NodeSelection($pos), \"pointer\");\n        return true;\n    }\n    return false;\n}\nfunction selectClickedNode(view, inside) {\n    if (inside == -1)\n        return false;\n    let sel = view.state.selection, selectedNode, selectAt;\n    if (sel instanceof NodeSelection)\n        selectedNode = sel.node;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        if (NodeSelection.isSelectable(node)) {\n            if (selectedNode && sel.$from.depth > 0 &&\n                i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n                selectAt = $pos.before(sel.$from.depth);\n            else\n                selectAt = $pos.before(i);\n            break;\n        }\n    }\n    if (selectAt != null) {\n        updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n        return true;\n    }\n    else {\n        return false;\n    }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n    return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n        (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n        defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n    if (event.button != 0)\n        return false;\n    let doc = view.state.doc;\n    if (inside == -1) {\n        if (doc.inlineContent) {\n            updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n            return true;\n        }\n        return false;\n    }\n    let $pos = doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        let nodePos = $pos.before(i);\n        if (node.inlineContent)\n            updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\");\n        else if (NodeSelection.isSelectable(node))\n            updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\");\n        else\n            continue;\n        return true;\n    }\n}\nfunction forceDOMFlush(view) {\n    return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.shiftKey;\n    let flushed = forceDOMFlush(view);\n    let now = Date.now(), type = \"singleClick\";\n    if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier] &&\n        view.input.lastClick.button == event.button) {\n        if (view.input.lastClick.type == \"singleClick\")\n            type = \"doubleClick\";\n        else if (view.input.lastClick.type == \"doubleClick\")\n            type = \"tripleClick\";\n    }\n    view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type, button: event.button };\n    let pos = view.posAtCoords(eventCoords(event));\n    if (!pos)\n        return;\n    if (type == \"singleClick\") {\n        if (view.input.mouseDown)\n            view.input.mouseDown.done();\n        view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);\n    }\n    else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"pointer\");\n    }\n};\nclass MouseDown {\n    constructor(view, pos, event, flushed) {\n        this.view = view;\n        this.pos = pos;\n        this.event = event;\n        this.flushed = flushed;\n        this.delayedSelectionSync = false;\n        this.mightDrag = null;\n        this.startDoc = view.state.doc;\n        this.selectNode = !!event[selectNodeModifier];\n        this.allowDefault = event.shiftKey;\n        let targetNode, targetPos;\n        if (pos.inside > -1) {\n            targetNode = view.state.doc.nodeAt(pos.inside);\n            targetPos = pos.inside;\n        }\n        else {\n            let $pos = view.state.doc.resolve(pos.pos);\n            targetNode = $pos.parent;\n            targetPos = $pos.depth ? $pos.before() : 0;\n        }\n        const target = flushed ? null : event.target;\n        const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n        this.target = targetDesc && targetDesc.dom.nodeType == 1 ? targetDesc.dom : null;\n        let { selection } = view.state;\n        if (event.button == 0 &&\n            targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n            selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos)\n            this.mightDrag = {\n                node: targetNode,\n                pos: targetPos,\n                addAttr: !!(this.target && !this.target.draggable),\n                setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n            };\n        if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.draggable = true;\n            if (this.mightDrag.setUneditable)\n                setTimeout(() => {\n                    if (this.view.input.mouseDown == this)\n                        this.target.setAttribute(\"contentEditable\", \"false\");\n                }, 20);\n            this.view.domObserver.start();\n        }\n        view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n        view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n        setSelectionOrigin(view, \"pointer\");\n    }\n    done() {\n        this.view.root.removeEventListener(\"mouseup\", this.up);\n        this.view.root.removeEventListener(\"mousemove\", this.move);\n        if (this.mightDrag && this.target) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.removeAttribute(\"draggable\");\n            if (this.mightDrag.setUneditable)\n                this.target.removeAttribute(\"contentEditable\");\n            this.view.domObserver.start();\n        }\n        if (this.delayedSelectionSync)\n            setTimeout(() => selectionToDOM(this.view));\n        this.view.input.mouseDown = null;\n    }\n    up(event) {\n        this.done();\n        if (!this.view.dom.contains(event.target))\n            return;\n        let pos = this.pos;\n        if (this.view.state.doc != this.startDoc)\n            pos = this.view.posAtCoords(eventCoords(event));\n        this.updateAllowDefault(event);\n        if (this.allowDefault || !pos) {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n        else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n            event.preventDefault();\n        }\n        else if (event.button == 0 &&\n            (this.flushed ||\n                // Safari ignores clicks on draggable elements\n                (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n                // Chrome will sometimes treat a node selection as a\n                // cursor, but still report that the node is selected\n                // when asked through getSelection. You'll then get a\n                // situation where clicking at the point where that\n                // (hidden) cursor is doesn't change the selection, and\n                // thus doesn't get a reaction from ProseMirror. This\n                // works around that.\n                (chrome && !this.view.state.selection.visible &&\n                    Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n            updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n            event.preventDefault();\n        }\n        else {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n    }\n    move(event) {\n        this.updateAllowDefault(event);\n        setSelectionOrigin(this.view, \"pointer\");\n        if (event.buttons == 0)\n            this.done();\n    }\n    updateAllowDefault(event) {\n        if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n            Math.abs(this.event.y - event.clientY) > 4))\n            this.allowDefault = true;\n    }\n}\nhandlers.touchstart = view => {\n    view.input.lastTouch = Date.now();\n    forceDOMFlush(view);\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n    view.input.lastTouch = Date.now();\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n    if (view.composing)\n        return true;\n    // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n    // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n    // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n    // emitted. The keydown event triggers newline insertion, which we don't want.\n    // This method returns true if the keydown event should be ignored.\n    // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n    // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n    // This guards against the case where compositionend is triggered without the keyboard\n    // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n    // afterwards- we wouldn't want to ignore the keydown event in this case.\n    if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {\n        view.input.compositionEndedAt = -2e8;\n        return true;\n    }\n    return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n    if (!view.composing) {\n        view.domObserver.flush();\n        let { state } = view, $pos = state.selection.$to;\n        if (state.selection instanceof TextSelection &&\n            (state.storedMarks ||\n                (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)))) {\n            // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n            view.markCursor = view.state.storedMarks || $pos.marks();\n            endComposition(view, true);\n            view.markCursor = null;\n        }\n        else {\n            endComposition(view, !state.selection.empty);\n            // In firefox, if the cursor is after but outside a marked node,\n            // the inserted text won't inherit the marks. So this moves it\n            // inside if necessary.\n            if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n                let sel = view.domSelectionRange();\n                for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n                    let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n                    if (!before)\n                        break;\n                    if (before.nodeType == 3) {\n                        let sel = view.domSelection();\n                        if (sel)\n                            sel.collapse(before, before.nodeValue.length);\n                        break;\n                    }\n                    else {\n                        node = before;\n                        offset = -1;\n                    }\n                }\n            }\n        }\n        view.input.composing = true;\n    }\n    scheduleComposeEnd(view, timeoutComposition);\n};\neditHandlers.compositionend = (view, event) => {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = event.timeStamp;\n        view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n        view.input.compositionNode = null;\n        if (view.input.compositionPendingChanges)\n            Promise.resolve().then(() => view.domObserver.flush());\n        view.input.compositionID++;\n        scheduleComposeEnd(view, 20);\n    }\n};\nfunction scheduleComposeEnd(view, delay) {\n    clearTimeout(view.input.composingTimeout);\n    if (delay > -1)\n        view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = timestampFromCustomEvent();\n    }\n    while (view.input.compositionNodes.length > 0)\n        view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction findCompositionNode(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.focusNode)\n        return null;\n    let textBefore = textNodeBefore$1(sel.focusNode, sel.focusOffset);\n    let textAfter = textNodeAfter$1(sel.focusNode, sel.focusOffset);\n    if (textBefore && textAfter && textBefore != textAfter) {\n        let descAfter = textAfter.pmViewDesc, lastChanged = view.domObserver.lastChangedTextNode;\n        if (textBefore == lastChanged || textAfter == lastChanged)\n            return lastChanged;\n        if (!descAfter || !descAfter.isText(textAfter.nodeValue)) {\n            return textAfter;\n        }\n        else if (view.input.compositionNode == textAfter) {\n            let descBefore = textBefore.pmViewDesc;\n            if (!(!descBefore || !descBefore.isText(textBefore.nodeValue)))\n                return textAfter;\n        }\n    }\n    return textBefore || textAfter;\n}\nfunction timestampFromCustomEvent() {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"event\", true, true);\n    return event.timeStamp;\n}\n/**\n@internal\n*/\nfunction endComposition(view, restarting = false) {\n    if (android && view.domObserver.flushingSoon >= 0)\n        return;\n    view.domObserver.forceFlush();\n    clearComposition(view);\n    if (restarting || view.docView && view.docView.dirty) {\n        let sel = selectionFromDOM(view), cur = view.state.selection;\n        if (sel && !sel.eq(cur))\n            view.dispatch(view.state.tr.setSelection(sel));\n        else if ((view.markCursor || restarting) && !cur.$from.node(cur.$from.sharedDepth(cur.to)).inlineContent)\n            view.dispatch(view.state.tr.deleteSelection());\n        else\n            view.updateState(view.state);\n        return true;\n    }\n    return false;\n}\nfunction captureCopy(view, dom) {\n    // The extra wrapper is somehow necessary on IE/Edge to prevent the\n    // content from being mangled when it is put onto the clipboard\n    if (!view.dom.parentNode)\n        return;\n    let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n    wrap.appendChild(dom);\n    wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    let sel = getSelection(), range = document.createRange();\n    range.selectNodeContents(dom);\n    // Done because IE will fire a selectionchange moving the selection\n    // to its start when removeAllRanges is called and the editor still\n    // has focus (which will mess up the editor's selection state).\n    view.dom.blur();\n    sel.removeAllRanges();\n    sel.addRange(range);\n    setTimeout(() => {\n        if (wrap.parentNode)\n            wrap.parentNode.removeChild(wrap);\n        view.focus();\n    }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n    (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n    let event = _event;\n    let sel = view.state.selection, cut = event.type == \"cut\";\n    if (sel.empty)\n        return;\n    // IE and Edge's clipboard interface is completely broken\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n    if (data) {\n        event.preventDefault();\n        data.clearData();\n        data.setData(\"text/html\", dom.innerHTML);\n        data.setData(\"text/plain\", text);\n    }\n    else {\n        captureCopy(view, dom);\n    }\n    if (cut)\n        view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n    return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n    if (!view.dom.parentNode)\n        return;\n    let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n    let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n    if (!plainText)\n        target.contentEditable = \"true\";\n    target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    target.focus();\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    setTimeout(() => {\n        view.focus();\n        if (target.parentNode)\n            target.parentNode.removeChild(target);\n        if (plainText)\n            doPaste(view, target.value, null, plain, event);\n        else\n            doPaste(view, target.textContent, target.innerHTML, plain, event);\n    }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n    let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n    if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n        return true;\n    if (!slice)\n        return false;\n    let singleNode = sliceSingleNode(slice);\n    let tr = singleNode\n        ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)\n        : view.state.tr.replaceSelection(slice);\n    view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n    return true;\n}\nfunction getText(clipboardData) {\n    let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n    if (text)\n        return text;\n    let uris = clipboardData.getData(\"text/uri-list\");\n    return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n    let event = _event;\n    // Handling paste from JavaScript during composition is very poorly\n    // handled by browsers, so as a dodgy but preferable kludge, we just\n    // let the browser do its native thing there, except on Android,\n    // where the editor is almost always composing.\n    if (view.composing && !android)\n        return;\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n        event.preventDefault();\n    else\n        capturePaste(view, event);\n};\nclass Dragging {\n    constructor(slice, move, node) {\n        this.slice = slice;\n        this.move = move;\n        this.node = node;\n    }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nfunction dragMoves(view, event) {\n    let moves = view.someProp(\"dragCopies\", test => !test(event));\n    return moves != null ? moves : !event[dragCopyModifier];\n}\nhandlers.dragstart = (view, _event) => {\n    let event = _event;\n    let mouseDown = view.input.mouseDown;\n    if (mouseDown)\n        mouseDown.done();\n    if (!event.dataTransfer)\n        return;\n    let sel = view.state.selection;\n    let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n    let node;\n    if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n    else if (mouseDown && mouseDown.mightDrag) {\n        node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n    }\n    else if (event.target && event.target.nodeType == 1) {\n        let desc = view.docView.nearestDesc(event.target, true);\n        if (desc && desc.node.type.spec.draggable && desc != view.docView)\n            node = NodeSelection.create(view.state.doc, desc.posBefore);\n    }\n    let draggedSlice = (node || view.state.selection).content();\n    let { dom, text, slice } = serializeForClipboard(view, draggedSlice);\n    // Pre-120 Chrome versions clear files when calling `clearData` (#1472)\n    if (!event.dataTransfer.files.length || !chrome || chrome_version > 120)\n        event.dataTransfer.clearData();\n    event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n    // See https://github.com/ProseMirror/prosemirror/issues/1156\n    event.dataTransfer.effectAllowed = \"copyMove\";\n    if (!brokenClipboardAPI)\n        event.dataTransfer.setData(\"text/plain\", text);\n    view.dragging = new Dragging(slice, dragMoves(view, event), node);\n};\nhandlers.dragend = view => {\n    let dragging = view.dragging;\n    window.setTimeout(() => {\n        if (view.dragging == dragging)\n            view.dragging = null;\n    }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, _event) => {\n    let event = _event;\n    let dragging = view.dragging;\n    view.dragging = null;\n    if (!event.dataTransfer)\n        return;\n    let eventPos = view.posAtCoords(eventCoords(event));\n    if (!eventPos)\n        return;\n    let $mouse = view.state.doc.resolve(eventPos.pos);\n    let slice = dragging && dragging.slice;\n    if (slice) {\n        view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n    }\n    else {\n        slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n    }\n    let move = !!(dragging && dragMoves(view, event));\n    if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n        event.preventDefault();\n        return;\n    }\n    if (!slice)\n        return;\n    event.preventDefault();\n    let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n    if (insertPos == null)\n        insertPos = $mouse.pos;\n    let tr = view.state.tr;\n    if (move) {\n        let { node } = dragging;\n        if (node)\n            node.replace(tr);\n        else\n            tr.deleteSelection();\n    }\n    let pos = tr.mapping.map(insertPos);\n    let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n    let beforeInsert = tr.doc;\n    if (isNode)\n        tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n    else\n        tr.replaceRange(pos, pos, slice);\n    if (tr.doc.eq(beforeInsert))\n        return;\n    let $pos = tr.doc.resolve(pos);\n    if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n        $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n        tr.setSelection(new NodeSelection($pos));\n    }\n    else {\n        let end = tr.mapping.map(insertPos);\n        tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n        tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n    }\n    view.focus();\n    view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\nhandlers.focus = view => {\n    view.input.lastFocus = Date.now();\n    if (!view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.add(\"ProseMirror-focused\");\n        view.domObserver.start();\n        view.focused = true;\n        setTimeout(() => {\n            if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n                selectionToDOM(view);\n        }, 20);\n    }\n};\nhandlers.blur = (view, _event) => {\n    let event = _event;\n    if (view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.remove(\"ProseMirror-focused\");\n        view.domObserver.start();\n        if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n            view.domObserver.currentSelection.clear();\n        view.focused = false;\n    }\n};\nhandlers.beforeinput = (view, _event) => {\n    let event = _event;\n    // We should probably do more with beforeinput events, but support\n    // is so spotty that I'm still waiting to see where they are going.\n    // Very specific hack to deal with backspace sometimes failing on\n    // Chrome Android when after an uneditable node.\n    if (chrome && android && event.inputType == \"deleteContentBackward\") {\n        view.domObserver.flushSoon();\n        let { domChangeCount } = view.input;\n        setTimeout(() => {\n            if (view.input.domChangeCount != domChangeCount)\n                return; // Event already had some effect\n            // This bug tends to close the virtual keyboard, so we refocus\n            view.dom.blur();\n            view.focus();\n            if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n                return;\n            let { $cursor } = view.state.selection;\n            // Crude approximation of backspace behavior when no command handled it\n            if ($cursor && $cursor.pos > 0)\n                view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n        }, 50);\n    }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n    handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n    if (a == b)\n        return true;\n    for (let p in a)\n        if (a[p] !== b[p])\n            return false;\n    for (let p in b)\n        if (!(p in a))\n            return false;\n    return true;\n}\nclass WidgetType {\n    constructor(toDOM, spec) {\n        this.toDOM = toDOM;\n        this.spec = spec || noSpec;\n        this.side = this.spec.side || 0;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n        return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n    }\n    valid() { return true; }\n    eq(other) {\n        return this == other ||\n            (other instanceof WidgetType &&\n                (this.spec.key && this.spec.key == other.spec.key ||\n                    this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n    }\n    destroy(node) {\n        if (this.spec.destroy)\n            this.spec.destroy(node);\n    }\n}\nclass InlineType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n        let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n        return from >= to ? null : new Decoration(from, to, this);\n    }\n    valid(_, span) { return span.from < span.to; }\n    eq(other) {\n        return this == other ||\n            (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    static is(span) { return span.type instanceof InlineType; }\n    destroy() { }\n}\nclass NodeType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.mapResult(span.from + oldOffset, 1);\n        if (from.deleted)\n            return null;\n        let to = mapping.mapResult(span.to + oldOffset, -1);\n        if (to.deleted || to.pos <= from.pos)\n            return null;\n        return new Decoration(from.pos - offset, to.pos - offset, this);\n    }\n    valid(node, span) {\n        let { index, offset } = node.content.findIndex(span.from), child;\n        return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n    }\n    eq(other) {\n        return this == other ||\n            (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The start position of the decoration.\n    */\n    from, \n    /**\n    The end position. Will be the same as `from` for [widget\n    decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n    */\n    to, \n    /**\n    @internal\n    */\n    type) {\n        this.from = from;\n        this.to = to;\n        this.type = type;\n    }\n    /**\n    @internal\n    */\n    copy(from, to) {\n        return new Decoration(from, to, this.type);\n    }\n    /**\n    @internal\n    */\n    eq(other, offset = 0) {\n        return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n    }\n    /**\n    @internal\n    */\n    map(mapping, offset, oldOffset) {\n        return this.type.map(mapping, this, offset, oldOffset);\n    }\n    /**\n    Creates a widget decoration, which is a DOM node that's shown in\n    the document at the given position. It is recommended that you\n    delay rendering the widget by passing a function that will be\n    called when the widget is actually drawn in a view, but you can\n    also directly pass a DOM node. `getPos` can be used to find the\n    widget's current document position.\n    */\n    static widget(pos, toDOM, spec) {\n        return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n    }\n    /**\n    Creates an inline decoration, which adds the given attributes to\n    each inline node between `from` and `to`.\n    */\n    static inline(from, to, attrs, spec) {\n        return new Decoration(from, to, new InlineType(attrs, spec));\n    }\n    /**\n    Creates a node decoration. `from` and `to` should point precisely\n    before and after a node in the document. That node, and only that\n    node, will receive the given attributes.\n    */\n    static node(from, to, attrs, spec) {\n        return new Decoration(from, to, new NodeType(attrs, spec));\n    }\n    /**\n    The spec provided when creating this decoration. Can be useful\n    if you've stored extra information in that object.\n    */\n    get spec() { return this.type.spec; }\n    /**\n    @internal\n    */\n    get inline() { return this.type instanceof InlineType; }\n    /**\n    @internal\n    */\n    get widget() { return this.type instanceof WidgetType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n    /**\n    @internal\n    */\n    constructor(local, children) {\n        this.local = local.length ? local : none;\n        this.children = children.length ? children : none;\n    }\n    /**\n    Create a set of decorations, using the structure of the given\n    document. This will consume (modify) the `decorations` array, so\n    you must make a copy if you want need to preserve that.\n    */\n    static create(doc, decorations) {\n        return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n    }\n    /**\n    Find all decorations in this set which touch the given range\n    (including decorations that start or end directly at the\n    boundaries) and match the given predicate on their spec. When\n    `start` and `end` are omitted, all decorations in the set are\n    considered. When `predicate` isn't given, all decorations are\n    assumed to match.\n    */\n    find(start, end, predicate) {\n        let result = [];\n        this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n        return result;\n    }\n    findInner(start, end, result, offset, predicate) {\n        for (let i = 0; i < this.local.length; i++) {\n            let span = this.local[i];\n            if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n                result.push(span.copy(span.from + offset, span.to + offset));\n        }\n        for (let i = 0; i < this.children.length; i += 3) {\n            if (this.children[i] < end && this.children[i + 1] > start) {\n                let childOff = this.children[i] + 1;\n                this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n            }\n        }\n    }\n    /**\n    Map the set of decorations in response to a change in the\n    document.\n    */\n    map(mapping, doc, options) {\n        if (this == empty || mapping.maps.length == 0)\n            return this;\n        return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n    }\n    /**\n    @internal\n    */\n    mapInner(mapping, node, offset, oldOffset, options) {\n        let newLocal;\n        for (let i = 0; i < this.local.length; i++) {\n            let mapped = this.local[i].map(mapping, offset, oldOffset);\n            if (mapped && mapped.type.valid(node, mapped))\n                (newLocal || (newLocal = [])).push(mapped);\n            else if (options.onRemove)\n                options.onRemove(this.local[i].spec);\n        }\n        if (this.children.length)\n            return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n        else\n            return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n    }\n    /**\n    Add the given array of decorations to the ones in the set,\n    producing a new set. Consumes the `decorations` array. Needs\n    access to the current document to create the appropriate tree\n    structure.\n    */\n    add(doc, decorations) {\n        if (!decorations.length)\n            return this;\n        if (this == empty)\n            return DecorationSet.create(doc, decorations);\n        return this.addInner(doc, decorations, 0);\n    }\n    addInner(doc, decorations, offset) {\n        let children, childIndex = 0;\n        doc.forEach((childNode, childOffset) => {\n            let baseOffset = childOffset + offset, found;\n            if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n                return;\n            if (!children)\n                children = this.children.slice();\n            while (childIndex < children.length && children[childIndex] < childOffset)\n                childIndex += 3;\n            if (children[childIndex] == childOffset)\n                children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n            else\n                children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n            childIndex += 3;\n        });\n        let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n        for (let i = 0; i < local.length; i++)\n            if (!local[i].type.valid(doc, local[i]))\n                local.splice(i--, 1);\n        return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n    }\n    /**\n    Create a new set that contains the decorations in this set, minus\n    the ones in the given array.\n    */\n    remove(decorations) {\n        if (decorations.length == 0 || this == empty)\n            return this;\n        return this.removeInner(decorations, 0);\n    }\n    removeInner(decorations, offset) {\n        let children = this.children, local = this.local;\n        for (let i = 0; i < children.length; i += 3) {\n            let found;\n            let from = children[i] + offset, to = children[i + 1] + offset;\n            for (let j = 0, span; j < decorations.length; j++)\n                if (span = decorations[j]) {\n                    if (span.from > from && span.to < to) {\n                        decorations[j] = null;\n                        (found || (found = [])).push(span);\n                    }\n                }\n            if (!found)\n                continue;\n            if (children == this.children)\n                children = this.children.slice();\n            let removed = children[i + 2].removeInner(found, from + 1);\n            if (removed != empty) {\n                children[i + 2] = removed;\n            }\n            else {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        }\n        if (local.length)\n            for (let i = 0, span; i < decorations.length; i++)\n                if (span = decorations[i]) {\n                    for (let j = 0; j < local.length; j++)\n                        if (local[j].eq(span, offset)) {\n                            if (local == this.local)\n                                local = this.local.slice();\n                            local.splice(j--, 1);\n                        }\n                }\n        if (children == this.children && local == this.local)\n            return this;\n        return local.length || children.length ? new DecorationSet(local, children) : empty;\n    }\n    forChild(offset, node) {\n        if (this == empty)\n            return this;\n        if (node.isLeaf)\n            return DecorationSet.empty;\n        let child, local;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] >= offset) {\n                if (this.children[i] == offset)\n                    child = this.children[i + 2];\n                break;\n            }\n        let start = offset + 1, end = start + node.content.size;\n        for (let i = 0; i < this.local.length; i++) {\n            let dec = this.local[i];\n            if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n                let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n                if (from < to)\n                    (local || (local = [])).push(dec.copy(from, to));\n            }\n        }\n        if (local) {\n            let localSet = new DecorationSet(local.sort(byPos), none);\n            return child ? new DecorationGroup([localSet, child]) : localSet;\n        }\n        return child || empty;\n    }\n    /**\n    @internal\n    */\n    eq(other) {\n        if (this == other)\n            return true;\n        if (!(other instanceof DecorationSet) ||\n            this.local.length != other.local.length ||\n            this.children.length != other.children.length)\n            return false;\n        for (let i = 0; i < this.local.length; i++)\n            if (!this.local[i].eq(other.local[i]))\n                return false;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] != other.children[i] ||\n                this.children[i + 1] != other.children[i + 1] ||\n                !this.children[i + 2].eq(other.children[i + 2]))\n                return false;\n        return true;\n    }\n    /**\n    @internal\n    */\n    locals(node) {\n        return removeOverlap(this.localsInner(node));\n    }\n    /**\n    @internal\n    */\n    localsInner(node) {\n        if (this == empty)\n            return none;\n        if (node.inlineContent || !this.local.some(InlineType.is))\n            return this.local;\n        let result = [];\n        for (let i = 0; i < this.local.length; i++) {\n            if (!(this.local[i].type instanceof InlineType))\n                result.push(this.local[i]);\n        }\n        return result;\n    }\n    forEachSet(f) { f(this); }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n    constructor(members) {\n        this.members = members;\n    }\n    map(mapping, doc) {\n        const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n        return DecorationGroup.from(mappedDecos);\n    }\n    forChild(offset, child) {\n        if (child.isLeaf)\n            return DecorationSet.empty;\n        let found = [];\n        for (let i = 0; i < this.members.length; i++) {\n            let result = this.members[i].forChild(offset, child);\n            if (result == empty)\n                continue;\n            if (result instanceof DecorationGroup)\n                found = found.concat(result.members);\n            else\n                found.push(result);\n        }\n        return DecorationGroup.from(found);\n    }\n    eq(other) {\n        if (!(other instanceof DecorationGroup) ||\n            other.members.length != this.members.length)\n            return false;\n        for (let i = 0; i < this.members.length; i++)\n            if (!this.members[i].eq(other.members[i]))\n                return false;\n        return true;\n    }\n    locals(node) {\n        let result, sorted = true;\n        for (let i = 0; i < this.members.length; i++) {\n            let locals = this.members[i].localsInner(node);\n            if (!locals.length)\n                continue;\n            if (!result) {\n                result = locals;\n            }\n            else {\n                if (sorted) {\n                    result = result.slice();\n                    sorted = false;\n                }\n                for (let j = 0; j < locals.length; j++)\n                    result.push(locals[j]);\n            }\n        }\n        return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n    }\n    // Create a group for the given array of decoration sets, or return\n    // a single set when possible.\n    static from(members) {\n        switch (members.length) {\n            case 0: return empty;\n            case 1: return members[0];\n            default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n                members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n        }\n    }\n    forEachSet(f) {\n        for (let i = 0; i < this.members.length; i++)\n            this.members[i].forEachSet(f);\n    }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n    let children = oldChildren.slice();\n    // Mark the children that are directly touched by changes, and\n    // move those that are after the changes.\n    for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n        let moved = 0;\n        mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n            let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n            for (let i = 0; i < children.length; i += 3) {\n                let end = children[i + 1];\n                if (end < 0 || oldStart > end + baseOffset - moved)\n                    continue;\n                let start = children[i] + baseOffset - moved;\n                if (oldEnd >= start) {\n                    children[i + 1] = oldStart <= start ? -2 : -1;\n                }\n                else if (oldStart >= baseOffset && dSize) {\n                    children[i] += dSize;\n                    children[i + 1] += dSize;\n                }\n            }\n            moved += dSize;\n        });\n        baseOffset = mapping.maps[i].map(baseOffset, -1);\n    }\n    // Find the child nodes that still correspond to a single node,\n    // recursively call mapInner on them and update their positions.\n    let mustRebuild = false;\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] < 0) { // Touched nodes\n            if (children[i + 1] == -2) {\n                mustRebuild = true;\n                children[i + 1] = -1;\n                continue;\n            }\n            let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n            if (fromLocal < 0 || fromLocal >= node.content.size) {\n                mustRebuild = true;\n                continue;\n            }\n            // Must read oldChildren because children was tagged with -1\n            let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n            let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n            let childNode = node.maybeChild(index);\n            if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n                let mapped = children[i + 2]\n                    .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n                if (mapped != empty) {\n                    children[i] = fromLocal;\n                    children[i + 1] = toLocal;\n                    children[i + 2] = mapped;\n                }\n                else {\n                    children[i + 1] = -2;\n                    mustRebuild = true;\n                }\n            }\n            else {\n                mustRebuild = true;\n            }\n        }\n    // Remaining children must be collected and rebuilt into the appropriate structure\n    if (mustRebuild) {\n        let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n        let built = buildTree(decorations, node, 0, options);\n        newLocal = built.local;\n        for (let i = 0; i < children.length; i += 3)\n            if (children[i + 1] < 0) {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        for (let i = 0, j = 0; i < built.children.length; i += 3) {\n            let from = built.children[i];\n            while (j < children.length && children[j] < from)\n                j += 3;\n            children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n        }\n    }\n    return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n    if (!offset || !spans.length)\n        return spans;\n    let result = [];\n    for (let i = 0; i < spans.length; i++) {\n        let span = spans[i];\n        result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n    }\n    return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n    // Gather all decorations from the remaining marked children\n    function gather(set, oldOffset) {\n        for (let i = 0; i < set.local.length; i++) {\n            let mapped = set.local[i].map(mapping, offset, oldOffset);\n            if (mapped)\n                decorations.push(mapped);\n            else if (options.onRemove)\n                options.onRemove(set.local[i].spec);\n        }\n        for (let i = 0; i < set.children.length; i += 3)\n            gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n    }\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] == -1)\n            gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n    return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n    if (node.isLeaf)\n        return null;\n    let end = offset + node.nodeSize, found = null;\n    for (let i = 0, span; i < spans.length; i++) {\n        if ((span = spans[i]) && span.from > offset && span.to < end) {\n            (found || (found = [])).push(span);\n            spans[i] = null;\n        }\n    }\n    return found;\n}\nfunction withoutNulls(array) {\n    let result = [];\n    for (let i = 0; i < array.length; i++)\n        if (array[i] != null)\n            result.push(array[i]);\n    return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n    let children = [], hasNulls = false;\n    node.forEach((childNode, localStart) => {\n        let found = takeSpansForNode(spans, childNode, localStart + offset);\n        if (found) {\n            hasNulls = true;\n            let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n            if (subtree != empty)\n                children.push(localStart, localStart + childNode.nodeSize, subtree);\n        }\n    });\n    let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n    for (let i = 0; i < locals.length; i++)\n        if (!locals[i].type.valid(node, locals[i])) {\n            if (options.onRemove)\n                options.onRemove(locals[i].spec);\n            locals.splice(i--, 1);\n        }\n    return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n    return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n    let working = spans;\n    for (let i = 0; i < working.length - 1; i++) {\n        let span = working[i];\n        if (span.from != span.to)\n            for (let j = i + 1; j < working.length; j++) {\n                let next = working[j];\n                if (next.from == span.from) {\n                    if (next.to != span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // Followed by a partially overlapping larger span. Split that\n                        // span.\n                        working[j] = next.copy(next.from, span.to);\n                        insertAhead(working, j + 1, next.copy(span.to, next.to));\n                    }\n                    continue;\n                }\n                else {\n                    if (next.from < span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // The end of this one overlaps with a subsequent span. Split\n                        // this one.\n                        working[i] = span.copy(span.from, next.from);\n                        insertAhead(working, j, span.copy(next.from, span.to));\n                    }\n                    break;\n                }\n            }\n    }\n    return working;\n}\nfunction insertAhead(array, i, deco) {\n    while (i < array.length && byPos(deco, array[i]) > 0)\n        i++;\n    array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n    let found = [];\n    view.someProp(\"decorations\", f => {\n        let result = f(view.state);\n        if (result && result != empty)\n            found.push(result);\n    });\n    if (view.cursorWrapper)\n        found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n    return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n    childList: true,\n    characterData: true,\n    characterDataOldValue: true,\n    attributes: true,\n    attributeOldValue: true,\n    subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n    constructor() {\n        this.anchorNode = null;\n        this.anchorOffset = 0;\n        this.focusNode = null;\n        this.focusOffset = 0;\n    }\n    set(sel) {\n        this.anchorNode = sel.anchorNode;\n        this.anchorOffset = sel.anchorOffset;\n        this.focusNode = sel.focusNode;\n        this.focusOffset = sel.focusOffset;\n    }\n    clear() {\n        this.anchorNode = this.focusNode = null;\n    }\n    eq(sel) {\n        return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n            sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n    }\n}\nclass DOMObserver {\n    constructor(view, handleDOMChange) {\n        this.view = view;\n        this.handleDOMChange = handleDOMChange;\n        this.queue = [];\n        this.flushingSoon = -1;\n        this.observer = null;\n        this.currentSelection = new SelectionState;\n        this.onCharData = null;\n        this.suppressingSelectionUpdates = false;\n        this.lastChangedTextNode = null;\n        this.observer = window.MutationObserver &&\n            new window.MutationObserver(mutations => {\n                for (let i = 0; i < mutations.length; i++)\n                    this.queue.push(mutations[i]);\n                // IE11 will sometimes (on backspacing out a single character\n                // text node after a BR node) call the observer callback\n                // before actually updating the DOM, which will cause\n                // ProseMirror to miss the change (see #930)\n                if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n                    m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n                    this.flushSoon();\n                else\n                    this.flush();\n            });\n        if (useCharData) {\n            this.onCharData = e => {\n                this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n                this.flushSoon();\n            };\n        }\n        this.onSelectionChange = this.onSelectionChange.bind(this);\n    }\n    flushSoon() {\n        if (this.flushingSoon < 0)\n            this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n    }\n    forceFlush() {\n        if (this.flushingSoon > -1) {\n            window.clearTimeout(this.flushingSoon);\n            this.flushingSoon = -1;\n            this.flush();\n        }\n    }\n    start() {\n        if (this.observer) {\n            this.observer.takeRecords();\n            this.observer.observe(this.view.dom, observeOptions);\n        }\n        if (this.onCharData)\n            this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.connectSelection();\n    }\n    stop() {\n        if (this.observer) {\n            let take = this.observer.takeRecords();\n            if (take.length) {\n                for (let i = 0; i < take.length; i++)\n                    this.queue.push(take[i]);\n                window.setTimeout(() => this.flush(), 20);\n            }\n            this.observer.disconnect();\n        }\n        if (this.onCharData)\n            this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.disconnectSelection();\n    }\n    connectSelection() {\n        this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    disconnectSelection() {\n        this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    suppressSelectionUpdates() {\n        this.suppressingSelectionUpdates = true;\n        setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n    }\n    onSelectionChange() {\n        if (!hasFocusAndSelection(this.view))\n            return;\n        if (this.suppressingSelectionUpdates)\n            return selectionToDOM(this.view);\n        // Deletions on IE11 fire their events in the wrong order, giving\n        // us a selection change event before the DOM changes are\n        // reported.\n        if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n            let sel = this.view.domSelectionRange();\n            // Selection.isCollapsed isn't reliable on IE\n            if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n                return this.flushSoon();\n        }\n        this.flush();\n    }\n    setCurSelection() {\n        this.currentSelection.set(this.view.domSelectionRange());\n    }\n    ignoreSelectionChange(sel) {\n        if (!sel.focusNode)\n            return true;\n        let ancestors = new Set, container;\n        for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n            ancestors.add(scan);\n        for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n            if (ancestors.has(scan)) {\n                container = scan;\n                break;\n            }\n        let desc = container && this.view.docView.nearestDesc(container);\n        if (desc && desc.ignoreMutation({\n            type: \"selection\",\n            target: container.nodeType == 3 ? container.parentNode : container\n        })) {\n            this.setCurSelection();\n            return true;\n        }\n    }\n    pendingRecords() {\n        if (this.observer)\n            for (let mut of this.observer.takeRecords())\n                this.queue.push(mut);\n        return this.queue;\n    }\n    flush() {\n        let { view } = this;\n        if (!view.docView || this.flushingSoon > -1)\n            return;\n        let mutations = this.pendingRecords();\n        if (mutations.length)\n            this.queue = [];\n        let sel = view.domSelectionRange();\n        let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n        let from = -1, to = -1, typeOver = false, added = [];\n        if (view.editable) {\n            for (let i = 0; i < mutations.length; i++) {\n                let result = this.registerMutation(mutations[i], added);\n                if (result) {\n                    from = from < 0 ? result.from : Math.min(result.from, from);\n                    to = to < 0 ? result.to : Math.max(result.to, to);\n                    if (result.typeOver)\n                        typeOver = true;\n                }\n            }\n        }\n        if (gecko && added.length) {\n            let brs = added.filter(n => n.nodeName == \"BR\");\n            if (brs.length == 2) {\n                let [a, b] = brs;\n                if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n                    b.remove();\n                else\n                    a.remove();\n            }\n            else {\n                let { focusNode } = this.currentSelection;\n                for (let br of brs) {\n                    let parent = br.parentNode;\n                    if (parent && parent.nodeName == \"LI\" && (!focusNode || blockParent(view, focusNode) != parent))\n                        br.remove();\n                }\n            }\n        }\n        let readSel = null;\n        // If it looks like the browser has reset the selection to the\n        // start of the document after focus, restore the selection from\n        // the state\n        if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n            Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n            selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n            readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n            view.input.lastFocus = 0;\n            selectionToDOM(view);\n            this.currentSelection.set(sel);\n            view.scrollToSelection();\n        }\n        else if (from > -1 || newSel) {\n            if (from > -1) {\n                view.docView.markDirty(from, to);\n                checkCSS(view);\n            }\n            this.handleDOMChange(from, to, typeOver, added);\n            if (view.docView && view.docView.dirty)\n                view.updateState(view.state);\n            else if (!this.currentSelection.eq(sel))\n                selectionToDOM(view);\n            this.currentSelection.set(sel);\n        }\n    }\n    registerMutation(mut, added) {\n        // Ignore mutations inside nodes that were already noted as inserted\n        if (added.indexOf(mut.target) > -1)\n            return null;\n        let desc = this.view.docView.nearestDesc(mut.target);\n        if (mut.type == \"attributes\" &&\n            (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n                // Firefox sometimes fires spurious events for null/empty styles\n                (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n            return null;\n        if (!desc || desc.ignoreMutation(mut))\n            return null;\n        if (mut.type == \"childList\") {\n            for (let i = 0; i < mut.addedNodes.length; i++) {\n                let node = mut.addedNodes[i];\n                added.push(node);\n                if (node.nodeType == 3)\n                    this.lastChangedTextNode = node;\n            }\n            if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n                return { from: desc.posBefore, to: desc.posAfter };\n            let prev = mut.previousSibling, next = mut.nextSibling;\n            if (ie && ie_version <= 11 && mut.addedNodes.length) {\n                // IE11 gives us incorrect next/prev siblings for some\n                // insertions, so if there are added nodes, recompute those\n                for (let i = 0; i < mut.addedNodes.length; i++) {\n                    let { previousSibling, nextSibling } = mut.addedNodes[i];\n                    if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n                        prev = previousSibling;\n                    if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n                        next = nextSibling;\n                }\n            }\n            let fromOffset = prev && prev.parentNode == mut.target\n                ? domIndex(prev) + 1 : 0;\n            let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n            let toOffset = next && next.parentNode == mut.target\n                ? domIndex(next) : mut.target.childNodes.length;\n            let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n            return { from, to };\n        }\n        else if (mut.type == \"attributes\") {\n            return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n        }\n        else { // \"characterData\"\n            this.lastChangedTextNode = mut.target;\n            return {\n                from: desc.posAtStart,\n                to: desc.posAtEnd,\n                // An event was generated for a text change that didn't change\n                // any text. Mark the dom change to fall back to assuming the\n                // selection was typed over with an identical value if it can't\n                // find another change.\n                typeOver: mut.target.nodeValue == mut.oldValue\n            };\n        }\n    }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n    if (cssChecked.has(view))\n        return;\n    cssChecked.set(view, null);\n    if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n        view.requiresGeckoHackNode = gecko;\n        if (cssCheckWarned)\n            return;\n        console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n        cssCheckWarned = true;\n    }\n}\nfunction rangeToSelectionRange(view, range) {\n    let anchorNode = range.startContainer, anchorOffset = range.startOffset;\n    let focusNode = range.endContainer, focusOffset = range.endOffset;\n    let currentAnchor = view.domAtPos(view.state.selection.anchor);\n    // Since such a range doesn't distinguish between anchor and head,\n    // use a heuristic that flips it around if its end matches the\n    // current anchor.\n    if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n        [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n    return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view, selection) {\n    if (selection.getComposedRanges) {\n        let range = selection.getComposedRanges(view.root)[0];\n        if (range)\n            return rangeToSelectionRange(view, range);\n    }\n    let found;\n    function read(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        found = event.getTargetRanges()[0];\n    }\n    // Because Safari (at least in 2018-2022) doesn't provide regular\n    // access to the selection inside a shadowRoot, we have to perform a\n    // ridiculous hack to get at it—using `execCommand` to trigger a\n    // `beforeInput` event so that we can read the target range from the\n    // event.\n    view.dom.addEventListener(\"beforeinput\", read, true);\n    document.execCommand(\"indent\");\n    view.dom.removeEventListener(\"beforeinput\", read, true);\n    return found ? rangeToSelectionRange(view, found) : null;\n}\nfunction blockParent(view, node) {\n    for (let p = node.parentNode; p && p != view.dom; p = p.parentNode) {\n        let desc = view.docView.nearestDesc(p, true);\n        if (desc && desc.node.isBlock)\n            return p;\n    }\n    return null;\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_) {\n    let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n    let domSel = view.domSelectionRange();\n    let find;\n    let anchor = domSel.anchorNode;\n    if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n        find = [{ node: anchor, offset: domSel.anchorOffset }];\n        if (!selectionCollapsed(domSel))\n            find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n    }\n    // Work around issue in Chrome where backspacing sometimes replaces\n    // the deleted content with a random BR node (issues #799, #831)\n    if (chrome && view.input.lastKeyCode === 8) {\n        for (let off = toOffset; off > fromOffset; off--) {\n            let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n            if (node.nodeName == \"BR\" && !desc) {\n                toOffset = off;\n                break;\n            }\n            if (!desc || desc.size)\n                break;\n        }\n    }\n    let startDoc = view.state.doc;\n    let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n    let $from = startDoc.resolve(from);\n    let sel = null, doc = parser.parse(parent, {\n        topNode: $from.parent,\n        topMatch: $from.parent.contentMatchAt($from.index()),\n        topOpen: true,\n        from: fromOffset,\n        to: toOffset,\n        preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n        findPositions: find,\n        ruleFromNode,\n        context: $from\n    });\n    if (find && find[0].pos != null) {\n        let anchor = find[0].pos, head = find[1] && find[1].pos;\n        if (head == null)\n            head = anchor;\n        sel = { anchor: anchor + from, head: head + from };\n    }\n    return { doc, sel, from, to };\n}\nfunction ruleFromNode(dom) {\n    let desc = dom.pmViewDesc;\n    if (desc) {\n        return desc.parseRule();\n    }\n    else if (dom.nodeName == \"BR\" && dom.parentNode) {\n        // Safari replaces the list item or table cell with a BR\n        // directly in the list node (?!) if you delete the last\n        // character in a list item or table cell (#708, #862)\n        if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n            let skip = document.createElement(\"div\");\n            skip.appendChild(document.createElement(\"li\"));\n            return { skip };\n        }\n        else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n            return { ignore: true };\n        }\n    }\n    else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n        return { ignore: true };\n    }\n    return null;\n}\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n    let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n    view.input.compositionPendingChanges = 0;\n    if (from < 0) {\n        let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n        let newSel = selectionFromDOM(view, origin);\n        if (newSel && !view.state.selection.eq(newSel)) {\n            if (chrome && android &&\n                view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n                return;\n            let tr = view.state.tr.setSelection(newSel);\n            if (origin == \"pointer\")\n                tr.setMeta(\"pointer\", true);\n            else if (origin == \"key\")\n                tr.scrollIntoView();\n            if (compositionID)\n                tr.setMeta(\"composition\", compositionID);\n            view.dispatch(tr);\n        }\n        return;\n    }\n    let $before = view.state.doc.resolve(from);\n    let shared = $before.sharedDepth(to);\n    from = $before.before(shared + 1);\n    to = view.state.doc.resolve(to).after(shared + 1);\n    let sel = view.state.selection;\n    let parse = parseBetween(view, from, to);\n    let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n    let preferredPos, preferredSide;\n    // Prefer anchoring to end when Backspace is pressed\n    if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n        preferredPos = view.state.selection.to;\n        preferredSide = \"end\";\n    }\n    else {\n        preferredPos = view.state.selection.from;\n        preferredSide = \"start\";\n    }\n    view.input.lastKeyCode = null;\n    let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n    if (change)\n        view.input.domChangeCount++;\n    if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n        addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&\n        (!change || change.endA >= change.endB) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    if (!change) {\n        if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n            !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n            change = { start: sel.from, endA: sel.to, endB: sel.to };\n        }\n        else {\n            if (parse.sel) {\n                let sel = resolveSelection(view, view.state.doc, parse.sel);\n                if (sel && !sel.eq(view.state.selection)) {\n                    let tr = view.state.tr.setSelection(sel);\n                    if (compositionID)\n                        tr.setMeta(\"composition\", compositionID);\n                    view.dispatch(tr);\n                }\n            }\n            return;\n        }\n    }\n    // Handle the case where overwriting a selection by typing matches\n    // the start or end of the selected content, creating a change\n    // that's smaller than what was actually overwritten.\n    if (view.state.selection.from < view.state.selection.to &&\n        change.start == change.endB &&\n        view.state.selection instanceof TextSelection) {\n        if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n            view.state.selection.from >= parse.from) {\n            change.start = view.state.selection.from;\n        }\n        else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n            view.state.selection.to <= parse.to) {\n            change.endB += (view.state.selection.to - change.endA);\n            change.endA = view.state.selection.to;\n        }\n    }\n    // IE11 will insert a non-breaking space _ahead_ of the space after\n    // the cursor space when adding a space before another space. When\n    // that happened, adjust the change to cover the space instead.\n    if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n        change.endA == change.start && change.start > parse.from &&\n        parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n        change.start--;\n        change.endA--;\n        change.endB--;\n    }\n    let $from = parse.doc.resolveNoCache(change.start - parse.from);\n    let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n    let $fromA = doc.resolve(change.start);\n    let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n    let nextSel;\n    // If this looks like the effect of pressing Enter (or was recorded\n    // as being an iOS enter press), just dispatch an Enter key instead.\n    if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n        (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n        (!inlineChange && $from.pos < parse.doc.content.size &&\n            (!$from.sameParent($to) || !$from.parent.inlineContent) &&\n            !/\\S/.test(parse.doc.textBetween($from.pos, $to.pos, \"\", \"\")) &&\n            (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n            nextSel.head > $from.pos)) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    // Same for backspace\n    if (view.state.selection.anchor > change.start &&\n        looksLikeBackspace(doc, change.start, change.endA, $from, $to) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n        if (android && chrome)\n            view.domObserver.suppressSelectionUpdates(); // #820\n        return;\n    }\n    // Chrome will occasionally, during composition, delete the\n    // entire composition and then immediately insert it again. This is\n    // used to detect that situation.\n    if (chrome && change.endB == change.start)\n        view.input.lastChromeDelete = Date.now();\n    // This tries to detect Android virtual keyboard\n    // enter-and-pick-suggestion action. That sometimes (see issue\n    // #1059) first fires a DOM mutation, before moving the selection to\n    // the newly created block. And then, because ProseMirror cleans up\n    // the DOM selection, it gives up moving the selection entirely,\n    // leaving the cursor in the wrong place. When that happens, we drop\n    // the new paragraph from the initial change, and fire a simulated\n    // enter key afterwards.\n    if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n        parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n        change.endB -= 2;\n        $to = parse.doc.resolveNoCache(change.endB - parse.from);\n        setTimeout(() => {\n            view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n        }, 20);\n    }\n    let chFrom = change.start, chTo = change.endA;\n    let mkTr = (base) => {\n        let tr = base || view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n        if (parse.sel) {\n            let sel = resolveSelection(view, tr.doc, parse.sel);\n            // Chrome will sometimes, during composition, report the\n            // selection in the wrong place. If it looks like that is\n            // happening, don't update the selection.\n            // Edge just doesn't move the cursor forward when you start typing\n            // in an empty block or between br nodes.\n            if (sel && !(chrome && view.composing && sel.empty &&\n                (change.start != change.endB || view.input.lastChromeDelete < Date.now() - 100) &&\n                (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n                ie && sel.empty && sel.head == chFrom))\n                tr.setSelection(sel);\n        }\n        if (compositionID)\n            tr.setMeta(\"composition\", compositionID);\n        return tr.scrollIntoView();\n    };\n    let markChange;\n    if (inlineChange) {\n        if ($from.pos == $to.pos) { // Deletion\n            // IE11 sometimes weirdly moves the DOM selection around after\n            // backspacing out the first element in a textblock\n            if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n                view.domObserver.suppressSelectionUpdates();\n                setTimeout(() => selectionToDOM(view), 20);\n            }\n            let tr = mkTr(view.state.tr.delete(chFrom, chTo));\n            let marks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n            if (marks)\n                tr.ensureMarks(marks);\n            view.dispatch(tr);\n        }\n        else if ( // Adding or removing a mark\n        change.endA == change.endB &&\n            (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n            let tr = mkTr(view.state.tr);\n            if (markChange.type == \"add\")\n                tr.addMark(chFrom, chTo, markChange.mark);\n            else\n                tr.removeMark(chFrom, chTo, markChange.mark);\n            view.dispatch(tr);\n        }\n        else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n            // Both positions in the same text node -- simply insert text\n            let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n            let deflt = () => mkTr(view.state.tr.insertText(text, chFrom, chTo));\n            if (!view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text, deflt)))\n                view.dispatch(deflt());\n        }\n    }\n    else {\n        view.dispatch(mkTr());\n    }\n}\nfunction resolveSelection(view, doc, parsedSel) {\n    if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n        return null;\n    return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n    let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n    let added = curMarks, removed = prevMarks, type, mark, update;\n    for (let i = 0; i < prevMarks.length; i++)\n        added = prevMarks[i].removeFromSet(added);\n    for (let i = 0; i < curMarks.length; i++)\n        removed = curMarks[i].removeFromSet(removed);\n    if (added.length == 1 && removed.length == 0) {\n        mark = added[0];\n        type = \"add\";\n        update = (node) => node.mark(mark.addToSet(node.marks));\n    }\n    else if (added.length == 0 && removed.length == 1) {\n        mark = removed[0];\n        type = \"remove\";\n        update = (node) => node.mark(mark.removeFromSet(node.marks));\n    }\n    else {\n        return null;\n    }\n    let updated = [];\n    for (let i = 0; i < prev.childCount; i++)\n        updated.push(update(prev.child(i)));\n    if (Fragment.from(updated).eq(cur))\n        return { mark, type };\n}\nfunction looksLikeBackspace(old, start, end, $newStart, $newEnd) {\n    if ( // The content must have shrunk\n    end - start <= $newEnd.pos - $newStart.pos ||\n        // newEnd must point directly at or after the end of the block that newStart points into\n        skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n        return false;\n    let $start = old.resolve(start);\n    // Handle the case where, rather than joining blocks, the change just removed an entire block\n    if (!$newStart.parent.isTextblock) {\n        let after = $start.nodeAfter;\n        return after != null && end == start + after.nodeSize;\n    }\n    // Start must be at the end of a block\n    if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n        return false;\n    let $next = old.resolve(skipClosingAndOpening($start, true, true));\n    // The next textblock must start before end and end near it\n    if (!$next.parent.isTextblock || $next.pos > end ||\n        skipClosingAndOpening($next, true, false) < end)\n        return false;\n    // The fragments after the join point must match\n    return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n    let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n    while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n        depth--;\n        end++;\n        fromEnd = false;\n    }\n    if (mayOpen) {\n        let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n        while (next && !next.isLeaf) {\n            next = next.firstChild;\n            end++;\n        }\n    }\n    return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n    let start = a.findDiffStart(b, pos);\n    if (start == null)\n        return null;\n    let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);\n    if (preferredSide == \"end\") {\n        let adjust = Math.max(0, start - Math.min(endA, endB));\n        preferredPos -= endA + adjust - start;\n    }\n    if (endA < start && a.size < b.size) {\n        let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n        start -= move;\n        if (start && start < b.size && isSurrogatePair(b.textBetween(start - 1, start + 1)))\n            start += move ? 1 : -1;\n        endB = start + (endB - endA);\n        endA = start;\n    }\n    else if (endB < start) {\n        let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n        start -= move;\n        if (start && start < a.size && isSurrogatePair(a.textBetween(start - 1, start + 1)))\n            start += move ? 1 : -1;\n        endA = start + (endA - endB);\n        endB = start;\n    }\n    return { start, endA, endB };\n}\nfunction isSurrogatePair(str) {\n    if (str.length != 2)\n        return false;\n    let a = str.charCodeAt(0), b = str.charCodeAt(1);\n    return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;\n}\n\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n    /**\n    Create a view. `place` may be a DOM node that the editor should\n    be appended to, a function that will place it into the document,\n    or an object whose `mount` property holds the node to use as the\n    document container. If it is `null`, the editor will not be\n    added to the document.\n    */\n    constructor(place, props) {\n        this._root = null;\n        /**\n        @internal\n        */\n        this.focused = false;\n        /**\n        Kludge used to work around a Chrome bug @internal\n        */\n        this.trackWrites = null;\n        this.mounted = false;\n        /**\n        @internal\n        */\n        this.markCursor = null;\n        /**\n        @internal\n        */\n        this.cursorWrapper = null;\n        /**\n        @internal\n        */\n        this.lastSelectedViewDesc = undefined;\n        /**\n        @internal\n        */\n        this.input = new InputState;\n        this.prevDirectPlugins = [];\n        this.pluginViews = [];\n        /**\n        Holds `true` when a hack node is needed in Firefox to prevent the\n        [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)\n        @internal\n        */\n        this.requiresGeckoHackNode = false;\n        /**\n        When editor content is being dragged, this object contains\n        information about the dragged slice and whether it is being\n        copied or moved. At any other time, it is null.\n        */\n        this.dragging = null;\n        this._props = props;\n        this.state = props.state;\n        this.directPlugins = props.plugins || [];\n        this.directPlugins.forEach(checkStateComponent);\n        this.dispatch = this.dispatch.bind(this);\n        this.dom = (place && place.mount) || document.createElement(\"div\");\n        if (place) {\n            if (place.appendChild)\n                place.appendChild(this.dom);\n            else if (typeof place == \"function\")\n                place(this.dom);\n            else if (place.mount)\n                this.mounted = true;\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        this.nodeViews = buildNodeViews(this);\n        this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n        this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n        this.domObserver.start();\n        initInput(this);\n        this.updatePluginViews();\n    }\n    /**\n    Holds `true` when a\n    [composition](https://w3c.github.io/uievents/#events-compositionevents)\n    is active.\n    */\n    get composing() { return this.input.composing; }\n    /**\n    The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n    */\n    get props() {\n        if (this._props.state != this.state) {\n            let prev = this._props;\n            this._props = {};\n            for (let name in prev)\n                this._props[name] = prev[name];\n            this._props.state = this.state;\n        }\n        return this._props;\n    }\n    /**\n    Update the view's props. Will immediately cause an update to\n    the DOM.\n    */\n    update(props) {\n        if (props.handleDOMEvents != this._props.handleDOMEvents)\n            ensureListeners(this);\n        let prevProps = this._props;\n        this._props = props;\n        if (props.plugins) {\n            props.plugins.forEach(checkStateComponent);\n            this.directPlugins = props.plugins;\n        }\n        this.updateStateInner(props.state, prevProps);\n    }\n    /**\n    Update the view by updating existing props object with the object\n    given as argument. Equivalent to `view.update(Object.assign({},\n    view.props, props))`.\n    */\n    setProps(props) {\n        let updated = {};\n        for (let name in this._props)\n            updated[name] = this._props[name];\n        updated.state = this.state;\n        for (let name in props)\n            updated[name] = props[name];\n        this.update(updated);\n    }\n    /**\n    Update the editor's `state` prop, without touching any of the\n    other props.\n    */\n    updateState(state) {\n        this.updateStateInner(state, this._props);\n    }\n    updateStateInner(state, prevProps) {\n        var _a;\n        let prev = this.state, redraw = false, updateSel = false;\n        // When stored marks are added, stop composition, so that they can\n        // be displayed.\n        if (state.storedMarks && this.composing) {\n            clearComposition(this);\n            updateSel = true;\n        }\n        this.state = state;\n        let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n        if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n            let nodeViews = buildNodeViews(this);\n            if (changedNodeViews(nodeViews, this.nodeViews)) {\n                this.nodeViews = nodeViews;\n                redraw = true;\n            }\n        }\n        if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n            ensureListeners(this);\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n        let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n            : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n        let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n        if (updateDoc || !state.selection.eq(prev.selection))\n            updateSel = true;\n        let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n        if (updateSel) {\n            this.domObserver.stop();\n            // Work around an issue in Chrome, IE, and Edge where changing\n            // the DOM around an active selection puts it into a broken\n            // state where the thing the user sees differs from the\n            // selection reported by the Selection object (#710, #973,\n            // #1011, #1013, #1035).\n            let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n                !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n            if (updateDoc) {\n                // If the node that the selection points into is written to,\n                // Chrome sometimes starts misreporting the selection, so this\n                // tracks that and forces a selection reset when our update\n                // did write to the node.\n                let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n                if (this.composing)\n                    this.input.compositionNode = findCompositionNode(this);\n                if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n                    this.docView.updateOuterDeco(outerDeco);\n                    this.docView.destroy();\n                    this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n                }\n                if (chromeKludge && !this.trackWrites)\n                    forceSelUpdate = true;\n            }\n            // Work around for an issue where an update arriving right between\n            // a DOM selection change and the \"selectionchange\" event for it\n            // can cause a spurious DOM selection update, disrupting mouse\n            // drag selection.\n            if (forceSelUpdate ||\n                !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n                    anchorInRightPlace(this))) {\n                selectionToDOM(this, forceSelUpdate);\n            }\n            else {\n                syncNodeSelection(this, state.selection);\n                this.domObserver.setCurSelection();\n            }\n            this.domObserver.start();\n        }\n        this.updatePluginViews(prev);\n        if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n            this.updateDraggedNode(this.dragging, prev);\n        if (scroll == \"reset\") {\n            this.dom.scrollTop = 0;\n        }\n        else if (scroll == \"to selection\") {\n            this.scrollToSelection();\n        }\n        else if (oldScrollPos) {\n            resetScrollPos(oldScrollPos);\n        }\n    }\n    /**\n    @internal\n    */\n    scrollToSelection() {\n        let startDOM = this.domSelectionRange().focusNode;\n        if (!startDOM || !this.dom.contains(startDOM.nodeType == 1 ? startDOM : startDOM.parentNode)) ;\n        else if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n        else if (this.state.selection instanceof NodeSelection) {\n            let target = this.docView.domAfterPos(this.state.selection.from);\n            if (target.nodeType == 1)\n                scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n        }\n        else {\n            scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n        }\n    }\n    destroyPluginViews() {\n        let view;\n        while (view = this.pluginViews.pop())\n            if (view.destroy)\n                view.destroy();\n    }\n    updatePluginViews(prevState) {\n        if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n            this.prevDirectPlugins = this.directPlugins;\n            this.destroyPluginViews();\n            for (let i = 0; i < this.directPlugins.length; i++) {\n                let plugin = this.directPlugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n            for (let i = 0; i < this.state.plugins.length; i++) {\n                let plugin = this.state.plugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n        }\n        else {\n            for (let i = 0; i < this.pluginViews.length; i++) {\n                let pluginView = this.pluginViews[i];\n                if (pluginView.update)\n                    pluginView.update(this, prevState);\n            }\n        }\n    }\n    updateDraggedNode(dragging, prev) {\n        let sel = dragging.node, found = -1;\n        if (this.state.doc.nodeAt(sel.from) == sel.node) {\n            found = sel.from;\n        }\n        else {\n            let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n            let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);\n            if (moved == sel.node)\n                found = movedPos;\n        }\n        this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : NodeSelection.create(this.state.doc, found));\n    }\n    someProp(propName, f) {\n        let prop = this._props && this._props[propName], value;\n        if (prop != null && (value = f ? f(prop) : prop))\n            return value;\n        for (let i = 0; i < this.directPlugins.length; i++) {\n            let prop = this.directPlugins[i].props[propName];\n            if (prop != null && (value = f ? f(prop) : prop))\n                return value;\n        }\n        let plugins = this.state.plugins;\n        if (plugins)\n            for (let i = 0; i < plugins.length; i++) {\n                let prop = plugins[i].props[propName];\n                if (prop != null && (value = f ? f(prop) : prop))\n                    return value;\n            }\n    }\n    /**\n    Query whether the view has focus.\n    */\n    hasFocus() {\n        // Work around IE not handling focus correctly if resize handles are shown.\n        // If the cursor is inside an element with resize handles, activeElement\n        // will be that element instead of this.dom.\n        if (ie) {\n            // If activeElement is within this.dom, and there are no other elements\n            // setting `contenteditable` to false in between, treat it as focused.\n            let node = this.root.activeElement;\n            if (node == this.dom)\n                return true;\n            if (!node || !this.dom.contains(node))\n                return false;\n            while (node && this.dom != node && this.dom.contains(node)) {\n                if (node.contentEditable == 'false')\n                    return false;\n                node = node.parentElement;\n            }\n            return true;\n        }\n        return this.root.activeElement == this.dom;\n    }\n    /**\n    Focus the editor.\n    */\n    focus() {\n        this.domObserver.stop();\n        if (this.editable)\n            focusPreventScroll(this.dom);\n        selectionToDOM(this);\n        this.domObserver.start();\n    }\n    /**\n    Get the document root in which the editor exists. This will\n    usually be the top-level `document`, but might be a [shadow\n    DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n    root if the editor is inside one.\n    */\n    get root() {\n        let cached = this._root;\n        if (cached == null)\n            for (let search = this.dom.parentNode; search; search = search.parentNode) {\n                if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n                    if (!search.getSelection)\n                        Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n                    return this._root = search;\n                }\n            }\n        return cached || document;\n    }\n    /**\n    When an existing editor view is moved to a new document or\n    shadow tree, call this to make it recompute its root.\n    */\n    updateRoot() {\n        this._root = null;\n    }\n    /**\n    Given a pair of viewport coordinates, return the document\n    position that corresponds to them. May return null if the given\n    coordinates aren't inside of the editor. When an object is\n    returned, its `pos` property is the position nearest to the\n    coordinates, and its `inside` property holds the position of the\n    inner node that the position falls inside of, or -1 if it is at\n    the top level, not in any node.\n    */\n    posAtCoords(coords) {\n        return posAtCoords(this, coords);\n    }\n    /**\n    Returns the viewport rectangle at a given document position.\n    `left` and `right` will be the same number, as this returns a\n    flat cursor-ish rectangle. If the position is between two things\n    that aren't directly adjacent, `side` determines which element\n    is used. When < 0, the element before the position is used,\n    otherwise the element after.\n    */\n    coordsAtPos(pos, side = 1) {\n        return coordsAtPos(this, pos, side);\n    }\n    /**\n    Find the DOM position that corresponds to the given document\n    position. When `side` is negative, find the position as close as\n    possible to the content before the position. When positive,\n    prefer positions close to the content after the position. When\n    zero, prefer as shallow a position as possible.\n    \n    Note that you should **not** mutate the editor's internal DOM,\n    only inspect it (and even that is usually not necessary).\n    */\n    domAtPos(pos, side = 0) {\n        return this.docView.domFromPos(pos, side);\n    }\n    /**\n    Find the DOM node that represents the document node after the\n    given position. May return `null` when the position doesn't point\n    in front of a node or if the node is inside an opaque node view.\n    \n    This is intended to be able to call things like\n    `getBoundingClientRect` on that DOM node. Do **not** mutate the\n    editor DOM directly, or add styling this way, since that will be\n    immediately overriden by the editor as it redraws the node.\n    */\n    nodeDOM(pos) {\n        let desc = this.docView.descAt(pos);\n        return desc ? desc.nodeDOM : null;\n    }\n    /**\n    Find the document position that corresponds to a given DOM\n    position. (Whenever possible, it is preferable to inspect the\n    document structure directly, rather than poking around in the\n    DOM, but sometimes—for example when interpreting an event\n    target—you don't have a choice.)\n    \n    The `bias` parameter can be used to influence which side of a DOM\n    node to use when the position is inside a leaf node.\n    */\n    posAtDOM(node, offset, bias = -1) {\n        let pos = this.docView.posFromDOM(node, offset, bias);\n        if (pos == null)\n            throw new RangeError(\"DOM position not inside the editor\");\n        return pos;\n    }\n    /**\n    Find out whether the selection is at the end of a textblock when\n    moving in a given direction. When, for example, given `\"left\"`,\n    it will return true if moving left from the current cursor\n    position would leave that position's parent textblock. Will apply\n    to the view's current state by default, but it is possible to\n    pass a different state.\n    */\n    endOfTextblock(dir, state) {\n        return endOfTextblock(this, state || this.state, dir);\n    }\n    /**\n    Run the editor's paste logic with the given HTML string. The\n    `event`, if given, will be passed to the\n    [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n    */\n    pasteHTML(html, event) {\n        return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Run the editor's paste logic with the given plain-text input.\n    */\n    pasteText(text, event) {\n        return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Serialize the given slice as it would be if it was copied from\n    this editor. Returns a DOM element that contains a\n    representation of the slice as its children, a textual\n    representation, and the transformed slice (which can be\n    different from the given input due to hooks like\n    [`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).\n    */\n    serializeForClipboard(slice) {\n        return serializeForClipboard(this, slice);\n    }\n    /**\n    Removes the editor from the DOM and destroys all [node\n    views](https://prosemirror.net/docs/ref/#view.NodeView).\n    */\n    destroy() {\n        if (!this.docView)\n            return;\n        destroyInput(this);\n        this.destroyPluginViews();\n        if (this.mounted) {\n            this.docView.update(this.state.doc, [], viewDecorations(this), this);\n            this.dom.textContent = \"\";\n        }\n        else if (this.dom.parentNode) {\n            this.dom.parentNode.removeChild(this.dom);\n        }\n        this.docView.destroy();\n        this.docView = null;\n        clearReusedRange();\n    }\n    /**\n    This is true when the view has been\n    [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n    used anymore).\n    */\n    get isDestroyed() {\n        return this.docView == null;\n    }\n    /**\n    Used for testing.\n    */\n    dispatchEvent(event) {\n        return dispatchEvent(this, event);\n    }\n    /**\n    @internal\n    */\n    domSelectionRange() {\n        let sel = this.domSelection();\n        if (!sel)\n            return { focusNode: null, focusOffset: 0, anchorNode: null, anchorOffset: 0 };\n        return safari && this.root.nodeType === 11 &&\n            deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;\n    }\n    /**\n    @internal\n    */\n    domSelection() {\n        return this.root.getSelection();\n    }\n}\nEditorView.prototype.dispatch = function (tr) {\n    let dispatchTransaction = this._props.dispatchTransaction;\n    if (dispatchTransaction)\n        dispatchTransaction.call(this, tr);\n    else\n        this.updateState(this.state.apply(tr));\n};\nfunction computeDocDeco(view) {\n    let attrs = Object.create(null);\n    attrs.class = \"ProseMirror\";\n    attrs.contenteditable = String(view.editable);\n    view.someProp(\"attributes\", value => {\n        if (typeof value == \"function\")\n            value = value(view.state);\n        if (value)\n            for (let attr in value) {\n                if (attr == \"class\")\n                    attrs.class += \" \" + value[attr];\n                else if (attr == \"style\")\n                    attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n                else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n                    attrs[attr] = String(value[attr]);\n            }\n    });\n    if (!attrs.translate)\n        attrs.translate = \"no\";\n    return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n    if (view.markCursor) {\n        let dom = document.createElement(\"img\");\n        dom.className = \"ProseMirror-separator\";\n        dom.setAttribute(\"mark-placeholder\", \"true\");\n        dom.setAttribute(\"alt\", \"\");\n        view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.from, dom, { raw: true, marks: view.markCursor }) };\n    }\n    else {\n        view.cursorWrapper = null;\n    }\n}\nfunction getEditable(view) {\n    return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n    let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n    return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n    let result = Object.create(null);\n    function add(obj) {\n        for (let prop in obj)\n            if (!Object.prototype.hasOwnProperty.call(result, prop))\n                result[prop] = obj[prop];\n    }\n    view.someProp(\"nodeViews\", add);\n    view.someProp(\"markViews\", add);\n    return result;\n}\nfunction changedNodeViews(a, b) {\n    let nA = 0, nB = 0;\n    for (let prop in a) {\n        if (a[prop] != b[prop])\n            return true;\n        nA++;\n    }\n    for (let _ in b)\n        nB++;\n    return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n    if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n        throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard };\n","import { ContentMapper } from './ContentMapper.ts';\n\nexport type WorkspaceFile = TextFile | BinaryFile;\n\nexport interface TextFile {\n  uri: string;\n  lang: string;\n  version: number;\n  getContentMapper: () => Promise<ContentMapper>;\n}\n\nexport interface BinaryFile {\n  uri: string;\n}\n\ninterface WorkspaceRestartParams {\n}\n\nexport interface WorkspaceOpenParams {\n  uri: string;\n  lang: string;\n  version: number;\n  getContentMapper: () => Promise<ContentMapper>;\n}\n\nexport interface WorkspaceModifyParams {\n  uri: string;\n  lang: string;\n  version: number;\n  getContentMapper: () => Promise<ContentMapper>;\n}\n\nexport interface WorkspaceCloseParams {\n  uri: string;\n}\n\nexport interface WorkspaceEventMap {\n  restart: CustomEvent<WorkspaceRestartParams>;\n  openFile: CustomEvent<WorkspaceOpenParams>;\n  modifyFile: CustomEvent<WorkspaceModifyParams>;\n  closeFile: CustomEvent<WorkspaceCloseParams>;\n}\n\nexport interface Workspace extends EventTarget {\n  addEventListener<K extends keyof WorkspaceEventMap>(\n    type: K,\n    listener: (event: WorkspaceEventMap[K]) => void,\n    options?: boolean | AddEventListenerOptions,\n  ): void;\n\n  // fallback DOM signature (required)\n  addEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | AddEventListenerOptions,\n  ): void;\n\n  removeEventListener<K extends keyof WorkspaceEventMap>(\n    type: K,\n    listener: (event: WorkspaceEventMap[K]) => void,\n    options?: boolean | EventListenerOptions,\n  ): void;\n  // fallback DOM signature (required)\n  removeEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | EventListenerOptions,\n  ): void;\n\n  dispatchEvent<K extends keyof WorkspaceEventMap>(\n    event: WorkspaceEventMap[K],\n  ): boolean;\n  dispatchEvent(event: Event): boolean;\n\n  restart(): Promise<void>;\n  getFiles(): string[];\n\n  getFile(uri: string): TextFile | null;\n  openFile(file: WorkspaceOpenParams): void;\n  modifyFile(modification: WorkspaceModifyParams): void;\n  closeFile(uri: string): void;\n}\n\nexport class WorkspaceImpl extends EventTarget implements Workspace {\n  files: Map<string, TextFile> = new Map();\n\n  constructor() {\n    super();\n  }\n\n  async restart(): Promise<void> {\n    this.files.clear();\n    this.dispatchEvent(new CustomEvent<WorkspaceRestartParams>('restart'));\n  }\n\n  getFiles(): string[] {\n    return Array.from(this.files.keys());\n  }\n\n  getFile(uri: string): TextFile | null {\n    return this.files.get(uri) || null;\n  }\n\n  openFile(file: WorkspaceOpenParams): void {\n    this.files.set(file.uri, file);\n    this.dispatchEvent(\n      new CustomEvent<WorkspaceOpenParams>('openFile', {\n        detail: file,\n      }),\n    );\n  }\n\n  modifyFile(modification: WorkspaceModifyParams): void {\n    const file: TextFile = this.files.get(modification.uri) || modification;\n    file.lang = modification.lang;\n    file.version = modification.version;\n    file.getContentMapper = modification.getContentMapper;\n    this.files.set(modification.uri, file);\n\n    this.dispatchEvent(\n      new CustomEvent<WorkspaceModifyParams>('modifyFile', {\n        detail: modification,\n      }),\n    );\n  }\n\n  closeFile(uri: string): void {\n    this.dispatchEvent(\n      new CustomEvent<WorkspaceCloseParams>('closeFile', {\n        detail: {\n          uri,\n        },\n      }),\n    );\n    this.files.delete(uri);\n  }\n}\n","import { Node as ProseMirrorNode } from 'prosemirror-model';\nimport {\n  EditorState,\n  Plugin,\n  PluginKey,\n  TextSelection,\n  Transaction,\n} from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport type { Command, CommandFactory } from '../../commands/types.ts';\n\nconst MAX_MATCH = 500;\n\ntype PluginState = {\n  transform: Transaction;\n  from: number;\n  to: number;\n  text: string;\n} | null;\n\n/// Input rules are regular expressions describing a piece of text\n/// that, when typed, causes something to happen. This might be\n/// changing two dashes into an emdash, wrapping a paragraph starting\n/// with `\"> \"` into a blockquote, or something entirely different.\nexport class InputRule {\n  /// @internal\n  handler: (\n    tr: Transaction,\n    state: EditorState,\n    match: RegExpMatchArray,\n    start: number,\n    end: number,\n  ) => Transaction | null;\n\n  /// @internal\n  undoable: boolean;\n  inCode: boolean | 'only';\n\n  // :: (RegExp, union<string, (state: EditorState, match: [string], start: number, end: number) → ?Transaction>)\n  /// Create an input rule. The rule applies when the user typed\n  /// something and the text directly in front of the cursor matches\n  /// `match`, which should end with `$`.\n  ///\n  /// The `handler` can be a string, in which case the matched text, or\n  /// the first matched group in the regexp, is replaced by that\n  /// string.\n  ///\n  /// Or a it can be a function, which will be called with the match\n  /// array produced by\n  /// [`RegExp.exec`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec),\n  /// as well as the start and end of the matched range, and which can\n  /// return a [transaction](#state.Transaction) that describes the\n  /// rule's effect, or null to indicate the input was not handled.\n  constructor(\n    /// @internal\n    readonly regex: RegExp,\n    handler:\n      | string\n      | ((\n        tr: Transaction,\n        state: EditorState,\n        match: RegExpMatchArray,\n        start: number,\n        end: number,\n      ) => Transaction | null),\n    options: {\n      /// When set to false,\n      /// [`undoInputRule`](#inputrules.undoInputRule) doesn't work on\n      /// this rule.\n      undoable?: boolean;\n      /// By default, input rules will not apply inside nodes marked\n      /// as [code](#model.NodeSpec.code). Set this to true to change\n      /// that, or to `\"only\"` to _only_ match in such nodes.\n      inCode?: boolean | 'only';\n    } = {},\n  ) {\n    this.regex = regex;\n    this.handler = typeof handler == 'string'\n      ? stringHandler(handler)\n      : handler;\n    this.undoable = options.undoable !== false;\n    this.inCode = options.inCode || false;\n  }\n}\n\nfunction stringHandler(string: string) {\n  return function (\n    tr: Transaction,\n    state: EditorState,\n    match: RegExpMatchArray,\n    start: number,\n    end: number,\n  ) {\n    if (!tr) {\n      tr = state.tr;\n    }\n\n    let insert = string;\n    if (match[1]) {\n      const offset = match[0].lastIndexOf(match[1]);\n      insert += match[0].slice(offset + match[1].length);\n      start += offset;\n      const cutOff = start - end;\n      if (cutOff > 0) {\n        insert = match[0].slice(offset - cutOff, offset) + insert;\n        start = end;\n      }\n    }\n    return tr.insertText(insert, start, end);\n  };\n}\n\n/// Create an input rules plugin. When enabled, it will cause text\n/// input that matches any of the given rules to trigger the rule's\n/// action.\nexport class InputRulesPlugin extends Plugin<PluginState> {\n  constructor(rules: readonly InputRule[]) {\n    super({\n      key: new PluginKey('input-rules'),\n      state: {\n        init() {\n          return null;\n        },\n        apply(this: InputRulesPlugin, tr, prev) {\n          const stored = tr.getMeta(this);\n          if (stored) {\n            return stored;\n          }\n          return tr.selectionSet || tr.docChanged ? null : prev;\n        },\n      },\n\n      props: {\n        handleTextInput(view, from, to, text) {\n          const cmd = runInputRulesRange(from, to, text);\n          const dispatch = (tr: Transaction) => {\n            view.dispatch(tr);\n          };\n          return cmd(view.state, dispatch, view);\n          // return run(view, from, to, text, rules, this);\n        },\n        handleDOMEvents: {\n          compositionend: (view) => {\n            setTimeout(() => {\n              const { $cursor } = view.state.selection as TextSelection;\n              if ($cursor) {\n                const cmd = runInputRulesRange($cursor.pos, $cursor.pos, '');\n                const dispatch = (tr: Transaction) => {\n                  view.dispatch(tr);\n                };\n                return cmd(view.state, dispatch, view);\n                // run(view, $cursor.pos, $cursor.pos, '', this);\n              }\n            });\n          },\n        },\n      },\n\n      rules,\n      isInputRules: true,\n    });\n  }\n}\n\nexport const runInputRulesTexts: CommandFactory = () => {\n  const cmd: Command = (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n    view?: EditorView,\n  ) => {\n    const plugins = state.plugins;\n    const plugin: InputRulesPlugin | undefined = plugins.find((plugin) =>\n      (plugin.spec as any).isInputRules\n    );\n    if (!plugin) {\n      return false;\n    }\n\n    const rules: readonly InputRule[] = plugin.spec.rules;\n\n    if (view?.composing) return false;\n\n    let doc = state.doc;\n    let tr = state.tr;\n\n    for (let i = 0; i < rules.length; i++) {\n      const rule = rules[i];\n\n      const textNodePositions: {\n        pos: number;\n        node: ProseMirrorNode;\n        index: number;\n      }[] = [];\n      doc.descendants((node, pos, parent, index) => {\n        if (node.isText) {\n          textNodePositions.push({ pos, node, index });\n        }\n      });\n\n      if (textNodePositions.length === 0) {\n        return false; // Nothing to do\n      }\n\n      // Process from the end of the document to the start to avoid position invalidation\n      for (let i = textNodePositions.length - 1; i >= 0; i--) {\n        const { pos, node, index } = textNodePositions[i];\n        if (!node.isText || !node.text) continue;\n\n        let text = node.text;\n\n        if (node.type.spec.code) {\n          if (!rule.inCode) continue;\n        } else if (rule.inCode === 'only') {\n          continue;\n        }\n\n        if (rule.regex.source.startsWith('^') && index > 0) { // Must be first in block\n          continue;\n        }\n\n        const matches = rule.regex.global\n          ? [...text.matchAll(rule.regex)]\n          : [text.match(rule.regex)];\n        for (const match of matches.reverse()) {\n          if (!match) {\n            continue;\n          }\n          if ('undefined' == typeof match.index) {\n            continue;\n          }\n\n          const index = match.index;\n\n          const from = pos + index;\n          const to = from + match[0].length;\n\n          rule.handler(\n            tr,\n            state,\n            match,\n            from,\n            to,\n          );\n\n          if (rule.undoable) {\n            tr.setMeta(plugin, { transform: tr, from, to, text });\n          }\n        }\n      }\n    }\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return tr.docChanged;\n  };\n\n  cmd.displayName = 'runInputRulesTexts';\n\n  return cmd;\n};\n\nexport const runInputRulesRange: CommandFactory = (\n  from: number,\n  to: number,\n  text: string,\n) => {\n  const cmd: Command = (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n    view?: EditorView,\n  ) => {\n    const plugins = state.plugins;\n    const plugin: InputRulesPlugin | undefined = plugins.find((plugin) =>\n      (plugin.spec as any).isInputRules\n    );\n    if (!plugin) {\n      return false;\n    }\n\n    const rules: readonly InputRule[] = plugin.spec.rules;\n\n    if (view?.composing) return false;\n\n    const $from = state.doc.resolve(from);\n    const textBefore = $from.parent.textBetween(\n      Math.max(0, $from.parentOffset - MAX_MATCH),\n      $from.parentOffset,\n      null,\n      '\\ufffc',\n    ) + text;\n    let tr = state.tr;\n\n    for (let i = 0; i < rules.length; i++) {\n      const rule = rules[i];\n      if ($from.parent.type.spec.code) {\n        if (!rule.inCode) continue;\n      } else if (rule.inCode === 'only') {\n        continue;\n      }\n      const match = rule.regex.exec(textBefore);\n      if (!match) {\n        continue;\n      }\n\n      const subTr = rule.handler(\n        tr,\n        state,\n        match,\n        tr.mapping.map(from - (match[0].length - text.length)),\n        tr.mapping.map(to),\n      );\n      if (!subTr) continue;\n\n      tr = subTr;\n      if (rule.undoable) {\n        tr.setMeta(plugin, { transform: tr, from, to, text });\n      }\n      break;\n    }\n\n    if (tr.docChanged) {\n      dispatch?.(tr);\n      return true;\n    }\n\n    return false;\n  };\n  cmd.displayName = 'runInputRulesRange';\n\n  return cmd;\n};\n\n/// This is a command that will undo an input rule, if applying such a\n/// rule was the last thing that the user did.\nexport const undoInputRuleCommand: Command = (state, dispatch) => {\n  const plugins = state.plugins;\n  const plugin: InputRulesPlugin | undefined = plugins.find((plugin) =>\n    (plugin.spec as any).isInputRules\n  );\n  if (!plugin) {\n    return false;\n  }\n\n  const undoable: PluginState | undefined = plugin.getState(state);\n  if (!undoable) {\n    return false;\n  }\n\n  if (dispatch) {\n    const tr = state.tr;\n    const toUndo = undoable.transform;\n    for (let j = toUndo.steps.length - 1; j >= 0; j--) {\n      tr.step(toUndo.steps[j].invert(toUndo.docs[j]));\n    }\n    if (undoable.text) {\n      const marks = tr.doc.resolve(undoable.from).marks();\n      tr.replaceWith(\n        undoable.from,\n        undoable.to,\n        state.schema.text(undoable.text, marks),\n      );\n    } else {\n      tr.delete(undoable.from, undoable.to);\n    }\n    dispatch(tr);\n  }\n  return true;\n};\n","export const base: Record<number, string> = {\n  8: 'Backspace',\n  9: 'Tab',\n  10: 'Enter',\n  12: 'NumLock',\n  13: 'Enter',\n  16: 'Shift',\n  17: 'Control',\n  18: 'Alt',\n  20: 'CapsLock',\n  27: 'Escape',\n  32: ' ',\n  33: 'PageUp',\n  34: 'PageDown',\n  35: 'End',\n  36: 'Home',\n  37: 'ArrowLeft',\n  38: 'ArrowUp',\n  39: 'ArrowRight',\n  40: 'ArrowDown',\n  44: 'PrintScreen',\n  45: 'Insert',\n  46: 'Delete',\n  59: ';',\n  61: '=',\n  91: 'Meta',\n  92: 'Meta',\n  106: '*',\n  107: '+',\n  108: ',',\n  109: '-',\n  110: '.',\n  111: '/',\n  144: 'NumLock',\n  145: 'ScrollLock',\n  160: 'Shift',\n  161: 'Shift',\n  162: 'Control',\n  163: 'Control',\n  164: 'Alt',\n  165: 'Alt',\n  173: '-',\n  186: ';',\n  187: '=',\n  188: ',',\n  189: '-',\n  190: '.',\n  191: '/',\n  192: '`',\n  219: '[',\n  220: '\\\\',\n  221: ']',\n  222: \"'\",\n};\n\nexport const shift: Record<number, string> = {\n  48: ')',\n  49: '!',\n  50: '@',\n  51: '#',\n  52: '$',\n  53: '%',\n  54: '^',\n  55: '&',\n  56: '*',\n  57: '(',\n  59: ':',\n  61: '+',\n  173: '_',\n  186: ':',\n  187: '+',\n  188: '<',\n  189: '_',\n  190: '>',\n  191: '?',\n  192: '~',\n  219: '{',\n  220: '|',\n  221: '}',\n  222: '\"',\n};\n\nconst mac = typeof navigator != 'undefined' && /Mac/.test(navigator.platform);\nconst ie = typeof navigator != 'undefined' &&\n  /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);\n\n// Fill in the digit keys\nfor (let i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i);\n\n// The function keys\nfor (let i = 1; i <= 24; i++) base[i + 111] = 'F' + i;\n\n// And the alphabetic keys\nfor (let i = 65; i <= 90; i++) {\n  base[i] = String.fromCharCode(i + 32);\n  shift[i] = String.fromCharCode(i);\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (const code in base) {\n  if (!Object.prototype.hasOwnProperty.call(shift, code)) {\n    shift[code] = base[code];\n  }\n}\n\nexport function keyName(event: KeyboardEvent) {\n  // On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.\n  // On IE, shift effect is never included in `.key`.\n  const ignoreKey =\n    mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||\n    ie && event.shiftKey && event.key && event.key.length == 1 ||\n    event.key == 'Unidentified';\n  let name: string = (!ignoreKey && event.key) ||\n    (event.shiftKey ? shift : base)[event.keyCode] ||\n    event.key || 'Unidentified';\n  // Edge sometimes produces wrong names (Issue #3)\n  if (name == 'Esc') name = 'Escape';\n  if (name == 'Del') name = 'Delete';\n  // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n  if (name == 'Left') name = 'ArrowLeft';\n  if (name == 'Up') name = 'ArrowUp';\n  if (name == 'Right') name = 'ArrowRight';\n  if (name == 'Down') name = 'ArrowDown';\n  return name;\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport type { Command } from '../../commands/types.ts';\nimport { base, keyName } from './w3c-keyname.ts';\n\nconst mac = typeof navigator != 'undefined' &&\n  /Mac|iP(hone|[oa]d)/.test(navigator?.platform);\nconst windows = typeof navigator != 'undefined' &&\n  /Win/.test(navigator?.platform);\n\nfunction normalizeKeyName(name: string) {\n  let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n  if (result == 'Space') result = ' ';\n  let alt, ctrl, shift, meta;\n  for (let i = 0; i < parts.length - 1; i++) {\n    let mod = parts[i];\n    if (/^(cmd|meta|m)$/i.test(mod)) meta = true;\n    else if (/^a(lt)?$/i.test(mod)) alt = true;\n    else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;\n    else if (/^s(hift)?$/i.test(mod)) shift = true;\n    else if (/^mod$/i.test(mod)) {\n      if (mac) meta = true;\n      else ctrl = true;\n    } else throw new Error('Unrecognized modifier name: ' + mod);\n  }\n  if (alt) result = 'Alt-' + result;\n  if (ctrl) result = 'Ctrl-' + result;\n  if (meta) result = 'Meta-' + result;\n  if (shift) result = 'Shift-' + result;\n  return result;\n}\n\nfunction normalize(map: { [key: string]: Command }) {\n  let copy: { [key: string]: Command } = Object.create(null);\n  for (let prop in map) copy[normalizeKeyName(prop)] = map[prop];\n  return copy;\n}\n\nfunction modifiers(name: string, event: KeyboardEvent, shift = true) {\n  if (event.altKey) name = 'Alt-' + name;\n  if (event.ctrlKey) name = 'Ctrl-' + name;\n  if (event.metaKey) name = 'Meta-' + name;\n  if (shift && event.shiftKey) name = 'Shift-' + name;\n  return name;\n}\n\n/// Create a keymap plugin for the given set of bindings.\n///\n/// Bindings should map key names to [command](#commands)-style\n/// functions, which will be called with `(EditorState, dispatch,\n/// EditorView)` arguments, and should return true when they've handled\n/// the key. Note that the view argument isn't part of the command\n/// protocol, but can be used as an escape hatch if a binding needs to\n/// directly interact with the UI.\n///\n/// Key names may be strings like `\"Shift-Ctrl-Enter\"`—a key\n/// identifier prefixed with zero or more modifiers. Key identifiers\n/// are based on the strings that can appear in\n/// [`KeyEvent.key`](https:///developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\n/// Use lowercase letters to refer to letter keys (or uppercase letters\n/// if you want shift to be held). You may use `\"Space\"` as an alias\n/// for the `\" \"` name.\n///\n/// Modifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n/// `a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n/// `Meta-`) are recognized. For characters that are created by holding\n/// shift, the `Shift-` prefix is implied, and should not be added\n/// explicitly.\n///\n/// You can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\n/// other platforms.\n///\n/// You can add multiple keymap plugins to an editor. The order in\n/// which they appear determines their precedence (the ones early in\n/// the array get to dispatch first).\nexport class KeymapPlugin extends Plugin {\n  constructor(bindings: { [key: string]: Command }) {\n    super({\n      key: new PluginKey('keymap'),\n      props: { handleKeyDown: keydownHandler(bindings) },\n    });\n  }\n}\n\n/// Given a set of bindings (using the same format as\n/// [`keymap`](#keymap.keymap)), return a [keydown\n/// handler](#view.EditorProps.handleKeyDown) that handles them.\nexport function keydownHandler(\n  bindings: { [key: string]: Command },\n): (view: EditorView, event: KeyboardEvent) => boolean {\n  let map = normalize(bindings);\n  return function (view, event) {\n    let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n    if (direct && direct(view.state, view.dispatch, view)) return true;\n    // A character key\n    if (name.length == 1 && name != ' ') {\n      if (event.shiftKey) {\n        // In case the name was already modified by shift, try looking\n        // it up without its shift modifier\n        let noShift = map[modifiers(name, event, false)];\n        if (noShift && noShift(view.state, view.dispatch, view)) return true;\n      }\n      if (\n        (event.altKey || event.metaKey || event.ctrlKey) &&\n        // Ctrl-Alt may be used for AltGr on Windows\n        !(windows && event.ctrlKey && event.altKey) &&\n        (baseName = base[event.keyCode]) && baseName != name\n      ) {\n        // Try falling back to the keyCode when there's a modifier\n        // active or the character produced isn't ASCII, and our table\n        // produces a different name from the the keyCode. See #668,\n        // #1060, #1529.\n        let fromCode = map[modifiers(baseName, event)];\n        if (fromCode && fromCode(view.state, view.dispatch, view)) return true;\n      }\n    }\n    return false;\n  };\n}\n","import type { Transaction } from 'prosemirror-state';\nimport type { Node } from 'prosemirror-model';\nimport type { Command } from './types.ts';\nimport { canJoin } from 'prosemirror-transform';\n\nexport * from './types.ts';\n\n/// Combine a number of command functions into a single function (which\n/// calls them one by one until one returns true).\nexport function firstCommand(...commands: readonly Command[]): Command {\n  const cmd: Command = function (state, dispatch, view) {\n    for (let i = 0; i < commands.length; i++) {\n      if (commands[i](state, dispatch, view)) {\n        const cmd: Command = commands[i];\n        if (cmd.displayName !== 'first') {\n          console.debug(\n            'firstCommand: ',\n            commands[i].displayName || commands[i],\n          );\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n  cmd.displayName = 'first';\n\n  return cmd;\n}\n\nexport function alternativeCommands(...commands: readonly Command[]): Command {\n  return function (state, dispatch, view) {\n    for (let i = 0; i < commands.length; i++) {\n      if (commands[i](state, dispatch, view)) return true;\n    }\n    return false;\n  };\n}\n\nfunction wrapDispatchForJoin(\n  dispatch: (tr: Transaction) => void,\n  isJoinable: (a: Node, b: Node) => boolean,\n) {\n  return (tr: Transaction) => {\n    if (!tr.isGeneric) return dispatch(tr);\n\n    let ranges: number[] = [];\n    for (let i = 0; i < tr.mapping.maps.length; i++) {\n      let map = tr.mapping.maps[i];\n      for (let j = 0; j < ranges.length; j++) {\n        ranges[j] = map.map(ranges[j]);\n      }\n      map.forEach((_s, _e, from, to) => ranges.push(from, to));\n    }\n\n    // Figure out which joinable points exist inside those ranges,\n    // by checking all node boundaries in their parent nodes.\n    let joinable = [];\n    for (let i = 0; i < ranges.length; i += 2) {\n      let from = ranges[i], to = ranges[i + 1];\n      let $from = tr.doc.resolve(from),\n        depth = $from.sharedDepth(to),\n        parent = $from.node(depth);\n      for (\n        let index = $from.indexAfter(depth), pos = $from.after(depth + 1);\n        pos <= to;\n        ++index\n      ) {\n        let after = parent.maybeChild(index);\n        if (!after) break;\n        if (index && joinable.indexOf(pos) == -1) {\n          let before = parent.child(index - 1);\n          if (before.type == after.type && isJoinable(before, after)) {\n            joinable.push(pos);\n          }\n        }\n        pos += after.nodeSize;\n      }\n    }\n    // Join the joinable points\n    joinable.sort((a, b) => a - b);\n    for (let i = joinable.length - 1; i >= 0; i--) {\n      if (canJoin(tr.doc, joinable[i])) tr.join(joinable[i]);\n    }\n    dispatch(tr);\n  };\n}\n\n/// Wrap a command so that, when it produces a transform that causes\n/// two joinable nodes to end up next to each other, those are joined.\n/// Nodes are considered joinable when they are of the same type and\n/// when the `isJoinable` predicate returns true for them or, if an\n/// array of strings was passed, if their node type name is in that\n/// array.\nexport function autoJoin(\n  command: Command,\n  isJoinable: ((before: Node, after: Node) => boolean) | readonly string[],\n): Command {\n  let canJoin = Array.isArray(isJoinable)\n    ? (node: Node) => isJoinable.indexOf(node.type.name) > -1\n    : isJoinable as (a: Node, b: Node) => boolean;\n  return (state, dispatch, view) =>\n    command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view);\n}\n","import type {\n  MarkSpec,\n  Node as ProseMirrorNode,\n  NodeSpec,\n} from 'prosemirror-model';\n\nimport type { Mark } from '../Mark.ts';\nimport type { Node } from '../Node.ts';\n\ntype MarkOfNode = Mark | Node;\n\nexport function getHtmlAttributes(\n  extension: MarkOfNode,\n  node: ProseMirrorNode,\n) {\n  const attrs: Record<string, any> = {};\n\n  if (extension.attributes) {\n    for (const [key, value] of Object.entries(extension.attributes)) {\n      if ('undefined' !== typeof node.attrs[key]) {\n        attrs[key] = node.attrs[key];\n      } else {\n        if (value.toDom) {\n          attrs[key] = value.toDom(node);\n        } else {\n          attrs[key] = value.default;\n        }\n      }\n    }\n  }\n\n  return attrs;\n}\n\nexport function setHtmlAttributes(extension: MarkOfNode, element: HTMLElement) {\n  const attrs: Record<string, any> = {};\n\n  if (extension.attributes) {\n    for (const [key, value] of Object.entries(extension.attributes)) {\n      if (value.fromDom) {\n        attrs[key] = value.fromDom(element);\n      } else {\n        attrs[key] = value.default;\n      }\n    }\n  }\n\n  return attrs;\n}\n\nexport function addAttributesToSchema(\n  spec: MarkSpec | NodeSpec,\n  extension: MarkOfNode,\n) {\n  const attrs = {};\n\n  if (extension.attributes) {\n    if (!spec.attrs) {\n      spec.attrs = {};\n    }\n    for (const [key, value] of Object.entries(extension.attributes)) {\n      spec.attrs[key] = value;\n      if (!value.toDom) {\n        value.toDom = (node) => node.attrs[key];\n      }\n    }\n  }\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport type { CoreEditor } from '@kerebron/editor';\n\nexport class TrackSelecionPlugin extends Plugin {\n  constructor(editor: CoreEditor) {\n    super({\n      key: new PluginKey('track-selection'),\n      view(editorView) {\n        return {\n          update(view, prevState) {\n            const state = view.state;\n            const prevSelection = prevState.selection;\n            const selection = state.selection;\n\n            if (!prevSelection.eq(selection)) {\n              const event = new CustomEvent('selection', {\n                detail: {\n                  selection,\n                },\n              });\n              editor.dispatchEvent(event);\n            }\n          },\n        };\n      },\n    });\n  }\n}\n","// Tiny, slop yaml parser / stringifier\n// Intended for frontmatters. For more advance usage external js-yaml or similar\n\nexport type YAMLValue =\n  | string\n  | number\n  | boolean\n  | null\n  | YAMLMap\n  | YAMLArray;\n\nexport type YAMLMap = Map<string, YAMLValue>;\nexport interface YAMLArray extends Array<YAMLValue> {}\n\nconst findUnquotedColon = (s: string): number => {\n  let inSingle = false, inDouble = false;\n  for (let k = 0; k < s.length; k++) {\n    const ch = s[k];\n    if (ch === '\"' && !inSingle) inDouble = !inDouble;\n    else if (ch === \"'\" && !inDouble) inSingle = !inSingle;\n    else if (ch === ':' && !inSingle && !inDouble) return k;\n  }\n  return -1;\n};\n\nexport function parse(input: string): YAMLValue {\n  const lines = input\n    .replace(/\\r\\n/g, '\\n')\n    .split('\\n')\n    .filter((l) => l.trim().length > 0 && !l.trim().startsWith('#'));\n\n  const parseValue = (v: string): YAMLValue => {\n    v = v.trim();\n\n    if (v === '') return null;\n    if (v === 'null') return null;\n    if (v === 'true') return true;\n    if (v === 'false') return false;\n\n    if (!isNaN(Number(v))) return Number(v);\n\n    if (\n      (v.startsWith('\"') && v.endsWith('\"')) ||\n      (v.startsWith(\"'\") && v.endsWith(\"'\"))\n    ) {\n      return v.slice(1, -1);\n    }\n\n    return v;\n  };\n\n  let i = 0;\n\n  const parseBlock = (parentIndent: number): YAMLValue => {\n    let result: YAMLMap | YAMLArray | null = null;\n    let isArray: boolean | null = null;\n\n    while (i < lines.length) {\n      const line = lines[i];\n      const indent = line.match(/^ */)?.[0].length ?? 0;\n\n      if (indent < parentIndent) break;\n\n      const trimmed = line.trim();\n\n      if (trimmed.startsWith('-')) {\n        if (result === null) {\n          result = [];\n          isArray = true;\n        }\n        if (isArray === false) {\n          throw new Error('Mixed array/object structure');\n        }\n        isArray = true;\n\n        const valuePart = trimmed.slice(1).trim();\n\n        if (valuePart === '') {\n          i++;\n          (result as YAMLArray).push(parseBlock(indent + 2));\n        } else {\n          const colonIdx = findUnquotedColon(valuePart);\n          if (colonIdx === -1) {\n            (result as YAMLArray).push(parseValue(valuePart));\n            i++;\n          } else {\n            const map: YAMLMap = new Map();\n            const key = valuePart.slice(0, colonIdx).trim();\n            const rest = valuePart.slice(colonIdx + 1).trim();\n            i++;\n            map.set(\n              key,\n              rest === '' ? parseBlock(indent + 2) : parseValue(rest),\n            );\n            // parse remaining deeper-indented entries into the same map\n            while (i < lines.length) {\n              const nextLine = lines[i];\n              const nextIndent = nextLine.match(/^ */)?.[0].length ?? 0;\n              if (nextIndent <= indent) break;\n              const nextTrimmed = nextLine.trim();\n              const nextColon = findUnquotedColon(nextTrimmed);\n              if (nextColon === -1) break;\n              const k2 = nextTrimmed.slice(0, nextColon).trim();\n              const r2 = nextTrimmed.slice(nextColon + 1).trim();\n              i++;\n              map.set(\n                k2,\n                r2 === '' ? parseBlock(nextIndent + 2) : parseValue(r2),\n              );\n            }\n            (result as YAMLArray).push(map);\n          }\n        }\n\n        continue;\n      }\n\n      const idx = trimmed.indexOf(':');\n      if (idx === -1) {\n        throw new Error(`Invalid line: ${line}`);\n      }\n\n      if (result === null) {\n        result = new Map();\n        isArray = false;\n      }\n      if (isArray === true) {\n        throw new Error('Mixed array/object structure');\n      }\n\n      const key = trimmed.slice(0, idx).trim();\n      const valuePart = trimmed.slice(idx + 1).trim();\n\n      i++;\n      (result as YAMLMap).set(\n        key,\n        valuePart === '' ? parseBlock(indent + 2) : parseValue(valuePart),\n      );\n    }\n\n    return result ?? new Map();\n  };\n\n  return parseBlock(0);\n}\n\nexport function stringify(value: any, indentSize = 2): string {\n  value = fromJSON(value);\n  const indent = (lvl: number) => ' '.repeat(lvl * indentSize);\n\n  const isObj = (v: any) =>\n    typeof v === 'object' && v !== null && !Array.isArray(v);\n\n  const lines: string[] = [];\n\n  function emit(val: any, lvl: number, key?: string) {\n    const prefix = key !== undefined ? indent(lvl) + key + ': ' : indent(lvl);\n\n    if (val === null) {\n      lines.push(prefix + 'null');\n      return;\n    }\n\n    if (typeof val === 'number' || typeof val === 'boolean') {\n      lines.push(prefix + String(val));\n      return;\n    }\n\n    if (typeof val === 'string') {\n      const v = /[:\\s]/.test(val) ? `\"${val}\"` : val;\n      lines.push(prefix + v);\n      return;\n    }\n\n    if (Array.isArray(val)) {\n      if (key !== undefined) {\n        lines.push(indent(lvl) + key + ':');\n        lvl++;\n      }\n\n      for (const item of val) {\n        if (Array.isArray(item)) {\n          // nested array -> must expand, never join()\n          lines.push(indent(lvl) + '-');\n          emit(item, lvl + 1);\n        } else if (isObj(item)) {\n          lines.push(indent(lvl) + '-');\n          emit(item, lvl + 1);\n        } else {\n          lines.push(indent(lvl) + '- ' + formatScalar(item));\n        }\n      }\n      return;\n    }\n\n    if (isObj(val)) {\n      if (key !== undefined) {\n        lines.push(indent(lvl) + key + ':');\n        lvl++;\n      }\n\n      for (const [k, v] of val) {\n        emit(v, lvl, k);\n      }\n      return;\n    }\n\n    // fallback safety (should never hit)\n    lines.push(prefix + String(val));\n  }\n\n  function formatScalar(v: any): string {\n    if (v === null) return 'null';\n    if (typeof v === 'string') return /[:\\s]/.test(v) ? `\"${v}\"` : v;\n    return String(v);\n  }\n\n  emit(value, 0);\n  return lines.join('\\n');\n}\n\nexport function fromJSON(value: unknown): YAMLValue {\n  if (value === null) return null;\n  if (Array.isArray(value)) {\n    return value.map(fromJSON) as YAMLArray;\n  }\n  if (typeof value === 'object') {\n    if (value instanceof Map) {\n      return value;\n    }\n    const map: YAMLMap = new Map();\n    for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n      map.set(k, fromJSON(v));\n    }\n    return map;\n  }\n  if (\n    typeof value === 'string' || typeof value === 'number' ||\n    typeof value === 'boolean'\n  ) {\n    return value;\n  }\n  throw new Error(`Unsupported JSON value: ${typeof value}`);\n}\n\nexport function toJSON(value: YAMLValue): unknown {\n  if (value instanceof Map) {\n    const obj: Record<string, unknown> = {};\n    for (const [k, v] of value) {\n      obj[k] = toJSON(v);\n    }\n    return obj;\n  }\n  if (Array.isArray(value)) {\n    return value.map(toJSON);\n  }\n  return value;\n}\n\nexport function setPathValue(\n  root: YAMLValue,\n  path: string,\n  value: YAMLValue,\n): void {\n  const segs =\n    path.match(/[^.\\[\\]]+|\\[\\d+\\]/g)?.map((s) =>\n      s.startsWith('[') ? Number(s.slice(1, -1)) : s\n    ) ?? [];\n  if (segs.length === 0) throw new Error('empty path');\n  if (!(root instanceof Map) && !Array.isArray(root)) {\n    throw new Error('root must be Map or array');\n  }\n\n  let cur: YAMLValue = root;\n  for (let i = 0; i < segs.length - 1; i++) {\n    const seg = segs[i];\n\n    let next: YAMLValue | undefined = typeof seg === 'number'\n      ? Array.isArray(cur) ? cur[seg] : undefined\n      : cur instanceof Map\n      ? cur.get(seg)\n      : undefined;\n\n    if (!(next instanceof Map) && !Array.isArray(next)) {\n      if (next !== undefined && next !== null) {\n        console.log('next', next);\n        throw new Error(`\"${seg}\" #${i} of \"${path}\" not container`);\n      }\n      const nextIsNum = typeof segs[i + 1] === 'number';\n      next = nextIsNum ? [] : new Map();\n      if (typeof seg === 'number') (cur as YAMLArray)[seg] = next;\n      else (cur as YAMLMap).set(seg, next);\n    }\n    cur = next;\n  }\n\n  const last = segs[segs.length - 1];\n  if (typeof last === 'number') {\n    if (!Array.isArray(cur)) throw new Error('target not array');\n    while (cur.length <= last) cur.push(null);\n    cur[last] = value;\n  } else {\n    if (!(cur instanceof Map)) throw new Error('target not map');\n    cur.set(last, value);\n  }\n}\n\nexport interface YamlService {\n  parse: typeof parse;\n  stringify: typeof stringify;\n  toJSON: typeof toJSON;\n  fromJSON: typeof fromJSON;\n  setPathValue: typeof setPathValue;\n}\n","import { EditorState } from 'prosemirror-state';\nimport { Fragment, Node, Slice } from 'prosemirror-model';\n\nexport class SearchQuery {\n  /// The search string (or regular expression).\n  readonly search: string;\n  /// Indicates whether the search is case-sensitive.\n  readonly caseSensitive: boolean;\n  /// By default, string search will replace `\\n`, `\\r`, and `\\t` in\n  /// the query with newline, return, and tab characters. When this\n  /// is set to true, that behavior is disabled.\n  readonly literal: boolean;\n  /// When true, the search string is interpreted as a regular\n  /// expression.\n  readonly regexp: boolean;\n  /// The replace text, or the empty string if no replace text has\n  /// been given.\n  readonly replace: string;\n  /// Whether this query is non-empty and, in case of a regular\n  /// expression search, syntactically valid.\n  readonly valid: boolean;\n  /// When true, matches that contain words are ignored when there are\n  /// further word characters around them.\n  readonly wholeWord: boolean;\n  /// An optional filter that causes some results to be ignored.\n  readonly filter:\n    | ((state: EditorState, result: SearchResult) => boolean)\n    | null;\n\n  /// @internal\n  impl: QueryImpl;\n\n  /// Create a query object.\n  constructor(config: {\n    /// The search string.\n    search: string;\n    /// Controls whether the search should be case-sensitive.\n    caseSensitive?: boolean;\n    /// By default, string search will replace `\\n`, `\\r`, and `\\t` in\n    /// the query with newline, return, and tab characters. When this\n    /// is set to true, that behavior is disabled.\n    literal?: boolean;\n    /// When true, interpret the search string as a regular expression.\n    regexp?: boolean;\n    /// The replace text.\n    replace?: string;\n    /// Enable whole-word matching.\n    wholeWord?: boolean;\n    /// Providing a filter causes results for which the filter returns\n    /// false to be ignored.\n    filter?: (state: EditorState, result: SearchResult) => boolean;\n  }) {\n    this.search = config.search;\n    this.caseSensitive = !!config.caseSensitive;\n    this.literal = !!config.literal;\n    this.regexp = !!config.regexp;\n    this.replace = config.replace || '';\n    this.valid = !!this.search && !(this.regexp && !validRegExp(this.search));\n    this.wholeWord = !!config.wholeWord;\n    this.filter = config.filter || null;\n    this.impl = !this.valid\n      ? nullQuery\n      : this.regexp\n      ? new RegExpQuery(this)\n      : new StringQuery(this);\n  }\n\n  /// Compare this query to another query.\n  eq(other: SearchQuery) {\n    return this.search == other.search && this.replace == other.replace &&\n      this.caseSensitive == other.caseSensitive &&\n      this.regexp == other.regexp &&\n      this.wholeWord == other.wholeWord;\n  }\n\n  /// Find the next occurrence of this query in the given range.\n  findNext(\n    state: EditorState,\n    from: number = 0,\n    to: number = state.doc.content.size,\n  ) {\n    for (;;) {\n      if (from >= to) return null;\n      let result = this.impl.findNext(state, from, to);\n      if (!result || this.checkResult(state, result)) return result;\n      from = result.from + 1;\n    }\n  }\n\n  /// Find the previous occurrence of this query in the given range.\n  /// Note that, if `to` is given, it should be _less_ than `from`.\n  findPrev(\n    state: EditorState,\n    from: number = state.doc.content.size,\n    to: number = 0,\n  ) {\n    for (;;) {\n      if (from <= to) return null;\n      let result = this.impl.findPrev(state, from, to);\n      if (!result || this.checkResult(state, result)) return result;\n      from = result.to - 1;\n    }\n  }\n\n  /// @internal\n  checkResult(state: EditorState, result: SearchResult) {\n    return (!this.wholeWord ||\n      checkWordBoundary(state, result.from) &&\n        checkWordBoundary(state, result.to)) &&\n      (!this.filter || this.filter(state, result));\n  }\n\n  /// @internal\n  unquote(string: string) {\n    return this.literal\n      ? string\n      : string.replace(/\\\\([nrt\\\\])/g, (_, ch) =>\n        ch == 'n' ? '\\n' : ch == 'r' ? '\\r' : ch == 't' ? '\\t' : '\\\\');\n  }\n\n  /// Get the ranges that should be replaced for this result. This can\n  /// return multiple ranges when `this.replace` contains\n  /// `$1`/`$&`-style placeholders, in which case the preserved\n  /// content is skipped by the replacements.\n  ///\n  /// Ranges are sorted by position, and `from`/`to` positions all\n  /// refer to positions in `state.doc`. When applying these, you'll\n  /// want to either apply them from back to front, or map these\n  /// positions through your transaction's current mapping.\n  getReplacements(\n    state: EditorState,\n    result: SearchResult,\n  ): { from: number; to: number; insert: Slice }[] {\n    let $from = state.doc.resolve(result.from);\n    let marks = $from.marksAcross(state.doc.resolve(result.to));\n    let ranges: { from: number; to: number; insert: Slice }[] = [];\n\n    let frag = Fragment.empty, pos = result.from, { match } = result;\n    let groups = match\n      ? getGroupIndices(match)\n      : [[0, result.to - result.from]];\n    let replParts = parseReplacement(this.unquote(this.replace)), groupSpan;\n    for (let part of replParts) {\n      if (typeof part == 'string') { // Replacement text\n        frag = frag.addToEnd(state.schema.text(part, marks));\n      } else {\n        groupSpan = groups[part.group];\n        if (groupSpan) {\n          let from = result.matchStart + groupSpan[0],\n            to = result.matchStart + groupSpan[1];\n          if (part.copy) { // Copied content\n            frag = frag.append(state.doc.slice(from, to).content);\n          } else { // Skipped content\n            if (frag != Fragment.empty || from > pos) {\n              ranges.push({\n                from: pos,\n                to: from,\n                insert: new Slice(frag, 0, 0),\n              });\n              frag = Fragment.empty;\n            }\n            pos = to;\n          }\n        }\n      }\n    }\n    if (frag != Fragment.empty || pos < result.to) {\n      ranges.push({ from: pos, to: result.to, insert: new Slice(frag, 0, 0) });\n    }\n    return ranges;\n  }\n}\n\n/// A matched instance of a search query. `match` will be non-null\n/// only for regular expression queries.\nexport interface SearchResult {\n  from: number;\n  to: number;\n  match: RegExpMatchArray | null;\n  matchStart: number;\n}\n\ninterface QueryImpl {\n  findNext(state: EditorState, from: number, to: number): SearchResult | null;\n  findPrev(state: EditorState, from: number, to: number): SearchResult | null;\n}\n\nconst nullQuery = new class implements QueryImpl {\n  findNext() {\n    return null;\n  }\n  findPrev() {\n    return null;\n  }\n}();\n\nclass StringQuery implements QueryImpl {\n  string: string;\n\n  constructor(readonly query: SearchQuery) {\n    let string = query.unquote(query.search);\n    if (!query.caseSensitive) string = string.toLowerCase();\n    this.string = string;\n  }\n\n  findNext(state: EditorState, from: number, to: number) {\n    return scanTextblocks(state.doc, from, to, (node, start) => {\n      let off = Math.max(from, start);\n      let content = textContent(node).slice(\n        off - start,\n        Math.min(node.content.size, to - start),\n      );\n      let index = (this.query.caseSensitive ? content : content.toLowerCase())\n        .indexOf(this.string);\n      return index < 0 ? null : {\n        from: off + index,\n        to: off + index + this.string.length,\n        match: null,\n        matchStart: start,\n      };\n    });\n  }\n\n  findPrev(state: EditorState, from: number, to: number) {\n    return scanTextblocks(state.doc, from, to, (node, start) => {\n      let off = Math.max(start, to);\n      let content = textContent(node).slice(\n        off - start,\n        Math.min(node.content.size, from - start),\n      );\n      if (!this.query.caseSensitive) content = content.toLowerCase();\n      let index = content.lastIndexOf(this.string);\n      return index < 0 ? null : {\n        from: off + index,\n        to: off + index + this.string.length,\n        match: null,\n        matchStart: start,\n      };\n    });\n  }\n}\n\nconst baseFlags = 'g' + (/x/.unicode == null ? '' : 'u') +\n  ((/x/ as any).hasIndices == null ? '' : 'd');\n\nclass RegExpQuery implements QueryImpl {\n  regexp: RegExp;\n\n  constructor(readonly query: SearchQuery) {\n    this.regexp = new RegExp(\n      query.search,\n      baseFlags + (query.caseSensitive ? '' : 'i'),\n    );\n  }\n\n  findNext(state: EditorState, from: number, to: number) {\n    return scanTextblocks(state.doc, from, to, (node, start) => {\n      let content = textContent(node).slice(\n        0,\n        Math.min(node.content.size, to - start),\n      );\n      this.regexp.lastIndex = from - start;\n      let match = this.regexp.exec(content);\n      return match\n        ? {\n          from: start + match.index,\n          to: start + match.index + match[0].length,\n          match,\n          matchStart: start,\n        }\n        : null;\n    });\n  }\n\n  findPrev(state: EditorState, from: number, to: number) {\n    return scanTextblocks(state.doc, from, to, (node, start) => {\n      let content = textContent(node).slice(\n        0,\n        Math.min(node.content.size, from - start),\n      );\n      let match;\n      for (let off = 0;;) {\n        this.regexp.lastIndex = off;\n        let next = this.regexp.exec(content);\n        if (!next) break;\n        match = next;\n        off = next.index + 1;\n      }\n      return match\n        ? {\n          from: start + match.index,\n          to: start + match.index + match[0].length,\n          match,\n          matchStart: start,\n        }\n        : null;\n    });\n  }\n}\n\nfunction getGroupIndices(\n  match: RegExpMatchArray,\n): ([number, number] | undefined)[] {\n  if ((match as any).indices) return (match as any).indices;\n  let result: ([number, number] | undefined)[] = [[0, match[0].length]];\n  for (let i = 1, pos = 0; i < match.length; i++) {\n    let found = match[i] ? match[0].indexOf(match[i], pos) : -1;\n    result.push(found < 0 ? undefined : [found, pos = found + match[i].length]);\n  }\n  return result;\n}\n\nfunction parseReplacement(\n  text: string,\n): (string | { group: number; copy: boolean })[] {\n  let result: (string | { group: number; copy: boolean })[] = [],\n    highestSeen = -1;\n  function add(text: string) {\n    let last = result.length - 1;\n    if (last > -1 && typeof result[last] == 'string') result[last] += text;\n    else result.push(text);\n  }\n  while (text.length) {\n    let m = /\\$([$&\\d+])/.exec(text);\n    if (!m) {\n      add(text);\n      return result;\n    }\n    if (m.index > 0) add(text.slice(0, m.index + (m[1] == '$' ? 1 : 0)));\n    if (m[1] != '$') {\n      let n = m[1] == '&' ? 0 : +m[1];\n      if (highestSeen >= n) {\n        result.push({ group: n, copy: true });\n      } else {\n        highestSeen = n || 1000;\n        result.push({ group: n, copy: false });\n      }\n    }\n    text = text.slice(m.index + m[0].length);\n  }\n  return result;\n}\n\nexport function validRegExp(source: string) {\n  try {\n    new RegExp(source, baseFlags);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nconst TextContentCache = new WeakMap<Node, string>();\n\nfunction textContent(node: Node) {\n  let cached = TextContentCache.get(node);\n  if (cached) return cached;\n\n  let content = '';\n  for (let i = 0; i < node.childCount; i++) {\n    let child = node.child(i);\n    if (child.isText) content += child.text!;\n    else if (child.isLeaf) content += '\\ufffc';\n    else content += ' ' + textContent(child) + ' ';\n  }\n  TextContentCache.set(node, content);\n  return content;\n}\n\nfunction scanTextblocks<T>(\n  node: Node,\n  from: number,\n  to: number,\n  f: (node: Node, startPos: number) => T | null,\n  nodeStart: number = 0,\n): T | null {\n  if (node.inlineContent) {\n    return f(node, nodeStart);\n  } else if (!node.isLeaf) {\n    if (from > to) {\n      for (\n        let i = node.childCount - 1, pos = nodeStart + node.content.size;\n        i >= 0 && pos > to;\n        i--\n      ) {\n        let child = node.child(i);\n        pos -= child.nodeSize;\n        if (pos < from) {\n          let result = scanTextblocks(child, from, to, f, pos + 1);\n          if (result != null) return result;\n        }\n      }\n    } else {\n      for (let i = 0, pos = nodeStart; i < node.childCount && pos < to; i++) {\n        let child = node.child(i), start = pos;\n        pos += child.nodeSize;\n        if (pos > from) {\n          let result = scanTextblocks(child, from, to, f, start + 1);\n          if (result != null) return result;\n        }\n      }\n    }\n  }\n  return null;\n}\n\nfunction checkWordBoundary(state: EditorState, pos: number) {\n  let $pos = state.doc.resolve(pos);\n  let before = $pos.nodeBefore, after = $pos.nodeAfter;\n  if (!before || !after || !before.isText || !after.isText) return true;\n  return !/\\p{L}$/u.test(before.text!) || !/^\\p{L}/u.test(after.text!);\n}\n","import {\n  EditorState,\n  Plugin,\n  PluginKey,\n  TextSelection,\n  Transaction,\n} from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nimport { type Command, CommandFactory } from '../commands/types.ts';\nimport { SearchQuery, SearchResult } from './query.ts';\n\nclass SearchState {\n  constructor(\n    readonly query: SearchQuery,\n    readonly range: { from: number; to: number } | null,\n    readonly deco: DecorationSet,\n  ) {}\n}\n\nfunction buildMatchDeco(\n  state: EditorState,\n  query: SearchQuery,\n  range: { from: number; to: number } | null,\n) {\n  if (!query.valid) return DecorationSet.empty;\n  let deco: Decoration[] = [];\n  let sel = state.selection;\n  for (\n    let pos = range ? range.from : 0,\n      end = range ? range.to : state.doc.content.size;;\n  ) {\n    let next = query.findNext(state, pos, end);\n    if (!next) break;\n    let cls = next.from == sel.from && next.to == sel.to\n      ? 'kb-active-search-match'\n      : 'kb-search-match';\n    deco.push(Decoration.inline(next.from, next.to, { class: cls }));\n    pos = next.to;\n  }\n  return DecorationSet.create(state.doc, deco);\n}\n\nconst searchKey: PluginKey<SearchState> = new PluginKey('search');\n\n/// Returns a plugin that stores a current search query and searched\n/// range, and highlights matches of the query.\nexport function createSearchPlugin(\n  options: {\n    initialQuery?: SearchQuery;\n    initialRange?: { from: number; to: number };\n  } = {},\n): Plugin {\n  return new Plugin<SearchState>({\n    key: searchKey,\n    state: {\n      init(_config, state) {\n        let query = options.initialQuery || new SearchQuery({ search: '' });\n        let range = options.initialRange || null;\n        return new SearchState(\n          query,\n          range,\n          buildMatchDeco(state, query, range),\n        );\n      },\n      apply(tr, search, _oldState, state) {\n        let set = tr.getMeta(searchKey) as {\n          query: SearchQuery;\n          range: { from: number; to: number } | null;\n        } | undefined;\n        if (set) {\n          return new SearchState(\n            set.query,\n            set.range,\n            buildMatchDeco(state, set.query, set.range),\n          );\n        }\n\n        if (tr.docChanged || tr.selectionSet) {\n          let range = search.range;\n          if (range) {\n            let from = tr.mapping.map(range.from, 1);\n            let to = tr.mapping.map(range.to, -1);\n            range = from < to ? { from, to } : null;\n          }\n          search = new SearchState(\n            search.query,\n            range,\n            buildMatchDeco(state, search.query, range),\n          );\n        }\n        return search;\n      },\n    },\n    props: {\n      decorations: (state) => searchKey.getState(state)!.deco,\n    },\n  });\n}\n\n/// Get the current active search query and searched range. Will\n/// return `undefined` is the search plugin isn't active.\nexport function getSearchState(state: EditorState): {\n  query: SearchQuery;\n  range: { from: number; to: number } | null;\n} | undefined {\n  return searchKey.getState(state);\n}\n\n/// Access the decoration set holding the currently highlighted search\n/// matches in the document.\nexport function getMatchHighlights(state: EditorState) {\n  let search = searchKey.getState(state);\n  return search ? search.deco : DecorationSet.empty;\n}\n\n/// Add metadata to a transaction that updates the active search query\n/// and searched range, when dispatched.\nexport function setSearchState(\n  tr: Transaction,\n  query: SearchQuery,\n  range: { from: number; to: number } | null = null,\n) {\n  return tr.setMeta(searchKey, { query, range });\n}\n\nfunction nextMatch(\n  search: SearchState,\n  state: EditorState,\n  wrap: boolean,\n  curFrom: number,\n  curTo: number,\n) {\n  let range = search.range || { from: 0, to: state.doc.content.size };\n  let next = search.query.findNext(\n    state,\n    Math.max(curTo, range.from),\n    range.to,\n  );\n  if (!next && wrap) {\n    next = search.query.findNext(\n      state,\n      range.from,\n      Math.min(curFrom, range.to),\n    );\n  }\n  return next;\n}\n\nfunction prevMatch(\n  search: SearchState,\n  state: EditorState,\n  wrap: boolean,\n  curFrom: number,\n  curTo: number,\n) {\n  let range = search.range || { from: 0, to: state.doc.content.size };\n  let prev = search.query.findPrev(\n    state,\n    Math.min(curFrom, range.to),\n    range.from,\n  );\n  if (!prev && wrap) {\n    prev = search.query.findPrev(state, range.to, Math.max(curTo, range.from));\n  }\n  return prev;\n}\n\nfunction findCommand(wrap: boolean, dir: -1 | 1): Command {\n  return (state, dispatch) => {\n    let search = searchKey.getState(state);\n    if (!search || !search.query.valid) return false;\n    let { from, to } = state.selection;\n    let next = dir > 0\n      ? nextMatch(search, state, wrap, from, to)\n      : prevMatch(search, state, wrap, from, to);\n    if (!next) return false;\n    let selection = TextSelection.create(state.doc, next.from, next.to);\n    if (dispatch) dispatch(state.tr.setSelection(selection).scrollIntoView());\n    return true;\n  };\n}\n\n/// Find the next instance of the search query after the current\n/// selection and move the selection to it.\nexport const findNext: Command = findCommand(true, 1);\n\n/// Find the next instance of the search query and move the selection\n/// to it. Don't wrap around at the end of document or search range.\nexport const findNextNoWrap: Command = findCommand(false, 1);\n\n/// Find the previous instance of the search query and move the\n/// selection to it.\nexport const findPrev: Command = findCommand(true, -1);\n\n/// Find the previous instance of the search query and move the\n/// selection to it. Don't wrap at the start of the document or search\n/// range.\nexport const findPrevNoWrap: Command = findCommand(false, -1);\n\nfunction replaceCommand(wrap: boolean, moveForward: boolean): Command {\n  return (state, dispatch) => {\n    let search = searchKey.getState(state);\n    if (!search || !search.query.valid) return false;\n    let { from } = state.selection;\n    let next = nextMatch(search, state, wrap, from, from);\n    if (!next) return false;\n\n    if (!dispatch) return true;\n    if (state.selection.from == next.from && state.selection.to == next.to) {\n      let tr = state.tr,\n        replacements = search.query.getReplacements(state, next);\n      for (let i = replacements.length - 1; i >= 0; i--) {\n        let { from, to, insert } = replacements[i];\n        tr.replace(from, to, insert);\n      }\n      let after = moveForward &&\n        nextMatch(search, state, wrap, next.from, next.to);\n      if (after) {\n        tr.setSelection(\n          TextSelection.create(\n            tr.doc,\n            tr.mapping.map(after.from, 1),\n            tr.mapping.map(after.to, -1),\n          ),\n        );\n      } else {\n        tr.setSelection(\n          TextSelection.create(tr.doc, next.from, tr.mapping.map(next.to, 1)),\n        );\n      }\n      dispatch(tr.scrollIntoView());\n    } else if (!moveForward) {\n      return false;\n    } else {\n      dispatch(\n        state.tr.setSelection(\n          TextSelection.create(state.doc, next.from, next.to),\n        ).scrollIntoView(),\n      );\n    }\n    return true;\n  };\n}\n\n/// Replace the currently selected instance of the search query, and\n/// move to the next one. Or select the next match, if none is already\n/// selected.\nexport const replaceNext: Command = replaceCommand(true, true);\n\n/// Replace the next instance of the search query. Don't wrap around\n/// at the end of the document.\nexport const replaceNextNoWrap: Command = replaceCommand(false, true);\n\n/// Replace the currently selected instance of the search query, if\n/// any, and keep it selected.\nexport const replaceCurrent: Command = replaceCommand(false, false);\n\n/// Replace all instances of the search query.\nexport const replaceAll: Command = (state, dispatch) => {\n  let search = searchKey.getState(state);\n  if (!search) return false;\n  let matches: SearchResult[] = [],\n    range = search.range || { from: 0, to: state.doc.content.size };\n  for (let pos = range.from;;) {\n    let next = search.query.findNext(state, pos, range.to);\n    if (!next) break;\n    matches.push(next);\n    pos = next.to;\n  }\n  if (dispatch) {\n    let tr = state.tr;\n    for (let i = matches.length - 1; i >= 0; i--) {\n      let match = matches[i];\n      let replacements = search.query.getReplacements(state, match);\n      for (let j = replacements.length - 1; j >= 0; j--) {\n        let { from, to, insert } = replacements[j];\n        tr.replace(from, to, insert);\n      }\n    }\n    dispatch(tr);\n  }\n  return true;\n};\n\nconst searchFactory: CommandFactory = (\n  query: SearchQuery,\n  range: { from: number; to: number } | null = null,\n) => {\n  const search: Command = (state, dispatch) => {\n    const tr = state.tr;\n    setSearchState(tr, query, range);\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return true;\n  };\n\n  return search;\n};\n\nexport const searchCommandFactories: Record<string, CommandFactory> = {\n  search: searchFactory,\n  findNext: () => findNext,\n  findNextNoWrap: () => findNextNoWrap,\n  findPrev: () => findPrev,\n  findPrevNoWrap: () => findPrevNoWrap,\n  replaceNext: () => replaceNext,\n  replaceNextNoWrap: () => replaceNextNoWrap,\n  replaceCurrent: () => replaceCurrent,\n  replaceAll: () => replaceAll,\n};\n","export interface Telemetry {\n  enabled: boolean;\n\n  span<T>(name: string, fn: () => T): T;\n  event(type: string, data: unknown): void;\n  log(type: string, body: unknown): void;\n}\n\nexport class NoTelemetry implements Telemetry {\n  enabled = false;\n\n  span<T>(_: string, fn: () => T): T {\n    return fn();\n  }\n\n  event(): void {\n  }\n\n  log(): void {\n  }\n}\n","import { MarkSpec, NodeSpec, Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { NodeViewConstructor } from 'prosemirror-view';\n\nimport { WorkspaceImpl } from '@kerebron/workspace';\n\nimport { Converter, Extension } from './Extension.ts';\nimport type { AnyExtension, AnyExtensionOrReq, EditorKit } from './types.ts';\nimport type { CoreEditor } from './CoreEditor.ts';\nimport { Mark } from './Mark.ts';\nimport { Node } from './Node.ts';\nimport {\n  InputRule,\n  InputRulesPlugin,\n} from './plugins/input-rules/InputRulesPlugin.ts';\nimport { KeymapPlugin } from './plugins/keymap/keymap.ts';\nimport { CommandShortcuts, firstCommand } from './commands/mod.ts';\nimport { type Command } from 'prosemirror-state';\nimport { addAttributesToSchema } from './utilities/getHtmlAttributes.ts';\nimport { TrackSelecionPlugin } from './plugins/TrackSelecionPlugin.ts';\n\nimport * as yaml from './utilities/yaml.ts';\nimport { FrontmatterServiceImpl } from '@kerebron/editor/frontmatter';\nimport { createSearchPlugin } from './search/search.ts';\nimport { NoTelemetry } from './utilities/Telemetry.ts';\n\nfunction splitExtensions(extensions: Iterable<AnyExtension>) {\n  const baseExtensions = Array.from(extensions).filter((extension) =>\n    extension.type === 'extension'\n  ) as Extension[];\n  const nodeExtensions = Array.from(extensions).filter((extension) =>\n    extension.type === 'node'\n  ) as Node[];\n  const markExtensions = Array.from(extensions).filter((extension) =>\n    extension.type === 'mark'\n  ) as Mark[];\n\n  return {\n    baseExtensions,\n    nodeExtensions,\n    markExtensions,\n  };\n}\n\nexport class ExtensionManager {\n  public readonly extensions: Set<AnyExtension> = new Set();\n  readonly plugins: Plugin[] = [];\n  readonly nodeViews: Record<string, NodeViewConstructor> = {};\n\n  public converters: Record<string, Converter> = {};\n\n  constructor(public readonly editorKits: EditorKit[], private debug = false) {\n    const extensions: AnyExtensionOrReq[] = editorKits\n      .reduce(\n        (prev: AnyExtensionOrReq[], cur) => prev.concat(cur.getExtensions()),\n        [],\n      );\n\n    this.setupExtensions(new Set(extensions));\n  }\n\n  private initPlugins(editor: CoreEditor, schema: Schema) {\n    const inputRules: InputRule[] = [];\n    const keyBindings: Map<string, Command> = new Map();\n\n    const mergeShortcuts = (\n      toInsert: Partial<CommandShortcuts>,\n      extName: string,\n    ) => {\n      for (const key in toInsert) {\n        if (!toInsert[key]) {\n          continue;\n        }\n\n        const commandFactory = editor.commandFactories[toInsert[key]];\n        if (!commandFactory) {\n          console.warn(`No command constructor: ${toInsert[key]}`);\n          continue;\n        }\n        const command = commandFactory();\n\n        const keyBinding = keyBindings.get(key);\n        if (keyBinding) {\n          keyBindings.set(key, firstCommand(command, keyBinding));\n        } else {\n          keyBindings.set(key, command);\n        }\n      }\n    };\n\n    let converters = {};\n\n    for (const extension of this.extensions) {\n      extension.setEditor(editor);\n\n      if (extension.type === 'node') {\n        const nodeType = schema.nodes[extension.name];\n        inputRules.push(...extension.getInputRules(nodeType));\n        this.plugins.push(\n          ...extension.getProseMirrorPlugins(),\n        );\n        editor.mergeCommandFactories(\n          extension.getCommandFactories(editor, nodeType),\n          extension.name,\n        );\n        mergeShortcuts(\n          extension.getKeyboardShortcuts(editor),\n          extension.name,\n        );\n        converters = {\n          ...converters,\n          ...extension.getConverters(editor, schema),\n        };\n        const nodeView = extension.getNodeView(editor);\n        if (nodeView) {\n          this.nodeViews[extension.name] = nodeView;\n        }\n      }\n      if (extension.type === 'mark') {\n        const markType = schema.marks[extension.name];\n        inputRules.push(...extension.getInputRules(markType));\n        editor.mergeCommandFactories(\n          extension.getCommandFactories(editor, markType),\n          extension.name,\n        );\n        mergeShortcuts(\n          extension.getKeyboardShortcuts(editor),\n          extension.name,\n        );\n      }\n      if (extension.type === 'extension') {\n        this.plugins.push(\n          ...extension.getProseMirrorPlugins(),\n        );\n        editor.mergeCommandFactories(\n          extension.getCommandFactories(editor),\n          extension.name,\n        );\n        mergeShortcuts(\n          extension.getKeyboardShortcuts(editor),\n          extension.name,\n        );\n        converters = {\n          ...converters,\n          ...extension.getConverters(editor, schema),\n        };\n      }\n    }\n\n    if (this.debug) {\n      for (const key in keyBindings) {\n        const keyBinding = keyBindings.get(key);\n        if (!keyBinding) {\n          continue;\n        }\n\n        const wrapperCommand: Command = (state, dispatch, view) => {\n          console.debug(`Key: ${key}`);\n          return true;\n        };\n        keyBindings.set(\n          key,\n          firstCommand(wrapperCommand, keyBinding),\n        );\n      }\n    }\n\n    this.converters = converters;\n\n    this.plugins.push(new InputRulesPlugin(inputRules));\n    this.plugins.push(new KeymapPlugin(Object.fromEntries(keyBindings)));\n    this.plugins.push(createSearchPlugin());\n    this.plugins.push(new TrackSelecionPlugin(editor));\n  }\n\n  private setupExtensions(extensions: Set<AnyExtensionOrReq>) {\n    const allExtensions = new Map<string, AnyExtensionOrReq>();\n\n    const createMap = (extensions: Set<AnyExtensionOrReq>) => {\n      for (const extension of extensions) {\n        if ('name' in extension) {\n          const existing = allExtensions.get(extension.name);\n          if (\n            existing && 'type' in existing && extension.type !== existing.type\n          ) {\n            throw new Error(`Duplicate mark/node: ${extension.name}`);\n          }\n          allExtensions.set(extension.name, extension);\n        }\n        if ('requires' in extension) {\n          const childExtensions = Array.from(extension.requires).filter((e) =>\n            typeof e !== 'string'\n          );\n          createMap(new Set(childExtensions));\n        }\n      }\n    };\n\n    createMap(extensions);\n\n    const initialized: Set<string> = new Set();\n\n    const initializeExtension = (extension: AnyExtension) => {\n      if (this.debug) {\n        console.info(`Initialize ${extension.type} ${extension.name}`);\n      }\n      this.extensions.add(extension);\n    };\n\n    function recursiveInitializeExtension(extension: AnyExtensionOrReq) {\n      if ('name' in extension && initialized.has(extension.name)) {\n        return;\n      }\n\n      if ('requires' in extension) {\n        const requires = extension.requires || [];\n        const requireNames = requires.map((\n          e: string | AnyExtensionOrReq,\n        ): string => typeof e === 'string' ? e : ('name' in e ? e.name : ''));\n\n        for (const require of requireNames) {\n          if (!initialized.has(require)) {\n            const requiredExtension = allExtensions.get(require);\n            if (!requiredExtension) {\n              throw new Error(\n                `Required extension for (${\n                  'name' in extension ? extension.name : extension\n                }) not found: ${require}`,\n              );\n            }\n            recursiveInitializeExtension(requiredExtension);\n          }\n        }\n      }\n\n      if ('name' in extension) {\n        initializeExtension(extension);\n\n        initialized.add(extension.name);\n        allExtensions.delete(extension.name);\n      }\n    }\n\n    for (const extension of allExtensions.values()) {\n      recursiveInitializeExtension(extension);\n    }\n\n    if (allExtensions.size > 0) {\n      throw new Error(\n        'Not all extensions initialized: ' +\n          Array.from(allExtensions.keys()).join(', '),\n      );\n    }\n  }\n\n  getSchemaByResolvedExtensions(): Schema {\n    const { nodeExtensions, markExtensions, baseExtensions } = splitExtensions(\n      this.extensions,\n    );\n\n    const nodes: { [name: string]: NodeSpec } = {};\n    let topNode = '';\n    for (const extension of nodeExtensions) {\n      nodes[extension.name] = extension.getNodeSpec();\n\n      if (nodes[extension.name].EMPTY_DOC) {\n        if (topNode) {\n          throw new Error(`Multiple topNodes: ${extension.name}, ${topNode}`);\n        }\n        topNode = extension.name;\n      }\n\n      addAttributesToSchema(nodes[extension.name], extension);\n    }\n\n    const marks: { [name: string]: MarkSpec } = {};\n    for (const extension of markExtensions) {\n      marks[extension.name] = extension.getMarkSpec();\n      addAttributesToSchema(marks[extension.name], extension);\n    }\n\n    const spec = {\n      topNode: topNode || 'doc',\n      nodes,\n      marks,\n    };\n\n    for (const extension of baseExtensions) {\n      if ('setupSpec' in baseExtensions) {\n        extension.setupSpec(spec);\n      }\n    }\n\n    return new Schema(spec);\n  }\n\n  created(editor: CoreEditor, schema: Schema) {\n    const { nodeExtensions, markExtensions, baseExtensions } = splitExtensions(\n      this.extensions,\n    );\n\n    for (const extension of baseExtensions) {\n      if (Array.isArray(extension.overrides)) {\n        for (const name of extension.overrides) {\n          for (const ext of this.extensions) {\n            if (ext.name === name) {\n              this.extensions.delete(ext);\n            }\n          }\n        }\n      }\n      if (Array.isArray(extension.conflicts)) {\n        for (const name of extension.conflicts) {\n          const anotherExtension = baseExtensions.find((it) =>\n            it.name === name\n          );\n          if (anotherExtension) {\n            throw new Error(`Extension conflict: ${extension.name} vs ${name}`);\n          }\n        }\n      }\n    }\n\n    for (const extension of baseExtensions) {\n      editor.ci.register(extension.name, extension);\n    }\n    editor.ci.register('yaml', yaml);\n    editor.ci.register('frontmatter', new FrontmatterServiceImpl(yaml));\n    editor.ci.register('workspace', new WorkspaceImpl());\n    editor.ci.register('telemetry', new NoTelemetry());\n\n    this.initPlugins(editor, schema);\n\n    for (const extension of this.extensions) {\n      extension.created();\n    }\n  }\n}\n","import { EditorState, Transaction } from 'prosemirror-state';\n\nexport function createChainableState(\n  transaction: Transaction,\n  state: EditorState,\n): EditorState {\n  let { selection } = transaction;\n  let { doc } = transaction;\n  let { storedMarks } = transaction;\n\n  return {\n    ...state,\n    apply: state.apply.bind(state),\n    applyTransaction: state.applyTransaction.bind(state),\n    plugins: state.plugins,\n    schema: state.schema,\n    reconfigure: state.reconfigure.bind(state),\n    toJSON: state.toJSON.bind(state),\n    get storedMarks() {\n      return storedMarks;\n    },\n    get selection() {\n      return selection;\n    },\n    get doc() {\n      return doc;\n    },\n    get tr() {\n      selection = transaction.selection;\n      doc = transaction.doc;\n      storedMarks = transaction.storedMarks;\n\n      return transaction;\n    },\n  };\n}\n","import {\n  canJoin,\n  canSplit,\n  findWrapping,\n  joinPoint,\n  liftTarget,\n  ReplaceAroundStep,\n  ReplaceStep,\n  replaceStep,\n} from 'prosemirror-transform';\nimport {\n  Attrs,\n  ContentMatch,\n  Fragment,\n  MarkType,\n  Node,\n  NodeRange,\n  NodeType,\n  ResolvedPos,\n  Slice,\n} from 'prosemirror-model';\nimport {\n  AllSelection,\n  EditorState,\n  NodeSelection,\n  Selection,\n  SelectionRange,\n  TextSelection,\n  Transaction,\n} from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { type Command, CommandFactory } from './types.ts';\nimport {\n  runInputRulesRange,\n  runInputRulesTexts,\n  undoInputRuleCommand,\n} from '../plugins/input-rules/InputRulesPlugin.ts';\n\n/// When the cursor is at the start of a textblock that is *not* the\n/// first child of a list item, lift that textblock out of the list\n/// instead of merging it into the previous paragraph.\nconst liftListItemParagraph = (): Command => (state, dispatch) => {\n  const { $cursor } = state.selection as TextSelection;\n  if (!$cursor || $cursor.parentOffset > 0) return false;\n  if (!$cursor.parent.isTextblock) return false;\n\n  // Walk up: find the list_item ancestor and check whether the\n  // textblock is its first child at that depth.\n  for (let depth = $cursor.depth; depth > 0; depth--) {\n    const node = $cursor.node(depth);\n    if (\n      node.type.name === 'list_item' || node.type.name === 'bullet_list' ||\n      node.type.name === 'task_item' || node.type.name === 'task_list'\n    ) {\n      // Is the cursor's textblock the first child of the list_item?\n      const listItemDepth = node.type.name === 'list_item' ? depth : depth - 1;\n      const listItem = node.type.name === 'list_item'\n        ? node\n        : $cursor.node(depth - 1);\n      // index of the textblock within the list_item\n      if ($cursor.index(listItemDepth) === 0) return false; // first paragraph — let joinBackward handle it\n\n      const range = $cursor.blockRange();\n      if (!range) return false;\n      const target = liftTarget(range);\n      if (target == null) return false;\n      if (dispatch) dispatch(state.tr.lift(range, target).scrollIntoView());\n      return true;\n    }\n  }\n  return false;\n};\n\n/// Returns a command function that wraps the selection in a list with\n/// the given type an attributes. If `dispatch` is null, only return a\n/// value to indicate whether this is possible, but don't actually\n/// perform the change.\nexport const wrapInList: CommandFactory = (\n  listType: NodeType,\n  attrs: Attrs | null = null,\n): Command => {\n  return function (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n    view?: EditorView,\n  ) {\n    let { $from, $to } = state.selection;\n    let range = $from.blockRange($to);\n    if (!range) return false;\n    let tr = dispatch ? state.tr : null;\n    // const tr = state.tr;\n    const cmd = wrapRangeInList(tr, range, listType, attrs);\n    if (!cmd.apply(this, [state, dispatch])) return false;\n    if (dispatch) dispatch(tr!.scrollIntoView());\n    return true;\n  };\n};\n\n/// Try to wrap the given node range in a list of the given type.\n/// Return `true` when this is possible, `false` otherwise. When `tr`\n/// is non-null, the wrapping is added to that transaction. When it is\n/// `null`, the function only queries whether the wrapping is\n/// possible.\nconst wrapRangeInList: CommandFactory = (\n  tr: Transaction | null,\n  range: NodeRange,\n  listType: NodeType,\n  attrs: Attrs | null = null,\n): Command => {\n  const cmd: Command = () => {\n    let doJoin = false, outerRange = range, doc = range.$from.doc;\n    // This is at the top of an existing list item\n    if (\n      range.depth >= 2 &&\n      range.$from.node(range.depth - 1).type.compatibleContent(listType) &&\n      range.startIndex == 0\n    ) {\n      // Don't do anything if this is the top of the list\n      if (range.$from.index(range.depth - 1) == 0) return false;\n      let $insert = doc.resolve(range.start - 2);\n      outerRange = new NodeRange($insert, $insert, range.depth);\n      if (range.endIndex < range.parent.childCount) {\n        range = new NodeRange(\n          range.$from,\n          doc.resolve(range.$to.end(range.depth)),\n          range.depth,\n        );\n      }\n      doJoin = true;\n    }\n    let wrap = findWrapping(outerRange, listType, attrs, range);\n    if (!wrap) return false;\n    if (tr) doWrapInList(tr, range, wrap, doJoin, listType);\n    return true;\n  };\n\n  return cmd;\n};\n\nfunction doWrapInList(\n  tr: Transaction,\n  range: NodeRange,\n  wrappers: { type: NodeType; attrs?: Attrs | null }[],\n  joinBefore: boolean,\n  listType: NodeType,\n) {\n  let content = Fragment.empty;\n  for (let i = wrappers.length - 1; i >= 0; i--) {\n    content = Fragment.from(\n      wrappers[i].type.create(wrappers[i].attrs, content),\n    );\n  }\n\n  tr.step(\n    new ReplaceAroundStep(\n      range.start - (joinBefore ? 2 : 0),\n      range.end,\n      range.start,\n      range.end,\n      new Slice(content, 0, 0),\n      wrappers.length,\n      true,\n    ),\n  );\n\n  let found = 0;\n  for (let i = 0; i < wrappers.length; i++) {\n    if (wrappers[i].type == listType) found = i + 1;\n  }\n  let splitDepth = wrappers.length - found;\n\n  let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0),\n    parent = range.parent;\n  for (\n    let i = range.startIndex, e = range.endIndex, first = true;\n    i < e;\n    i++, first = false\n  ) {\n    if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n      tr.split(splitPos, splitDepth);\n      splitPos += 2 * splitDepth;\n    }\n    splitPos += parent.child(i).nodeSize;\n  }\n  return tr;\n}\n\n/// Delete the selection, if there is one.\nconst deleteSelection = (): Command => (state, dispatch) => {\n  if (state.selection.empty) return false;\n  if (dispatch) dispatch(state.tr.deleteSelection().scrollIntoView());\n  return true;\n};\n\nfunction atBlockStart(\n  state: EditorState,\n  view?: EditorView,\n): ResolvedPos | null {\n  let { $cursor } = state.selection as TextSelection;\n  if (\n    !$cursor ||\n    (view ? !view.endOfTextblock('backward', state) : $cursor.parentOffset > 0)\n  ) {\n    return null;\n  }\n  return $cursor;\n}\n\n/// If the selection is empty and at the start of a textblock, try to\n/// reduce the distance between that block and the one before it—if\n/// there's a block directly before it that can be joined, join them.\n/// If not, try to move the selected block closer to the next one in\n/// the document structure by lifting it out of its parent or moving it\n/// into a parent of the previous block. Will use the view for accurate\n/// (bidi-aware) start-of-textblock detection if given.\nconst joinBackward = (): Command => (state, dispatch, view) => {\n  let $cursor = atBlockStart(state, view);\n  if (!$cursor) return false;\n\n  let $cut = findCutBefore($cursor);\n\n  // If there is no node before this, try to lift\n  if (!$cut) {\n    let range = $cursor.blockRange(), target = range && liftTarget(range);\n    if (target == null) return false;\n    if (dispatch) dispatch(state.tr.lift(range!, target).scrollIntoView());\n    return true;\n  }\n\n  let before = $cut.nodeBefore!;\n  // Apply the joining algorithm\n  if (deleteBarrier(state, $cut, dispatch, -1)) return true;\n\n  // If the node below has no content and the node above is\n  // selectable, delete the node below and select the one above.\n  if (\n    $cursor.parent.content.size == 0 &&\n    (textblockAt(before, 'end') || NodeSelection.isSelectable(before))\n  ) {\n    for (let depth = $cursor.depth;; depth--) {\n      let delStep = replaceStep(\n        state.doc,\n        $cursor.before(depth),\n        $cursor.after(depth),\n        Slice.empty,\n      );\n      if (\n        delStep &&\n        (delStep as ReplaceStep).slice.size <\n          (delStep as ReplaceStep).to - (delStep as ReplaceStep).from\n      ) {\n        if (dispatch) {\n          let tr = state.tr.step(delStep);\n          tr.setSelection(\n            textblockAt(before, 'end')\n              ? Selection.findFrom(\n                tr.doc.resolve(tr.mapping.map($cut.pos, -1)),\n                -1,\n              )!\n              : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize),\n          );\n          dispatch(tr.scrollIntoView());\n        }\n        return true;\n      }\n      if (depth == 1 || $cursor.node(depth - 1).childCount > 1) break;\n    }\n  }\n\n  // If the node before is an atom, delete it\n  if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n    if (dispatch) {\n      dispatch(\n        state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView(),\n      );\n    }\n    return true;\n  }\n\n  return false;\n};\n\n/// A more limited form of [`joinBackward`](#commands.joinBackward)\n/// that only tries to join the current textblock to the one before\n/// it, if the cursor is at the start of a textblock.\nconst joinTextblockBackward = (): Command => (state, dispatch, view) => {\n  let $cursor = atBlockStart(state, view);\n  if (!$cursor) return false;\n  let $cut = findCutBefore($cursor);\n  return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n\n/// A more limited form of [`joinForward`](#commands.joinForward)\n/// that only tries to join the current textblock to the one after\n/// it, if the cursor is at the end of a textblock.\nconst joinTextblockForward = (): Command => (state, dispatch, view) => {\n  let $cursor = atBlockEnd(state, view);\n  if (!$cursor) return false;\n  let $cut = findCutAfter($cursor);\n  return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n\nfunction joinTextblocksAround(\n  state: EditorState,\n  $cut: ResolvedPos,\n  dispatch?: (tr: Transaction) => void,\n) {\n  let before = $cut.nodeBefore!, beforeText = before, beforePos = $cut.pos - 1;\n  for (; !beforeText.isTextblock; beforePos--) {\n    if (beforeText.type.spec.isolating) return false;\n    let child = beforeText.lastChild;\n    if (!child) return false;\n    beforeText = child;\n  }\n  let after = $cut.nodeAfter!, afterText = after, afterPos = $cut.pos + 1;\n  for (; !afterText.isTextblock; afterPos++) {\n    if (afterText.type.spec.isolating) return false;\n    let child = afterText.firstChild;\n    if (!child) return false;\n    afterText = child;\n  }\n  let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty) as\n    | ReplaceStep\n    | null;\n  if (\n    !step || step.from != beforePos ||\n    step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos\n  ) return false;\n  if (dispatch) {\n    let tr = state.tr.step(step);\n    tr.setSelection(TextSelection.create(tr.doc, beforePos));\n    dispatch(tr.scrollIntoView());\n  }\n  return true;\n}\n\nfunction textblockAt(node: Node, side: 'start' | 'end', only = false) {\n  for (\n    let scan: Node | null = node;\n    scan;\n    scan = side == 'start' ? scan.firstChild : scan.lastChild\n  ) {\n    if (scan.isTextblock) return true;\n    if (only && scan.childCount != 1) return false;\n  }\n  return false;\n}\n\n/// When the selection is empty and at the start of a textblock, select\n/// the node before that textblock, if possible. This is intended to be\n/// bound to keys like backspace, after\n/// [`joinBackward`](#commands.joinBackward) or other deleting\n/// commands, as a fall-back behavior when the schema doesn't allow\n/// deletion at the selected point.\nconst selectNodeBackward = (): Command => (state, dispatch, view) => {\n  let { $head, empty } = state.selection, $cut: ResolvedPos | null = $head;\n  if (!empty) return false;\n\n  if ($head.parent.isTextblock) {\n    if (\n      view ? !view.endOfTextblock('backward', state) : $head.parentOffset > 0\n    ) return false;\n    $cut = findCutBefore($head);\n  }\n  let node = $cut && $cut.nodeBefore;\n  if (!node || !NodeSelection.isSelectable(node)) return false;\n  if (dispatch) {\n    dispatch(\n      state.tr.setSelection(\n        NodeSelection.create(state.doc, $cut!.pos - node.nodeSize),\n      ).scrollIntoView(),\n    );\n  }\n  return true;\n};\n\nfunction findCutBefore($pos: ResolvedPos): ResolvedPos | null {\n  if (!$pos.parent.type.spec.isolating) {\n    for (let i = $pos.depth - 1; i >= 0; i--) {\n      if ($pos.index(i) > 0) {\n        return $pos.doc.resolve($pos.before(i + 1));\n      }\n      if ($pos.node(i).type.spec.isolating) break;\n    }\n  }\n  return null;\n}\n\nfunction atBlockEnd(state: EditorState, view?: EditorView): ResolvedPos | null {\n  let { $cursor } = state.selection as TextSelection;\n  if (\n    !$cursor ||\n    (view\n      ? !view.endOfTextblock('forward', state)\n      : $cursor.parentOffset < $cursor.parent.content.size)\n  ) {\n    return null;\n  }\n  return $cursor;\n}\n\n/// If the selection is empty and the cursor is at the end of a\n/// textblock, try to reduce or remove the boundary between that block\n/// and the one after it, either by joining them or by moving the other\n/// block closer to this one in the tree structure. Will use the view\n/// for accurate start-of-textblock detection if given.\nconst joinForward = (): Command => (state, dispatch, view) => {\n  let $cursor = atBlockEnd(state, view);\n  if (!$cursor) return false;\n\n  let $cut = findCutAfter($cursor);\n  // If there is no node after this, there's nothing to do\n  if (!$cut) return false;\n\n  let after = $cut.nodeAfter!;\n  // Try the joining algorithm\n  if (deleteBarrier(state, $cut, dispatch, 1)) return true;\n\n  // If the node above has no content and the node below is\n  // selectable, delete the node above and select the one below.\n  if (\n    $cursor.parent.content.size == 0 &&\n    (textblockAt(after, 'start') || NodeSelection.isSelectable(after))\n  ) {\n    let delStep = replaceStep(\n      state.doc,\n      $cursor.before(),\n      $cursor.after(),\n      Slice.empty,\n    );\n    if (\n      delStep &&\n      (delStep as ReplaceStep).slice.size <\n        (delStep as ReplaceStep).to - (delStep as ReplaceStep).from\n    ) {\n      if (dispatch) {\n        let tr = state.tr.step(delStep);\n        tr.setSelection(\n          textblockAt(after, 'start')\n            ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)!\n            : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)),\n        );\n        dispatch(tr.scrollIntoView());\n      }\n      return true;\n    }\n  }\n\n  // If the next node is an atom, delete it\n  if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n    if (dispatch) {\n      dispatch(\n        state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView(),\n      );\n    }\n    return true;\n  }\n\n  return false;\n};\n\n/// When the selection is empty and at the end of a textblock, select\n/// the node coming after that textblock, if possible. This is intended\n/// to be bound to keys like delete, after\n/// [`joinForward`](#commands.joinForward) and similar deleting\n/// commands, to provide a fall-back behavior when the schema doesn't\n/// allow deletion at the selected point.\nconst selectNodeForward = (): Command => (state, dispatch, view) => {\n  let { $head, empty } = state.selection, $cut: ResolvedPos | null = $head;\n  if (!empty) return false;\n  if ($head.parent.isTextblock) {\n    if (\n      view\n        ? !view.endOfTextblock('forward', state)\n        : $head.parentOffset < $head.parent.content.size\n    ) {\n      return false;\n    }\n    $cut = findCutAfter($head);\n  }\n  let node = $cut && $cut.nodeAfter;\n  if (!node || !NodeSelection.isSelectable(node)) return false;\n  if (dispatch) {\n    dispatch(\n      state.tr.setSelection(NodeSelection.create(state.doc, $cut!.pos))\n        .scrollIntoView(),\n    );\n  }\n  return true;\n};\n\nfunction findCutAfter($pos: ResolvedPos) {\n  if (!$pos.parent.type.spec.isolating) {\n    for (let i = $pos.depth - 1; i >= 0; i--) {\n      let parent = $pos.node(i);\n      if ($pos.index(i) + 1 < parent.childCount) {\n        return $pos.doc.resolve($pos.after(i + 1));\n      }\n      if (parent.type.spec.isolating) {\n        break;\n      }\n    }\n  }\n  return null;\n}\n\n/// Join the selected block or, if there is a text selection, the\n/// closest ancestor block of the selection that can be joined, with\n/// the sibling above it.\nconst joinUp = (): Command => (state, dispatch) => {\n  let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n  if (nodeSel) {\n    if (\n      (sel as NodeSelection).node.isTextblock || !canJoin(state.doc, sel.from)\n    ) return false;\n    point = sel.from;\n  } else {\n    point = joinPoint(state.doc, sel.from, -1);\n    if (point == null) return false;\n  }\n  if (dispatch) {\n    let tr = state.tr.join(point);\n    if (nodeSel) {\n      tr.setSelection(\n        NodeSelection.create(\n          tr.doc,\n          point - state.doc.resolve(point).nodeBefore!.nodeSize,\n        ),\n      );\n    }\n    dispatch(tr.scrollIntoView());\n  }\n  return true;\n};\n\n/// Join the selected block, or the closest ancestor of the selection\n/// that can be joined, with the sibling after it.\nconst joinDown = (): Command => (state, dispatch) => {\n  let sel = state.selection, point;\n  if (sel instanceof NodeSelection) {\n    if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) return false;\n    point = sel.to;\n  } else {\n    point = joinPoint(state.doc, sel.to, 1);\n    if (point == null) return false;\n  }\n  if (dispatch) {\n    dispatch(state.tr.join(point).scrollIntoView());\n  }\n  return true;\n};\n\n/// Lift the selected block, or the closest ancestor block of the\n/// selection that can be lifted, out of its parent node.\nconst lift = (): Command => (state, dispatch) => {\n  let { $from, $to } = state.selection;\n  let range = $from.blockRange($to), target = range && liftTarget(range);\n  if (target == null) return false;\n  if (dispatch) dispatch(state.tr.lift(range!, target).scrollIntoView());\n  return true;\n};\n\n/// If the selection is in a node whose type has a truthy\n/// [`code`](#model.NodeSpec.code) property in its spec, replace the\n/// selection with a newline character.\nconst newlineInCode = (): Command => {\n  const cmd: Command = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) {\n      return false;\n    }\n    if (dispatch) dispatch(state.tr.insertText('\\n').scrollIntoView());\n    return true;\n  };\n  cmd.displayName = 'newlineInCode()';\n  return cmd;\n};\n\nfunction defaultBlockAt(match: ContentMatch) {\n  console.log('defaultBlockAt', match);\n  for (let i = 0; i < match.edgeCount; i++) {\n    let { type } = match.edge(i);\n    if (type.isTextblock && !type.hasRequiredAttrs()) return type;\n  }\n  return null;\n}\n\n/// When the selection is in a node with a truthy\n/// [`code`](#model.NodeSpec.code) property in its spec, create a\n/// default block after the code block, and move the cursor there.\nconst exitCode = (): Command => (state, dispatch) => {\n  let { $head, $anchor } = state.selection;\n  if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false;\n  let above = $head.node(-1),\n    after = $head.indexAfter(-1),\n    type = defaultBlockAt(above.contentMatchAt(after));\n  if (!type || !above.canReplaceWith(after, after, type)) return false;\n  if (dispatch) {\n    let pos = $head.after(),\n      tr = state.tr.replaceWith(pos, pos, type.createAndFill()!);\n    tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n    dispatch(tr.scrollIntoView());\n  }\n  return true;\n};\n\n/// If a block node is selected, create an empty paragraph before (if\n/// it is its parent's first child) or after it.\nconst createParagraphNear = (): Command => {\n  const cmd: Command = (state, dispatch) => {\n    let sel = state.selection, { $from, $to } = sel;\n    if (\n      sel instanceof AllSelection || $from.parent.inlineContent ||\n      $to.parent.inlineContent\n    ) return false;\n    let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n    if (!type || !type.isTextblock) return false;\n    if (dispatch) {\n      let side = (!$from.parentOffset && $to.index() < $to.parent.childCount\n        ? $from\n        : $to)\n        .pos;\n      let tr = state.tr.insert(side, type.createAndFill()!);\n      tr.setSelection(TextSelection.create(tr.doc, side + 1));\n      dispatch(tr.scrollIntoView());\n    }\n    return true;\n  };\n  cmd.displayName = 'createParagraphNear()';\n  return cmd;\n};\n\n/// If the cursor is in an empty textblock that can be lifted, lift the\n/// block.\nconst liftEmptyBlock = (): Command => {\n  const cmd: Command = (state, dispatch) => {\n    let { $cursor } = state.selection as TextSelection;\n    if (!$cursor || $cursor.parent.content.size) return false;\n    if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n      let before = $cursor.before();\n      if (canSplit(state.doc, before)) {\n        if (dispatch) dispatch(state.tr.split(before).scrollIntoView());\n        return true;\n      }\n    }\n    let range = $cursor.blockRange(), target = range && liftTarget(range);\n    if (target == null) return false;\n    if (dispatch) dispatch(state.tr.lift(range!, target).scrollIntoView());\n    return true;\n  };\n  cmd.displayName = 'liftEmptyBlock()';\n  return cmd;\n};\n\n/// Create a variant of [`splitBlock`](#commands.splitBlock) that uses\n/// a custom function to determine the type of the newly split off block.\nconst splitBlockAs = (\n  splitNode?: (\n    node: Node,\n    atEnd: boolean,\n    $from: ResolvedPos,\n  ) => { type: NodeType; attrs?: Attrs } | null,\n): Command => {\n  const cmd: Command = (state, dispatch) => {\n    let { $from, $to } = state.selection;\n    if (\n      state.selection instanceof NodeSelection && state.selection.node.isBlock\n    ) {\n      if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) return false;\n      if (dispatch) dispatch(state.tr.split($from.pos).scrollIntoView());\n      return true;\n    }\n\n    if (!$from.depth) return false;\n    let types: (null | { type: NodeType; attrs?: Attrs | null })[] = [];\n    let splitDepth, deflt, atEnd = false, atStart = false;\n    for (let d = $from.depth;; d--) {\n      let node = $from.node(d);\n      if (node.isBlock) {\n        atEnd = $from.end(d) == $from.pos + ($from.depth - d);\n        atStart = $from.start(d) == $from.pos - ($from.depth - d);\n        deflt = defaultBlockAt(\n          $from.node(d - 1).contentMatchAt($from.indexAfter(d - 1)),\n        );\n        let splitType = splitNode && splitNode($to.parent, atEnd, $from);\n        types.unshift(splitType || (atEnd && deflt ? { type: deflt } : null));\n        splitDepth = d;\n        break;\n      } else {\n        if (d == 1) return false;\n        types.unshift(null);\n      }\n    }\n\n    let tr = state.tr;\n    if (\n      state.selection instanceof TextSelection ||\n      state.selection instanceof AllSelection\n    ) tr.deleteSelection();\n    let splitPos = tr.mapping.map($from.pos);\n    let can = canSplit(tr.doc, splitPos, types.length, types);\n    if (!can) {\n      types[0] = deflt ? { type: deflt } : null;\n      can = canSplit(tr.doc, splitPos, types.length, types);\n    }\n    tr.split(splitPos, types.length, types);\n    if (!atEnd && atStart && $from.node(splitDepth).type != deflt) {\n      let first = tr.mapping.map($from.before(splitDepth)),\n        $first = tr.doc.resolve(first);\n      if (\n        deflt &&\n        $from.node(splitDepth - 1).canReplaceWith(\n          $first.index(),\n          $first.index() + 1,\n          deflt,\n        )\n      ) {\n        tr.setNodeMarkup(tr.mapping.map($from.before(splitDepth)), deflt);\n      }\n    }\n    if (dispatch) dispatch(tr.scrollIntoView());\n    return true;\n  };\n  cmd.displayName = 'splitBlockAs()';\n\n  return cmd;\n};\n\n/// Split the parent block of the selection. If the selection is a text\n/// selection, also delete its content.\nconst splitBlock = (): Command => splitBlockAs();\n\n/// Acts like [`splitBlock`](#commands.splitBlock), but without\n/// resetting the set of active marks at the cursor.\nconst splitBlockKeepMarks = (): Command => (state, dispatch) => {\n  return splitBlockAs().apply(this, [\n    state,\n    dispatch && ((tr) => {\n      let marks = state.storedMarks ||\n        (state.selection.$to.parentOffset && state.selection.$from.marks());\n      if (marks) tr.ensureMarks(marks);\n      dispatch(tr);\n    }),\n  ]);\n};\n\n/// Move the selection to the node wrapping the current selection, if\n/// any. (Will not select the document node.)\nconst selectParentNode = (): Command => (state, dispatch) => {\n  let { $from, to } = state.selection, pos;\n  let same = $from.sharedDepth(to);\n  if (same == 0) return false;\n  pos = $from.before(same);\n  if (dispatch) {\n    dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n  }\n  return true;\n};\n\n/// Select the whole document.\nconst selectAll = (): Command => (state, dispatch) => {\n  if (dispatch) dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n  return true;\n};\n\nfunction joinMaybeClear(\n  state: EditorState,\n  $pos: ResolvedPos,\n  dispatch: ((tr: Transaction) => void) | undefined,\n) {\n  let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n  if (!before || !after || !before.type.compatibleContent(after.type)) {\n    return false;\n  }\n  if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n    if (dispatch) {\n      dispatch(\n        state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView(),\n      );\n    }\n    return true;\n  }\n  if (\n    !$pos.parent.canReplace(index, index + 1) ||\n    !(after.isTextblock || canJoin(state.doc, $pos.pos))\n  ) {\n    return false;\n  }\n  if (dispatch) {\n    dispatch(state.tr.join($pos.pos).scrollIntoView());\n  }\n  return true;\n}\n\nfunction deleteBarrier(\n  state: EditorState,\n  $cut: ResolvedPos,\n  dispatch: ((tr: Transaction) => void) | undefined,\n  dir: number,\n) {\n  let before = $cut.nodeBefore!, after = $cut.nodeAfter!, conn, match;\n  let isolated = before.type.spec.isolating || after.type.spec.isolating;\n  if (!isolated && joinMaybeClear(state, $cut, dispatch)) return true;\n\n  let canDelAfter = !isolated &&\n    $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n  if (\n    canDelAfter &&\n    (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(\n      after.type,\n    )) &&\n    match.matchType(conn[0] || after.type)!.validEnd\n  ) {\n    if (dispatch) {\n      let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n      for (let i = conn.length - 1; i >= 0; i--) {\n        wrap = Fragment.from(conn[i].create(null, wrap));\n      }\n      wrap = Fragment.from(before.copy(wrap));\n      let tr = state.tr.step(\n        new ReplaceAroundStep(\n          $cut.pos - 1,\n          end,\n          $cut.pos,\n          end,\n          new Slice(wrap, 1, 0),\n          conn.length,\n          true,\n        ),\n      );\n      let $joinAt = tr.doc.resolve(end + 2 * conn.length);\n      if (\n        $joinAt.nodeAfter && $joinAt.nodeAfter.type == before.type &&\n        canJoin(tr.doc, $joinAt.pos)\n      ) tr.join($joinAt.pos);\n      dispatch(tr.scrollIntoView());\n    }\n    return true;\n  }\n\n  let selAfter = after.type.spec.isolating || (dir > 0 && isolated)\n    ? null\n    : Selection.findFrom($cut, 1);\n  let range = selAfter && selAfter.$from.blockRange(selAfter.$to),\n    target = range && liftTarget(range);\n  if (target != null && target >= $cut.depth) {\n    if (dispatch) dispatch(state.tr.lift(range!, target).scrollIntoView());\n    return true;\n  }\n\n  if (\n    canDelAfter && textblockAt(after, 'start', true) &&\n    textblockAt(before, 'end')\n  ) {\n    let at = before, wrap = [];\n    for (;;) {\n      wrap.push(at);\n      if (at.isTextblock) break;\n      at = at.lastChild!;\n    }\n    let afterText = after, afterDepth = 1;\n    for (; !afterText.isTextblock; afterText = afterText.firstChild!) {\n      afterDepth++;\n    }\n    if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n      if (dispatch) {\n        let end = Fragment.empty;\n        for (let i = wrap.length - 1; i >= 0; i--) {\n          end = Fragment.from(wrap[i].copy(end));\n        }\n        let tr = state.tr.step(\n          new ReplaceAroundStep(\n            $cut.pos - wrap.length,\n            $cut.pos + after.nodeSize,\n            $cut.pos + afterDepth,\n            $cut.pos + after.nodeSize - afterDepth,\n            new Slice(end, wrap.length, 0),\n            0,\n            true,\n          ),\n        );\n        dispatch(tr.scrollIntoView());\n      }\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction selectTextblockSide(side: number): Command {\n  return function (state, dispatch) {\n    let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n    let depth = $pos.depth;\n    while ($pos.node(depth).isInline) {\n      if (!depth) return false;\n      depth--;\n    }\n    if (!$pos.node(depth).isTextblock) return false;\n    if (dispatch) {\n      dispatch(state.tr.setSelection(TextSelection.create(\n        state.doc,\n        side < 0 ? $pos.start(depth) : $pos.end(depth),\n      )));\n    }\n    return true;\n  };\n}\n\n// Parameterized commands\n\n/// Wrap the selection in a node of the given type with the given\n/// attributes.\nconst wrapIn = (\n  nodeType: NodeType,\n  attrs: Attrs | null = null,\n): Command => {\n  return function (state, dispatch) {\n    let { $from, $to } = state.selection;\n    let range = $from.blockRange($to),\n      wrapping = range && findWrapping(range, nodeType, attrs);\n    if (!wrapping) return false;\n    if (dispatch) dispatch(state.tr.wrap(range!, wrapping).scrollIntoView());\n    return true;\n  };\n};\n\n/// Returns a command that tries to set the selected textblocks to the\n/// given node type with the given attributes.\nconst setBlockType = (\n  nodeType: NodeType,\n  attrs: Attrs | null = null,\n): Command => {\n  return function (state, dispatch) {\n    let applicable = false;\n    for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n      let { $from: { pos: from }, $to: { pos: to } } =\n        state.selection.ranges[i];\n      state.doc.nodesBetween(from, to, (node, pos) => {\n        if (applicable) return false;\n        if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return;\n        if (node.type == nodeType) {\n          applicable = true;\n        } else {\n          let $pos = state.doc.resolve(pos), index = $pos.index();\n          applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n        }\n      });\n    }\n    if (!applicable) return false;\n    if (dispatch) {\n      let tr = state.tr;\n      for (let i = 0; i < state.selection.ranges.length; i++) {\n        let { $from: { pos: from }, $to: { pos: to } } =\n          state.selection.ranges[i];\n        tr.setBlockType(from, to, nodeType, attrs);\n      }\n      dispatch(tr.scrollIntoView());\n    }\n    return true;\n  };\n};\n\nfunction markApplies(\n  doc: Node,\n  ranges: readonly SelectionRange[],\n  type: MarkType,\n  enterAtoms: boolean,\n) {\n  for (let i = 0; i < ranges.length; i++) {\n    let { $from, $to } = ranges[i];\n    let can = $from.depth == 0\n      ? doc.inlineContent && doc.type.allowsMarkType(type)\n      : false;\n    doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n      if (\n        can ||\n        !enterAtoms && node.isAtom && node.isInline && pos >= $from.pos &&\n          pos + node.nodeSize <= $to.pos\n      ) {\n        return false;\n      }\n      can = node.inlineContent && node.type.allowsMarkType(type);\n    });\n    if (can) return true;\n  }\n  return false;\n}\n\nfunction removeInlineAtoms(\n  ranges: readonly SelectionRange[],\n): readonly SelectionRange[] {\n  let result = [];\n  for (let i = 0; i < ranges.length; i++) {\n    let { $from, $to } = ranges[i];\n    $from.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n      if (\n        node.isAtom && node.content.size && node.isInline && pos >= $from.pos &&\n        pos + node.nodeSize <= $to.pos\n      ) {\n        if (pos + 1 > $from.pos) {\n          result.push(new SelectionRange($from, $from.doc.resolve(pos + 1)));\n        }\n        $from = $from.doc.resolve(pos + 1 + node.content.size);\n        return false;\n      }\n    });\n    if ($from.pos < $to.pos) result.push(new SelectionRange($from, $to));\n  }\n  return result;\n}\n\n/// Create a command function that toggles the given mark with the\n/// given attributes. Will return `false` when the current selection\n/// doesn't support that mark. This will remove the mark if any marks\n/// of that type exist in the selection, or add it otherwise. If the\n/// selection is empty, this applies to the [stored\n/// marks](#state.EditorState.storedMarks) instead of a range of the\n/// document.\nfunction toggleMark(\n  markType: MarkType,\n  attrs: Attrs | null = null,\n  options?: {\n    /// Controls whether, when part of the selected range has the mark\n    /// already and part doesn't, the mark is removed (`true`, the\n    /// default) or added (`false`).\n    removeWhenPresent?: boolean;\n    /// When set to false, this will prevent the command from acting on\n    /// the content of inline nodes marked as\n    /// [atoms](#model.NodeSpec.atom) that are completely covered by a\n    /// selection range.\n    enterInlineAtoms?: boolean;\n    /// By default, this command doesn't apply to leading and trailing\n    /// whitespace in the selection. Set this to `true` to change that.\n    includeWhitespace?: boolean;\n  },\n): Command {\n  let removeWhenPresent = (options && options.removeWhenPresent) !== false;\n  let enterAtoms = (options && options.enterInlineAtoms) !== false;\n  let dropSpace = !(options && options.includeWhitespace);\n  return function (state, dispatch) {\n    let { empty, $cursor, ranges } = state.selection as TextSelection;\n    if (\n      (empty && !$cursor) ||\n      !markApplies(state.doc, ranges, markType, enterAtoms)\n    ) return false;\n    if (dispatch) {\n      if ($cursor) {\n        if (markType.isInSet(state.storedMarks || $cursor.marks())) {\n          dispatch(state.tr.removeStoredMark(markType));\n        } else {\n          dispatch(state.tr.addStoredMark(markType.create(attrs)));\n        }\n      } else {\n        let add, tr = state.tr;\n        if (!enterAtoms) ranges = removeInlineAtoms(ranges);\n        if (removeWhenPresent) {\n          add = !ranges.some((r) =>\n            state.doc.rangeHasMark(r.$from.pos, r.$to.pos, markType)\n          );\n        } else {\n          add = !ranges.every((r) => {\n            let missing = false;\n            tr.doc.nodesBetween(r.$from.pos, r.$to.pos, (node, pos, parent) => {\n              if (missing) return false;\n              missing = !markType.isInSet(node.marks) && !!parent &&\n                parent.type.allowsMarkType(markType) &&\n                !(node.isText &&\n                  /^\\s*$/.test(\n                    node.textBetween(\n                      Math.max(0, r.$from.pos - pos),\n                      Math.min(node.nodeSize, r.$to.pos - pos),\n                    ),\n                  ));\n            });\n            return !missing;\n          });\n        }\n        for (let i = 0; i < ranges.length; i++) {\n          let { $from, $to } = ranges[i];\n          if (!add) {\n            tr.removeMark($from.pos, $to.pos, markType);\n          } else {\n            let from = $from.pos,\n              to = $to.pos,\n              start = $from.nodeAfter,\n              end = $to.nodeBefore;\n            let spaceStart = dropSpace && start && start.isText\n              ? /^\\s*/.exec(start.text!)![0].length\n              : 0;\n            let spaceEnd = dropSpace && end && end.isText\n              ? /\\s*$/.exec(end.text!)![0].length\n              : 0;\n            if (from + spaceStart < to) {\n              from += spaceStart;\n              to -= spaceEnd;\n            }\n            tr.addMark(from, to, markType.create(attrs));\n          }\n        }\n        dispatch(tr.scrollIntoView());\n      }\n    }\n    return true;\n  };\n}\n\nconst isList = (node: Node) =>\n  node.type.name === 'bullet_list' ||\n  node.type.name === 'ordered_list' ||\n  node.type.name === 'task_list';\n\nexport const keepRange =\n  (from: number, to: number): Command => (state, dispatch?) => {\n    const $from = state.doc.resolve(from);\n    const $to = state.doc.resolve(to);\n\n    for (let d = $from.depth; d > 0; d--) {\n      if (isList($from.node(d))) {\n        from = $from.before(d);\n        break;\n      }\n    }\n\n    for (let d = $to.depth; d > 0; d--) {\n      if (isList($to.node(d))) {\n        to = $to.after(d);\n        break;\n      }\n    }\n\n    if (!dispatch) return true;\n\n    const slice = state.doc.slice(from, to);\n\n    let tr = state.tr.replace(0, state.doc.content.size, slice);\n    tr = tr.setSelection(TextSelection.atStart(tr.doc));\n\n    if (!dispatch) return true;\n\n    dispatch(tr);\n    return true;\n  };\n\nconst keepSelection: CommandFactory = () => (state, dispatch?) => {\n  if (!dispatch) return true;\n\n  const slice = state.selection.content();\n\n  const tr = state.tr.replace(\n    0,\n    state.doc.content.size,\n    slice,\n  );\n\n  tr.setSelection(TextSelection.atStart(tr.doc));\n\n  if (!dispatch) return true;\n\n  dispatch(tr);\n  return true;\n};\n\nconst undoInputRule: CommandFactory = () => undoInputRuleCommand;\n\nexport const command: CommandFactory = (fn: Command) => (...props) => {\n  return fn.apply(this, props);\n};\n\nexport const baseCommandFactories: Record<string, CommandFactory> = {\n  keepRange,\n  keepSelection,\n  wrapInList,\n  wrapRangeInList,\n  deleteSelection,\n  joinBackward,\n  joinTextblockBackward,\n  joinTextblockForward,\n  joinForward,\n  joinUp,\n  joinDown,\n  lift,\n  liftListItemParagraph,\n  newlineInCode,\n  exitCode,\n  createParagraphNear,\n  liftEmptyBlock,\n  splitBlockAs,\n  splitBlock,\n  splitBlockKeepMarks,\n  selectAll,\n  selectParentNode,\n  selectNodeBackward,\n  selectNodeForward,\n  selectTextblockStart: () => selectTextblockSide(-1),\n  selectTextblockEnd: () => selectTextblockSide(1),\n  wrapIn,\n  setBlockType,\n  toggleMark,\n  undoInputRule,\n  runInputRulesRange,\n  runInputRulesTexts,\n  command,\n};\n","import { CommandFactory, firstCommand } from '@kerebron/editor/commands';\nimport { baseCommandFactories } from './baseCommandFactories.ts';\n\nconst backspace = firstCommand(\n  baseCommandFactories.undoInputRule(),\n  baseCommandFactories.deleteSelection(),\n  baseCommandFactories.liftListItemParagraph(),\n  baseCommandFactories.joinBackward(),\n  baseCommandFactories.selectNodeBackward(),\n);\nconst del = firstCommand(\n  baseCommandFactories.deleteSelection(),\n  baseCommandFactories.joinForward(),\n  baseCommandFactories.selectNodeForward(),\n);\nconst enter = firstCommand(\n  baseCommandFactories.newlineInCode(),\n  baseCommandFactories.createParagraphNear(),\n  baseCommandFactories.liftEmptyBlock(),\n  baseCommandFactories.splitBlock(),\n);\n\nexport const keyCommandFactories: Record<string, CommandFactory> = {\n  backspace: () => backspace,\n  del: () => del,\n  enter: () => enter,\n};\n","import { Fragment, Node, Slice } from 'prosemirror-model';\n\nimport type { Command, CommandFactory } from '@kerebron/editor/commands';\nimport type { TextRange } from '@kerebron/editor';\nimport { EditorState } from 'prosemirror-state';\n\nconst replaceRangeText = (range: TextRange, text: string): Command => {\n  return (state, dispatch) => {\n    const tr = state.tr;\n\n    const from = tr.mapping.map(range.from);\n    const to = tr.mapping.map(range.to);\n\n    if (text.length > 0) {\n      const frag = Fragment.from(state.schema.text(text));\n      const insert = new Slice(frag, 0, 0);\n\n      tr.replace(from, to, insert);\n    } else {\n      const frag = Fragment.from(state.schema.topNodeType.createAndFill());\n\n      const insert = new Slice(frag, 0, 0);\n      tr.replace(from, to, insert);\n    }\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nconst replaceRangeSlice = (range: TextRange, insert: Slice): Command => {\n  return (state, dispatch) => {\n    const tr = state.tr;\n\n    const from = tr.mapping.map(range.from);\n    const to = tr.mapping.map(range.to);\n\n    tr.replace(from, to, insert);\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nfunction getTopMostBlockStartForOffset(state: EditorState, offset: number) {\n  const { doc } = state;\n  const $pos = doc.resolve(offset);\n\n  const blockPos = $pos.before($pos.depth);\n\n  if ($pos.depth === 1) return blockPos;\n  return $pos.start(1);\n}\n\nfunction getTopMostBlockEndForOffset(state: EditorState, offset: number) {\n  const { doc } = state;\n\n  const $pos = doc.resolve(offset);\n  return $pos.end(1);\n}\n\nfunction getAdjacentTopBlock(state: EditorState, offset: number) {\n  const { doc } = state;\n\n  if (offset < 0 || offset > doc.content.size) {\n    throw new RangeError('Offset is outside the document');\n  }\n\n  const $pos = doc.resolve(offset);\n  const atBlockStart = $pos.pos === $pos.start($pos.depth);\n\n  if (atBlockStart) {\n    return getTopMostBlockStartForOffset(state, offset);\n  } else {\n    return getTopMostBlockEndForOffset(state, offset);\n  }\n}\n\nconst insertBlockBefore = (pos: number, insert: Node): Command => {\n  return (state, dispatch) => {\n    const tr = state.tr;\n\n    const blockPos = getTopMostBlockStartForOffset(state, tr.mapping.map(pos));\n    tr.insert(blockPos, insert);\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nconst insertBlockAfter = (pos: number, insert: Node): Command => {\n  return (state, dispatch) => {\n    const tr = state.tr;\n\n    const blockPos = getTopMostBlockEndForOffset(state, tr.mapping.map(pos));\n    tr.insert(blockPos, insert);\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nconst insertBlockSmart = (pos: number, insert: Node): Command => {\n  return (state, dispatch) => {\n    const tr = state.tr;\n\n    const blockPos = getAdjacentTopBlock(state, tr.mapping.map(pos));\n    tr.insert(blockPos, insert);\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nexport const replaceCommandFactories: Record<string, CommandFactory> = {\n  replaceRangeText,\n  replaceRangeSlice,\n  insertBlockBefore,\n  insertBlockAfter,\n  insertBlockSmart,\n};\n","import { EditorView } from 'prosemirror-view';\nimport type { Transaction } from 'prosemirror-state';\n\nimport type { CoreEditor } from '../CoreEditor.ts';\nimport { createChainableState } from './createChainableState.ts';\nimport type {\n  ChainedCommands,\n  Command,\n  CommandFactories,\n  CommandFactory,\n} from './types.ts';\n\nimport { baseCommandFactories } from './baseCommandFactories.ts';\nimport { keyCommandFactories } from './keyCommandFactories.ts';\nimport { replaceCommandFactories } from './replaceCommandFactories.ts';\nimport { searchCommandFactories } from '../search/search.ts';\n\ntype CommandRunner = (...args: any[]) => boolean;\n\nexport class CommandManager {\n  public readonly commandFactories: { [key: string]: CommandFactory } = {};\n  public readonly run: { [key: string]: CommandRunner } = {};\n\n  private debug = true;\n\n  constructor(\n    private editor: CoreEditor,\n  ) {\n    this.mergeCommandFactories(baseCommandFactories, 'baseCommand');\n    this.mergeCommandFactories(keyCommandFactories, 'key');\n    this.mergeCommandFactories(replaceCommandFactories, 'replace');\n    this.mergeCommandFactories(searchCommandFactories, 'search');\n  }\n\n  public mergeCommandFactories(\n    toInsert: Partial<CommandFactories>,\n    extName: string,\n  ) {\n    for (const key in toInsert) {\n      const commandFactory = toInsert[key];\n      if (!commandFactory) {\n        continue;\n      }\n      this.overwriteCommandFactory(extName, key, commandFactory);\n    }\n  }\n\n  private overwriteCommandFactory(\n    extName: string,\n    name: string,\n    commandFactory: CommandFactory,\n  ) {\n    if (this.debug) {\n      const wrappedFactory = (...args: unknown[]) => {\n        const realCommand = commandFactory(...args);\n\n        const command: Command = (state, dispatch, view) => {\n          if (dispatch) {\n            console.debug(`Command: ${extName}.${name}`, ...args);\n          }\n          return realCommand.apply({ editor: this.editor }, [\n            state,\n            dispatch,\n            view,\n          ]);\n        };\n\n        return command;\n      };\n\n      this.commandFactories[name] = wrappedFactory;\n    } else {\n      this.commandFactories[name] = commandFactory;\n    }\n\n    this.run[name] = (...args) => {\n      const factory = this.commandFactories[name];\n      const command: Command = factory(...args);\n      const state = this.editor.state;\n      const view = this.editor.view;\n      if (view instanceof EditorView) {\n        return command.apply({ editor: this.editor }, [\n          state,\n          view.dispatch,\n          view,\n        ]);\n      } else {\n        return command.apply({ editor: this.editor }, [state, view.dispatch]);\n      }\n    };\n  }\n\n  get chain(): () => ChainedCommands {\n    return () => this.createChain();\n  }\n\n  get can(): () => ChainedCommands {\n    return () => this.createCan();\n  }\n\n  public createChain(\n    startTr?: Transaction,\n    shouldDispatch = true,\n  ): ChainedCommands {\n    const { commandFactories, editor } = this;\n    const state = this.editor.state;\n    const { view } = editor;\n    const callbacks: boolean[] = [];\n    const hasStartTransaction = !!startTr;\n    const tr = startTr || state.tr;\n\n    tr.setMeta('isCommand', true);\n\n    const chainedState = createChainableState(tr, state);\n    const fakeDispatch = () => undefined;\n\n    const chain = {\n      ...Object.fromEntries(\n        Object.entries(commandFactories).map(([name, commandFactory]) => {\n          const chainedCommand = (...args: never[]) => {\n            const command = commandFactory(...args);\n            const callback = command.apply({ editor: this.editor }, [\n              chainedState,\n              shouldDispatch ? fakeDispatch : undefined,\n            ]);\n            callbacks.push(callback);\n            return chain;\n          };\n          return [name, chainedCommand];\n        }),\n      ),\n      run: () => {\n        if (\n          !hasStartTransaction &&\n          shouldDispatch &&\n          !tr.getMeta('preventDispatch')\n        ) {\n          view.dispatch(tr);\n        }\n\n        return callbacks.every((callback) => callback === true);\n      },\n      chain: () => {\n        return this.createChain(tr, shouldDispatch);\n      },\n    } as unknown as ChainedCommands;\n\n    return chain;\n  }\n\n  public createCan(startTr?: Transaction): ChainedCommands {\n    return this.createChain(startTr, false);\n  }\n}\n","export interface OutputMeta<K> {\n  pos: number;\n  rowPos: number;\n  colPos: number;\n  item?: K;\n}\n\ninterface Mapping {\n  sourceNo: number;\n  sourceRowPos: number;\n  sourceColPos: number;\n}\n\nexport interface SourceMap {\n  'version': 3; //  3,\n  'file': string; // \"out.js\",\n  'sourceRoot': string; // \"\"\n  'sources': Array<string>; // [\"foo.js\", \"bar.js\"],\n  'sourcesContent': Array<string>; // [null, null],\n  'names': Array<string>; // [\"src\", \"maps\", \"are\", \"fun\"],\n  'mappings': string; // \"A,AAAB;;ABCDE;\"\n}\n\nexport class SmartOutput<K> {\n  private _rowPos = 0;\n  private _colPos = 0;\n  private _pos = 0;\n\n  private chunks: Array<string> = [];\n  private metas: Array<OutputMeta<K>> = [];\n\n  log(text: string, item?: K) {\n    if (text.length === 0) {\n      return;\n    }\n\n    this.chunks.push(text);\n\n    this.metas.push({\n      pos: this._pos,\n      colPos: this._colPos,\n      rowPos: this._rowPos,\n      item,\n    });\n\n    const lines = text.split('\\n');\n\n    if (lines.length === 1) {\n      this._colPos += lines[lines.length - 1].length;\n    } else {\n      this._rowPos += lines.length - 1;\n      this._colPos = lines[lines.length - 1].length;\n    }\n    this._pos += text.length;\n  }\n\n  getMetas() {\n    return this.metas;\n  }\n\n  get chunkPos() {\n    return this.chunks.length;\n  }\n\n  rollback(pos: number) {\n    this.chunks.splice(pos);\n    this.metas.splice(pos);\n  }\n\n  get rowPos() {\n    return this._rowPos;\n  }\n\n  get colPos() {\n    return this._colPos;\n  }\n\n  get pos() {\n    return this._pos;\n  }\n\n  backspace(count: number) {\n    const metasToRestore: Array<OutputMeta<K>> = [];\n    const chunksToRestore: Array<string> = [];\n    while (count > 0 && this.chunks[0].length > 0) {\n      const lastMeta = this.metas.pop();\n      let lastChunk = this.chunks.pop();\n      if (!lastChunk || !lastMeta) {\n        break;\n      }\n      const origLen = lastChunk.length;\n      lastChunk = lastChunk.substring(0, Math.max(0, lastChunk.length - count));\n      metasToRestore.unshift(lastMeta);\n      chunksToRestore.unshift(lastChunk);\n      count -= origLen - lastChunk.length;\n    }\n    this.chunks.push(...chunksToRestore);\n    this.metas.push(...metasToRestore);\n  }\n\n  endsWith(text: string) {\n    return this.chunks.join('').endsWith(text);\n  }\n\n  toString() {\n    return this.chunks.join('');\n  }\n\n  getSourceMap(\n    mapper: (\n      rowPos: number,\n      colPos: number,\n      pos: number,\n      item?: K,\n    ) => Mapping | void,\n  ): SourceMap {\n    const mappingRows: Array<Array<Array<number>>> = [];\n\n    let lastRow = -1;\n    let lastCol = -1;\n\n    let prevSourceNo = 0;\n    let prevSourceRowPos = 0;\n    let prevSourceColPos = 0;\n\n    let prevColPos = 0;\n    for (const meta of this.metas) {\n      while (meta.rowPos >= mappingRows.length) {\n        mappingRows.push([]);\n      }\n\n      if (lastRow != meta.rowPos || lastCol != meta.colPos) {\n        const currentRow = mappingRows[meta.rowPos];\n\n        if (lastRow != meta.rowPos) {\n          prevColPos = 0;\n        }\n        const mapping = mapper(meta.rowPos, meta.colPos, meta.pos, meta.item);\n        if (mapping) {\n          currentRow.push([\n            meta.colPos - prevColPos,\n            mapping.sourceNo - prevSourceNo,\n            mapping.sourceRowPos - prevSourceRowPos,\n            mapping.sourceColPos - prevSourceColPos,\n          ]);\n          prevColPos = meta.colPos;\n          prevSourceNo = mapping.sourceNo;\n          prevSourceRowPos = mapping.sourceRowPos;\n          prevSourceColPos = mapping.sourceColPos;\n        }\n      }\n\n      lastRow = meta.rowPos;\n      lastCol = meta.colPos;\n    }\n\n    const mappings = mappingRows\n      .map((row) =>\n        row.map(\n          (group) => encode(group),\n        )\n          .join(',')\n      )\n      .join(';');\n\n    return {\n      version: 3,\n      file: '',\n      sourceRoot: '',\n      sources: [],\n      sourcesContent: [],\n      names: [],\n      mappings,\n    };\n  }\n}\n\nconst BASE64_CHARS =\n  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nfunction toVLQ(value: number): number[] {\n  const vlq: number[] = [];\n  const isNegative = value < 0;\n  value = Math.abs(value);\n\n  if (value === 0) {\n    vlq.push(0);\n    return vlq;\n  }\n\n  while (value > 0) {\n    let digit = value & 0x1F;\n    value >>= 5;\n    if (value > 0) {\n      digit |= 0x20;\n    }\n    vlq.push(digit);\n    if (vlq.length === 1) {\n      digit = isNegative ? (digit | 0x1) : (digit & ~0x1);\n      vlq[0] = digit;\n    }\n  }\n\n  return vlq;\n}\n\nfunction encodeVLQ(input: number | number[]): string {\n  const numbers = Array.isArray(input) ? input : [input];\n  let result = '';\n\n  for (const num of numbers) {\n    const vlq = toVLQ(num);\n    for (const digit of vlq) {\n      result += BASE64_CHARS[digit];\n    }\n  }\n\n  return result;\n}\n\nconst char_to_integer: Record<string, number> = {};\nconst integer_to_char: Record<number, string> = {};\n\n'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n  .split('')\n  .forEach(function (char, i) {\n    char_to_integer[char] = i;\n    integer_to_char[i] = char;\n  });\n\nexport function decode(string: string) {\n  let result: number[] = [];\n\n  let shift = 0;\n  let value = 0;\n\n  for (let i = 0; i < string.length; i += 1) {\n    let integer = char_to_integer[string[i]];\n\n    if (integer === undefined) {\n      throw new Error('Invalid character (' + string[i] + ')');\n    }\n\n    const has_continuation_bit = integer & 32;\n\n    integer &= 31;\n    value += integer << shift;\n\n    if (has_continuation_bit) {\n      shift += 5;\n    } else {\n      const should_negate = value & 1;\n      value >>>= 1;\n\n      if (should_negate) {\n        result.push(value === 0 ? -0x80000000 : -value);\n      } else {\n        result.push(value);\n      }\n\n      // reset\n      value = shift = 0;\n    }\n  }\n\n  return result;\n}\n\nexport function encode(value: number | number[]) {\n  if (typeof value === 'number') {\n    return encode_integer(value);\n  }\n\n  let result = '';\n  for (let i = 0; i < value.length; i += 1) {\n    result += encode_integer(value[i]);\n  }\n\n  return result;\n}\n\nfunction encode_integer(num: number) {\n  let result = '';\n\n  if (num < 0) {\n    num = (-num << 1) | 1;\n  } else {\n    num <<= 1;\n  }\n\n  do {\n    let clamped = num & 31;\n    num >>>= 5;\n\n    if (num > 0) {\n      clamped |= 32;\n    }\n\n    result += integer_to_char[clamped];\n  } while (num > 0);\n\n  return result;\n}\n","import type { Node } from 'prosemirror-model';\nimport { SmartOutput } from './utilities/SmartOutput.ts';\n\nfunction trimText(str: string, maxLen = 20): string {\n  str = str.replaceAll('\\n', '\\\\n');\n\n  if (str.length <= maxLen) {\n    return str;\n  }\n\n  return str.slice(0, maxLen) + '...';\n}\n\nexport interface NodeAndPos {\n  node: Node;\n  pos: number;\n}\n\nexport function nodeToTreeStringOutput(\n  output: SmartOutput<NodeAndPos>,\n  node: Node | Node[] | readonly Node[],\n  level = 0,\n  currentPos = 0,\n) {\n  let delim = '';\n  for (let i = 0; i < level; i++) {\n    delim += '  ';\n  }\n\n  if (Array.isArray(node)) {\n    for (const child of node) {\n      output.log(delim, { node: child, pos: currentPos });\n      nodeToTreeStringOutput(output, child, level + 1, currentPos);\n      // .replace(/\\s+$/gm, '') +\n      // '\\n'\n    }\n    return;\n  }\n\n  // https://prosemirror.net/docs/guide/#doc.indexing\n\n  let line = '';\n  // if (node.type) {\n  if ('type' in node) {\n    line += ` - [${node.type.name}] `;\n    // } else {\n    //   line += ` - `;\n    // }\n    line += `pos: ${currentPos}, `;\n    line += `nodeSize: ${node.nodeSize}, `; // isLeaf ? 1 : 2 + this.content.size\n    line += `epos: ${currentPos + node.nodeSize}, `; // isLeaf ? 1 : 2 + this.content.size\n    if (node.content) {\n      line += `fragment.size: ${node.content.size}, `;\n    }\n\n    output.log((delim + line) + '\\n', { node, pos: currentPos });\n\n    let marksLine = '';\n    if (node.marks) {\n      for (const mark of node.marks) {\n        marksLine += `(${mark.type.name}), `;\n      }\n    }\n\n    if (marksLine) {\n      output.log((delim + '    ' + marksLine) + '\\n', {\n        node,\n        pos: currentPos,\n      });\n    }\n\n    if (node.text) {\n      output.log((delim + '    \"' + trimText(node.text) + '\"') + '\\n', {\n        node,\n        pos: currentPos,\n      });\n    }\n  }\n\n  node.forEach((child, offset) => {\n    // output +=\n    nodeToTreeStringOutput(output, child, level + 1, currentPos + offset + 1);\n    //   .replace(\n    //   /\\s+$/gm,\n    //   '',\n    // ) + '\\n'; // + (node.isLeaf ? 1 : 2)\n  });\n\n  return output;\n}\n\nexport function nodeToTreeString(node: Node | Node[] | readonly Node[]) {\n  const output = new SmartOutput<NodeAndPos>();\n  nodeToTreeStringOutput(output, node);\n  return output.toString();\n}\n\nexport function debugNode(node: Node | Node[]) {\n  console.debug(nodeToTreeString(node));\n}\n","// Headless View to be used on Server-side\n// TODO: remove all unnecessary props and methods\n\nimport {\n  EditorState,\n  Plugin,\n  PluginView,\n  Transaction,\n} from 'prosemirror-state';\nimport { Mark, Node } from 'prosemirror-model';\n\nimport { EditorView, MarkView, NodeView } from 'prosemirror-view';\n\nimport { Decoration, DecorationSource } from 'prosemirror-view';\n\n/// An editor view manages the DOM structure that represents an\n/// editable document. Its state and behavior are determined by its\n/// [props](#view.DirectEditorProps).\nexport class DummyEditorView {\n  /// @internal\n  private _props: DirectEditorProps;\n  private directPlugins: readonly Plugin[];\n  /// @internal\n  private nodeViews: NodeViewSet;\n  private prevDirectPlugins: readonly Plugin[] = [];\n  private pluginViews: PluginView[] = [];\n\n  /// The view's current [state](#state.EditorState).\n  public state: EditorState;\n  focused: boolean = false;\n\n  /// Create a view. `place` may be a DOM node that the editor should\n  /// be appended to, a function that will place it into the document,\n  /// or an object whose `mount` property holds the node to use as the\n  /// document container. If it is `null`, the editor will not be\n  /// added to the document.\n  constructor(props: DirectEditorProps) {\n    this._props = props;\n    this.state = props.state;\n    this.directPlugins = props.plugins || [];\n    this.directPlugins.forEach(checkStateComponent);\n\n    this.dispatch = this.dispatch.bind(this);\n\n    this.editable = getEditable(this);\n    this.nodeViews = buildNodeViews(this);\n    // TODO initInput(this)\n    this.updatePluginViews();\n  }\n\n  /// Indicates whether the editor is currently [editable](#view.EditorProps.editable).\n  editable: boolean;\n\n  /// Holds `true` when a\n  /// [composition](https://w3c.github.io/uievents/#events-compositionevents)\n  /// is active.\n  get composing() {\n    return false;\n  }\n\n  get dom() {\n    return {\n      addEventListener() {},\n      removeEventListener() {},\n    };\n  }\n\n  /// The view's current [props](#view.EditorProps).\n  get props() {\n    if (this._props.state != this.state) {\n      let prev = this._props;\n      this._props = {} as any;\n      for (let name in prev) (this._props as any)[name] = (prev as any)[name];\n      this._props.state = this.state;\n    }\n    return this._props;\n  }\n\n  /// Update the view's props. Will immediately cause an update to\n  /// the DOM.\n  update(props: DirectEditorProps) {\n    let prevProps = this._props;\n    this._props = props;\n    if (props.plugins) {\n      props.plugins.forEach(checkStateComponent);\n      this.directPlugins = props.plugins;\n    }\n    this.updateStateInner(props.state, prevProps);\n  }\n\n  /// Update the view by updating existing props object with the object\n  /// given as argument. Equivalent to `view.update(Object.assign({},\n  /// view.props, props))`.\n  setProps(props: Partial<DirectEditorProps>) {\n    let updated = {} as DirectEditorProps;\n    for (let name in this._props) {\n      (updated as any)[name] = (this._props as any)[name];\n    }\n    updated.state = this.state;\n    for (let name in props) (updated as any)[name] = (props as any)[name];\n    this.update(updated);\n  }\n\n  /// Update the editor's `state` prop, without touching any of the\n  /// other props.\n  updateState(state: EditorState) {\n    this.updateStateInner(state, this._props);\n  }\n\n  private updateStateInner(state: EditorState, prevProps: DirectEditorProps) {\n    let prev = this.state, redraw = false, updateSel = false;\n    // When stored marks are added, stop composition, so that they can\n    // be displayed.\n    if (state.storedMarks && this.composing) {\n      // TODO clearComposition(this)\n      updateSel = true;\n    }\n    this.state = state;\n    let pluginsChanged = prev.plugins != state.plugins ||\n      this._props.plugins != prevProps.plugins;\n    if (\n      pluginsChanged || this._props.plugins != prevProps.plugins ||\n      this._props.nodeViews != prevProps.nodeViews\n    ) {\n      let nodeViews = buildNodeViews(this);\n      if (changedNodeViews(nodeViews, this.nodeViews)) {\n        this.nodeViews = nodeViews;\n        redraw = true;\n      }\n    }\n\n    this.editable = getEditable(this);\n\n    let updateDoc = redraw;\n    if (updateDoc || !state.selection.eq(prev.selection)) updateSel = true;\n\n    if (updateSel) {\n      // Work around an issue in Chrome, IE, and Edge where changing\n      // the DOM around an active selection puts it into a broken\n      // state where the thing the user sees differs from the\n      // selection reported by the Selection object (#710, #973,\n      // #1011, #1013, #1035).\n      let forceSelUpdate = false;\n      if (updateDoc) {\n        // If the node that the selection points into is written to,\n        // Chrome sometimes starts misreporting the selection, so this\n        // tracks that and forces a selection reset when our update\n        // did write to the node.\n        // TODO if (this.composing) this.input.compositionNode = findCompositionNode(this)\n      }\n    }\n\n    this.updatePluginViews(prev);\n  }\n\n  /// @internal\n  scrollToSelection() {\n  }\n\n  private destroyPluginViews() {\n    let view = this.pluginViews.pop();\n    while (view) {\n      if (view.destroy) view.destroy();\n      view = this.pluginViews.pop();\n    }\n  }\n\n  private updatePluginViews(prevState?: EditorState) {\n    if (\n      !prevState || prevState.plugins != this.state.plugins ||\n      this.directPlugins != this.prevDirectPlugins\n    ) {\n      this.prevDirectPlugins = this.directPlugins;\n      this.destroyPluginViews();\n      for (let i = 0; i < this.directPlugins.length; i++) {\n        let plugin = this.directPlugins[i];\n        if (plugin.spec.view) {\n          this.pluginViews.push(plugin.spec.view(<any> this));\n        }\n      }\n      for (let i = 0; i < this.state.plugins.length; i++) {\n        let plugin = this.state.plugins[i];\n        if (plugin.spec.view) {\n          this.pluginViews.push(plugin.spec.view(<any> this));\n        }\n      }\n    } else {\n      for (let i = 0; i < this.pluginViews.length; i++) {\n        let pluginView = this.pluginViews[i];\n        if (pluginView.update) pluginView.update(<any> this, prevState);\n      }\n    }\n  }\n\n  /// Goes over the values of a prop, first those provided directly,\n  /// then those from plugins given to the view, then from plugins in\n  /// the state (in order), and calls `f` every time a non-undefined\n  /// value is found. When `f` returns a truthy value, that is\n  /// immediately returned. When `f` isn't provided, it is treated as\n  /// the identity function (the prop value is returned directly).\n  someProp<PropName extends keyof EditorProps, Result>(\n    propName: PropName,\n    f: (value: NonNullable<EditorProps[PropName]>) => Result,\n  ): Result | undefined;\n  someProp<PropName extends keyof EditorProps>(\n    propName: PropName,\n  ): NonNullable<EditorProps[PropName]> | undefined;\n  someProp<PropName extends keyof EditorProps, Result>(\n    propName: PropName,\n    f?: (value: NonNullable<EditorProps[PropName]>) => Result,\n  ): Result | undefined {\n    let prop = this._props && this._props[propName], value;\n    if (prop != null && (value = f ? f(prop as any) : prop)) {\n      return value as any;\n    }\n    for (let i = 0; i < this.directPlugins.length; i++) {\n      let prop = this.directPlugins[i].props[propName];\n      if (prop != null && (value = f ? f(prop as any) : prop)) {\n        return value as any;\n      }\n    }\n    let plugins = this.state.plugins;\n    if (plugins) {\n      for (let i = 0; i < plugins.length; i++) {\n        let prop = plugins[i].props[propName];\n        if (\n          prop != null && (value = f ? f(prop as any) : prop)\n        ) return value as any;\n      }\n    }\n  }\n\n  /// Query whether the view has focus.\n  hasFocus() {\n    return this.focused;\n  }\n\n  /// Focus the editor.\n  focus() {\n    this.focused = true;\n  }\n\n  /// Removes the editor from the DOM and destroys all [node\n  /// views](#view.NodeView).\n  destroy() {\n    this.destroyPluginViews();\n  }\n\n  /// This is true when the view has been\n  /// [destroyed](#view.DummyEditorView.destroy) (and thus should not be\n  /// used anymore).\n  get isDestroyed() {\n    return false;\n  }\n\n  /// Used for testing.\n  dispatchEvent(event: Event) {\n  }\n\n  /// Dispatch a transaction. Will call\n  /// [`dispatchTransaction`](#view.DirectEditorProps.dispatchTransaction)\n  /// when given, and otherwise defaults to applying the transaction to\n  /// the current state and calling\n  /// [`updateState`](#view.DummyEditorView.updateState) with the result.\n  /// This method is bound to the view instance, so that it can be\n  /// easily passed around.\n  declare dispatch: (tr: Transaction) => void;\n}\n\nDummyEditorView.prototype.dispatch = function (tr: Transaction) {\n  let dispatchTransaction = this.props.dispatchTransaction;\n  if (dispatchTransaction) dispatchTransaction.call(this, tr);\n  else this.updateState(this.state.apply(tr));\n};\n\nfunction getEditable(view: DummyEditorView) {\n  return !view.someProp('editable', (value) => value(view.state) === false);\n}\n\nfunction buildNodeViews(view: DummyEditorView) {\n  let result: NodeViewSet = Object.create(null);\n  function add(obj: NodeViewSet) {\n    for (let prop in obj) {\n      if (!Object.prototype.hasOwnProperty.call(result, prop)) {\n        result[prop] = obj[prop];\n      }\n    }\n  }\n  view.someProp('nodeViews', add);\n  view.someProp('markViews', add);\n  return result;\n}\n\nfunction changedNodeViews(a: NodeViewSet, b: NodeViewSet) {\n  let nA = 0, nB = 0;\n  for (let prop in a) {\n    if (a[prop] != b[prop]) return true;\n    nA++;\n  }\n  for (let _ in b) nB++;\n  return nA != nB;\n}\n\nfunction checkStateComponent(plugin: Plugin) {\n  if (\n    plugin.spec.state || plugin.spec.filterTransaction ||\n    plugin.spec.appendTransaction\n  ) {\n    throw new RangeError(\n      'Plugins passed directly to the view must not have a state component',\n    );\n  }\n}\n\n/// The type of function [provided](#view.EditorProps.nodeViews) to\n/// create [node views](#view.NodeView).\nexport type NodeViewConstructor = (\n  node: Node,\n  view: EditorView,\n  getPos: () => number | undefined,\n  decorations: readonly Decoration[],\n  innerDecorations: DecorationSource,\n) => NodeView;\n\n/// The function types [used](#view.EditorProps.markViews) to create\n/// mark views.\nexport type MarkViewConstructor = (\n  mark: Mark,\n  view: EditorView,\n  inline: boolean,\n) => MarkView;\n\ntype NodeViewSet = {\n  [name: string]: NodeViewConstructor | MarkViewConstructor;\n};\n\n/// Helper type that maps event names to event object types, but\n/// includes events that TypeScript's HTMLElementEventMap doesn't know\n/// about.\nexport interface DOMEventMap extends HTMLElementEventMap {\n  [event: string]: any;\n}\n\n/// Props are configuration values that can be passed to an editor view\n/// or included in a plugin. This interface lists the supported props.\nexport interface EditorProps<P = any> {\n  /// Allows you to pass custom rendering and behavior logic for\n  /// nodes. Should map node names to constructor functions that\n  /// produce a [`NodeView`](#view.NodeView) object implementing the\n  /// node's display behavior. The third argument `getPos` is a\n  /// function that can be called to get the node's current position,\n  /// which can be useful when creating transactions to update it.\n  /// Note that if the node is not in the document, the position\n  /// returned by this function will be `undefined`.\n  ///\n  /// (For backwards compatibility reasons, [mark\n  /// views](#view.EditorProps.markViews) can also be included in this\n  /// object.)\n  nodeViews?: { [node: string]: NodeViewConstructor };\n\n  /// Pass custom mark rendering functions. Note that these cannot\n  /// provide the kind of dynamic behavior that [node\n  /// views](#view.NodeView) can—they just provide custom rendering\n  /// logic. The third argument indicates whether the mark's content\n  /// is inline.\n  markViews?: { [mark: string]: MarkViewConstructor };\n\n  /// When this returns false, the content of the view is not directly\n  /// editable.\n  editable?: (this: P, state: EditorState) => boolean;\n\n  /// Control the DOM attributes of the editable element. May be either\n  /// an object or a function going from an editor state to an object.\n  /// By default, the element will get a class `\"ProseMirror\"`, and\n  /// will have its `contentEditable` attribute determined by the\n  /// [`editable` prop](#view.EditorProps.editable). Additional classes\n  /// provided here will be added to the class. For other attributes,\n  /// the value provided first (as in\n  /// [`someProp`](#view.DummyEditorView.someProp)) will be used.\n  attributes?:\n    | { [name: string]: string }\n    | ((state: EditorState) => { [name: string]: string });\n}\n\n/// The props object given directly to the editor view supports some\n/// fields that can't be used in plugins:\nexport interface DirectEditorProps extends EditorProps {\n  /// The current state of the editor.\n  state: EditorState;\n\n  /// A set of plugins to use in the view, applying their [plugin\n  /// view](#state.PluginSpec.view) and\n  /// [props](#state.PluginSpec.props). Passing plugins with a state\n  /// component (a [state field](#state.PluginSpec.state) field or a\n  /// [transaction](#state.PluginSpec.filterTransaction) filter or\n  /// appender) will result in an error, since such plugins must be\n  /// present in the state to work.\n  plugins?: readonly Plugin[];\n\n  /// The callback over which to send transactions (state updates)\n  /// produced by the view. If you specify this, you probably want to\n  /// make sure this ends up calling the view's\n  /// [`updateState`](#view.DummyEditorView.updateState) method with a new\n  /// state that has the transaction\n  /// [applied](#state.EditorState.apply). The callback will be bound to have\n  /// the view instance as its `this` binding.\n  dispatchTransaction?: (tr: Transaction) => void;\n}\n","import { Fragment, Node as ProseMirrorNode, Schema } from 'prosemirror-model';\n\nimport type { Content, JSONContent } from '../types.ts';\n\nexport type CreateNodeFromContentOptions = {\n  errorOnInvalidContent?: boolean;\n};\n\nexport function createNodeFromObject(\n  content: JSONContent | ProseMirrorNode | Fragment,\n  schema: Schema,\n  options?: CreateNodeFromContentOptions,\n): ProseMirrorNode {\n  try {\n    const node = schema.nodeFromJSON(content);\n\n    if (options?.errorOnInvalidContent) {\n      node.check();\n    }\n\n    return node;\n  } catch (error: any) {\n    if (options?.errorOnInvalidContent) {\n      throw new Error('Invalid JSON content: ' + error.message, {\n        cause: error as Error,\n      });\n    }\n\n    console.warn(\n      'Invalid content.',\n      'Passed value:',\n      content,\n      'Error:',\n      error,\n    );\n\n    return schema.topNodeType.createAndFill(null, [])!;\n  }\n}\n\nexport function createNodeFromArray(\n  content: JSONContent[],\n  schema: Schema,\n): Fragment {\n  return Fragment.fromArray(\n    content.map((item) => schema.nodeFromJSON(item)),\n  );\n}\n\nexport function createNodeFromContent(\n  content: JSONContent | ProseMirrorNode | Fragment,\n  schema: Schema,\n  options?: CreateNodeFromContentOptions,\n): ProseMirrorNode | Fragment {\n  if (content instanceof ProseMirrorNode || content instanceof Fragment) {\n    return content;\n  }\n\n  const isJSONContent = typeof content === 'object' && content !== null;\n\n  if (isJSONContent) {\n    return createNodeFromObject(content, schema, options);\n  }\n\n  return schema.topNodeType.createAndFill(null, [])!;\n}\n","import type { CoreEditor } from './CoreEditor.ts';\n\ninterface SelectParams {\n  anchor: number;\n  scrollIntoView: boolean;\n  userEvent: string;\n}\n\nexport interface EditorUi {\n  showMessage(msg: string): void;\n  showError(err: Error): void;\n  focus(): void;\n  select(params: SelectParams): void;\n}\n\nexport function defaultUi(editor: CoreEditor): EditorUi {\n  return {\n    showMessage(msg: string) {\n      globalThis.alert(msg);\n    },\n    showError(err: Error) {\n      globalThis.alert(err.message);\n      console.error(err);\n    },\n    focus() {\n      // editor.run.focus();\n    },\n    select({\n      anchor: number,\n      scrollIntoView: boolean,\n      userEvent: string,\n    }) {\n    },\n  };\n}\n","export class Container {\n  private items = new Map<string, unknown>();\n\n  register<T>(key: string, service: T) {\n    this.items.set(key, service);\n  }\n\n  resolve<T>(key: string): T {\n    return this.items.get(key) as T;\n  }\n}\n","import {\n  Node as ProseMirrorNode,\n  ParseOptions,\n  Schema,\n} from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ExtensionManager } from './ExtensionManager.ts';\nimport type { AssetLoad, Content, EditorKit, JSONContent } from './types.ts';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { CommandManager } from './commands/CommandManager.ts';\nimport { nodeToTreeString } from './nodeToTreeString.ts';\nimport { DummyEditorView } from './DummyEditorView.ts';\nimport { createNodeFromObject } from './utilities/createNodeFromContent.ts';\nimport { Extension } from './Extension.ts';\nimport { defaultUi, EditorUi } from './ui.ts';\nimport { runInputRulesTexts } from './plugins/input-rules/InputRulesPlugin.ts';\nimport {\n  ChainedCommands,\n  Command,\n  CommandFactories,\n} from './commands/types.ts';\nimport { Container } from './Container.ts';\nimport { Telemetry } from '@kerebron/editor/Telemetry';\n\nfunction ensureDocSchema(\n  doc: ProseMirrorNode,\n  schema: Schema,\n): ProseMirrorNode {\n  if (doc.type.schema === schema) {\n    return doc;\n  }\n\n  const json = doc.toJSON();\n  return ProseMirrorNode.fromJSON(schema, json);\n}\n\nexport interface EditorConfig {\n  element: HTMLElement;\n  content: Content;\n  parseOptions: ParseOptions;\n  assetLoad?: AssetLoad;\n  uri?: string;\n  languageID?: string;\n  readOnly?: boolean;\n  debug?: boolean;\n}\n\nexport class CoreEditor extends EventTarget {\n  public readonly config: Partial<EditorConfig>;\n  private commandManager: CommandManager;\n  public view!: EditorView | DummyEditorView;\n  public state!: EditorState;\n  public ui: EditorUi = defaultUi(this);\n  private linkListener?: EventListenerOrEventListenerObject;\n  private linkSource?: CoreEditor;\n\n  public readonly ci = new Container();\n  version = 0;\n\n  private constructor(\n    config: Partial<EditorConfig>,\n    public readonly schema: Schema,\n    private extensionManager: ExtensionManager,\n  ) {\n    super();\n\n    this.config = { ...config };\n\n    this.commandManager = new CommandManager(\n      this,\n    );\n  }\n\n  static create(config: Partial<EditorConfig> & { editorKits: EditorKit[] }) {\n    const extensionManager = new ExtensionManager(\n      config.editorKits,\n      config.debug,\n    );\n\n    const schema = extensionManager.getSchemaByResolvedExtensions();\n\n    const instance = new CoreEditor(config, schema, extensionManager);\n    extensionManager.created(instance, schema);\n\n    const content = config.content\n      ? config.content\n      : schema.topNodeType.spec.EMPTY_DOC;\n\n    instance.createView(content);\n    instance.setupPlugins();\n\n    instance.dispatchEvent(new CustomEvent('ready'));\n\n    return instance;\n  }\n\n  public clone(config?: EditorConfig): CoreEditor {\n    const extensionManager = new ExtensionManager(\n      this.extensionManager.editorKits,\n      (config || this.config).debug,\n    );\n\n    const instance = new CoreEditor(\n      {\n        assetLoad: this.config.assetLoad,\n        ...config,\n      },\n      this.schema,\n      extensionManager,\n    );\n    extensionManager.created(instance, this.schema);\n\n    const content = this.getJSON();\n\n    const selection = this.state.selection;\n    instance.createView(content, selection);\n    instance.setupPlugins();\n\n    {\n      const oldState = this.state;\n      const tr = instance.state.tr.setMeta('cloned', oldState);\n      instance.dispatchTransaction(tr);\n    }\n\n    return instance;\n  }\n\n  getExtension<T extends Extension>(name: string): T | undefined {\n    return this.ci.resolve<T>(name);\n  }\n\n  public get run() {\n    return this.commandManager.run;\n  }\n\n  public get commandFactories() {\n    return this.commandManager.commandFactories;\n  }\n\n  public chain(startTr?: Transaction): ChainedCommands {\n    return this.commandManager.createChain(startTr);\n  }\n\n  public can(startTr?: Transaction): ChainedCommands {\n    return this.commandManager.createCan(startTr);\n  }\n\n  public link(source: CoreEditor): ChainedCommands {\n    if (source === this) {\n      throw new Error('You cannot chain editor to itself');\n    }\n\n    this.unlink();\n\n    this.state = EditorState.create({ doc: source.getDocument() });\n\n    const { commandFactories } = this.commandManager;\n    const commands: Command[] = [];\n\n    const chain = {\n      ...Object.fromEntries(\n        Object.entries(commandFactories).map(([name, commandFactory]) => {\n          const chainedCommand = (...args: never[]) => {\n            const command = commandFactory(...args);\n            commands.push(command);\n            return chain;\n          };\n          return [name, chainedCommand];\n        }),\n      ),\n      run: () => {\n        this.linkSource = source;\n        this.linkListener = () => {\n          let state = source.state;\n          const dispatch = (tr: Transaction) => {\n            state = state.apply(tr);\n          };\n\n          for (const command of commands) {\n            if (!command(state, dispatch)) {\n              return;\n            }\n          }\n\n          this.state = state.reconfigure({\n            plugins: this.extensionManager.plugins,\n          });\n          if (this.view) {\n            this.view.updateState(this.state);\n          }\n\n          const event = new CustomEvent('changed', {\n            detail: {\n              editor: this,\n            },\n          });\n          this.dispatchEvent(event);\n        };\n        source.addEventListener('changed', this.linkListener);\n      },\n    } as unknown as ChainedCommands;\n\n    return chain;\n  }\n\n  public unlink() {\n    if (this.linkListener && this.linkSource) {\n      this.linkSource.removeEventListener('changed', this.linkListener);\n      this.linkListener = undefined;\n      this.linkSource = undefined;\n    }\n  }\n\n  private createView(content: any, selection?: Selection) {\n    const doc = createNodeFromObject(content, this.schema);\n\n    this.state = EditorState.create({ doc, selection });\n\n    if (this.config.element) {\n      const view = new EditorView(this.config.element, {\n        state: this.state,\n        attributes: {\n          class: 'kb-editor',\n        },\n        dispatchTransaction: (tx: Transaction) => this.dispatchTransaction(tx),\n        editable: () => !this.config.readOnly,\n      });\n      this.view = view;\n\n      const parent = this.config.element.parentNode;\n      if (parent) {\n        const observer = new MutationObserver((mutations) => {\n          for (const mutation of mutations) {\n            for (const removedNode of mutation.removedNodes) {\n              if (removedNode.contains(view.dom)) {\n                // Editor DOM was removed\n                observer.disconnect(); // Prevent multiple calls\n                view.destroy();\n                return;\n              }\n            }\n          }\n        });\n      }\n    } else {\n      this.view = new DummyEditorView({\n        state: this.state,\n        dispatchTransaction: (tx: Transaction) => this.dispatchTransaction(tx),\n      });\n    }\n\n    const event = new CustomEvent('doc:loaded', {\n      detail: {\n        editor: this,\n        doc,\n      },\n    });\n    this.dispatchEvent(event);\n  }\n\n  public dispatchTransaction(transaction: Transaction) {\n    this.state = this.state.apply(transaction);\n\n    if (transaction.docChanged) {\n      this.version++;\n    }\n\n    if (this.view) {\n      this.view.updateState(this.state);\n      const event = new CustomEvent('transaction', {\n        detail: {\n          editor: this,\n          transaction,\n        },\n      });\n      this.dispatchEvent(event);\n    }\n    if (transaction.docChanged) {\n      const event = new CustomEvent('changed', {\n        detail: {\n          editor: this,\n        },\n      });\n      this.dispatchEvent(event);\n    }\n  }\n\n  private setupPlugins() {\n    this.state = this.state.reconfigure({\n      plugins: this.extensionManager.plugins,\n    });\n\n    if (this.view) {\n      this.view.updateState(this.state);\n      this.view.setProps({\n        nodeViews: this.extensionManager.nodeViews,\n      });\n    }\n  }\n\n  public clearDocument() {\n    const content = {\n      type: this.schema.topNodeType.name,\n      content: this.schema.topNodeType.spec.EMPTY_DOC.content,\n    };\n\n    this.setDocument(content);\n  }\n\n  public setDocument(content: any) {\n    let doc = createNodeFromObject(content, this.schema, {\n      errorOnInvalidContent: true,\n    });\n    doc = ensureDocSchema(doc, this.schema);\n\n    this.state = EditorState.create({\n      doc,\n      plugins: this.state.plugins,\n      storedMarks: this.state.storedMarks,\n    });\n\n    if (this.view) {\n      this.view.updateState(this.state);\n    }\n\n    const event = new CustomEvent('doc:loaded', {\n      detail: {\n        editor: this,\n        doc,\n      },\n    });\n    this.dispatchEvent(event);\n  }\n\n  public getConverter(mediaType: string) {\n    const converter = this.extensionManager.converters[mediaType];\n    if (!converter) {\n      throw new Error('Converter not found for: ' + mediaType);\n    }\n    return converter;\n  }\n\n  public getDocument() {\n    return this.state.doc;\n  }\n\n  public loadDocumentText(mediaType: string, content: string) {\n    return this.loadDocument(mediaType, new TextEncoder().encode(content));\n  }\n\n  public async loadDocument(mediaType: string, content: Uint8Array) {\n    const converter = this.getConverter(mediaType);\n    const parsedDoc = await converter.toDoc(content);\n\n    let newState = EditorState.create({\n      doc: parsedDoc,\n      plugins: this.state.plugins,\n      storedMarks: this.state.storedMarks,\n    });\n    const dispatch = (tr: Transaction) => {\n      newState = newState.apply(tr);\n    };\n\n    {\n      const oldState = this.state;\n      const tr = newState.tr.setMeta('cloned', oldState);\n      dispatch(tr);\n    }\n\n    const cmd = runInputRulesTexts();\n    cmd(newState, dispatch);\n\n    const telemetry: Telemetry = this.ci.resolve('telemetry')!;\n    if (telemetry.enabled) {\n      telemetry.event('doc.afterInputRules', newState.doc);\n    }\n\n    this.state = newState;\n\n    if (this.view) {\n      this.view.updateState(this.state);\n      this.view.dispatch(this.view.state.tr);\n    }\n\n    const event = new CustomEvent('doc:loaded', {\n      detail: {\n        editor: this,\n        doc: this.state.doc,\n      },\n    });\n    this.dispatchEvent(event);\n  }\n\n  public async saveDocument(mediaType: string): Promise<Uint8Array> {\n    const converter = this.getConverter(mediaType);\n    const json = this.state.doc.toJSON();\n    const clonedDoc = ProseMirrorNode.fromJSON(this.state.schema, json);\n\n    return await converter.fromDoc(clonedDoc);\n  }\n\n  async patchDocument(mediaType: string, content: Uint8Array) {\n    const converter = this.getConverter(mediaType);\n    const parsedDoc = await converter.toDoc(content);\n\n    const tr = this.state.tr;\n    tr.replaceWith(\n      0,\n      this.state.doc.content.size,\n      parsedDoc.content,\n    );\n    this.dispatchTransaction(tr);\n  }\n\n  getMediaTypes(): string[] {\n    return Object.keys(this.extensionManager.converters);\n  }\n\n  patchDocumentText(mediaType: string, content: string) {\n    return this.patchDocument(mediaType, new TextEncoder().encode(content));\n  }\n\n  /*\n  Warning: doc.attrs.meta is not serialized because it is a map.\n  Use replacer:\n\n  const json = JSON.stringify(obj, (_, value) =>\n    value instanceof Map ? Object.fromEntries(value) : value\n  );\n  */\n  public getJSON(): JSONContent {\n    return this.state.doc.toJSON();\n  }\n\n  public debug(doc?: ProseMirrorNode) {\n    if (!doc) {\n      doc = this.state.doc;\n    }\n    console.debug(nodeToTreeString(doc));\n  }\n\n  public destroy() {\n    const event = new CustomEvent('beforeDestroy', {\n      detail: {},\n    });\n    this.dispatchEvent(event);\n\n    if (this.config.element) {\n      const oldEl = this.config.element;\n      const newEl = oldEl.cloneNode(true);\n      oldEl.replaceWith(newEl);\n    }\n\n    this.view.destroy();\n  }\n\n  mergeCommandFactories(toInsert: Partial<CommandFactories>, name: string) {\n    this.commandManager.mergeCommandFactories(toInsert, name);\n  }\n\n  get editable() {\n    return this.view.editable;\n  }\n}\n","import type { Plugin } from 'prosemirror-state';\nimport type { Node, Schema, SchemaSpec } from 'prosemirror-model';\n\nimport { type CoreEditor } from './CoreEditor.ts';\nimport type { InputRule } from './plugins/input-rules/InputRulesPlugin.ts';\nimport { CommandFactories, CommandShortcuts } from './commands/mod.ts';\n\nexport interface ExtensionConfig {\n  // @ts-ignore - this is a dynamic key\n  [key: string]: any;\n\n  requires: Array<Extension | string>;\n}\n\nexport interface Converter {\n  fromDoc(document: Node): Promise<Uint8Array>;\n  toDoc(content: Uint8Array): Promise<Node>;\n}\n\nexport abstract class Extension {\n  readonly type = 'extension';\n  abstract name: string;\n  protected editor!: CoreEditor;\n\n  readonly conflicts?: Array<string>;\n  readonly overrides?: Array<string>;\n\n  public constructor(public config: Partial<ExtensionConfig> = {}) {\n  }\n\n  setEditor(editor: CoreEditor) {\n    this.editor = editor;\n  }\n\n  getEditor() {\n    return this.editor;\n  }\n\n  created() {\n  }\n\n  getInputRules(): InputRule[] {\n    return [];\n  }\n\n  getProseMirrorPlugins(): Plugin[] {\n    return [];\n  }\n\n  getCommandFactories(editor: CoreEditor): Partial<CommandFactories> {\n    return {};\n  }\n\n  getKeyboardShortcuts(editor: CoreEditor): Partial<CommandShortcuts> {\n    return {};\n  }\n\n  getConverters(editor: CoreEditor, schema: Schema): Record<string, Converter> {\n    return {};\n  }\n\n  setupSpec(spec: SchemaSpec) {\n  }\n}\n","import type { MarkSpec, MarkType } from 'prosemirror-model';\n\nimport type { InputRule } from './plugins/input-rules/InputRulesPlugin.ts';\nimport type { CoreEditor } from './CoreEditor.ts';\nimport type { CommandFactories, CommandShortcuts } from './commands/mod.ts';\nimport { Attribute } from './types.ts';\n\nexport interface MarkConfig {\n  // @ts-ignore - this is a dynamic key\n  [key: string]: any;\n}\n\nexport abstract class Mark {\n  readonly type = 'mark';\n  name: string = 'node';\n  protected editor!: CoreEditor;\n\n  public readonly attributes: Record<string, Attribute<any>> = {};\n\n  public constructor(protected config: Partial<MarkConfig> = {}) {}\n\n  setEditor(editor: CoreEditor) {\n    this.editor = editor;\n  }\n\n  created() {\n  }\n\n  getMarkSpec(): MarkSpec {\n    throw new Error('MarkSpec not defined: ' + this.name);\n  }\n\n  getInputRules(type: MarkType): InputRule[] {\n    return [];\n  }\n\n  getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {};\n  }\n\n  getKeyboardShortcuts(editor: CoreEditor): Partial<CommandShortcuts> {\n    return {};\n  }\n}\n","import type { NodeSpec, NodeType, Schema } from 'prosemirror-model';\nimport type { NodeViewConstructor } from 'prosemirror-view';\nimport type { Plugin } from 'prosemirror-state';\n\nimport type { InputRule } from './plugins/input-rules/InputRulesPlugin.ts';\nimport type { CoreEditor } from './CoreEditor.ts';\nimport type { Command, CommandShortcuts } from './commands/mod.ts';\nimport type { Converter } from './Extension.ts';\nimport { Attribute } from './types.ts';\n\nexport interface NodeConfig {\n  // @ts-ignore - this is a dynamic key\n  [key: string]: any;\n}\n\nexport interface CommandFactories {\n  [key: string]: (...args: any[]) => Command;\n}\n\nexport abstract class Node {\n  readonly type = 'node';\n  name: string = 'node';\n  protected editor!: CoreEditor;\n\n  public readonly attributes: Record<string, Attribute<any>> = {};\n\n  public constructor(protected config: Partial<NodeConfig> = {}) {}\n\n  setEditor(editor: CoreEditor) {\n    this.editor = editor;\n  }\n\n  created() {\n  }\n\n  getNodeSpec(): NodeSpec {\n    throw new Error('NodeSpec not defined: ' + this.name);\n  }\n\n  getInputRules(type: NodeType): InputRule[] {\n    return [];\n  }\n\n  getProseMirrorPlugins(): Plugin[] {\n    return [];\n  }\n\n  getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {};\n  }\n\n  getKeyboardShortcuts(editor: CoreEditor): Partial<CommandShortcuts> {\n    return {};\n  }\n\n  getNodeView(editor: CoreEditor): NodeViewConstructor | undefined {\n    return undefined;\n  }\n\n  getConverters(editor: CoreEditor, schema: Schema): Record<string, Converter> {\n    return {};\n  }\n}\n","export function getShadowRoot(element?: Element): ShadowRoot | undefined {\n  let current = element;\n\n  while (current) {\n    if (current.toString() === '[object ShadowRoot]') {\n      return current as unknown as ShadowRoot;\n    }\n    if (current instanceof ShadowRoot) {\n      if (current.host) {\n        return current.host.shadowRoot || undefined;\n      }\n    }\n    current = current.parentElement ||\n      ((current instanceof ShadowRoot) ? current.host : undefined);\n  }\n\n  return undefined;\n}\n","export function debounce(cb: any, wait: number) {\n  let timeout: ReturnType<typeof setTimeout>;\n  return (...args: any) => {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => cb(...args), wait);\n  };\n}\n\nexport function debounceWithCancel(cb: any, wait: number) {\n  let timeout: ReturnType<typeof setTimeout>;\n\n  const start = (...args: any) => {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => cb(...args), wait);\n  };\n\n  const cancel = () => {\n    clearTimeout(timeout);\n  };\n\n  return {\n    start,\n    cancel,\n  };\n}\n","import {\n  Fragment,\n  Node,\n  NodeType,\n  ResolvedPos,\n  Slice,\n} from 'prosemirror-model';\nimport {\n  AllSelection,\n  EditorState,\n  TextSelection,\n  Transaction,\n} from 'prosemirror-state';\n\nimport { type CoreEditor, Extension } from '@kerebron/editor';\nimport type {\n  CommandFactories,\n  CommandFactory,\n} from '@kerebron/editor/commands';\nimport { createNodeFromObject } from '@kerebron/editor/utilities';\nimport { EditorView } from 'prosemirror-view';\n\nfunction normalizeSiblings(fragment: Fragment, $context: ResolvedPos) {\n  if (fragment.childCount < 2) return fragment;\n  for (let d = $context.depth; d >= 0; d--) {\n    let parent = $context.node(d);\n    let match = parent.contentMatchAt($context.index(d));\n    let lastWrap: readonly NodeType[] | undefined;\n    let result: Node[] | null = [];\n    fragment.forEach((node) => {\n      if (!result) return;\n      let wrap = match.findWrapping(node.type);\n      let inLast;\n      if (!wrap) return result = null;\n      if (\n        inLast = result.length && lastWrap!.length &&\n          addToSibling(wrap, lastWrap!, node, result[result.length - 1], 0)\n      ) {\n        result[result.length - 1] = inLast;\n      } else {\n        if (result.length) {\n          result[result.length - 1] = closeRight(\n            result[result.length - 1],\n            lastWrap!.length,\n          );\n        }\n        let wrapped = withWrappers(node, wrap);\n        result.push(wrapped);\n        match = match.matchType(wrapped.type)!;\n        lastWrap = wrap;\n      }\n    });\n    if (result) return Fragment.from(result);\n  }\n  return fragment;\n}\n\nfunction withWrappers(node: Node, wrap: readonly NodeType[], from = 0) {\n  for (let i = wrap.length - 1; i >= from; i--) {\n    node = wrap[i].create(null, Fragment.from(node));\n  }\n  return node;\n}\n\nfunction addToSibling(\n  wrap: readonly NodeType[],\n  lastWrap: readonly NodeType[],\n  node: Node,\n  sibling: Node,\n  depth: number,\n): Node | undefined {\n  if (\n    depth < wrap.length && depth < lastWrap.length &&\n    wrap[depth] == lastWrap[depth]\n  ) {\n    let inner = addToSibling(\n      wrap,\n      lastWrap,\n      node,\n      sibling.lastChild!,\n      depth + 1,\n    );\n    if (inner) {\n      return sibling.copy(\n        sibling.content.replaceChild(sibling.childCount - 1, inner),\n      );\n    }\n    let match = sibling.contentMatchAt(sibling.childCount);\n    if (\n      match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1])\n    ) {\n      return sibling.copy(\n        sibling.content.append(\n          Fragment.from(withWrappers(node, wrap, depth + 1)),\n        ),\n      );\n    }\n  }\n}\n\nfunction closeRight(node: Node, depth: number) {\n  if (depth == 0) return node;\n  let fragment = node.content.replaceChild(\n    node.childCount - 1,\n    closeRight(node.lastChild!, depth - 1),\n  );\n  let fill = node.contentMatchAt(node.childCount).fillBefore(\n    Fragment.empty,\n    true,\n  )!;\n  return node.copy(fragment.append(fill));\n}\n\nfunction closeRange(\n  fragment: Fragment,\n  side: number,\n  from: number,\n  to: number,\n  depth: number,\n  openEnd: number,\n) {\n  let node = side < 0 ? fragment.firstChild! : fragment.lastChild!,\n    inner = node.content;\n  if (fragment.childCount > 1) openEnd = 0;\n  if (depth < to - 1) {\n    inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n  }\n  if (depth >= from) {\n    inner = side < 0\n      ? node.contentMatchAt(0)!.fillBefore(inner, openEnd <= depth)!.append(\n        inner,\n      )\n      : inner.append(\n        node.contentMatchAt(node.childCount)!.fillBefore(Fragment.empty, true)!,\n      );\n  }\n  return fragment.replaceChild(\n    side < 0 ? 0 : fragment.childCount - 1,\n    node.copy(inner),\n  );\n}\n\nfunction closeSlice(slice: Slice, openStart: number, openEnd: number) {\n  if (openStart < slice.openStart) {\n    slice = new Slice(\n      closeRange(\n        slice.content,\n        -1,\n        openStart,\n        slice.openStart,\n        0,\n        slice.openEnd,\n      ),\n      openStart,\n      slice.openEnd,\n    );\n  }\n  if (openEnd < slice.openEnd) {\n    slice = new Slice(\n      closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0),\n      slice.openStart,\n      openEnd,\n    );\n  }\n  return slice;\n}\n\nfunction sliceSingleNode(slice: Slice) {\n  return slice.openStart == 0 && slice.openEnd == 0 &&\n      slice.content.childCount == 1\n    ? slice.content.firstChild\n    : null;\n}\n\nfunction fixSlice(slice: Slice, $context: ResolvedPos): Slice {\n  slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n  if (slice.openStart || slice.openEnd) {\n    let openStart = 0, openEnd = 0;\n    for (\n      let node = slice.content.firstChild;\n      openStart < slice.openStart && !node!.type.spec.isolating;\n      openStart++, node = node!.firstChild\n      // deno-lint-ignore no-empty\n    ) {}\n    for (\n      let node = slice.content.lastChild;\n      openEnd < slice.openEnd && !node!.type.spec.isolating;\n      openEnd++, node = node!.lastChild\n      // deno-lint-ignore no-empty\n    ) {}\n    slice = closeSlice(slice, openStart, openEnd);\n  }\n  return slice;\n}\n\nfunction sliceHasOnlyText(slice: Slice) {\n  return slice.content.content.every((node) => node.isInline);\n}\n\nconst selectAll: CommandFactory = () => {\n  return function (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n    view?: EditorView,\n  ) {\n    const tr = state.tr.setSelection(new AllSelection(state.doc));\n    if (view) {\n      view.dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nfunction textPositionsToResolvedPos(\n  textPosVec: number[],\n  doc: Node,\n  paraNum: number,\n): ResolvedPos[] {\n  const retVal = textPosVec.map((x) => -1);\n\n  let currentTextPos = 0;\n  let inParaRange = false;\n\n  function callback(\n    currentPos: number,\n    level: number,\n    idx: number,\n    textLen: number,\n  ) {\n    if (!inParaRange) {\n      return;\n    }\n\n    for (let i = 0; i < textPosVec.length; i++) {\n      const val = textPosVec[i];\n      if (val >= currentTextPos && val < currentTextPos + textLen) {\n        retVal[i] = currentPos + (val - currentTextPos);\n      }\n    }\n\n    currentTextPos += textLen;\n  }\n\n  function treeTraverse(\n    node: Node,\n    level = 0,\n    idx = 0,\n    currentPos = 0,\n  ) {\n    if (level === 1 && idx === paraNum) {\n      inParaRange = true;\n    }\n\n    let textLen = 0;\n    if (node.isText && node.text) {\n      textLen = node.text?.length;\n    } else if (node.isLeaf) {\n      textLen = 1;\n    }\n\n    if (textLen > 0) {\n      callback(currentPos, level, idx, textLen);\n    }\n\n    node.forEach((child, offset, childIndex) => {\n      treeTraverse(child, level + 1, childIndex, currentPos + offset + 1);\n    });\n  }\n\n  treeTraverse(doc);\n\n  if (inParaRange) {\n    for (let i = 0; i < textPosVec.length; i++) {\n      const val = textPosVec[i];\n      if (retVal[i] === -1) {\n        if (val < currentTextPos) {\n          retVal[i] = 1;\n        } else {\n          retVal[i] = doc.nodeSize - 1;\n        }\n      }\n    }\n  }\n\n  return retVal.map((x) => doc.resolve(x - 1));\n}\n\nconst selectText: CommandFactory = (\n  textStart: number,\n  length: number,\n  paraNum = 0,\n) => {\n  return function (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n    view?: EditorView,\n  ) {\n    const [$head, $anchor] = textPositionsToResolvedPos(\n      [textStart + length, textStart],\n      state.doc,\n      paraNum,\n    );\n\n    const tr = state.tr.setSelection(new TextSelection($anchor, $head));\n    if (view) {\n      view.dispatch(tr);\n    }\n\n    return true;\n  };\n};\n\nexport class ExtensionSelection extends Extension {\n  name = 'selection';\n\n  extractSelection(): Node {\n    const state = this.editor.state;\n    const { from, to } = state.selection;\n    const slice = state.doc.slice(from, to);\n\n    if (sliceHasOnlyText(slice)) {\n      const para = state.schema.nodes.paragraph.create(null, slice.content);\n      return state.schema.topNodeType.createAndFill(null, [para])!;\n    }\n\n    return state.schema.topNodeType.createAndFill(null, slice.content)!;\n  }\n\n  replaceSelection(otherDoc: Node) {\n    const preferPlain = false;\n    const view = this.editor.view;\n    const state = this.editor.state;\n\n    let slice: Slice;\n\n    if (otherDoc.type?.name === 'doc') {\n      otherDoc = createNodeFromObject(otherDoc.toJSON(), this.editor.schema);\n    }\n    slice = new Slice(otherDoc.content, 1, 1);\n\n    const $context = state.selection.$from;\n\n    slice = fixSlice(slice, $context);\n\n    let singleNode = sliceSingleNode(slice);\n    let tr = singleNode\n      ? state.tr.replaceSelectionWith(singleNode, preferPlain)\n      : state.tr.replaceSelection(slice);\n    view.dispatch(tr.scrollIntoView());\n  }\n\n  appendSelection(otherDoc: Node) {\n    const view = this.editor.view;\n    const { state } = view;\n\n    let slice: Slice;\n\n    if (otherDoc.type?.name === 'doc') {\n      otherDoc = createNodeFromObject(otherDoc.toJSON(), this.editor.schema);\n    }\n    slice = new Slice(otherDoc.content, 1, 1);\n\n    const $context = view.state.selection.$from;\n\n    slice = fixSlice(slice, $context);\n\n    const tr = state.tr.insert(view.state.selection.to, slice.content);\n    view.dispatch(tr.scrollIntoView());\n  }\n\n  override getCommandFactories(editor: CoreEditor): Partial<CommandFactories> {\n    this.editor = editor;\n    return {\n      'selectAll': () => selectAll(),\n      'selectText': (...args) => selectText(...args),\n    };\n  }\n}\n","import { Extension } from '@kerebron/editor';\nimport { type CommandShortcuts } from '@kerebron/editor/commands';\n\n/// A basic keymap containing bindings not specific to any schema.\n/// Binds the following keys (when multiple commands are listed, they\n/// are chained with [`chainCommands`](#commands.chainCommands)):\n///\n/// * **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n/// * **Mod-Enter** to `exitCode`\n/// * **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n/// * **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n/// * **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n/// * **Mod-a** to `selectAll`\nconst pcBaseKeymap: { [key: string]: string } = {\n  'Mod-Enter': 'exitCode',\n  'Backspace': 'backspace',\n  'Mod-Backspace': 'backspace',\n  'Shift-Backspace': 'backspace',\n  'Delete': 'del',\n  'Mod-Delete': 'del',\n  'Mod-a': 'selectAll',\n};\n\n/// A copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n/// **Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n/// **Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\n/// Ctrl-Delete.\nconst macBaseKeymap: { [key: string]: string } = {\n  ...pcBaseKeymap,\n  'Ctrl-h': pcBaseKeymap['Backspace'],\n  'Alt-Backspace': pcBaseKeymap['Mod-Backspace'],\n  'Ctrl-d': pcBaseKeymap['Delete'],\n  'Ctrl-Alt-Backspace': pcBaseKeymap['Mod-Delete'],\n  'Alt-Delete': pcBaseKeymap['Mod-Delete'],\n  'Alt-d': pcBaseKeymap['Mod-Delete'],\n  'Ctrl-a': 'selectTextblockStart',\n  'Ctrl-e': 'selectTextblockEnd',\n};\n\nconst mac = /(Mac|iPhone|iPod|iPad)/i.test(navigator?.platform);\n\nconst baseKeymap: { [key: string]: string } = mac\n  ? macBaseKeymap\n  : pcBaseKeymap;\n\nexport class ExtensionBaseKeymap extends Extension {\n  name = 'base-keymap';\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    const shortcuts: CommandShortcuts = {\n      'Enter': 'enter',\n      'Alt-ArrowUp': 'joinUp',\n      'Alt-ArrowDown': 'joinDown',\n      'Mod-BracketLeft': 'lift',\n      'Escape': 'selectParentNode',\n    };\n\n    for (const key in baseKeymap) {\n      shortcuts[key] = baseKeymap[key];\n    }\n\n    return shortcuts;\n  }\n}\n","import { EditorState, Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { dropPoint } from 'prosemirror-transform';\n\nimport { Extension } from '@kerebron/editor';\n\ninterface DropCursorOptions {\n  /// The color of the cursor. Defaults to `black`. Use `false` to apply no color and rely only on class.\n  color?: string | false;\n\n  /// The precise width of the cursor in pixels. Defaults to 1.\n  width?: number;\n\n  /// A CSS class name to add to the cursor element.\n  class?: string;\n}\n\n/// Create a plugin that, when added to a ProseMirror instance,\n/// causes a decoration to show up at the drop position when something\n/// is dragged over the editor.\n///\n/// Nodes may add a `disableDropCursor` property to their spec to\n/// control the showing of a drop cursor inside them. This may be a\n/// boolean or a function, which will be called with a view and a\n/// position, and should return a boolean.\nexport function dropCursor(options: DropCursorOptions = {}): Plugin {\n  return new Plugin({\n    key: new PluginKey('drop-cursor'),\n    view(editorView) {\n      return new DropCursorView(editorView, options);\n    },\n  });\n}\n\nclass DropCursorView {\n  width: number;\n  color: string | undefined;\n  class: string | undefined;\n  cursorPos: number | null = null;\n  element: HTMLElement | null = null;\n  timeout: number = -1;\n  handlers: { name: string; handler: (event: Event) => void }[];\n\n  constructor(readonly editorView: EditorView, options: DropCursorOptions) {\n    this.width = options.width ?? 1;\n    this.color = options.color === false\n      ? undefined\n      : (options.color || 'black');\n    this.class = options.class;\n\n    this.handlers = ['dragover', 'dragend', 'drop', 'dragleave'].map((name) => {\n      let handler = (e: Event) => {\n        (this as any)[name](e);\n      };\n      editorView.dom.addEventListener(name, handler);\n      return { name, handler };\n    });\n  }\n\n  destroy() {\n    this.handlers.forEach(({ name, handler }) =>\n      this.editorView.dom.removeEventListener(name, handler)\n    );\n  }\n\n  update(editorView: EditorView, prevState: EditorState) {\n    if (this.cursorPos != null && prevState.doc != editorView.state.doc) {\n      if (this.cursorPos > editorView.state.doc.content.size) {\n        this.setCursor(null);\n      } else this.updateOverlay();\n    }\n  }\n\n  setCursor(pos: number | null) {\n    if (pos == this.cursorPos) return;\n    this.cursorPos = pos;\n    if (pos == null) {\n      this.element!.parentNode!.removeChild(this.element!);\n      this.element = null;\n    } else {\n      this.updateOverlay();\n    }\n  }\n\n  updateOverlay() {\n    let $pos = this.editorView.state.doc.resolve(this.cursorPos!);\n    let isBlock = !$pos.parent.inlineContent, rect;\n    let editorDOM = this.editorView.dom,\n      editorRect = editorDOM.getBoundingClientRect();\n    let scaleX = editorRect.width / editorDOM.offsetWidth,\n      scaleY = editorRect.height / editorDOM.offsetHeight;\n    if (isBlock) {\n      let before = $pos.nodeBefore, after = $pos.nodeAfter;\n      if (before || after) {\n        let node = this.editorView.nodeDOM(\n          this.cursorPos! - (before ? before.nodeSize : 0),\n        );\n        if (node) {\n          let nodeRect = (node as HTMLElement).getBoundingClientRect();\n          let top = before ? nodeRect.bottom : nodeRect.top;\n          if (before && after) {\n            top = (top +\n              (this.editorView.nodeDOM(this.cursorPos!) as HTMLElement)\n                .getBoundingClientRect().top) / 2;\n          }\n          let halfWidth = (this.width / 2) * scaleY;\n          rect = {\n            left: nodeRect.left,\n            right: nodeRect.right,\n            top: top - halfWidth,\n            bottom: top + halfWidth,\n          };\n        }\n      }\n    }\n    if (!rect) {\n      let coords = this.editorView.coordsAtPos(this.cursorPos!);\n      let halfWidth = (this.width / 2) * scaleX;\n      rect = {\n        left: coords.left - halfWidth,\n        right: coords.left + halfWidth,\n        top: coords.top,\n        bottom: coords.bottom,\n      };\n    }\n\n    let parent = this.editorView.dom.offsetParent as HTMLElement;\n    if (!this.element) {\n      this.element = parent.appendChild(document.createElement('div'));\n      if (this.class) this.element.className = this.class;\n      this.element.style.cssText =\n        'position: absolute; z-index: 50; pointer-events: none;';\n      if (this.color) {\n        this.element.style.backgroundColor = this.color;\n      }\n    }\n    this.element.classList.toggle('prosemirror-dropcursor-block', isBlock);\n    this.element.classList.toggle('prosemirror-dropcursor-inline', !isBlock);\n    let parentLeft, parentTop;\n    if (\n      !parent ||\n      parent == document.body && getComputedStyle(parent).position == 'static'\n    ) {\n      parentLeft = -pageXOffset;\n      parentTop = -pageYOffset;\n    } else {\n      let rect = parent.getBoundingClientRect();\n      let parentScaleX = rect.width / parent.offsetWidth,\n        parentScaleY = rect.height / parent.offsetHeight;\n      parentLeft = rect.left - parent.scrollLeft * parentScaleX;\n      parentTop = rect.top - parent.scrollTop * parentScaleY;\n    }\n    this.element.style.left = (rect.left - parentLeft) / scaleX + 'px';\n    this.element.style.top = (rect.top - parentTop) / scaleY + 'px';\n    this.element.style.width = (rect.right - rect.left) / scaleX + 'px';\n    this.element.style.height = (rect.bottom - rect.top) / scaleY + 'px';\n  }\n\n  scheduleRemoval(timeout: number) {\n    clearTimeout(this.timeout);\n    this.timeout = setTimeout(() => this.setCursor(null), timeout);\n  }\n\n  dragover(event: DragEvent) {\n    if (!this.editorView.editable) return;\n    let pos = this.editorView.posAtCoords({\n      left: event.clientX,\n      top: event.clientY,\n    });\n\n    let node = pos && pos.inside >= 0 &&\n      this.editorView.state.doc.nodeAt(pos.inside);\n    let disableDropCursor = node && node.type.spec.disableDropCursor;\n    let disabled = typeof disableDropCursor == 'function'\n      ? disableDropCursor(this.editorView, pos!, event)\n      : disableDropCursor;\n\n    if (pos && !disabled) {\n      let target = pos.pos;\n      if (this.editorView.dragging && this.editorView.dragging.slice) {\n        let point = dropPoint(\n          this.editorView.state.doc,\n          target,\n          this.editorView.dragging.slice,\n        );\n        if (point != null) target = point;\n      }\n      this.setCursor(target);\n      this.scheduleRemoval(5000);\n    }\n  }\n\n  dragend() {\n    this.scheduleRemoval(20);\n  }\n\n  drop() {\n    this.scheduleRemoval(20);\n  }\n\n  dragleave(event: DragEvent) {\n    if (!this.editorView.dom.contains((event as any).relatedTarget)) {\n      this.setCursor(null);\n    }\n  }\n}\n\nexport class ExtensionDropcursor extends Extension {\n  name = 'dropcursor';\n\n  options = {\n    color: 'currentColor',\n    width: 1,\n    class: undefined,\n  };\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      dropCursor(this.options),\n    ];\n  }\n}\n","import {\n  EditorState,\n  NodeSelection,\n  Plugin,\n  PluginKey,\n  Selection,\n  TextSelection,\n} from 'prosemirror-state';\nimport { Fragment, Node, ResolvedPos, Slice } from 'prosemirror-model';\nimport { Mappable } from 'prosemirror-transform';\nimport { Decoration, DecorationSet, EditorView } from 'prosemirror-view';\n\nimport type { Command } from '@kerebron/editor/commands';\nimport { Extension } from '@kerebron/editor';\nimport { keydownHandler } from '@kerebron/editor/plugins/keymap';\n\n/// Gap cursor selections are represented using this class. Its\n/// `$anchor` and `$head` properties both point at the cursor position.\nexport class GapCursor extends Selection {\n  /// Create a gap cursor.\n  constructor($pos: ResolvedPos) {\n    super($pos, $pos);\n    this.visible = false;\n  }\n\n  map(doc: Node, mapping: Mappable): Selection {\n    let $pos = doc.resolve(mapping.map(this.head));\n    return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n  }\n\n  override content() {\n    return Slice.empty;\n  }\n\n  eq(other: Selection): boolean {\n    return other instanceof GapCursor && other.head == this.head;\n  }\n\n  toJSON(): any {\n    return { type: 'gapcursor', pos: this.head };\n  }\n\n  /// @internal\n  static fromJSONToGapCursor(doc: Node, json: any): GapCursor {\n    if (typeof json.pos != 'number') {\n      throw new RangeError('Invalid input for GapCursor.fromJSON');\n    }\n    return new GapCursor(doc.resolve(json.pos));\n  }\n\n  /// @internal\n  override getBookmark(): GapBookmark {\n    return new GapBookmark(this.anchor);\n  }\n\n  /// @internal\n  static valid($pos: ResolvedPos) {\n    let parent = $pos.parent;\n    if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) {\n      return false;\n    }\n    let override = parent.type.spec.allowGapCursor;\n    if (override != null) return override;\n    let deflt = parent.contentMatchAt($pos.index()).defaultType;\n    return deflt && deflt.isTextblock;\n  }\n\n  /// @internal\n  static findGapCursorFrom($pos: ResolvedPos, dir: number, mustMove = false) {\n    search: for (;;) {\n      if (!mustMove && GapCursor.valid($pos)) return $pos;\n      let pos = $pos.pos, next = null;\n      // Scan up from this position\n      for (let d = $pos.depth;; d--) {\n        let parent = $pos.node(d);\n        if (\n          dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0\n        ) {\n          next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n          break;\n        } else if (d == 0) {\n          return null;\n        }\n        pos += dir;\n        let $cur = $pos.doc.resolve(pos);\n        if (GapCursor.valid($cur)) return $cur;\n      }\n\n      // And then down into the next node\n      for (;;) {\n        let inside: Node | null = dir > 0 ? next.firstChild : next.lastChild;\n        if (!inside) {\n          if (\n            next.isAtom && !next.isText && !NodeSelection.isSelectable(next)\n          ) {\n            $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n            mustMove = false;\n            continue search;\n          }\n          break;\n        }\n        next = inside;\n        pos += dir;\n        let $cur = $pos.doc.resolve(pos);\n        if (GapCursor.valid($cur)) return $cur;\n      }\n\n      return null;\n    }\n  }\n}\n\nSelection.jsonID('gapcursor', GapCursor);\n\nclass GapBookmark {\n  constructor(readonly pos: number) {}\n\n  map(mapping: Mappable) {\n    return new GapBookmark(mapping.map(this.pos));\n  }\n  resolve(doc: Node): Selection {\n    let $pos = doc.resolve(this.pos);\n    return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n  }\n}\n\nfunction closedBefore($pos: ResolvedPos) {\n  for (let d = $pos.depth; d >= 0; d--) {\n    let index = $pos.index(d), parent = $pos.node(d);\n    // At the start of this parent, look at next one\n    if (index == 0) {\n      if (parent.type.spec.isolating) return true;\n      continue;\n    }\n    // See if the node before (or its first ancestor) is closed\n    for (let before = parent.child(index - 1);; before = before.lastChild!) {\n      if (\n        (before.childCount == 0 && !before.inlineContent) || before.isAtom ||\n        before.type.spec.isolating\n      ) return true;\n      if (before.inlineContent) return false;\n    }\n  }\n  // Hit start of document\n  return true;\n}\n\nfunction closedAfter($pos: ResolvedPos) {\n  for (let d = $pos.depth; d >= 0; d--) {\n    let index = $pos.indexAfter(d), parent = $pos.node(d);\n    if (index == parent.childCount) {\n      if (parent.type.spec.isolating) return true;\n      continue;\n    }\n    for (let after = parent.child(index);; after = after.firstChild!) {\n      if (\n        (after.childCount == 0 && !after.inlineContent) || after.isAtom ||\n        after.type.spec.isolating\n      ) return true;\n      if (after.inlineContent) return false;\n    }\n  }\n  return true;\n}\n\n/// Create a gap cursor plugin. When enabled, this will capture clicks\n/// near and arrow-key-motion past places that don't have a normally\n/// selectable position nearby, and create a gap cursor selection for\n/// them. The cursor is drawn as an element with class\n/// `kb-gapcursor`. You can either include\n/// `style/gapcursor.css` from the package's directory or add your own\n/// styles to make it visible.\nfunction gapCursor(): Plugin {\n  return new Plugin({\n    key: new PluginKey('gap-cursor'),\n    props: {\n      decorations: drawGapCursor,\n\n      createSelectionBetween(_view, $anchor, $head) {\n        return $anchor.pos == $head.pos && GapCursor.valid($head)\n          ? new GapCursor($head)\n          : null;\n      },\n\n      handleClick,\n      handleKeyDown,\n      handleDOMEvents: { beforeinput: beforeinput as any },\n    },\n  });\n}\n\nconst handleKeyDown = keydownHandler({\n  'ArrowLeft': arrow('horiz', -1),\n  'ArrowRight': arrow('horiz', 1),\n  'ArrowUp': arrow('vert', -1),\n  'ArrowDown': arrow('vert', 1),\n});\n\nfunction arrow(axis: 'vert' | 'horiz', dir: number): Command {\n  const dirStr = axis == 'vert'\n    ? (dir > 0 ? 'down' : 'up')\n    : (dir > 0 ? 'right' : 'left');\n  return function (state, dispatch, view) {\n    let sel = state.selection;\n    let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n    if (sel instanceof TextSelection) {\n      if (!view!.endOfTextblock(dirStr) || $start.depth == 0) return false;\n      mustMove = false;\n      $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n    }\n    let $found = GapCursor.findGapCursorFrom($start, dir, mustMove);\n    if (!$found) return false;\n    if (dispatch) dispatch(state.tr.setSelection(new GapCursor($found)));\n    return true;\n  };\n}\n\nfunction handleClick(view: EditorView, pos: number, event: MouseEvent) {\n  if (!view || !view.editable) return false;\n  let $pos = view.state.doc.resolve(pos);\n  if (!GapCursor.valid($pos)) return false;\n  let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY });\n  if (\n    clickPos && clickPos.inside > -1 &&\n    NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside)!)\n  ) return false;\n  view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n  return true;\n}\n\n// This is a hack that, when a composition starts while a gap cursor\n// is active, quickly creates an inline context for the composition to\n// happen in, to avoid it being aborted by the DOM selection being\n// moved into a valid position.\nfunction beforeinput(view: EditorView, event: InputEvent) {\n  if (\n    event.inputType != 'insertCompositionText' ||\n    !(view.state.selection instanceof GapCursor)\n  ) return false;\n\n  let { $from } = view.state.selection;\n  let insert = $from.parent.contentMatchAt($from.index()).findWrapping(\n    view.state.schema.nodes.text,\n  );\n  if (!insert) return false;\n\n  let frag = Fragment.empty;\n  for (let i = insert.length - 1; i >= 0; i--) {\n    frag = Fragment.from(insert[i].createAndFill(null, frag));\n  }\n  let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0));\n  tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1)));\n  view.dispatch(tr);\n  return false;\n}\n\nfunction drawGapCursor(state: EditorState) {\n  if (!(state.selection instanceof GapCursor)) return null;\n  let node = document.createElement('div');\n  node.className = 'kb-gapcursor';\n  return DecorationSet.create(state.doc, [\n    Decoration.widget(state.selection.head, node, { key: 'gapcursor' }),\n  ]);\n}\n\nexport class ExtensionGapcursor extends Extension {\n  name = 'gapcursor';\n\n  options = {\n    color: 'currentColor',\n    width: 1,\n    class: undefined,\n  };\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      gapCursor(),\n    ];\n  }\n}\n","import { type CoreEditor, Extension } from '@kerebron/editor';\nimport { type EditorState, type Transaction } from 'prosemirror-state';\nimport { type CommandFactories } from '@kerebron/editor/commands';\n\ntype TextAlign = 'left' | 'center' | 'right' | 'justify';\n\n/**\n * Extension that adds text alignment commands.\n * Works by setting a 'textAlign' attribute on block nodes that support it.\n */\nexport class ExtensionTextAlign extends Extension {\n  name = 'textAlign';\n\n  override getCommandFactories(editor: CoreEditor): Partial<CommandFactories> {\n    const setAlignment = (align: TextAlign) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const { selection, tr } = state;\n        const { from, to } = selection;\n\n        let changed = false;\n        state.doc.nodesBetween(from, to, (node, pos) => {\n          // Check if this node type has a textAlign attribute\n          if (\n            node.isBlock &&\n            node.type.spec.attrs &&\n            'textAlign' in node.type.spec.attrs\n          ) {\n            tr.setNodeMarkup(pos, undefined, {\n              ...node.attrs,\n              textAlign: align,\n            });\n            changed = true;\n          }\n        });\n\n        if (changed && dispatch) {\n          dispatch(tr);\n        }\n        return changed;\n      };\n    };\n\n    return {\n      setTextAlignLeft: () => setAlignment('left'),\n      setTextAlignCenter: () => setAlignment('center'),\n      setTextAlignRight: () => setAlignment('right'),\n      setTextAlignJustify: () => setAlignment('justify'),\n    };\n  }\n}\n","export interface ColorPair {\n  light: string;\n  dark: string;\n}\n\nexport const userColors: ColorPair[] = [\n  { dark: '#30bced', light: '#30bced' },\n  { dark: '#6eeb83', light: '#6eeb83' },\n  { dark: '#ffbc42', light: '#ffbc42' },\n  { dark: '#ecd444', light: '#ecd444' },\n  { dark: '#ee6352', light: '#ee6352' },\n  { dark: '#9ac2c9', light: '#9ac2c9' },\n  { dark: '#8acb88', light: '#8acb88' },\n  { dark: '#1be7ff', light: '#1be7ff' },\n];\n\nexport type ColorMapper = (\n  user: { id: string },\n  me: { id: string },\n) => ColorPair;\n\nfunction hashString(str: string): number {\n  let hash = 0;\n\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash << 5) - hash + str.charCodeAt(i);\n    hash |= 0; // Convert to 32-bit integer\n  }\n\n  return Math.abs(hash);\n}\n\nexport const defaultColorMapper: ColorMapper = (user, me) => {\n  const mineIndex = hashString(me.id);\n  let userIndex = hashString(user.id);\n  if (mineIndex === userIndex) {\n    userIndex++;\n  }\n\n  return userColors[userIndex % userColors.length];\n};\n","import { EditorState, Plugin, PluginKey, Transaction } from 'prosemirror-state';\n\nimport { CommandFactories, Extension } from '@kerebron/editor';\nimport { CommandFactory } from '@kerebron/editor/commands';\nimport { ColorMapper, generateRandomUser, User } from '@kerebron/editor/user';\n\nexport const userPluginKey = new PluginKey<UserPluginState>('user');\n\ninterface UserPluginState {\n  user: User;\n}\n\nexport interface UserMeta {\n  changeUser?: {\n    user: User;\n  };\n  setColorMapper?: {\n    colorMapper: ColorMapper;\n  };\n}\n\nconst createUserPlugin: () => Plugin<UserPluginState> = () =>\n  new Plugin<UserPluginState>({\n    key: userPluginKey,\n    state: {\n      init() {\n        return {\n          user: generateRandomUser(),\n        };\n      },\n      apply: (tr, pluginState: UserPluginState) => {\n        const changeUser = tr.getMeta('changeUser');\n\n        if (changeUser) {\n          pluginState.user = { ...changeUser.user };\n        }\n\n        return pluginState;\n      },\n    },\n  });\n\nexport class ExtensionUser extends Extension {\n  override name = 'user';\n\n  override getCommandFactories(): Partial<CommandFactories> {\n    const changeUser: CommandFactory = (user: User) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n        tr.setMeta('changeUser', { user });\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return true;\n      };\n    };\n\n    return {\n      changeUser,\n    };\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      createUserPlugin(),\n    ];\n  }\n}\n","import { Decoration, DecorationSet } from 'prosemirror-view';\nimport { EditorState, Plugin, PluginKey } from 'prosemirror-state';\nimport { type DecorationAttrs } from 'prosemirror-view';\n\nimport {\n  type ColorMapper,\n  defaultColorMapper,\n  generateBlankUser,\n  type User,\n} from '@kerebron/editor/user';\n\nimport type { SelectionState } from './ExtensionRemoteSelection.ts';\n\nexport const remoteSelectionPluginKey = new PluginKey<RemoteSelectionState>(\n  'remote-selection',\n);\n\ninterface RemoteSelectionState {\n  remoteStates: SelectionState[];\n  me: User;\n  colorMapper: ColorMapper;\n}\n\n/**\n * Default generator for a cursor element\n */\nexport const defaultCursorBuilder = (\n  user: User,\n  me: User,\n  colorMapper: ColorMapper,\n): HTMLElement => {\n  const colorPair = colorMapper(user, me);\n  const color = colorPair.light;\n\n  const cursor = document.createElement('span');\n  cursor.classList.add('kb-yjs__cursor');\n  cursor.setAttribute('style', `border-color: ${color};`);\n  const userDiv = document.createElement('div');\n  userDiv.setAttribute('style', `background-color: ${color}`);\n  userDiv.insertBefore(document.createTextNode(user.name), null);\n  const nonbreakingSpace1 = document.createTextNode('\\u2060');\n  const nonbreakingSpace2 = document.createTextNode('\\u2060');\n  cursor.insertBefore(nonbreakingSpace1, null);\n  cursor.insertBefore(userDiv, null);\n  cursor.insertBefore(nonbreakingSpace2, null);\n  return cursor;\n};\n\n/**\n * Default generator for the selection attributes\n */\nexport const defaultSelectionBuilder = (\n  user: User,\n  me: User,\n  colorMapper: ColorMapper,\n): DecorationAttrs => {\n  const colorPair = colorMapper(user, me);\n  const color = colorPair.light;\n\n  return {\n    style: `background-color: ${color}70`,\n    class: 'kb-yjs__selection',\n  };\n};\n\nexport const createDecorations = (\n  state: EditorState,\n  pluginState: RemoteSelectionState,\n  createCursor: (\n    user: User,\n    me: User,\n    colorMapper: ColorMapper,\n  ) => Element,\n  createSelection: (\n    user: User,\n    me: User,\n    colorMapper: ColorMapper,\n  ) => DecorationAttrs,\n): DecorationSet => {\n  const decorations: Decoration[] = [];\n\n  const remoteStates = pluginState.remoteStates;\n  for (const remoteState of remoteStates) {\n    if (remoteState.cursor != null) {\n      const user = remoteState.user;\n      const cursor = remoteState.cursor;\n      let anchor = cursor.anchor || null;\n      let head = cursor.head || null;\n\n      if (anchor !== null && head !== null) {\n        const maxsize = Math.max(state.doc.content.size - 1, 0);\n        anchor = Math.min(anchor, maxsize);\n        head = Math.min(head, maxsize);\n        decorations.push(\n          Decoration.widget(\n            head,\n            () => createCursor(user, pluginState.me, pluginState.colorMapper),\n            {\n              key: remoteState.clientId + user.id + user.name,\n              side: 10,\n            },\n          ),\n        );\n        const from = Math.min(anchor, head);\n        const to = Math.max(anchor, head);\n        decorations.push(\n          Decoration.inline(\n            from,\n            to,\n            createSelection(user, pluginState.me, pluginState.colorMapper),\n            {\n              inclusiveEnd: true,\n              inclusiveStart: false,\n            },\n          ),\n        );\n      }\n    }\n  }\n  return DecorationSet.create(state.doc, decorations);\n};\n\nexport const remoteSelectionPlugin = (\n  {\n    cursorBuilder = defaultCursorBuilder,\n    selectionBuilder = defaultSelectionBuilder,\n  }: {\n    cursorBuilder?: (\n      user: User,\n      me: User,\n      colorMapper: ColorMapper,\n    ) => HTMLElement;\n    selectionBuilder?: (\n      user: User,\n      me: User,\n      colorMapper: ColorMapper,\n    ) => DecorationAttrs;\n  } = {},\n) => {\n  return new Plugin<RemoteSelectionState>({\n    key: remoteSelectionPluginKey,\n    state: {\n      init() {\n        return {\n          remoteStates: [],\n          me: generateBlankUser(),\n          colorMapper: defaultColorMapper,\n        };\n      },\n      apply(tr, pluginState) {\n        const changeUser = tr.getMeta('changeUser');\n        if (changeUser) {\n          pluginState.me = { ...changeUser.user };\n        }\n        const setColorMapper = tr.getMeta('setColorMapper');\n        if (setColorMapper) {\n          pluginState.colorMapper = setColorMapper.colorMapper;\n        }\n\n        const remoteSelectionChange = tr.getMeta('remoteSelectionChange');\n        if (remoteSelectionChange) {\n          pluginState.remoteStates = [...remoteSelectionChange.remoteStates];\n        }\n\n        return pluginState;\n      },\n    },\n    props: {\n      decorations(state) {\n        const pluginState = this.getState(state);\n        if (!pluginState) {\n          return DecorationSet.empty;\n        }\n        return createDecorations(\n          state,\n          pluginState,\n          cursorBuilder,\n          selectionBuilder,\n        );\n      },\n    },\n  });\n};\n","import { Plugin } from 'prosemirror-state';\nimport { Extension } from '@kerebron/editor';\nimport { type User } from '@kerebron/editor/user';\n\nimport { remoteSelectionPlugin } from './remoteSelectionPlugin.ts';\n\nexport interface SelectionState {\n  clientId: number;\n  user: User;\n  cursor?: {\n    anchor: number;\n    head: number;\n  };\n}\n\nexport { remoteSelectionPluginKey } from './remoteSelectionPlugin.ts';\n\nexport class ExtensionRemoteSelection extends Extension {\n  override name = 'remote-selection';\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      remoteSelectionPlugin(),\n    ];\n  }\n}\n","import { Node } from 'prosemirror-model';\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { CommandFactory } from '@kerebron/editor/commands';\nimport {\n  NESTING_CLOSING,\n  NESTING_OPENING,\n  NESTING_SELF_CLOSING,\n} from '@kerebron/editor';\n\nfunction generateId(): string {\n  return String(Math.random());\n}\n\ntype NodeAndPos = { node: Node; pos: number };\n\nexport function buildPairingTransaction(\n  state: EditorState,\n  type: string,\n  tr: Transaction,\n) {\n  const { doc } = state;\n\n  const stackMap: Map<string, Array<NodeAndPos>> = new Map();\n  const nodes: Array<NodeAndPos> = [];\n\n  doc.descendants((node, pos) => {\n    if (node.type.name === type) {\n      nodes.push({ node, pos });\n    }\n  });\n\n  let modified = false;\n\n  for (const { node, pos } of nodes) {\n    const raw = node.attrs.content?.trim();\n    if (!raw) continue;\n\n    const match = raw.match(/^[^0-9a-z\\/]*(\\/?)[\\s]*([\\w]+)/i);\n    if (!match) {\n      continue;\n    }\n\n    const isClosing = match[1] === '/';\n    const name = match[2];\n\n    if (!isClosing) {\n      if (!stackMap.has(name)) {\n        stackMap.set(name, []);\n      }\n\n      stackMap.get(name)!.push({ node, pos });\n    } else {\n      const stack = stackMap.get(name);\n\n      if (stack && stack.length > 0) {\n        const opening = stack.pop()!;\n        const id = generateId();\n\n        tr.setNodeMarkup(opening.pos, undefined, {\n          ...opening.node.attrs,\n          id,\n          nesting: NESTING_OPENING,\n          error: undefined,\n        });\n\n        tr.setNodeMarkup(pos, undefined, {\n          ...node.attrs,\n          id,\n          nesting: NESTING_CLOSING,\n          error: undefined,\n        });\n      } else {\n        tr.setNodeMarkup(pos, undefined, {\n          ...node.attrs,\n          error: 'Closing shortcode without matching opening',\n          nesting: NESTING_CLOSING,\n        });\n      }\n\n      modified = true;\n    }\n  }\n\n  // Any leftover openings are self-closing (no matching close)\n  for (const [, stack] of stackMap.entries()) {\n    for (const { node, pos } of stack) {\n      tr.setNodeMarkup(pos, undefined, {\n        ...node.attrs,\n        nesting: NESTING_SELF_CLOSING,\n        id: undefined,\n      });\n      modified = true;\n    }\n  }\n\n  return modified ? tr : null;\n}\n\nexport const pairNodes: CommandFactory = (type: string) => {\n  return (state: EditorState, dispatch) => {\n    const tr = buildPairingTransaction(state, type, state.tr);\n    if (!tr) {\n      return false;\n    }\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n    return true;\n  };\n};\n","import { Plugin, Transaction } from 'prosemirror-state';\nimport { ReplaceAroundStep, ReplaceStep } from 'prosemirror-transform';\nimport { buildPairingTransaction } from './pairNodes.ts';\n\nexport const createPairingPlugin = (types: string[]) => {\n  return new Plugin({\n    appendTransaction(\n      transactions: readonly Transaction[],\n      oldState,\n      newState,\n    ) {\n      const typesToRebuild: Set<string> = new Set();\n\n      for (const tr of transactions) {\n        if (!tr.docChanged) continue;\n\n        for (const step of tr.steps) {\n          if (\n            !(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)\n          ) {\n            continue;\n          }\n\n          if (step.slice) {\n            step.slice.content.descendants((node) => {\n              if (types.includes(node.type.name)) {\n                typesToRebuild.add(node.type.name);\n              }\n            });\n          }\n\n          if (step.from != null && step.to != null && step.from !== step.to) {\n            oldState.doc.nodesBetween(step.from, step.to, (node) => {\n              if (types.includes(node.type.name)) {\n                typesToRebuild.add(node.type.name);\n              }\n            });\n          }\n\n          if (typesToRebuild.size === types.length) break;\n        }\n\n        if (typesToRebuild.size === types.length) break;\n      }\n\n      if (typesToRebuild.size === 0) return null;\n\n      const tr = newState.tr;\n      for (const type of typesToRebuild) {\n        buildPairingTransaction(newState, type, tr);\n      }\n\n      return tr;\n    },\n  });\n};\n","import { Plugin } from 'prosemirror-state';\n\nimport { Extension } from '@kerebron/editor';\nimport { createPairingPlugin } from './PairNodesPlugin.ts';\n\nexport class ExtensionPairing extends Extension {\n  name = 'pairing-nodes';\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      createPairingPlugin(['shortcode_inline']),\n    ];\n  }\n}\n","import {\n  DOMParser,\n  DOMSerializer,\n  Fragment,\n  Node as PMNode,\n  type ParseOptions,\n  Schema,\n} from 'prosemirror-model';\n\nimport { type Converter, type CoreEditor, Extension } from '@kerebron/editor';\n\nimport { HtmlPasteRule } from './ExtensionPaste.ts';\n\nexport type CreateNodeFromContentOptions = {\n  parseOptions?: ParseOptions;\n  errorOnInvalidContent?: boolean;\n  pasteRules: HtmlPasteRule[];\n};\n\nexport function getHTMLFromFragment(\n  fragment: Fragment,\n  schema: Schema,\n): string {\n  const document = globalThis.document;\n  const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(\n    fragment,\n    { document },\n  );\n\n  const temporaryDocument = document.implementation.createHTMLDocument();\n  const container = temporaryDocument.createElement('div');\n\n  container.appendChild(documentFragment);\n\n  return container.innerHTML;\n}\n\nconst removeWhitespaces = (node: HTMLElement) => {\n  const children = node.childNodes;\n\n  for (let i = children.length - 1; i >= 0; i -= 1) {\n    const child = children[i];\n\n    if (\n      child.nodeType === 3 && child.nodeValue &&\n      /^(\\n\\s\\s|\\n)$/.test(child.nodeValue)\n    ) {\n      node.removeChild(child);\n    } else if (child.nodeType === 1) {\n      removeWhitespaces(child as HTMLElement);\n    }\n  }\n\n  return node;\n};\n\nexport function elementFromString(value: string): HTMLElement {\n  // add a wrapper to preserve leading and trailing whitespace\n  const wrappedValue = `<html lang=\"en\"><body>${value}</body></html>`;\n\n  // TODO: consider using `const clean = DOMPurify.sanitize(html);` to prevent loading external resources\n  // Or check all src/href attrs, etc. for js\n\n  const body =\n    new globalThis.DOMParser().parseFromString(wrappedValue, 'text/html').body;\n\n  return removeWhitespaces(body);\n}\n\nexport function decodeEntity(value: string): string {\n  const wrappedValue = `<html lang=\"en\"><body>${value}</body></html>`;\n\n  const body =\n    new globalThis.DOMParser().parseFromString(wrappedValue, 'text/html').body;\n\n  return body.innerText;\n}\n\nfunction prepareContentCheckSchema(schema: Schema): Schema {\n  const contentCheckSchema = new Schema({\n    topNode: schema.spec.topNode,\n    marks: schema.spec.marks,\n    // Prosemirror's schemas are executed such that: the last to execute, matches last\n    // This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle\n    nodes: schema.spec.nodes.append({\n      __unknown__catch__all__node: {\n        content: 'inline*',\n        group: 'block',\n        parseDOM: [\n          {\n            tag: '*',\n            getAttrs: (e) => {\n              // Try to stringify the element for a more helpful error message\n              const invalidContent = typeof e === 'string' ? e : e.outerHTML;\n              throw new Error('Invalid HTML content', {\n                cause: new Error(`Invalid element found: ${invalidContent}`),\n              });\n            },\n          },\n        ],\n      },\n    }),\n  });\n\n  return contentCheckSchema;\n}\n\nexport async function createNodeFromHTML(\n  content: string,\n  schema: Schema,\n  options?: CreateNodeFromContentOptions,\n): Promise<PMNode> {\n  options = {\n    pasteRules: [],\n    parseOptions: {},\n    ...options,\n  };\n\n  if (options.errorOnInvalidContent) {\n    const contentCheckSchema = prepareContentCheckSchema(schema);\n    DOMParser.fromSchema(contentCheckSchema).parse(\n      elementFromString(content),\n      options.parseOptions,\n    );\n  }\n\n  const body = elementFromString(content);\n  // const processed = await processHtml(body, {});\n\n  const parser = DOMParser.fromSchema(schema);\n  return parser.parse(body, options.parseOptions);\n}\n\nexport function createFragmentFromHTML(\n  content: string,\n  schema: Schema,\n  options?: CreateNodeFromContentOptions,\n): Fragment {\n  options = {\n    pasteRules: [],\n    parseOptions: {},\n    ...options,\n  };\n\n  if (options.errorOnInvalidContent) {\n    const contentCheckSchema = prepareContentCheckSchema(schema);\n    DOMParser.fromSchema(contentCheckSchema).parseSlice(\n      elementFromString(content),\n      options.parseOptions,\n    );\n  }\n\n  const parser = DOMParser.fromSchema(schema);\n  const htmlElement = elementFromString(content);\n\n  return parser.parseSlice(htmlElement, options.parseOptions)\n    .content;\n}\n\nexport class ExtensionHtml extends Extension {\n  name = 'html';\n\n  override getConverters(\n    editor: CoreEditor,\n    schema: Schema,\n  ): Record<string, Converter> {\n    return {\n      'text/html': {\n        fromDoc: async (document: PMNode): Promise<Uint8Array> => {\n          const html = getHTMLFromFragment(document.content, editor.schema);\n          return new TextEncoder().encode(html);\n        },\n        toDoc: async (buffer: Uint8Array): Promise<PMNode> => {\n          const html = new TextDecoder().decode(buffer);\n\n          const body = elementFromString(html);\n          const parser = DOMParser.fromSchema(schema);\n          return parser.parse(body);\n        },\n      },\n    };\n  }\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension } from '@kerebron/editor';\n\nexport interface MediaUploadOptions {\n  /** Maximum file size in bytes (default: 10MB for images) */\n  maxFileSize?: number;\n\n  /** Maximum file size for videos (default: 50MB) */\n  maxVideoFileSize?: number;\n\n  /** Allowed image MIME types */\n  allowedImageTypes?: string[];\n\n  /** Allowed video MIME types */\n  allowedVideoTypes?: string[];\n\n  /** Use object URLs for videos instead of base64 (default: true) */\n  useObjectURLForVideos?: boolean;\n\n  /** Custom upload handler. Returns the URL of uploaded media. */\n  uploadHandler?: (file: File) => Promise<string>;\n}\n\nconst mediaUploadKey = new PluginKey<MediaUploadOptions>('mediaUpload');\n\n/** Convert a File to a base64 data URL */\nfunction fileToDataURL(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => resolve(reader.result as string);\n    reader.onerror = reject;\n    reader.readAsDataURL(file);\n  });\n}\n\n/** Convert a File to an object URL (better for videos) */\nfunction fileToObjectURL(file: File): string {\n  return URL.createObjectURL(file);\n}\n\n/** Check if a file is an image */\nfunction isImage(file: File, allowedTypes: string[]): boolean {\n  return allowedTypes.some((type) => file.type.match(type));\n}\n\n/** Check if a file is a video */\nfunction isVideo(file: File, allowedTypes: string[]): boolean {\n  return allowedTypes.some((type) => file.type.match(type));\n}\n\n/** Insert an image into the editor at the given position */\nfunction insertImage(\n  view: EditorView,\n  pos: number,\n  src: string,\n  alt?: string,\n  title?: string,\n) {\n  const { schema } = view.state;\n  const imageType = schema.nodes.image;\n\n  if (!imageType) {\n    console.warn('Image node type not found in schema');\n    return;\n  }\n\n  const node = imageType.create({ src, alt, title });\n  const transaction = view.state.tr.insert(pos, node);\n  view.dispatch(transaction);\n}\n\n/** Insert a video into the editor at the given position */\nfunction insertVideo(\n  view: EditorView,\n  pos: number,\n  src: string,\n  title?: string,\n  width?: string,\n  height?: string,\n) {\n  const { schema } = view.state;\n  const videoType = schema.nodes.video;\n\n  if (!videoType) {\n    console.warn('Video node type not found in schema');\n    return;\n  }\n\n  const node = videoType.create({ src, title, width, height, controls: true });\n  const transaction = view.state.tr.insert(pos, node);\n  view.dispatch(transaction);\n}\n\n/** Handle media files (images and videos) from drop or paste events */\nasync function handleMediaFiles(\n  view: EditorView,\n  files: File[],\n  pos: number,\n  options: MediaUploadOptions,\n): Promise<void> {\n  const {\n    maxFileSize = 10 * 1024 * 1024, // 10MB for images\n    maxVideoFileSize = 50 * 1024 * 1024, // 50MB for videos\n    allowedImageTypes = ['^image/'],\n    allowedVideoTypes = ['^video/'],\n    uploadHandler,\n  } = options;\n\n  for (const file of files) {\n    const isImageFile = isImage(file, allowedImageTypes);\n    const isVideoFile = isVideo(file, allowedVideoTypes);\n\n    // Skip if not an image or video\n    if (!isImageFile && !isVideoFile) {\n      continue;\n    }\n\n    // Check file size\n    const sizeLimit = isVideoFile ? maxVideoFileSize : maxFileSize;\n    if (file.size > sizeLimit) {\n      console.warn(\n        `${isVideoFile ? 'Video' : 'Image'} file \"${file.name}\" is too large (${\n          (file.size / 1024 / 1024).toFixed(2)\n        }MB). Maximum size is ${(sizeLimit / 1024 / 1024).toFixed(2)}MB.`,\n      );\n      continue;\n    }\n\n    try {\n      // Upload or convert to data URL\n      console.log(\n        `Processing ${isVideoFile ? 'video' : 'image'}: ${file.name} (${\n          (file.size / 1024 / 1024).toFixed(2)\n        }MB, ${file.type})`,\n      );\n\n      let src: string;\n      if (uploadHandler) {\n        src = await uploadHandler(file);\n      } else if (isVideoFile && options.useObjectURLForVideos !== false) {\n        // Use object URL for videos (better performance, doesn't bloat the document)\n        src = fileToObjectURL(file);\n        console.log('Using object URL for video:', src);\n      } else {\n        // Use base64 data URL\n        src = await fileToDataURL(file);\n        console.log(\n          `${\n            isVideoFile ? 'Video' : 'Image'\n          } converted to data URL, length: ${src.length} characters`,\n        );\n      }\n\n      // Insert the media\n      if (isVideoFile) {\n        insertVideo(view, pos, src, file.name);\n        console.log('Video inserted into editor');\n      } else {\n        insertImage(view, pos, src, file.name);\n        console.log('Image inserted into editor');\n      }\n\n      // Increment position for next media\n      pos += 1;\n    } catch (error) {\n      console.error(\n        `Failed to process ${isVideoFile ? 'video' : 'image'} \"${file.name}\":`,\n        error,\n      );\n    }\n  }\n}\n\n/** Create the media upload plugin */\nfunction createMediaUploadPlugin(options: MediaUploadOptions = {}): Plugin {\n  return new Plugin<MediaUploadOptions>({\n    key: mediaUploadKey,\n\n    state: {\n      init(): MediaUploadOptions {\n        return options;\n      },\n      apply(tr, value) {\n        if (tr.isGeneric) {\n          return value;\n        }\n\n        const options: MediaUploadOptions | undefined = tr.getMeta(\n          'setMediaUploadOptions',\n        );\n\n        if (options) {\n          return options;\n        }\n\n        return value;\n      },\n    },\n\n    props: {\n      /** Handle file drops */\n      handleDrop(view, event, slice, moved) {\n        if (moved) return false;\n\n        const files = Array.from(event.dataTransfer?.files || []);\n        if (files.length === 0) return false;\n\n        const options = mediaUploadKey.getState(view.state) || {};\n\n        const {\n          allowedImageTypes = ['^image/'],\n          allowedVideoTypes = ['^video/'],\n        } = options;\n        const hasMedia = files.some((file) =>\n          isImage(file, allowedImageTypes) || isVideo(file, allowedVideoTypes)\n        );\n        if (hasMedia) {\n          event.preventDefault();\n\n          const coords = { left: event.clientX, top: event.clientY };\n          const pos = view.posAtCoords(coords);\n          if (!pos) return false;\n\n          handleMediaFiles(view, files, pos.pos, options);\n\n          return true;\n        }\n      },\n\n      handlePaste(view, event, slice) {\n        if ((event.clipboardData?.types || []).includes('text/html')) {\n          return;\n        }\n\n        const items = Array.from(event.clipboardData?.items || []);\n        const imageItems = items.filter((item) =>\n          item.type.startsWith('image/')\n        );\n\n        if (imageItems.length > 0) {\n          event.preventDefault();\n\n          const files: File[] = [];\n          for (const item of imageItems) {\n            const file = item.getAsFile();\n            if (file) files.push(file);\n          }\n\n          if (files.length === 0) return false;\n\n          const { from } = view.state.selection;\n\n          handleMediaFiles(view, files, from, options);\n\n          return true;\n        }\n      },\n    },\n  });\n}\n\n/** Extension that adds media upload support via drag & drop and paste */\nexport class ExtensionMediaUpload extends Extension {\n  name = 'mediaUpload';\n\n  constructor(public override config: Partial<MediaUploadOptions> = {}) {\n    super(config);\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [createMediaUploadPlugin(this.config)];\n  }\n}\n","import {\n  AllSelection,\n  EditorState,\n  Plugin,\n  PluginKey,\n  Transaction,\n} from 'prosemirror-state';\nimport { DOMParser, Slice } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { CommandFactories, CommandFactory } from '@kerebron/editor/commands';\nimport { type CoreEditor, Extension } from '@kerebron/editor';\n\nimport { elementFromString } from './ExtensionHtml.ts';\nimport { YamlService } from '@kerebron/editor/yaml';\nimport { BlankFrontmatterServiceImpl } from '@kerebron/editor/frontmatter';\n\ntype PasteRuleStep =\n  | PasteRuleStepDefault\n  | PasteRuleStepReplaceTag\n  | PasteRuleStepMetaSet;\n\ninterface PasteRuleStepDefault {\n  match: string | ((node: Node) => Node[]);\n  result?: 'string' | 'nodes';\n  op: 'remove' | 'replaceBody' | 'console.debug' | 'meta.set';\n}\n\ninterface PasteRuleStepReplaceTag {\n  match: string | ((node: Node) => Node[]);\n  result?: 'string' | 'nodes';\n  op: 'replaceTag';\n  tag: string;\n}\n\ninterface PasteRuleStepMetaSet {\n  match: string | ((node: Node) => Node[]);\n  result?: 'string' | 'nodes';\n  op: 'meta.set';\n  path: string;\n}\n\nexport type PasteRule = HtmlPasteRule;\n\nexport interface HtmlPasteRule {\n  match: string | ((node: Node) => boolean);\n  steps: Array<PasteRuleStep>;\n  replaceDocument?: boolean;\n}\n\nfunction getStringByXPath(xpath: string, element: HTMLElement): string {\n  const result = element.ownerDocument.evaluate(\n    xpath,\n    element,\n    null,\n    XPathResult.STRING_TYPE,\n    null,\n  );\n\n  return result.stringValue;\n}\n\nfunction getElementsByXPath(xpath: string, element: HTMLElement): Node[] {\n  const result = element.ownerDocument.evaluate(\n    xpath,\n    element,\n    null,\n    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\n    null,\n  );\n\n  const retVal = [];\n  for (let i = 0; i < result.snapshotLength; i++) {\n    const node = result.snapshotItem(i);\n    if (!node) {\n      continue;\n    }\n    retVal.push(node);\n  }\n\n  return retVal;\n}\n\ninterface PasteMeta {\n  getPasteRules?: (pasteRules: HtmlPasteRule[]) => void;\n  setPasteRules?: HtmlPasteRule[];\n  pasteHtml: {\n    from: number;\n    html: string;\n  };\n}\n\nclass PasteState {\n  pasteRules: HtmlPasteRule[] = [];\n\n  constructor(private editor: CoreEditor) {\n  }\n\n  handleCommands(pluginMeta: PasteMeta | undefined, transaction: Transaction) {\n    if (!pluginMeta) {\n      return false;\n    }\n\n    if (pluginMeta.getPasteRules) {\n      pluginMeta.getPasteRules(this.pasteRules);\n      return true;\n    }\n\n    if (pluginMeta.setPasteRules) {\n      console.log('setPasteRules', pluginMeta.setPasteRules);\n      this.pasteRules = pluginMeta.setPasteRules;\n      return true;\n    }\n\n    if (pluginMeta.pasteHtml) {\n      const { from, html } = pluginMeta.pasteHtml;\n\n      let body = elementFromString(html);\n      const editor = this.editor;\n\n      let replaceDocument = false;\n\n      const metaOps: any[] = [];\n      const yaml = editor.ci.resolve('yaml') as YamlService;\n\n      for (const rule of this.pasteRules) {\n        if ('string' === typeof rule.match) {\n          const matched = getElementsByXPath(rule.match, body);\n          if (matched.length === 0) {\n            continue;\n          }\n        } else {\n          if (!rule.match(body)) {\n            continue;\n          }\n        }\n\n        for (const step of rule.steps) {\n          let matched;\n          if ('string' === typeof step.match) {\n            switch (step.result || '') {\n              case 'string':\n                matched = getStringByXPath(step.match, body);\n                break;\n              default:\n                matched = getElementsByXPath(step.match, body);\n                break;\n            }\n          } else {\n            matched = step.match(body);\n          }\n\n          console.log('step', matched, step);\n\n          switch (step.op) {\n            case 'remove':\n              for (const node of matched) {\n                node.parentNode?.removeChild(node);\n              }\n              break;\n            case 'replaceTag':\n              for (const node of matched) {\n                const newNode = node.ownerDocument!.createElement(step.tag);\n                (newNode as HTMLElement).innerHTML =\n                  (node as HTMLElement).innerHTML;\n                node.parentNode?.replaceChild(newNode, node);\n              }\n              break;\n            case 'replaceBody':\n              for (const node of matched) {\n                body.innerHTML = '';\n                body.appendChild(node);\n              }\n              break;\n            case 'console.debug':\n              console.debug(matched);\n              break;\n            case 'meta.set':\n              metaOps.push({\n                path: step.path,\n                value: matched,\n              });\n              break;\n          }\n        }\n\n        replaceDocument = !!rule.replaceDocument;\n        break;\n      }\n\n      const parser = DOMParser.fromSchema(this.editor.schema);\n      const node = parser.parse(body);\n\n      setTimeout(async () => {\n        const tr = this.editor.state.tr;\n\n        if (replaceDocument) {\n          tr.replaceWith(0, this.editor.state.doc.content.size, node);\n        } else {\n          tr.insert(from, node);\n        }\n\n        // TODO: CLEAR odt/md\n\n        {\n          const meta = await new Promise<Map<any, any>>((r) =>\n            this.editor.chain().getMeta(r).run()\n          ) || new Map();\n          for (const op of metaOps) {\n            yaml.setPathValue(meta, op.path, op.value);\n          }\n          tr.setDocAttribute('meta', meta);\n        }\n\n        this.editor.dispatchTransaction(tr);\n      }, 0);\n\n      return true;\n    }\n\n    return false;\n  }\n}\n\nexport const PastePluginKey = new PluginKey<PasteState>('paste');\n\nexport class ExtensionPaste extends Extension {\n  name = 'paste';\n\n  override getProseMirrorPlugins(): Plugin[] {\n    const editor = this.editor;\n\n    return [\n      new Plugin<PasteState>({\n        key: PastePluginKey,\n        state: {\n          init() {\n            return new PasteState(editor);\n          },\n          apply(transaction, nextPasteState: PasteState, prevState, state) {\n            if (transaction.isGeneric) {\n              return nextPasteState;\n            }\n\n            const oldClonedState: EditorState | undefined = transaction.getMeta(\n              'cloned',\n            );\n            if (oldClonedState) {\n              const oldClonedPluginState = PastePluginKey.getState(\n                oldClonedState,\n              );\n              if (oldClonedPluginState) {\n                return oldClonedPluginState;\n              }\n            }\n\n            const pluginMeta: PasteMeta | undefined = transaction.getMeta(\n              PastePluginKey,\n            );\n\n            if (nextPasteState.handleCommands(pluginMeta, transaction)) {\n              return nextPasteState;\n            }\n\n            return nextPasteState;\n          },\n        },\n        props: {\n          handleDOMEvents: {\n            copy(view, event) {\n              if (!event.clipboardData) {\n                return false;\n              }\n\n              const cloned = editor.clone();\n              event.preventDefault();\n\n              (async () => {\n                if (!(cloned.state.selection instanceof AllSelection)) {\n                  cloned.ci.register(\n                    'frontmatter',\n                    new BlankFrontmatterServiceImpl(),\n                  );\n                }\n\n                cloned.chain().keepSelection().run();\n                const md = new TextDecoder().decode(\n                  await cloned.saveDocument('text/x-markdown'),\n                );\n                const html = new TextDecoder().decode(\n                  await cloned.saveDocument('text/html'),\n                );\n\n                await navigator.clipboard.write([\n                  new ClipboardItem({\n                    'text/plain': new Blob([md], { type: 'text/plain' }),\n                    'text/html': new Blob([html], { type: 'text/html' }),\n                  }),\n                ]);\n              })();\n\n              return false;\n            },\n          },\n          handlePaste(view: EditorView, event: ClipboardEvent, slice: Slice) {\n            const { clipboardData } = event;\n\n            if (!clipboardData) {\n              return false;\n            }\n\n            if (clipboardData.types.includes('text/html')) {\n              const { from } = view.state.selection;\n              const html = clipboardData.getData('text/html');\n              event.preventDefault();\n\n              const transaction = view.state.tr.setMeta(PastePluginKey, {\n                pasteHtml: { from, html },\n              });\n              view.dispatch(transaction);\n\n              return true;\n            }\n\n            const allFiles: File[] = [...clipboardData.items]\n              .map((data) => data.getAsFile())\n              .filter((file): file is File => !!file);\n\n            const files = Array.from(event.clipboardData?.files || []);\n            if (files.length === 1) {\n              const file = files[0];\n              if (editor.getMediaTypes().includes(file.type)) {\n                file.bytes().then((bytes) => {\n                  editor.loadDocument(file.type, bytes);\n                });\n                return true;\n              }\n            }\n          },\n          handleDrop(\n            _view: EditorView,\n            event: DragEvent,\n            _slice: Slice,\n            _moved: boolean,\n          ) {\n            const files = Array.from(event.dataTransfer?.files || []);\n            if (files.length === 1) {\n              const file = files[0];\n              if (editor.getMediaTypes().includes(file.type)) {\n                file.bytes().then((bytes) => {\n                  editor.loadDocument(file.type, bytes);\n                });\n                return true;\n              }\n            }\n          },\n        },\n      }),\n    ];\n  }\n\n  override getCommandFactories(editor: CoreEditor): Partial<CommandFactories> {\n    const getPasteRules: CommandFactory = (\n      cb: (pasteRules: PasteRule[]) => void,\n    ) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n        tr.setMeta(PastePluginKey, { getPasteRules: cb });\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return true;\n      };\n    };\n\n    const setPasteRules: CommandFactory = (pasteRules: PasteRule[]) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n        tr.setMeta(PastePluginKey, { setPasteRules: pasteRules });\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return true;\n      };\n    };\n\n    return {\n      getPasteRules,\n      setPasteRules,\n    };\n  }\n}\n","import { Mark as PmMark, MarkSpec } from 'prosemirror-model';\nimport { Mark } from '@kerebron/editor';\n\nexport class MarkLink extends Mark {\n  override name = 'link';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      attrs: {\n        href: {},\n        title: { default: undefined },\n        origUrl: { default: undefined },\n        mdTemplate: { default: undefined },\n      },\n      inclusive: false,\n      parseDOM: [\n        {\n          tag: 'a[href]',\n          getAttrs(dom: HTMLElement) {\n            return {\n              href: dom.getAttribute('href'),\n              title: dom.getAttribute('title'),\n            };\n          },\n        },\n      ],\n      toDOM(node) {\n        const { href, title } = node.attrs;\n        return ['a', { href, title }, 0];\n      },\n    };\n  }\n}\n","import { type CoreEditor, Mark } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { MarkSpec, type MarkType } from 'prosemirror-model';\n\nexport class MarkStrong extends Mark {\n  override name = 'strong';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      parseDOM: [\n        { tag: 'strong' },\n        // This works around a Google Docs misbehavior where\n        // pasted content will be inexplicably wrapped in `<b>`\n        // tags with a font-weight normal.\n        {\n          tag: 'b',\n          getAttrs: (node: HTMLElement) =>\n            node.style.fontWeight != 'normal' && null,\n        },\n        { style: 'font-weight=400', clearMark: (m) => m.type.name == 'strong' },\n        {\n          style: 'font-weight',\n          getAttrs: (value: string) =>\n            /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null,\n        },\n      ],\n      toDOM() {\n        return ['strong', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleStrong': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-b': 'toggleStrong',\n      'Mod-B': 'toggleStrong',\n    };\n  }\n}\n","import { type CoreEditor, Mark } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport type { MarkSpec, MarkType } from 'prosemirror-model';\n\nexport class MarkItalic extends Mark {\n  override name = 'em';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      parseDOM: [\n        { tag: 'i' },\n        { tag: 'em' },\n        { style: 'font-assets=italic' },\n        { style: 'font-assets=normal', clearMark: (m) => m.type.name == 'em' },\n      ],\n      toDOM() {\n        return ['em', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleItalic': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-i': 'toggleItalic',\n      'Mod-I': 'toggleItalic',\n    };\n  }\n}\n","import { CoreEditor, Mark } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport type { MarkSpec, MarkType } from 'prosemirror-model';\n\nexport class MarkUnderline extends Mark {\n  override name = 'underline';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      parseDOM: [\n        {\n          tag: 'u',\n        },\n      ],\n      toDOM() {\n        return ['u', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleUnderline': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-u': 'toggleUnderline',\n      'Mod-U': 'toggleUnderline',\n    };\n  }\n}\n","import { type CoreEditor, Mark } from '@kerebron/editor';\nimport type { MarkSpec, MarkType } from 'prosemirror-model';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nexport class MarkStrike extends Mark {\n  override name = 'strike';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      parseDOM: [\n        { tag: 'strike' },\n      ],\n      toDOM() {\n        return ['strike', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleStrike': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-s': 'toggleStrike',\n      'Mod-S': 'toggleStrike',\n    };\n  }\n}\n","import type { MarkSpec, MarkType } from 'prosemirror-model';\nimport { type CoreEditor, Mark } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nexport class MarkCode extends Mark {\n  override name = 'code';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      parseDOM: [{ tag: 'code' }],\n      toDOM() {\n        return ['code', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleCode': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-`': 'toggleCode',\n    };\n  }\n}\n","import { MarkSpec } from 'prosemirror-model';\n\nimport { Mark } from '@kerebron/editor';\n\nexport class MarkChange extends Mark {\n  override name = 'change';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      parseDOM: [],\n      toDOM() {\n        return ['change', 0];\n      },\n    };\n  }\n}\n","import { MarkSpec } from 'prosemirror-model';\n\nimport { Mark } from '@kerebron/editor';\n\nexport class MarkBookmark extends Mark {\n  override name = 'bookmark';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      attrs: {\n        id: {},\n      },\n      parseDOM: [],\n      toDOM(mark) {\n        return ['a', { id: mark.attrs.id }, 0];\n      },\n    };\n  }\n}\n","import { type MarkSpec } from 'prosemirror-model';\nimport { Mark } from '@kerebron/editor';\n\n/** Mark for text color (foreground color) */\nexport class MarkTextColor extends Mark {\n  override name = 'textColor';\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      attrs: {\n        color: { default: null },\n      },\n      parseDOM: [\n        {\n          tag: 'span[style*=\"color\"]',\n          getAttrs(dom: HTMLElement) {\n            const color = dom.style.color;\n            return color ? { color } : false;\n          },\n        },\n      ],\n      toDOM(mark) {\n        const { color } = mark.attrs;\n        if (!color) return ['span', 0];\n        return ['span', { style: `color: ${color}` }, 0];\n      },\n    };\n  }\n}\n","import { type MarkSpec } from 'prosemirror-model';\nimport { Mark } from '@kerebron/editor';\n\n/** Mark for text highlight (background color) */\nexport class MarkHighlight extends Mark {\n  override name = 'highlight';\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      attrs: {\n        color: { default: null },\n      },\n      parseDOM: [\n        {\n          tag: 'mark',\n          getAttrs(dom: HTMLElement) {\n            const color = dom.style.backgroundColor;\n            return color ? { color } : { color: 'yellow' };\n          },\n        },\n        {\n          tag: 'span[style*=\"background-color\"]',\n          getAttrs(dom: HTMLElement) {\n            const color = dom.style.backgroundColor;\n            return color ? { color } : false;\n          },\n        },\n      ],\n      toDOM(mark) {\n        const { color } = mark.attrs;\n        const bgColor = color || 'yellow';\n        return ['mark', {\n          style: `background-color: ${bgColor}; color: inherit;`,\n        }, 0];\n      },\n    };\n  }\n}\n","import { type CoreEditor, Mark } from '@kerebron/editor';\nimport type { MarkSpec, MarkType } from 'prosemirror-model';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nexport class MarkSuperscript extends Mark {\n  override name = 'superscript';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      excludes: 'subscript',\n      parseDOM: [\n        { tag: 'sup' },\n        {\n          style: 'vertical-align',\n          getAttrs: (value) => value === 'super' && null,\n        },\n      ],\n      toDOM() {\n        return ['sup', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleSuperscript': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-Shift-.': 'toggleSuperscript',\n    };\n  }\n}\n","import { type CoreEditor, Mark } from '@kerebron/editor';\nimport type { MarkSpec, MarkType } from 'prosemirror-model';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nexport class MarkSubscript extends Mark {\n  override name = 'subscript';\n  requires = ['doc'];\n\n  override getMarkSpec(): MarkSpec {\n    return {\n      excludes: 'superscript',\n      parseDOM: [\n        { tag: 'sub' },\n        {\n          style: 'vertical-align',\n          getAttrs: (value) => value === 'sub' && null,\n        },\n      ],\n      toDOM() {\n        return ['sub', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: MarkType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleSubscript': () => editor.commandFactories.toggleMark(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-Shift-,': 'toggleSubscript',\n    };\n  }\n}\n","import { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { CoreEditor, Node } from '@kerebron/editor';\nimport { CommandFactories, CommandFactory } from '@kerebron/editor/commands';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nexport class NodeDocument extends Node {\n  override name = 'doc';\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'block+',\n      attrs: {\n        meta: { default: null },\n      },\n      marks: 'code em strong link bookmark', // TODO: why is it necessary for convertCodeParagraphsToCodeBlocks?\n      EMPTY_DOC: {\n        'type': this.name,\n        'content': [\n          {\n            'type': 'paragraph',\n            'content': [],\n          },\n        ],\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const getMeta: CommandFactory = (cb: (meta: any) => void) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        cb(structuredClone(state.doc.attrs.meta));\n        return true;\n      };\n    };\n\n    const setMeta: CommandFactory = (meta: any) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n\n        tr.setDocAttribute('meta', meta);\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return tr.docChanged;\n      };\n    };\n\n    const updateMeta: CommandFactory = (\n      updater: (meta: unknown) => unknown,\n    ) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n\n        tr.setDocAttribute('meta', updater(state.doc.attrs.meta));\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return tr.docChanged;\n      };\n    };\n    return {\n      getMeta,\n      setMeta,\n      updateMeta,\n    };\n  }\n}\n","import { NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeText extends Node {\n  override name = 'text';\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      group: 'inline',\n    };\n  }\n}\n","import { Attrs, Fragment, Node, NodeType } from 'prosemirror-model';\nimport { canJoin, findWrapping } from 'prosemirror-transform';\n\nimport { InputRule } from './InputRulesPlugin.ts';\nimport { Command } from '../../commands/types.ts';\nimport { Transaction } from 'prosemirror-state';\n\n/// Build an input rule for automatically wrapping a textblock when a\n/// given string is typed. The `regexp` argument is\n/// directly passed through to the `InputRule` constructor. You'll\n/// probably want the regexp to start with `^`, so that the pattern can\n/// only occur at the start of a textblock.\n///\n/// `nodeType` is the type of node to wrap in. If it needs attributes,\n/// you can either pass them directly, or pass a function that will\n/// compute them from the regular expression match.\n///\n/// By default, if there's a node with the same type above the newly\n/// wrapped node, the rule will try to [join](#transform.Transform.join) those\n/// two nodes. You can pass a join predicate, which takes a regular\n/// expression match and the node before the wrapped node, and can\n/// return a boolean to indicate whether a join should happen.\nexport function wrappingInputRule(\n  regexp: RegExp,\n  nodeType: NodeType,\n  getAttrs: Attrs | null | ((matches: RegExpMatchArray) => Attrs | null) = null,\n  joinPredicate?: (match: RegExpMatchArray, node: Node) => boolean,\n) {\n  return new InputRule(regexp, (tr, state, match, start, end) => {\n    if (!tr) {\n      tr = state.tr;\n    }\n    const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n    tr = tr.delete(start, end);\n    const $start = tr.doc.resolve(start);\n    const range = $start.blockRange();\n    const wrapping = range && findWrapping(range, nodeType, attrs);\n    if (!wrapping) return null;\n    tr.wrap(range!, wrapping);\n    const before = tr.doc.resolve(start - 1).nodeBefore;\n    if (\n      before && before.type == nodeType && canJoin(tr.doc, start - 1) &&\n      (!joinPredicate || joinPredicate(match, before))\n    ) {\n      tr.join(start - 1);\n    }\n    return tr;\n  });\n}\n\n/// Build an input rule that changes the type of a textblock when the\n/// matched text is typed into it. You'll usually want to start your\n/// regexp with `^` to that it is only matched at the start of a\n/// textblock. The optional `getAttrs` parameter can be used to compute\n/// the new node's attributes, and works the same as in the\n/// `wrappingInputRule` function.\nexport function textblockTypeInputRule(\n  regexp: RegExp,\n  nodeType: NodeType,\n  getAttrs: Attrs | null | ((match: RegExpMatchArray) => Attrs | null) = null,\n) {\n  return new InputRule(regexp, (tr, state, match, start, end) => {\n    if (!tr) {\n      tr = state.tr;\n    }\n    const $start = state.doc.resolve(start);\n    const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n    if (\n      !$start.node(-1).canReplaceWith(\n        $start.index(-1),\n        $start.indexAfter(-1),\n        nodeType,\n      )\n    ) return null;\n    return tr\n      .delete(start, end)\n      .setBlockType(start, start, nodeType, attrs);\n  });\n}\n\nexport function commandInputRule(\n  regexp: RegExp,\n  command: Command,\n  getAttrs: Attrs | null | ((match: RegExpMatchArray) => Attrs | null) = null,\n) {\n  return new InputRule(regexp, (tr, state, match, start, end) => {\n    if (!tr) {\n      tr = state.tr;\n    }\n    const $start = state.doc.resolve(start);\n\n    const dispatch = (newTr: Transaction) => {\n      tr = newTr;\n      state = state.apply(tr);\n    };\n\n    dispatch(tr.delete(start, end));\n    command(state, dispatch);\n\n    return tr;\n  });\n}\n\nexport function replaceInlineNode(\n  regexp: RegExp,\n  nodeType: NodeType,\n  getAttrs: Attrs | null | ((matches: RegExpMatchArray) => Attrs | null) = null,\n) {\n  return new InputRule(regexp, (tr, state, match, start, end) => {\n    if (!tr) {\n      tr = state.tr;\n    }\n\n    const $pos = state.doc.resolve(start);\n    if ($pos.parent.type === state.schema.nodes.code_block) {\n      return tr;\n    }\n\n    const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n    const node = nodeType.createAndFill(attrs);\n\n    return tr.replaceWith(\n      tr.mapping.map(start),\n      tr.mapping.map(end),\n      Fragment.from(node),\n    );\n  });\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\nimport {\n  type InputRule,\n  textblockTypeInputRule,\n} from '@kerebron/editor/plugins/input-rules';\n\nexport class NodeCodeBlock extends Node {\n  override name = 'code_block';\n\n  override getNodeSpec(): NodeSpec {\n    // const langs = this.config.languageWhitelist || LANGS;\n\n    return {\n      content: 'text*',\n      marks: '',\n      group: 'block',\n      code: true,\n      defining: true,\n      attrs: { lang: { default: undefined } },\n      parseDOM: [\n        {\n          tag: 'pre',\n          preserveWhitespace: 'full',\n          getAttrs(dom: HTMLElement) {\n            let lang = dom.getAttribute('lang');\n\n            // if (!lang) {\n            //   for (const className of dom.classList) {\n            //     if (\n            //       className.startsWith('lang-') &&\n            //       langs.indexOf(className.substring('lang-'.length)) > -1\n            //     ) {\n            //       lang = className.substring('lang-'.length);\n            //       break;\n            //     }\n            //   }\n            // }\n\n            return {\n              lang,\n            };\n          },\n        },\n      ],\n      toDOM(node) {\n        const { lang } = node.attrs;\n        return ['pre', { lang }, ['code', 0]];\n      },\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    /// Given a code block node type, returns an input rule that turns a\n    /// textblock starting with three backticks into a code block.\n    return [\n      textblockTypeInputRule(/^```$/, type),\n    ];\n  }\n}\n","import { NodeSpec } from 'prosemirror-model';\n\nimport { NESTING_SELF_CLOSING, Node } from '@kerebron/editor';\n\nexport class NodeBookmark extends Node {\n  override name = 'node_bookmark';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      group: 'inline',\n      selectable: false,\n      atom: true,\n      attrs: {\n        id: {},\n        nesting: {\n          default: NESTING_SELF_CLOSING,\n        },\n      },\n      parseDOM: [],\n      toDOM(mark) {\n        return ['a', { id: mark.attrs.id }, 0];\n      },\n    };\n  }\n}\n","import { type NodeSpec, type NodeType } from 'prosemirror-model';\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nexport type TextAlign = 'left' | 'center' | 'right' | 'justify' | undefined;\n\nexport class NodeParagraph extends Node {\n  override name = 'paragraph';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'inline*',\n      group: 'block',\n      attrs: {\n        textAlign: { default: undefined },\n      },\n      parseDOM: [\n        {\n          tag: 'p',\n          getAttrs(dom) {\n            const element = dom as HTMLElement;\n            const style = element.style.textAlign;\n            if (\n              style === 'center' || style === 'right' || style === 'justify'\n            ) {\n              return { textAlign: style };\n            }\n            return false;\n          },\n        },\n      ],\n      toDOM(node) {\n        const align = node.attrs.textAlign || 'left';\n        if (['center', 'right', 'justify'].includes(align)) {\n          return ['p', { style: `text-align: ${align}` }, 0];\n        }\n        return ['p', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'setParagraph': () => editor.commandFactories.setBlockType(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Shift-Ctrl-0': 'setParagraph',\n    };\n  }\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { firstCommand } from '@kerebron/editor/commands';\n\nexport class NodeHardBreak extends Node {\n  override name = 'br';\n  requires = ['doc'];\n\n  options = {\n    keepMarks: true,\n  };\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      group: 'inline',\n      selectable: false,\n      linebreakReplacement: true,\n      parseDOM: [{ tag: 'br' }],\n      toDOM() {\n        return ['br'];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    // TODO: refactor commands\n    // const comm2: Command = (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    //   const { selection, storedMarks } = state\n\n    //   if (selection.$from.parent.type.spec.isolating) {\n    //       return false\n    //   }\n\n    //   const { keepMarks } = this.options\n    //   // const { splittableMarks } = editor.extensionManager\n    //   const splittableMarks = [];\n    //   const marks = storedMarks\n    //       || (selection.$to.parentOffset && selection.$from.marks())\n\n    //   return editor.chain()\n    //     .insertContent({ type: this.name })\n    //     .command(({ tr, dispatch }) => {\n    //         if (dispatch && marks && keepMarks) {\n    //           for (const mark of marks) {\n    //             console.log('mteset', mark.type);\n    //           }\n    //             const filteredMarks = marks\n    //                 .filter(mark => splittableMarks.includes(mark.type.name))\n\n    //             tr.ensureMarks(filteredMarks)\n    //         }\n\n    //         return true\n    //     })\n    //     .run();\n    // }\n\n    const setHardBreak = firstCommand(\n      editor.run.exitCode,\n      // comm2\n    );\n\n    return {\n      'setHardBreak': () => setHardBreak,\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    // https://stackoverflow.com/a/73619128\n    const mac = typeof navigator != 'undefined'\n      ? /Mac|iP(hone|[oa]d)/.test(navigator?.platform)\n      : false;\n\n    const shortcuts: Partial<CommandShortcuts> = {\n      'Ctrl-Enter': 'setHardBreak',\n    };\n    if (mac) {\n      shortcuts['Mod-Enter'] = 'setHardBreak';\n      shortcuts['Shift-Enter'] = 'setHardBreak';\n    }\n\n    return shortcuts;\n  }\n}\n","import type { NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeSoftBreak extends Node {\n  override name = 'softbreak';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      group: 'inline',\n      selectable: false,\n      parseDOM: [{ tag: 'wbr' }],\n      toDOM() {\n        return ['wbr'];\n      },\n    };\n  }\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport type {\n  CommandFactories,\n  CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nexport class NodeHorizontalRule extends Node {\n  override name = 'hr';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      group: 'inline',\n      parseDOM: [{ tag: 'hr' }],\n      toDOM() {\n        return ['hr'];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'setHorizontalRule': () => (state, dispatch) => {\n        if (dispatch) {\n          dispatch(\n            state.tr.replaceSelectionWith(type.create()).scrollIntoView(),\n          );\n        }\n        return true;\n      },\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Mod-_': 'setHorizontalRule',\n    };\n  }\n}\n","import type { Node as PmNode, NodeSpec } from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\nimport type { EditorView, NodeViewConstructor } from 'prosemirror-view';\n\nimport { Node } from '@kerebron/editor';\nimport type { CoreEditor } from '@kerebron/editor';\n\nexport class NodeImage extends Node {\n  override name = 'image';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      attrs: {\n        src: {},\n        alt: { default: null },\n        title: { default: null },\n        width: { default: null },\n        height: { default: null },\n        origUrl: { default: undefined },\n        mdTemplate: { default: undefined },\n      },\n      group: 'inline',\n      draggable: true,\n      parseDOM: [\n        {\n          tag: 'img[src]',\n          getAttrs(dom: HTMLElement) {\n            return {\n              src: dom.getAttribute('src'),\n              title: dom.getAttribute('title'),\n              alt: dom.getAttribute('alt'),\n              width: dom.getAttribute('width') || dom.style.width || null,\n              height: dom.getAttribute('height') || dom.style.height || null,\n            };\n          },\n        },\n      ],\n      toDOM(node) {\n        const { src, alt, title, width, height } = node.attrs;\n        const attrs: Record<string, string> = { src };\n        if (alt) attrs.alt = alt;\n        if (title) attrs.title = title;\n        if (width) attrs.width = width;\n        if (height) attrs.height = height;\n        return ['img', attrs];\n      },\n    };\n  }\n\n  override getNodeView(editor: CoreEditor): NodeViewConstructor {\n    return (node: PmNode, view: EditorView, getPos) => {\n      // Create wrapper div for the image with resize handles\n      const wrapper = document.createElement('span');\n      wrapper.className = 'kb-image-wrapper';\n      wrapper.contentEditable = 'false';\n\n      // Create the image element\n      const img = document.createElement('img');\n      img.src = node.attrs.src;\n      if (node.attrs.alt) img.alt = node.attrs.alt;\n      if (node.attrs.title) img.title = node.attrs.title;\n      if (node.attrs.width) {\n        img.style.width = typeof node.attrs.width === 'number'\n          ? `${node.attrs.width}px`\n          : node.attrs.width;\n      }\n      if (node.attrs.height) {\n        img.style.height = typeof node.attrs.height === 'number'\n          ? `${node.attrs.height}px`\n          : node.attrs.height;\n      }\n      img.draggable = false;\n\n      wrapper.appendChild(img);\n\n      // Create resize handles\n      const positions = ['nw', 'ne', 'sw', 'se'] as const;\n      const handles: HTMLElement[] = [];\n\n      for (const pos of positions) {\n        const handle = document.createElement('span');\n        handle.className =\n          `kb-image-resize-handle kb-image-resize-handle-${pos}`;\n        handle.dataset.position = pos;\n        handles.push(handle);\n        wrapper.appendChild(handle);\n      }\n\n      let isResizing = false;\n      let startX = 0;\n      let startY = 0;\n      let startWidth = 0;\n      let startHeight = 0;\n      let aspectRatio = 1;\n      let activeHandle: string | null = null;\n\n      const onMouseDown = (e: MouseEvent) => {\n        const target = e.target as HTMLElement;\n        if (!target.classList.contains('kb-image-resize-handle')) return;\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        isResizing = true;\n        activeHandle = target.dataset.position || null;\n        startX = e.clientX;\n        startY = e.clientY;\n\n        const rect = img.getBoundingClientRect();\n        startWidth = rect.width;\n        startHeight = rect.height;\n        aspectRatio = startWidth / startHeight;\n\n        wrapper.classList.add('kb-image-resizing');\n\n        document.addEventListener('mousemove', onMouseMove);\n        document.addEventListener('mouseup', onMouseUp);\n      };\n\n      const onMouseMove = (e: MouseEvent) => {\n        if (!isResizing) return;\n\n        const deltaX = e.clientX - startX;\n        const deltaY = e.clientY - startY;\n\n        let newWidth = startWidth;\n        let newHeight = startHeight;\n\n        // Calculate new dimensions based on which handle is being dragged\n        switch (activeHandle) {\n          case 'se':\n            newWidth = startWidth + deltaX;\n            newHeight = e.shiftKey\n              ? startHeight + deltaY\n              : newWidth / aspectRatio;\n            break;\n          case 'sw':\n            newWidth = startWidth - deltaX;\n            newHeight = e.shiftKey\n              ? startHeight + deltaY\n              : newWidth / aspectRatio;\n            break;\n          case 'ne':\n            newWidth = startWidth + deltaX;\n            newHeight = e.shiftKey\n              ? startHeight - deltaY\n              : newWidth / aspectRatio;\n            break;\n          case 'nw':\n            newWidth = startWidth - deltaX;\n            newHeight = e.shiftKey\n              ? startHeight - deltaY\n              : newWidth / aspectRatio;\n            break;\n        }\n\n        // Ensure minimum size\n        newWidth = Math.max(50, newWidth);\n        newHeight = Math.max(50, newHeight);\n\n        img.style.width = `${Math.round(newWidth)}px`;\n        img.style.height = `${Math.round(newHeight)}px`;\n      };\n\n      const onMouseUp = () => {\n        if (!isResizing) return;\n\n        isResizing = false;\n        activeHandle = null;\n        wrapper.classList.remove('kb-image-resizing');\n\n        document.removeEventListener('mousemove', onMouseMove);\n        document.removeEventListener('mouseup', onMouseUp);\n\n        // Get the new dimensions and update the node\n        const newWidth = Math.round(img.getBoundingClientRect().width);\n        const newHeight = Math.round(img.getBoundingClientRect().height);\n\n        const pos = getPos();\n        if (typeof pos === 'number') {\n          const tr = view.state.tr.setNodeMarkup(pos, undefined, {\n            ...node.attrs,\n            width: `${newWidth}px`,\n            height: `${newHeight}px`,\n          });\n          view.dispatch(tr);\n        }\n      };\n\n      wrapper.addEventListener('mousedown', onMouseDown);\n\n      // Add click handler to select the image\n      wrapper.addEventListener('click', (e) => {\n        e.preventDefault();\n        const pos = getPos();\n        if (typeof pos === 'number') {\n          const $pos = view.state.doc.resolve(pos);\n          const selection = Selection.near($pos);\n          view.dispatch(view.state.tr.setSelection(selection));\n        }\n      });\n\n      return {\n        dom: wrapper,\n        update: (updatedNode: PmNode) => {\n          if (updatedNode.type.name !== 'image') return false;\n\n          img.src = updatedNode.attrs.src;\n          if (updatedNode.attrs.alt) img.alt = updatedNode.attrs.alt;\n          if (updatedNode.attrs.title) img.title = updatedNode.attrs.title;\n          if (updatedNode.attrs.width) {\n            img.style.width = typeof updatedNode.attrs.width === 'number'\n              ? `${updatedNode.attrs.width}px`\n              : updatedNode.attrs.width;\n          } else {\n            img.style.width = '';\n          }\n          if (updatedNode.attrs.height) {\n            img.style.height = typeof updatedNode.attrs.height === 'number'\n              ? `${updatedNode.attrs.height}px`\n              : updatedNode.attrs.height;\n          } else {\n            img.style.height = '';\n          }\n\n          return true;\n        },\n        destroy: () => {\n          wrapper.removeEventListener('mousedown', onMouseDown);\n          document.removeEventListener('mousemove', onMouseMove);\n          document.removeEventListener('mouseup', onMouseUp);\n        },\n        stopEvent: (event: Event) => {\n          // Allow selection events to pass through\n          return event.type === 'mousedown' &&\n            (event.target as HTMLElement).classList.contains(\n              'kb-image-resize-handle',\n            );\n        },\n        ignoreMutation: () => true,\n      };\n    };\n  }\n}\n","import { type NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeVideo extends Node {\n  override name = 'video';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      attrs: {\n        src: {},\n        title: { default: null },\n        controls: { default: true },\n        width: { default: null },\n        height: { default: null },\n      },\n      group: 'block',\n      draggable: true,\n      parseDOM: [\n        {\n          tag: 'video[src]',\n          getAttrs(dom: HTMLElement) {\n            return {\n              src: dom.getAttribute('src'),\n              title: dom.getAttribute('title'),\n              controls: dom.hasAttribute('controls'),\n              width: dom.getAttribute('width'),\n              height: dom.getAttribute('height'),\n            };\n          },\n        },\n      ],\n      toDOM(node) {\n        const { src, title, controls, width, height } = node.attrs;\n        const attrs: any = { src };\n        if (title) attrs.title = title;\n        if (controls) attrs.controls = ''; // Boolean attribute - just needs to be present\n        if (width) attrs.width = width;\n        if (height) attrs.height = height;\n        return ['video', attrs];\n      },\n    };\n  }\n}\n","import { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport {\n  InputRule,\n  wrappingInputRule,\n} from '@kerebron/editor/plugins/input-rules';\n\nexport class NodeBlockquote extends Node {\n  override name = 'blockquote';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'block+',\n      group: 'block',\n      defining: true,\n      parseDOM: [{ tag: 'blockquote' }],\n      toDOM() {\n        return ['blockquote', 0];\n      },\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    return [\n      /// Given a blockquote node type, returns an input rule that turns `\"> \"`\n      /// at the start of a textblock into a blockquote.\n      wrappingInputRule(/^\\s*>\\s$/, type),\n    ];\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleBlockquote': () => editor.commandFactories.wrapInList(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Ctrl->': 'toggleBlockquote',\n    };\n  }\n}\n","import { NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeAside extends Node {\n  override name = 'aside';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'block+',\n      group: 'block',\n      defining: true,\n      parseDOM: [{ tag: 'aside' }],\n      toDOM() {\n        return ['aside', 0];\n      },\n    };\n  }\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport {\n  type InputRule,\n  textblockTypeInputRule,\n} from '@kerebron/editor/plugins/input-rules';\n\nconst maxLevel = 6;\n\nexport class NodeHeading extends Node {\n  override name = 'heading';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      attrs: { level: { default: 1 } },\n      content: 'inline*',\n      group: 'block',\n      defining: true,\n      parseDOM: [\n        { tag: 'h1', attrs: { level: 1 } },\n        { tag: 'h2', attrs: { level: 2 } },\n        { tag: 'h3', attrs: { level: 3 } },\n        { tag: 'h4', attrs: { level: 4 } },\n        { tag: 'h5', attrs: { level: 5 } },\n        { tag: 'h6', attrs: { level: 6 } },\n      ],\n      toDOM(node) {\n        return ['h' + node.attrs.level, 0];\n      },\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    /// Given a node type and a maximum level, creates an input rule that\n    /// turns up to that number of `#` characters followed by a space at\n    /// the start of a textblock into a heading whose level corresponds to\n    /// the number of `#` signs.\n    return [\n      textblockTypeInputRule(\n        new RegExp('^(#{1,' + maxLevel + '})\\\\s$'),\n        type,\n        (match) => ({ level: match[1].length }),\n      ),\n    ];\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const commands: Partial<CommandFactories> = {};\n\n    for (let i = 1; i <= maxLevel; i++) {\n      commands['setHeading' + i] = () =>\n        editor.commandFactories.setBlockType(type, { level: i });\n    }\n\n    return commands;\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    const keys: Partial<CommandShortcuts> = {};\n\n    for (let i = 1; i <= maxLevel; i++) {\n      keys['Shift-Ctrl-' + i] = 'setHeading' + i;\n    }\n\n    return keys;\n  }\n}\n","/**\n * This is the ParseError class, which is the main error thrown by Temml\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError {\n  constructor(\n    message, // The error message\n    token // An object providing position information\n  ) {\n    let error = \" \" + message;\n    let start;\n\n    const loc = token && token.loc;\n    if (loc && loc.start <= loc.end) {\n      // If we have the input and a position, make the error a bit fancier\n\n      // Get the input\n      const input = loc.lexer.input;\n\n      // Prepend some information\n      start = loc.start;\n      const end = loc.end;\n      if (start === input.length) {\n        error += \" at end of input: \";\n      } else {\n        error += \" at position \" + (start + 1) + \": \\n\";\n      }\n\n      // Underline token in question using combining underscores\n      const underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n\n      // Extract some context from the input and add it to the error\n      let left;\n      if (start > 15) {\n        left = \"…\" + input.slice(start - 15, start);\n      } else {\n        left = input.slice(0, start);\n      }\n      let right;\n      if (end + 15 < input.length) {\n        right = input.slice(end, end + 15) + \"…\";\n      } else {\n        right = input.slice(end);\n      }\n      error += left + underlined + right;\n    }\n\n    // Some hackery to make ParseError a prototype of Error\n    // See http://stackoverflow.com/a/8460753\n    const self = new Error(error);\n    self.name = \"ParseError\";\n    self.__proto__ = ParseError.prototype;\n    self.position = start;\n    return self;\n  }\n}\n\nParseError.prototype.__proto__ = Error.prototype;\n\n//\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n\n/**\n * Provide a default value if a setting is undefined\n */\nconst deflt = function(setting, defaultIfUndefined) {\n  return setting === undefined ? defaultIfUndefined : setting;\n};\n\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\n\nconst uppercase = /([A-Z])/g;\nconst hyphenate = function(str) {\n  return str.replace(uppercase, \"-$1\").toLowerCase();\n};\n\nconst ESCAPE_LOOKUP = {\n  \"&\": \"&amp;\",\n  \">\": \"&gt;\",\n  \"<\": \"&lt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&#x27;\"\n};\n\nconst ESCAPE_REGEX = /[&><\"']/g;\n\n/**\n * Escapes text to prevent scripting attacks.\n */\nfunction escape(text) {\n  return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\n\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nconst getBaseElem = function(group) {\n  if (group.type === \"ordgroup\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"color\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"font\") {\n    return getBaseElem(group.body);\n  } else {\n    return group;\n  }\n};\n\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nconst isCharacterBox = function(group) {\n  const baseElem = getBaseElem(group);\n\n  // These are all the types of groups which hold single characters\n  return baseElem.type === \"mathord\" || baseElem.type === \"textord\" || baseElem.type === \"atom\"\n};\n\nconst assert = function(value) {\n  if (!value) {\n    throw new Error(\"Expected non-null, but got \" + String(value));\n  }\n  return value;\n};\n\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nconst protocolFromUrl = function(url) {\n  // Check for possible leading protocol.\n  // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n  // (\\x00) or C0 control (\\x00-\\x1F) characters.\n  // eslint-disable-next-line no-control-regex\n  const protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);\n  if (!protocol) {\n    return \"_relative\";\n  }\n  // Reject weird colons\n  if (protocol[2] !== \":\") {\n    return null;\n  }\n  // Reject invalid characters in scheme according to\n  // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n  if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n    return null;\n  }\n  // Lowercase the protocol\n  return protocol[1].toLowerCase();\n};\n\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook\n * gives an acceptable rounding error of 100sp (which would be the nearest\n * 1/6551.6em with our ptPerEm = 10):\n * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69\n */\nconst round = function(n) {\n  return +n.toFixed(4);\n};\n\n// Identify short letters. Used for accents and \\cancelto.\nconst smalls = \"acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳\";\n\n/**\n * This is a module for storing settings passed into Temml. It correctly handles\n * default settings.\n */\n\n\n/**\n * The main Settings object\n */\nclass Settings {\n  constructor(options) {\n    // allow null options\n    options = options || {};\n    this.displayMode = deflt(options.displayMode, false);    // boolean\n    this.annotate = deflt(options.annotate, false);           // boolean\n    this.leqno = deflt(options.leqno, false);                // boolean\n    this.throwOnError = deflt(options.throwOnError, false);  // boolean\n    this.errorColor = deflt(options.errorColor, \"#b22222\");  // string\n    this.macros = options.macros || {};\n    this.wrap = deflt(options.wrap, \"none\");                   // \"none\" | \"tex\" | \"=\"\n    this.xml = deflt(options.xml, false);                     // boolean\n    this.colorIsTextColor = deflt(options.colorIsTextColor, false);  // boolean\n    this.strict = deflt(options.strict, false);    // boolean\n    this.trust = deflt(options.trust, false);  // trust context. See html.js.\n    this.maxSize = (options.maxSize === undefined\n      ? [Infinity, Infinity]\n      : Array.isArray(options.maxSize)\n      ? options.maxSize\n      : [Infinity, Infinity]\n    );\n    this.maxExpand = Math.max(0, deflt(options.maxExpand, 1000)); // number\n    this.wrapDelimiterPairs = true; // boolean\n  }\n\n  /**\n   * Check whether to test potentially dangerous input, and return\n   * `true` (trusted) or `false` (untrusted).  The sole argument `context`\n   * should be an object with `command` field specifying the relevant LaTeX\n   * command (as a string starting with `\\`), and any other arguments, etc.\n   * If `context` has a `url` field, a `protocol` field will automatically\n   * get added by this function (changing the specified object).\n   */\n  isTrusted(context) {\n    if (context.url && !context.protocol) {\n      const protocol = protocolFromUrl(context.url);\n      if (protocol == null) {\n        return false\n      }\n      context.protocol = protocol;\n    }\n    const trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n    return Boolean(trust);\n  }\n}\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nconst _functions = {};\n\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nconst _mathmlGroupBuilders = {};\n\nfunction defineFunction({\n  type,\n  names,\n  props,\n  handler,\n  mathmlBuilder\n}) {\n  // Set default values of functions\n  const data = {\n    type,\n    numArgs: props.numArgs,\n    argTypes: props.argTypes,\n    allowedInArgument: !!props.allowedInArgument,\n    allowedInText: !!props.allowedInText,\n    allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n    numOptionalArgs: props.numOptionalArgs || 0,\n    infix: !!props.infix,\n    primitive: !!props.primitive,\n    handler: handler\n  };\n  for (let i = 0; i < names.length; ++i) {\n    _functions[names[i]] = data;\n  }\n  if (type) {\n    if (mathmlBuilder) {\n      _mathmlGroupBuilders[type] = mathmlBuilder;\n    }\n  }\n}\n\n/**\n * Use this to register only the MathML builder for a function(e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders({ type, mathmlBuilder }) {\n  defineFunction({\n    type,\n    names: [],\n    props: { numArgs: 0 },\n    handler() {\n      throw new Error(\"Should never be called.\")\n    },\n    mathmlBuilder\n  });\n}\n\nconst normalizeArgument = function(arg) {\n  return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg\n};\n\n// Since the corresponding buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nconst ordargument = function(arg) {\n  return arg.type === \"ordgroup\" ? arg.body : [arg]\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n  constructor(children) {\n    this.children = children;\n    this.classes = [];\n    this.style = {};\n  }\n\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n\n  /** Convert the fragment into a node. */\n  toNode() {\n    const frag = document.createDocumentFragment();\n\n    for (let i = 0; i < this.children.length; i++) {\n      frag.appendChild(this.children[i].toNode());\n    }\n\n    return frag;\n  }\n\n  /** Convert the fragment into HTML markup. */\n  toMarkup() {\n    let markup = \"\";\n\n    // Simply concatenate the markup for the children together.\n    for (let i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n\n    return markup;\n  }\n\n  /**\n   * Converts the math node into a string, similar to innerText. Applies to\n   * MathDomNode's only.\n   */\n  toText() {\n    // To avoid this, we would subclass documentFragment separately for\n    // MathML, but polyfills for subclassing is expensive per PR 1469.\n    const toText = (child) => child.toText();\n    return this.children.map(toText).join(\"\");\n  }\n}\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n */\n\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nconst createClass = function(classes) {\n  return classes.filter((cls) => cls).join(\" \");\n};\n\nconst initNode = function(classes, style) {\n  this.classes = classes || [];\n  this.attributes = {};\n  this.style = style || {};\n};\n\n/**\n * Convert into an HTML node\n */\nconst toNode = function(tagName) {\n  const node = document.createElement(tagName);\n\n  // Apply the class\n  node.className = createClass(this.classes);\n\n  // Apply inline styles\n  for (const style in this.style) {\n    if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n      node.style[style] = this.style[style];\n    }\n  }\n\n  // Apply attributes\n  for (const attr in this.attributes) {\n    if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n  }\n\n  // Append the children, also as HTML nodes\n  for (let i = 0; i < this.children.length; i++) {\n    node.appendChild(this.children[i].toNode());\n  }\n\n  return node;\n};\n\n/**\n * Convert into an HTML markup string\n */\nconst toMarkup = function(tagName) {\n  let markup = `<${tagName}`;\n\n  // Add the class\n  if (this.classes.length) {\n    markup += ` class=\"${escape(createClass(this.classes))}\"`;\n  }\n\n  let styles = \"\";\n\n  // Add the styles, after hyphenation\n  for (const style in this.style) {\n    if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n      styles += `${hyphenate(style)}:${this.style[style]};`;\n    }\n  }\n\n  if (styles) {\n    markup += ` style=\"${styles}\"`;\n  }\n\n  // Add the attributes\n  for (const attr in this.attributes) {\n    if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n      markup += ` ${attr}=\"${escape(this.attributes[attr])}\"`;\n    }\n  }\n\n  markup += \">\";\n\n  // Add the markup of the children, also as markup\n  for (let i = 0; i < this.children.length; i++) {\n    markup += this.children[i].toMarkup();\n  }\n\n  markup += `</${tagName}>`;\n\n  return markup;\n};\n\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style.\n *\n */\nclass Span {\n  constructor(classes, children, style) {\n    initNode.call(this, classes, style);\n    this.children = children || [];\n  }\n\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n\n  toNode() {\n    return toNode.call(this, \"span\");\n  }\n\n  toMarkup() {\n    return toMarkup.call(this, \"span\");\n  }\n}\n\nlet TextNode$1 = class TextNode {\n  constructor(text) {\n    this.text = text;\n  }\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n  toMarkup() {\n    return escape(this.text);\n  }\n};\n\n// Create an <a href=\"…\"> node.\nclass AnchorNode {\n  constructor(href, classes, children) {\n    this.href = href;\n    this.classes = classes;\n    this.children = children || [];\n  }\n\n  toNode() {\n    const node = document.createElement(\"a\");\n    node.setAttribute(\"href\", this.href);\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n    for (let i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n    return node\n  }\n\n  toMarkup() {\n    let markup = `<a href='${escape(this.href)}'`;\n    if (this.classes.length > 0) {\n      markup += ` class=\"${escape(createClass(this.classes))}\"`;\n    }\n    markup += \">\";\n    for (let i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</a>\";\n    return markup\n  }\n}\n\n/*\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n  constructor(src, alt, style) {\n    this.alt = alt;\n    this.src = src;\n    this.classes = [\"mord\"];\n    this.style = style;\n  }\n\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n\n  toNode() {\n    const node = document.createElement(\"img\");\n    node.src = this.src;\n    node.alt = this.alt;\n    node.className = \"mord\";\n\n    // Apply inline styles\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        node.style[style] = this.style[style];\n      }\n    }\n\n    return node;\n  }\n\n  toMarkup() {\n    let markup = `<img src='${this.src}' alt='${this.alt}'`;\n\n    // Add the styles, after hyphenation\n    let styles = \"\";\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        styles += `${hyphenate(style)}:${this.style[style]};`;\n      }\n    }\n    if (styles) {\n      markup += ` style=\"${escape(styles)}\"`;\n    }\n\n    markup += \">\";\n    return markup;\n  }\n}\n\n//\n/**\n * These objects store data about MathML nodes.\n * The `toNode` and `toMarkup` functions  create namespaced DOM nodes and\n * HTML text markup respectively.\n */\n\n\nfunction newDocumentFragment(children) {\n  return new DocumentFragment(children);\n}\n\n/**\n * This node represents a general purpose MathML node of any type,\n * for example, `\"mo\"` or `\"mspace\"`, corresponding to `<mo>` and\n * `<mspace>` tags).\n */\nclass MathNode {\n  constructor(type, children, classes, style) {\n    this.type = type;\n    this.attributes = {};\n    this.children = children || [];\n    this.classes = classes || [];\n    this.style = style || {};   // Used for <mstyle> elements\n    this.label = \"\";\n  }\n\n  /**\n   * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n   * semantic content, so this is used heavily.\n   */\n  setAttribute(name, value) {\n    this.attributes[name] = value;\n  }\n\n  /**\n   * Gets an attribute on a MathML node.\n   */\n  getAttribute(name) {\n    return this.attributes[name];\n  }\n\n  setLabel(value) {\n    this.label = value;\n  }\n\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    const node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n\n    for (const attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        node.setAttribute(attr, this.attributes[attr]);\n      }\n    }\n\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n\n    // Apply inline styles\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        node.style[style] = this.style[style];\n      }\n    }\n\n    for (let i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n\n    return node;\n  }\n\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    let markup = \"<\" + this.type;\n\n    // Add the attributes\n    for (const attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        markup += \" \" + attr + '=\"';\n        markup += escape(this.attributes[attr]);\n        markup += '\"';\n      }\n    }\n\n    if (this.classes.length > 0) {\n      markup += ` class=\"${escape(createClass(this.classes))}\"`;\n    }\n\n    let styles = \"\";\n\n    // Add the styles, after hyphenation\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        styles += `${hyphenate(style)}:${this.style[style]};`;\n      }\n    }\n\n    if (styles) {\n      markup += ` style=\"${styles}\"`;\n    }\n\n    markup += \">\";\n\n    for (let i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n\n    markup += \"</\" + this.type + \">\";\n\n    return markup;\n  }\n\n  /**\n   * Converts the math node into a string, similar to innerText, but escaped.\n   */\n  toText() {\n    return this.children.map((child) => child.toText()).join(\"\");\n  }\n}\n\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n  constructor(text) {\n    this.text = text;\n  }\n\n  /**\n   * Converts the text node into a DOM text node.\n   */\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n\n  /**\n   * Converts the text node into escaped HTML markup\n   * (representing the text itself).\n   */\n  toMarkup() {\n    return escape(this.toText());\n  }\n\n  /**\n   * Converts the text node into a string\n   * (representing the text itself).\n   */\n  toText() {\n    return this.text;\n  }\n}\n\n// Do not make an <mrow> the only child of a <mstyle>.\n// An <mstyle> acts as its own implicit <mrow>.\nconst wrapWithMstyle = expression => {\n  let node;\n  if (expression.length === 1 && expression[0].type === \"mrow\") {\n    node = expression.pop();\n    node.type = \"mstyle\";\n  } else {\n    node = new MathNode(\"mstyle\", expression);\n  }\n  return node\n};\n\n/**\n * This file provides support for building horizontal stretchy elements.\n */\n\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst estimatedWidth = node => {\n  let width = 0;\n  if (node.body && Array.isArray(node.body)) {\n    for (const item of node.body) {\n      width += estimatedWidth(item);\n    }\n  } else if (node.body) {\n    width += estimatedWidth(node.body);\n  } else if (node.type === \"supsub\") {\n    width += estimatedWidth(node.base);\n    if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }\n    if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }\n  } else if (node.type === \"mathord\" || node.type === \"textord\") {\n    for (const ch of node.text.split('')) {\n      const codePoint = ch.codePointAt(0);\n      if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {\n        width += 0.56; // lower case latin or greek. Use advance width of letter n\n      } else if (0x2F < codePoint && codePoint < 0x3A) {\n        width += 0.50; // numerals.\n      } else {\n        width += 0.92; // advance width of letter M\n      }\n    }\n  } else {\n    width += 1.0;\n  }\n  return width\n};\n\nconst stretchyCodePoint = {\n  widehat: \"\\u02c6\", // Shorter than \\u005e, which is appropriate for an accent.\n  widecheck: \"ˇ\",\n  widetilde: \"~\",\n  wideparen: \"⏜\", // \\u23dc\n  utilde: \"~\",\n  overleftarrow: \"\\u2190\",\n  underleftarrow: \"\\u2190\",\n  xleftarrow: \"\\u2190\",\n  overrightarrow: \"\\u2192\",\n  underrightarrow: \"\\u2192\",\n  xrightarrow: \"\\u2192\",\n  underbrace: \"\\u23df\",\n  overbrace: \"\\u23de\",\n  overbracket: \"\\u23b4\",\n  underbracket: \"\\u23b5\",\n  overgroup: \"\\u23e0\",\n  overparen: \"⏜\",\n  undergroup: \"\\u23e1\",\n  underparen: \"\\u23dd\",\n  overleftrightarrow: \"\\u2194\",\n  underleftrightarrow: \"\\u2194\",\n  xleftrightarrow: \"\\u2194\",\n  Overrightarrow: \"\\u21d2\",\n  xRightarrow: \"\\u21d2\",\n  overleftharpoon: \"\\u21bc\",\n  xleftharpoonup: \"\\u21bc\",\n  overrightharpoon: \"\\u21c0\",\n  xrightharpoonup: \"\\u21c0\",\n  xLeftarrow: \"\\u21d0\",\n  xLeftrightarrow: \"\\u21d4\",\n  xhookleftarrow: \"\\u21a9\",\n  xhookrightarrow: \"\\u21aa\",\n  xmapsto: \"\\u21a6\",\n  xrightharpoondown: \"\\u21c1\",\n  xleftharpoondown: \"\\u21bd\",\n  xtwoheadleftarrow: \"\\u219e\",\n  xtwoheadrightarrow: \"\\u21a0\",\n  xlongequal: \"=\",\n  xrightleftarrows: \"\\u21c4\",\n  xtofrom: \"\\u21c4\",\n  xleftrightharpoons: \"\\u21cb\",\n  xrightleftharpoons: \"\\u21cc\",\n  yields: \"\\u2192\",\n  yieldsLeft: \"\\u2190\",\n  mesomerism: \"\\u2194\",\n  longrightharpoonup: \"\\u21c0\",\n  longleftharpoondown: \"\\u21bd\",\n  eqrightharpoonup: \"\\u21c0\",\n  eqleftharpoondown: \"\\u21bd\",\n  \"\\\\cdrightarrow\": \"\\u2192\",\n  \"\\\\cdleftarrow\": \"\\u2190\",\n  \"\\\\cdlongequal\": \"=\",\n  yieldsLeftRight: \"\\u21c4\",\n  chemequilibrium: \"\\u21cc\"\n};\n\nconst mathMLnode = function(label) {\n  const child = new TextNode(stretchyCodePoint[label.slice(1)]);\n  const node = new MathNode(\"mo\", [child]);\n  node.setAttribute(\"stretchy\", \"true\");\n  return node\n};\n\nconst wideHats = [\"\\\\widehat\", \"\\\\widecheck\"];\n\n// TODO: Remove if/when Chromium stretches \\widetilde & \\widehat\nconst accentNode = (group) => {\n  const mo = mathMLnode(group.label);\n  if (group.label.indexOf(\"tilde\") > -1) {\n    const width = estimatedWidth(group.base);\n    if (1 < width && width < 1.6) {\n      mo.classes.push(\"tml-tilde-2\");\n    } else if (1.6 <= width && width < 2.5) {\n      mo.classes.push(\"tml-tilde-3\");\n    } else if (2.5 <= width) {\n      mo.classes.push(\"tml-tilde-4\");\n    }\n  } else if (wideHats.includes(group.label)) {\n    const width = estimatedWidth(group.base);\n    if (0 < width && width <= 1) {\n      mo.classes.push(\"tml-hat-1\");\n    } else if (1 < width && width < 1.6) {\n      mo.classes.push(\"tml-hat-2\");\n    } else if (1.6 <= width && width < 2.5) {\n      mo.classes.push(\"tml-hat-3\");\n    } else if (2.5 <= width) {\n      mo.classes.push(\"tml-hat-4\");\n    }\n  }\n  return mo\n};\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are two properties they can have:\n * - group (required): the ParseNode group type the symbol should have (i.e.\n     \"textord\", \"mathord\", etc).\n * - replace: the character that this symbol or function should be\n *   replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n *   character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nconst ATOMS = {\n  bin: 1,\n  close: 1,\n  inner: 1,\n  open: 1,\n  punct: 1,\n  rel: 1\n};\nconst NON_ATOMS = {\n  \"accent-token\": 1,\n  mathord: 1,\n  \"op-token\": 1,\n  spacing: 1,\n  textord: 1\n};\n\nconst symbols = {\n  math: {},\n  text: {}\n};\n\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, group, replace, name, acceptUnicodeChar) {\n  symbols[mode][name] = { group, replace };\n\n  if (acceptUnicodeChar && replace) {\n    symbols[mode][replace] = symbols[mode][name];\n  }\n}\n\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n\n// modes:\nconst math = \"math\";\nconst text = \"text\";\n\n// groups:\nconst accent = \"accent-token\";\nconst bin = \"bin\";\nconst close = \"close\";\nconst inner = \"inner\";\nconst mathord = \"mathord\";\nconst op = \"op-token\";\nconst open = \"open\";\nconst punct = \"punct\";\nconst rel = \"rel\";\nconst spacing = \"spacing\";\nconst textord = \"textord\";\n\n// Now comes the symbol table\n\n// Relation Symbols\ndefineSymbol(math, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, rel, \"\\u27c2\", \"\\\\perp\", true);\ndefineSymbol(math, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, rel, \"\\u224c\", \"\\\\backcong\", true);\ndefineSymbol(math, rel, \"|\", \"\\\\mid\", true);\ndefineSymbol(math, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, rel, \"\\u220c\", \"\\\\notni\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\owns\");\ndefineSymbol(math, rel, \"\\u2258\", \"\\\\arceq\", true);\ndefineSymbol(math, rel, \"\\u2259\", \"\\\\wedgeq\", true);\ndefineSymbol(math, rel, \"\\u225a\", \"\\\\veeeq\", true);\ndefineSymbol(math, rel, \"\\u225b\", \"\\\\stareq\", true);\ndefineSymbol(math, rel, \"\\u225d\", \"\\\\eqdef\", true);\ndefineSymbol(math, rel, \"\\u225e\", \"\\\\measeq\", true);\ndefineSymbol(math, rel, \"\\u225f\", \"\\\\questeq\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\ne\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\neq\");\n// unicodemath\ndefineSymbol(math, rel, \"\\u2a75\", \"\\\\eqeq\", true);\ndefineSymbol(math, rel, \"\\u2a76\", \"\\\\eqeqeq\", true);\n// mathtools.sty\ndefineSymbol(math, rel, \"\\u2237\", \"\\\\dblcolon\", true);\ndefineSymbol(math, rel, \"\\u2254\", \"\\\\coloneqq\", true);\ndefineSymbol(math, rel, \"\\u2255\", \"\\\\eqqcolon\", true);\ndefineSymbol(math, rel, \"\\u2239\", \"\\\\eqcolon\", true);\ndefineSymbol(math, rel, \"\\u2A74\", \"\\\\Coloneqq\", true);\n\n// Punctuation\ndefineSymbol(math, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, punct, \"\\u00b7\", \"\\\\cdotp\");\n\n// Misc Symbols\ndefineSymbol(math, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, textord, \"\\u2203\", \"\\\\exists\", true);\ndefineSymbol(math, open, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, textord, \"Å\", \"\\\\Angstrom\", true);\ndefineSymbol(text, textord, \"Å\", \"\\\\Angstrom\", true);\ndefineSymbol(math, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, textord, \"\\u2667\", \"\\\\varclubsuit\", true);\ndefineSymbol(math, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, textord, \"\\u2666\", \"\\\\vardiamondsuit\", true);\ndefineSymbol(math, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, textord, \"\\u2665\", \"\\\\varheartsuit\", true);\ndefineSymbol(math, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, textord, \"\\u2664\", \"\\\\varspadesuit\", true);\ndefineSymbol(math, textord, \"\\u2640\", \"\\\\female\", true);\ndefineSymbol(math, textord, \"\\u2642\", \"\\\\male\", true);\ndefineSymbol(math, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, textord, \"\\u00b6\", \"\\\\P\");\ndefineSymbol(text, textord, \"\\u263a\", \"\\\\smiley\", true);\ndefineSymbol(math, textord, \"\\u263a\", \"\\\\smiley\", true);\n\n// Math and Text\ndefineSymbol(math, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n\n// Large Delimiters\ndefineSymbol(math, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, open, \"\\u27ee\", \"\\\\lgroup\", true);\n\n// Binary Operators\ndefineSymbol(math, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\ndefineSymbol(math, bin, \"\\u2AFD\", \"\\\\sslash\", true); // from stmaryrd\n\n// Arrow Symbols\ndefineSymbol(math, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a4\", \"\\\\mapsfrom\", true);\ndefineSymbol(math, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\ndefineSymbol(math, mathord, \"\\u21af\", \"\\\\lightning\", true);\ndefineSymbol(math, mathord, \"\\u220E\", \"\\\\QED\", true);\ndefineSymbol(math, mathord, \"\\u2030\", \"\\\\permil\", true);\ndefineSymbol(text, textord, \"\\u2030\", \"\\\\permil\");\ndefineSymbol(math, mathord, \"\\u2609\", \"\\\\astrosun\", true);\ndefineSymbol(math, mathord, \"\\u263c\", \"\\\\sun\", true);\ndefineSymbol(math, mathord, \"\\u263e\", \"\\\\leftmoon\", true);\ndefineSymbol(math, mathord, \"\\u263d\", \"\\\\rightmoon\", true);\ndefineSymbol(math, mathord, \"\\u2295\", \"\\\\Earth\");\n\n// AMS Negated Binary Relations\ndefineSymbol(math, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceded by \"@\" each have a corresponding macro.\ndefineSymbol(math, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, rel, \"\\u2268\\ufe00\", \"\\\\lvertneqq\");\ndefineSymbol(math, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nshortmid\");\ndefineSymbol(math, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, rel, \"\\u2284\", \"\\\\nsubset\", true);\ndefineSymbol(math, rel, \"\\u2285\", \"\\\\nsupset\", true);\ndefineSymbol(math, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, rel, \"\\u228a\\ufe00\", \"\\\\varsubsetneq\");\ndefineSymbol(math, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acb\\ufe00\", \"\\\\varsubsetneqq\");\ndefineSymbol(math, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, rel, \"\\u2269\\ufe00\", \"\\\\gvertneqq\");\ndefineSymbol(math, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nshortparallel\");\ndefineSymbol(math, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\varsupsetneq\");\ndefineSymbol(math, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acc\\ufe00\", \"\\\\varsupsetneqq\");\ndefineSymbol(math, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, bin, \"\\u22b5\", \"\\\\unrhd\");\n\n// AMS Negated Arrows\ndefineSymbol(math, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n\n// AMS Misc\ndefineSymbol(math, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, textord, \"\\u00ae\", \"\\\\circledR\", true);\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\textregistered\");\ndefineSymbol(math, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, textord, \"\\u2036\", \"\\\\backdprime\");\ndefineSymbol(math, textord, \"\\u2037\", \"\\\\backtrprime\");\ndefineSymbol(math, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, textord, \"\\u2201\", \"\\\\complement\", true);\ndefineSymbol(math, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, textord, \"\\u2713\", \"\\\\checkmark\");\ndefineSymbol(math, textord, \"\\u2717\", \"\\\\ballotx\", true);\ndefineSymbol(text, textord, \"\\u2717\", \"\\\\ballotx\");\ndefineSymbol(text, textord, \"\\u2022\", \"\\\\textbullet\");\n\n// AMS Hebrew\ndefineSymbol(math, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, textord, \"\\u2137\", \"\\\\gimel\", true);\n\n// AMS Greek\ndefineSymbol(math, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, textord, \"\\u03f0\", \"\\\\varkappa\");\n\n// AMS Delimiters\ndefineSymbol(math, open, \"\\u231C\", \"\\\\ulcorner\", true);\ndefineSymbol(math, close, \"\\u231D\", \"\\\\urcorner\", true);\ndefineSymbol(math, open, \"\\u231E\", \"\\\\llcorner\", true);\ndefineSymbol(math, close, \"\\u231F\", \"\\\\lrcorner\", true);\n\n// AMS Binary Relations\ndefineSymbol(math, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, rel, \"\\u22ab\", \"\\\\VDash\", true);\ndefineSymbol(math, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\Doteq\", true);\ndefineSymbol(math, rel, \"\\u297d\", \"\\\\strictif\", true);\ndefineSymbol(math, rel, \"\\u297c\", \"\\\\strictfi\", true);\n\n// AMS Binary Operators\ndefineSymbol(math, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, bin, \"\\u29C4\", \"\\\\boxslash\", true);\ndefineSymbol(math, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, bin, \"\\u27d5\", \"\\\\leftouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d6\", \"\\\\rightouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d7\", \"\\\\fullouterjoin\", true);\n\n// stix Binary Operators\ndefineSymbol(math, bin, \"\\u2238\", \"\\\\dotminus\", true);\ndefineSymbol(math, bin, \"\\u27D1\", \"\\\\wedgedot\", true);\ndefineSymbol(math, bin, \"\\u27C7\", \"\\\\veedot\", true);\ndefineSymbol(math, bin, \"\\u2A62\", \"\\\\doublebarvee\", true);\ndefineSymbol(math, bin, \"\\u2A63\", \"\\\\veedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A5F\", \"\\\\wedgebar\", true);\ndefineSymbol(math, bin, \"\\u2A60\", \"\\\\wedgedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A54\", \"\\\\Vee\", true);\ndefineSymbol(math, bin, \"\\u2A53\", \"\\\\Wedge\", true);\ndefineSymbol(math, bin, \"\\u2A43\", \"\\\\barcap\", true);\ndefineSymbol(math, bin, \"\\u2A42\", \"\\\\barcup\", true);\ndefineSymbol(math, bin, \"\\u2A48\", \"\\\\capbarcup\", true);\ndefineSymbol(math, bin, \"\\u2A40\", \"\\\\capdot\", true);\ndefineSymbol(math, bin, \"\\u2A47\", \"\\\\capovercup\", true);\ndefineSymbol(math, bin, \"\\u2A46\", \"\\\\cupovercap\", true);\ndefineSymbol(math, bin, \"\\u2A4D\", \"\\\\closedvarcap\", true);\ndefineSymbol(math, bin, \"\\u2A4C\", \"\\\\closedvarcup\", true);\ndefineSymbol(math, bin, \"\\u2A2A\", \"\\\\minusdot\", true);\ndefineSymbol(math, bin, \"\\u2A2B\", \"\\\\minusfdots\", true);\ndefineSymbol(math, bin, \"\\u2A2C\", \"\\\\minusrdots\", true);\ndefineSymbol(math, bin, \"\\u22BB\", \"\\\\Xor\", true);\ndefineSymbol(math, bin, \"\\u22BC\", \"\\\\Nand\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\Nor\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\barvee\");\ndefineSymbol(math, bin, \"\\u2AF4\", \"\\\\interleave\", true);\ndefineSymbol(math, bin, \"\\u29E2\", \"\\\\shuffle\", true);\ndefineSymbol(math, bin, \"\\u2AF6\", \"\\\\threedotcolon\", true);\ndefineSymbol(math, bin, \"\\u2982\", \"\\\\typecolon\", true);\ndefineSymbol(math, bin, \"\\u223E\", \"\\\\invlazys\", true);\ndefineSymbol(math, bin, \"\\u2A4B\", \"\\\\twocaps\", true);\ndefineSymbol(math, bin, \"\\u2A4A\", \"\\\\twocups\", true);\ndefineSymbol(math, bin, \"\\u2A4E\", \"\\\\Sqcap\", true);\ndefineSymbol(math, bin, \"\\u2A4F\", \"\\\\Sqcup\", true);\ndefineSymbol(math, bin, \"\\u2A56\", \"\\\\veeonvee\", true);\ndefineSymbol(math, bin, \"\\u2A55\", \"\\\\wedgeonwedge\", true);\ndefineSymbol(math, bin, \"\\u29D7\", \"\\\\blackhourglass\", true);\ndefineSymbol(math, bin, \"\\u29C6\", \"\\\\boxast\", true);\ndefineSymbol(math, bin, \"\\u29C8\", \"\\\\boxbox\", true);\ndefineSymbol(math, bin, \"\\u29C7\", \"\\\\boxcircle\", true);\ndefineSymbol(math, bin, \"\\u229C\", \"\\\\circledequal\", true);\ndefineSymbol(math, bin, \"\\u29B7\", \"\\\\circledparallel\", true);\ndefineSymbol(math, bin, \"\\u29B6\", \"\\\\circledvert\", true);\ndefineSymbol(math, bin, \"\\u29B5\", \"\\\\circlehbar\", true);\ndefineSymbol(math, bin, \"\\u27E1\", \"\\\\concavediamond\", true);\ndefineSymbol(math, bin, \"\\u27E2\", \"\\\\concavediamondtickleft\", true);\ndefineSymbol(math, bin, \"\\u27E3\", \"\\\\concavediamondtickright\", true);\ndefineSymbol(math, bin, \"\\u22C4\", \"\\\\diamond\", true);\ndefineSymbol(math, bin, \"\\u29D6\", \"\\\\hourglass\", true);\ndefineSymbol(math, bin, \"\\u27E0\", \"\\\\lozengeminus\", true);\ndefineSymbol(math, bin, \"\\u233D\", \"\\\\obar\", true);\ndefineSymbol(math, bin, \"\\u29B8\", \"\\\\obslash\", true);\ndefineSymbol(math, bin, \"\\u2A38\", \"\\\\odiv\", true);\ndefineSymbol(math, bin, \"\\u29C1\", \"\\\\ogreaterthan\", true);\ndefineSymbol(math, bin, \"\\u29C0\", \"\\\\olessthan\", true);\ndefineSymbol(math, bin, \"\\u29B9\", \"\\\\operp\", true);\ndefineSymbol(math, bin, \"\\u2A37\", \"\\\\Otimes\", true);\ndefineSymbol(math, bin, \"\\u2A36\", \"\\\\otimeshat\", true);\ndefineSymbol(math, bin, \"\\u22C6\", \"\\\\star\", true);\ndefineSymbol(math, bin, \"\\u25B3\", \"\\\\triangle\", true);\ndefineSymbol(math, bin, \"\\u2A3A\", \"\\\\triangleminus\", true);\ndefineSymbol(math, bin, \"\\u2A39\", \"\\\\triangleplus\", true);\ndefineSymbol(math, bin, \"\\u2A3B\", \"\\\\triangletimes\", true);\ndefineSymbol(math, bin, \"\\u27E4\", \"\\\\whitesquaretickleft\", true);\ndefineSymbol(math, bin, \"\\u27E5\", \"\\\\whitesquaretickright\", true);\ndefineSymbol(math, bin, \"\\u2A33\", \"\\\\smashtimes\", true);\n\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u22b6\", \"\\\\origof\", true);\ndefineSymbol(math, rel, \"\\u22b7\", \"\\\\imageof\", true);\ndefineSymbol(math, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\restriction\");\n\ndefineSymbol(math, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, textord, \"¢\", \"\\\\cent\");\ndefineSymbol(text, textord, \"¢\", \"\\\\cent\");\ndefineSymbol(math, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(text, textord, \"\\u2423\", \"\\\\textvisiblespace\", true);\ndefineSymbol(math, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, textord, \"\\u2033\", \"\\\\dprime\");\ndefineSymbol(math, textord, \"\\u2034\", \"\\\\trprime\");\ndefineSymbol(math, textord, \"\\u2057\", \"\\\\qprime\");\ndefineSymbol(math, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(text, textord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(text, textord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(text, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(text, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(text, textord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(text, textord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(text, textord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(text, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(text, textord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(text, textord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(text, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(text, textord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(text, textord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(text, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(text, textord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(text, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(text, textord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(text, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(text, textord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(text, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(text, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(text, textord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(text, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(text, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, mathord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(math, mathord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(math, mathord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, mathord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, mathord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(math, mathord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(math, mathord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(math, mathord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, mathord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(math, mathord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(math, mathord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, mathord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(math, mathord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(math, mathord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, mathord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(math, mathord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, mathord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(math, mathord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, mathord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(math, mathord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, mathord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(math, mathord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, mathord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\varnothing\");\ndefineSymbol(math, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, mathord, \"\\u03d8\", \"\\\\Coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\varcoppa\", true);\ndefineSymbol(math, mathord, \"\\u03de\", \"\\\\Koppa\", true);\ndefineSymbol(math, mathord, \"\\u03df\", \"\\\\koppa\", true);\ndefineSymbol(math, mathord, \"\\u03e0\", \"\\\\Sampi\", true);\ndefineSymbol(math, mathord, \"\\u03e1\", \"\\\\sampi\", true);\ndefineSymbol(math, mathord, \"\\u03da\", \"\\\\Stigma\", true);\ndefineSymbol(math, mathord, \"\\u03db\", \"\\\\stigma\", true);\ndefineSymbol(math, mathord, \"\\u2aeb\", \"\\\\Bot\");\n\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, textord, \"\\u00f0\", \"\\\\eth\", true); // ð\ndefineSymbol(text, textord, \"\\u00f0\", \"\\u00f0\");\n// Extended ASCII and non-ASCII Letters\ndefineSymbol(math, textord, \"\\u00C5\", \"\\\\AA\"); // Å\ndefineSymbol(text, textord, \"\\u00C5\", \"\\\\AA\", true);\ndefineSymbol(math, textord, \"\\u00C6\", \"\\\\AE\", true); // Æ\ndefineSymbol(text, textord, \"\\u00C6\", \"\\\\AE\", true);\ndefineSymbol(math, textord, \"\\u00D0\", \"\\\\DH\", true); // Ð\ndefineSymbol(text, textord, \"\\u00D0\", \"\\\\DH\", true);\ndefineSymbol(math, textord, \"\\u00DE\", \"\\\\TH\", true); // Þ\ndefineSymbol(text, textord, \"\\u00DE\", \"\\\\TH\", true);\ndefineSymbol(math, textord, \"\\u00DF\", \"\\\\ss\", true); // ß\ndefineSymbol(text, textord, \"\\u00DF\", \"\\\\ss\", true);\ndefineSymbol(math, textord, \"\\u00E5\", \"\\\\aa\"); // å\ndefineSymbol(text, textord, \"\\u00E5\", \"\\\\aa\", true);\ndefineSymbol(math, textord, \"\\u00E6\", \"\\\\ae\", true); // æ\ndefineSymbol(text, textord, \"\\u00E6\", \"\\\\ae\", true);\ndefineSymbol(math, textord, \"\\u00F0\", \"\\\\dh\"); // ð\ndefineSymbol(text, textord, \"\\u00F0\", \"\\\\dh\", true);\ndefineSymbol(math, textord, \"\\u00FE\", \"\\\\th\", true); // þ\ndefineSymbol(text, textord, \"\\u00FE\", \"\\\\th\", true);\ndefineSymbol(math, textord, \"\\u0110\", \"\\\\DJ\", true); // Đ\ndefineSymbol(text, textord, \"\\u0110\", \"\\\\DJ\", true);\ndefineSymbol(math, textord, \"\\u0111\", \"\\\\dj\", true); // đ\ndefineSymbol(text, textord, \"\\u0111\", \"\\\\dj\", true);\ndefineSymbol(math, textord, \"\\u0141\", \"\\\\L\", true); // Ł\ndefineSymbol(text, textord, \"\\u0141\", \"\\\\L\", true);\ndefineSymbol(math, textord, \"\\u0141\", \"\\\\l\", true); // ł\ndefineSymbol(text, textord, \"\\u0141\", \"\\\\l\", true);\ndefineSymbol(math, textord, \"\\u014A\", \"\\\\NG\", true); // Ŋ\ndefineSymbol(text, textord, \"\\u014A\", \"\\\\NG\", true);\ndefineSymbol(math, textord, \"\\u014B\", \"\\\\ng\", true); // ŋ\ndefineSymbol(text, textord, \"\\u014B\", \"\\\\ng\", true);\ndefineSymbol(math, textord, \"\\u0152\", \"\\\\OE\", true); // Œ\ndefineSymbol(text, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(math, textord, \"\\u0153\", \"\\\\oe\", true); // œ\ndefineSymbol(text, textord, \"\\u0153\", \"\\\\oe\", true);\n\ndefineSymbol(math, bin, \"\\u2217\", \"\\u2217\", true);\ndefineSymbol(math, bin, \"+\", \"+\");\ndefineSymbol(math, bin, \"\\u2217\", \"*\");\ndefineSymbol(math, bin, \"\\u2044\", \"/\", true);\ndefineSymbol(math, bin, \"\\u2044\", \"\\u2044\");\ndefineSymbol(math, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, open, \"\\u27e6\", \"\\\\llbracket\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u27e7\", \"\\\\rrbracket\", true);\ndefineSymbol(math, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, open, \"\\u27ea\", \"\\\\lAngle\", true);\ndefineSymbol(math, open, \"\\u2989\", \"\\\\llangle\", true);\ndefineSymbol(math, open, \"|\", \"\\\\lvert\");\ndefineSymbol(math, open, \"\\u2016\", \"\\\\lVert\", true);\ndefineSymbol(math, textord, \"!\", \"\\\\oc\"); // cmll package\ndefineSymbol(math, textord, \"?\", \"\\\\wn\");\ndefineSymbol(math, textord, \"\\u2193\", \"\\\\shpos\");\ndefineSymbol(math, textord, \"\\u2195\", \"\\\\shift\");\ndefineSymbol(math, textord, \"\\u2191\", \"\\\\shneg\");\ndefineSymbol(math, close, \"?\", \"?\");\ndefineSymbol(math, close, \"!\", \"!\");\ndefineSymbol(math, close, \"‼\", \"‼\");\ndefineSymbol(math, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, close, \"\\u27eb\", \"\\\\rAngle\", true);\ndefineSymbol(math, close, \"\\u298a\", \"\\\\rrangle\", true);\ndefineSymbol(math, close, \"|\", \"\\\\rvert\");\ndefineSymbol(math, close, \"\\u2016\", \"\\\\rVert\");\ndefineSymbol(math, open, \"\\u2983\", \"\\\\lBrace\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u2984\", \"\\\\rBrace\", true);\ndefineSymbol(math, rel, \"=\", \"\\\\equal\", true);\ndefineSymbol(math, rel, \":\", \":\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, rel, \"\\u2209\", \"\\\\notin\", true);\ndefineSymbol(math, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteqq\");\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteqq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqq\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqslant\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqq\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqslant\");\ndefineSymbol(math, rel, \"\\u2aeb\", \"\\\\Perp\", true); //cmll package\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, punct, \",\", \",\");\ndefineSymbol(text, punct, \":\", \":\");\ndefineSymbol(math, punct, \";\", \";\");\ndefineSymbol(math, bin, \"\\u22bc\", \"\\\\barwedge\");\ndefineSymbol(math, bin, \"\\u22bb\", \"\\\\veebar\");\ndefineSymbol(math, bin, \"\\u2299\", \"\\\\odot\", true);\n// Firefox turns ⊕ into an emoji. So append \\uFE0E. Define Unicode character in macros, not here.\ndefineSymbol(math, bin, \"\\u2295\\uFE0E\", \"\\\\oplus\");\ndefineSymbol(math, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, open, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, close, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(math, open, \"⦇\", \"\\\\llparenthesis\", true);\ndefineSymbol(math, close, \"⦈\", \"\\\\rrparenthesis\", true);\ndefineSymbol(text, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, textord, \"|\", \"|\");\ndefineSymbol(math, textord, \"|\", \"\\\\vert\");\ndefineSymbol(text, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\|\");\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\Vert\");\ndefineSymbol(text, textord, \"\\u2016\", \"\\\\textbardbl\");\ndefineSymbol(text, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\bigcupplus\");\ndefineSymbol(math, op, \"\\u2a03\", \"\\\\bigcupdot\");\ndefineSymbol(math, op, \"\\u2a07\", \"\\\\bigdoublevee\");\ndefineSymbol(math, op, \"\\u2a08\", \"\\\\bigdoublewedge\");\ndefineSymbol(math, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, op, \"\\u2a09\", \"\\\\bigtimes\");\ndefineSymbol(math, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, op, \"\\u2231\", \"\\\\intclockwise\");\ndefineSymbol(math, op, \"\\u2232\", \"\\\\varointclockwise\");\ndefineSymbol(math, op, \"\\u2a0c\", \"\\\\iiiint\");\ndefineSymbol(math, op, \"\\u2a0d\", \"\\\\intbar\");\ndefineSymbol(math, op, \"\\u2a0e\", \"\\\\intBar\");\ndefineSymbol(math, op, \"\\u2a0f\", \"\\\\fint\");\ndefineSymbol(math, op, \"\\u2a12\", \"\\\\rppolint\");\ndefineSymbol(math, op, \"\\u2a13\", \"\\\\scpolint\");\ndefineSymbol(math, op, \"\\u2a15\", \"\\\\pointint\");\ndefineSymbol(math, op, \"\\u2a16\", \"\\\\sqint\");\ndefineSymbol(math, op, \"\\u2a17\", \"\\\\intlarhk\");\ndefineSymbol(math, op, \"\\u2a18\", \"\\\\intx\");\ndefineSymbol(math, op, \"\\u2a19\", \"\\\\intcap\");\ndefineSymbol(math, op, \"\\u2a1a\", \"\\\\intcup\");\ndefineSymbol(math, op, \"\\u2a05\", \"\\\\bigsqcap\");\ndefineSymbol(math, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u22f0\", \"\\\\iddots\", true);\ndefineSymbol(math, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, inner, \"\\u22f1\", \"\\\\ddots\", true);\ndefineSymbol(math, textord, \"\\u22ee\", \"\\\\varvdots\"); // \\vdots is a macro\ndefineSymbol(text, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, accent, \"\\u00b4\", \"\\\\acute\");\ndefineSymbol(math, accent, \"\\u0060\", \"\\\\grave\");\ndefineSymbol(math, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, accent, \"\\u2026\", \"\\\\dddot\");\ndefineSymbol(math, accent, \"\\u2026\\u002e\", \"\\\\ddddot\");\ndefineSymbol(math, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, accent, \"\\u203e\", \"\\\\bar\");\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, accent, \"\\u02c6\", \"\\\\hat\");\ndefineSymbol(math, accent, \"\\u2192\", \"\\\\vec\");\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\mathring\");\ndefineSymbol(math, mathord, \"\\u0131\", \"\\\\imath\", true);\ndefineSymbol(math, mathord, \"\\u0237\", \"\\\\jmath\", true);\ndefineSymbol(math, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(math, mathord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(math, mathord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, accent, \"\\u007e\", \"\\\\~\"); // tilde\ndefineSymbol(text, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(text, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(math, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(math, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(math, accent, \"\\u007e\", \"\\\\~\"); // tilde\ndefineSymbol(math, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(math, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(math, accent, \"\\u00a8\", '\\\\\"'); // diaeresis\ndefineSymbol(math, accent, \"\\u02dd\", \"\\\\H\"); // double acute\n\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nconst ligatures = {\n  \"--\": true,\n  \"---\": true,\n  \"``\": true,\n  \"''\": true\n};\n\ndefineSymbol(text, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, textord, \"\\u201d\", \"\\\\textquotedblright\");\n//  \\degree from gensymb package\ndefineSymbol(math, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(math, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\texteuro\");\ndefineSymbol(math, textord, \"\\u00a9\", \"\\\\copyright\", true);\ndefineSymbol(text, textord, \"\\u00a9\", \"\\\\textcopyright\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\diameter\", true);\ndefineSymbol(text, textord, \"\\u2300\", \"\\\\diameter\");\n\n// Italic Greek\ndefineSymbol(math, textord, \"𝛤\", \"\\\\varGamma\");\ndefineSymbol(math, textord, \"𝛥\", \"\\\\varDelta\");\ndefineSymbol(math, textord, \"𝛩\", \"\\\\varTheta\");\ndefineSymbol(math, textord, \"𝛬\", \"\\\\varLambda\");\ndefineSymbol(math, textord, \"𝛯\", \"\\\\varXi\");\ndefineSymbol(math, textord, \"𝛱\", \"\\\\varPi\");\ndefineSymbol(math, textord, \"𝛴\", \"\\\\varSigma\");\ndefineSymbol(math, textord, \"𝛶\", \"\\\\varUpsilon\");\ndefineSymbol(math, textord, \"𝛷\", \"\\\\varPhi\");\ndefineSymbol(math, textord, \"𝛹\", \"\\\\varPsi\");\ndefineSymbol(math, textord, \"𝛺\", \"\\\\varOmega\");\ndefineSymbol(text, textord, \"𝛤\", \"\\\\varGamma\");\ndefineSymbol(text, textord, \"𝛥\", \"\\\\varDelta\");\ndefineSymbol(text, textord, \"𝛩\", \"\\\\varTheta\");\ndefineSymbol(text, textord, \"𝛬\", \"\\\\varLambda\");\ndefineSymbol(text, textord, \"𝛯\", \"\\\\varXi\");\ndefineSymbol(text, textord, \"𝛱\", \"\\\\varPi\");\ndefineSymbol(text, textord, \"𝛴\", \"\\\\varSigma\");\ndefineSymbol(text, textord, \"𝛶\", \"\\\\varUpsilon\");\ndefineSymbol(text, textord, \"𝛷\", \"\\\\varPhi\");\ndefineSymbol(text, textord, \"𝛹\", \"\\\\varPsi\");\ndefineSymbol(text, textord, \"𝛺\", \"\\\\varOmega\");\n\n\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nconst mathTextSymbols = '0123456789/@.\"';\nfor (let i = 0; i < mathTextSymbols.length; i++) {\n  const ch = mathTextSymbols.charAt(i);\n  defineSymbol(math, textord, ch, ch);\n}\n\n// All of these are textords in text mode\nconst textSymbols = '0123456789!@*()-=+\";:?/.,';\nfor (let i = 0; i < textSymbols.length; i++) {\n  const ch = textSymbols.charAt(i);\n  defineSymbol(text, textord, ch, ch);\n}\n\n// All of these are textords in text mode, and mathords in math mode\nconst letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (let i = 0; i < letters.length; i++) {\n  const ch = letters.charAt(i);\n  defineSymbol(math, mathord, ch, ch);\n  defineSymbol(text, textord, ch, ch);\n}\n\n// Some more letters in Unicode Basic Multilingual Plane.\nconst narrow = \"ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ\";\nfor (let i = 0; i < narrow.length; i++) {\n  const ch = narrow.charAt(i);\n  defineSymbol(math, mathord, ch, ch);\n  defineSymbol(text, textord, ch, ch);\n}\n\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\nlet wideChar = \"\";\nfor (let i = 0; i < letters.length; i++) {\n  // The hex numbers in the next line are a surrogate pair.\n  // 0xD835 is the high surrogate for all letters in the range we support.\n  // 0xDC00 is the low surrogate for bold A.\n  wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  const ch = letters.charAt(i);\n  wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic\n  defineSymbol(math, mathord, ch, wideChar);\n  defineSymbol(text, textord, ch, wideChar);\n}\n\n// Next, some wide character numerals\nfor (let i = 0; i < 10; i++) {\n  wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n}\n\n/*\n * Neither Firefox nor Chrome support hard line breaks or soft line breaks.\n * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs)\n * So Temml has work-arounds for both hard and soft breaks.\n * The work-arounds sadly do not work simultaneously. Any top-level hard\n * break makes soft line breaks impossible.\n *\n * Hard breaks are simulated by creating a <mtable> and putting each line in its own <mtr>.\n *\n * To create soft line breaks, Temml avoids using the <semantics> and <annotation> tags.\n * Then the top level of a <math> element can be occupied by <mrow> elements, and the browser\n * will break after a <mrow> if the expression extends beyond the container limit.\n *\n * The default is for soft line breaks after each top-level binary or\n * relational operator, per TeXbook p. 173. So we gather the expression into <mrow>s so that\n * each <mrow> ends in a binary or relational operator.\n *\n * An option is for soft line breaks before an \"=\" sign. That changes the <mrow>s.\n *\n * Soft line breaks will not work in Chromium and Safari, only Firefox.\n *\n * Hopefully browsers will someday do their own linebreaking and we will be able to delete\n * much of this module.\n */\n\nfunction setLineBreaks(expression, wrapMode, isDisplayMode) {\n  const mtrs = [];\n  let mrows = [];\n  let block = [];\n  let numTopLevelEquals = 0;\n  let i = 0;\n  while (i < expression.length) {\n    while (expression[i] instanceof DocumentFragment) {\n      expression.splice(i, 1, ...expression[i].children); // Expand the fragment.\n    }\n    const node = expression[i];\n    if (node.attributes && node.attributes.linebreak &&\n      node.attributes.linebreak === \"newline\") {\n      // A hard line break. Create a <mtr> for the current block.\n      if (block.length > 0) {\n        mrows.push(new MathNode(\"mrow\", block));\n      }\n      mrows.push(node);\n      block = [];\n      const mtd = new MathNode(\"mtd\", mrows);\n      mtd.style.textAlign = \"left\";\n      mtrs.push(new MathNode(\"mtr\", [mtd]));\n      mrows = [];\n      i += 1;\n      continue\n    }\n    block.push(node);\n    if (node.type && node.type === \"mo\" && node.children.length === 1 &&\n        !(node.attributes.form && node.attributes.form === \"prefix\") && // unary operators\n        !Object.prototype.hasOwnProperty.call(node.attributes, \"movablelimits\")) {\n      const ch = node.children[0].text;\n      if (wrapMode === \"=\" && ch === \"=\") {\n        numTopLevelEquals += 1;\n        if (numTopLevelEquals > 1) {\n          block.pop();\n          // Start a new block. (Insert a soft linebreak.)\n          const element = new MathNode(\"mrow\", block);\n          mrows.push(element);\n          block = [node];\n        }\n      } else if (wrapMode === \"tex\") {\n        // Check if the following node is a \\nobreak text node, e.g. \"~\"\"\n        const next = i < expression.length - 1 ? expression[i + 1] : null;\n        let glueIsFreeOfNobreak = true;\n        if (\n          !(\n            next &&\n            next.type === \"mtext\" &&\n            next.attributes.linebreak &&\n            next.attributes.linebreak === \"nobreak\"\n          )\n        ) {\n          // We may need to start a new block.\n          // First, put any post-operator glue on same line as operator.\n          for (let j = i + 1; j < expression.length; j++) {\n            const nd = expression[j];\n            if (\n              nd.type &&\n              nd.type === \"mspace\" &&\n              !(nd.attributes.linebreak && nd.attributes.linebreak === \"newline\")\n            ) {\n              block.push(nd);\n              i += 1;\n              if (\n                nd.attributes &&\n                nd.attributes.linebreak &&\n                nd.attributes.linebreak === \"nobreak\"\n              ) {\n                glueIsFreeOfNobreak = false;\n              }\n            } else {\n              break;\n            }\n          }\n        }\n        if (glueIsFreeOfNobreak) {\n          // Start a new block. (Insert a soft linebreak.)\n          const element = new MathNode(\"mrow\", block);\n          mrows.push(element);\n          block = [];\n        }\n      }\n    }\n    i += 1;\n  }\n  if (block.length > 0) {\n    const element = new MathNode(\"mrow\", block);\n    mrows.push(element);\n  }\n  if (mtrs.length > 0) {\n    const mtd = new MathNode(\"mtd\", mrows);\n    mtd.style.textAlign = \"left\";\n    const mtr = new MathNode(\"mtr\", [mtd]);\n    mtrs.push(mtr);\n    const mtable = new MathNode(\"mtable\", mtrs);\n    if (!isDisplayMode) {\n      mtable.setAttribute(\"columnalign\", \"left\");\n      mtable.setAttribute(\"rowspacing\", \"0em\");\n    }\n    return mtable\n  }\n  return newDocumentFragment(mrows);\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\n\n\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nconst makeText = function(text, mode, style) {\n  if (\n    symbols[mode][text] &&\n    symbols[mode][text].replace &&\n    text.charCodeAt(0) !== 0xd835 &&\n    !(\n      Object.prototype.hasOwnProperty.call(ligatures, text) &&\n      style &&\n      ((style.fontFamily && style.fontFamily.slice(4, 6) === \"tt\") ||\n        (style.font && style.font.slice(4, 6) === \"tt\"))\n    )\n  ) {\n    text = symbols[mode][text].replace;\n  }\n\n  return new TextNode(text);\n};\n\nconst copyChar = (newRow, child) => {\n  if (newRow.children.length === 0 ||\n      newRow.children[newRow.children.length - 1].type !== \"mtext\") {\n    const mtext = new MathNode(\n      \"mtext\",\n      [new TextNode(child.children[0].text)]\n    );\n    newRow.children.push(mtext);\n  } else {\n    newRow.children[newRow.children.length - 1].children[0].text += child.children[0].text;\n  }\n};\n\nconst consolidateText = mrow => {\n  // If possible, consolidate adjacent <mtext> elements into a single element.\n  if (mrow.type !== \"mrow\" && mrow.type !== \"mstyle\") { return mrow }\n  if (mrow.children.length === 0) { return mrow } // empty group, e.g., \\text{}\n  const newRow = new MathNode(\"mrow\");\n  for (let i = 0; i < mrow.children.length; i++) {\n    const child = mrow.children[i];\n    if (child.type === \"mtext\" && Object.keys(child.attributes).length === 0) {\n      copyChar(newRow, child);\n    } else if (child.type === \"mrow\") {\n      // We'll also check the children of an mrow. One level only. No recursion.\n      let canConsolidate = true;\n      for (let j = 0; j < child.children.length; j++) {\n        const grandChild = child.children[j];\n        if (grandChild.type !== \"mtext\" || Object.keys(child.attributes).length !== 0) {\n          canConsolidate = false;\n          break\n        }\n      }\n      if (canConsolidate) {\n        for (let j = 0; j < child.children.length; j++) {\n          const grandChild = child.children[j];\n          copyChar(newRow, grandChild);\n        }\n      } else {\n        newRow.children.push(child);\n      }\n    } else {\n      newRow.children.push(child);\n    }\n  }\n  for (let i = 0; i < newRow.children.length; i++) {\n    if (newRow.children[i].type === \"mtext\") {\n      const mtext = newRow.children[i];\n      // Firefox does not render a space at either end of an <mtext> string.\n      // To get proper rendering, we replace leading or trailing spaces with no-break spaces.\n      if (mtext.children[0].text.charAt(0) === \" \") {\n        mtext.children[0].text = \"\\u00a0\" + mtext.children[0].text.slice(1);\n      }\n      const L = mtext.children[0].text.length;\n      if (L > 0 && mtext.children[0].text.charAt(L - 1) === \" \") {\n        mtext.children[0].text = mtext.children[0].text.slice(0, -1) + \"\\u00a0\";\n      }\n      for (const [key, value] of Object.entries(mrow.attributes)) {\n        mtext.attributes[key] = value;\n      }\n    }\n  }\n  if (newRow.children.length === 1 && newRow.children[0].type === \"mtext\") {\n    return newRow.children[0]; // A consolidated <mtext>\n  } else {\n    return newRow\n  }\n};\n\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1.  Always returns a single node.\n */\nconst makeRow = function(body, semisimple = false) {\n  if (body.length === 1 && !(body[0] instanceof DocumentFragment)) {\n    return body[0];\n  } else if (!semisimple) {\n    // Suppress spacing on <mo> nodes at both ends of the row.\n    if (body[0] instanceof MathNode && body[0].type === \"mo\" && !body[0].attributes.fence) {\n      body[0].attributes.lspace = \"0em\";\n      body[0].attributes.rspace = \"0em\";\n    }\n    const end = body.length - 1;\n    if (body[end] instanceof MathNode && body[end].type === \"mo\" && !body[end].attributes.fence) {\n      body[end].attributes.lspace = \"0em\";\n      body[end].attributes.rspace = \"0em\";\n    }\n  }\n  return new MathNode(\"mrow\", body);\n};\n\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n  if (!group) {\n    return false\n  }\n  if (group.type === 'mi' && group.children.length === 1) {\n    const child = group.children[0];\n    return child instanceof TextNode && child.text === '.'\n  } else if (group.type === \"mtext\" && group.children.length === 1) {\n    const child = group.children[0];\n    return child instanceof TextNode && child.text === '\\u2008' // punctuation space\n  } else if (group.type === 'mo' && group.children.length === 1 &&\n    group.getAttribute('separator') === 'true' &&\n    group.getAttribute('lspace') === '0em' &&\n    group.getAttribute('rspace') === '0em') {\n    const child = group.children[0];\n    return child instanceof TextNode && child.text === ','\n  } else {\n    return false\n  }\n}\nconst isComma = (expression, i) => {\n  const node = expression[i];\n  const followingNode = expression[i + 1];\n  return (node.type === \"atom\" && node.text === \",\") &&\n    // Don't consolidate if there is a space after the comma.\n    node.loc && followingNode.loc && node.loc.end === followingNode.loc.start\n};\n\nconst isRel = item => {\n  return (item.type === \"atom\" && item.family === \"rel\") ||\n      (item.type === \"mclass\" && item.mclass === \"mrel\")\n};\n\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes.  Also do a couple chores along the way:\n * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}.\n * (2) Suppress spacing between two adjacent relations.\n */\nconst buildExpression = function(expression, style, semisimple = false) {\n  if (!semisimple && expression.length === 1) {\n    const group = buildGroup$1(expression[0], style);\n    if (group instanceof MathNode && group.type === \"mo\") {\n      // When TeX writers want to suppress spacing on an operator,\n      // they often put the operator by itself inside braces.\n      group.setAttribute(\"lspace\", \"0em\");\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    return [group];\n  }\n\n  const groups = [];\n  const groupArray = [];\n  let lastGroup;\n  for (let i = 0; i < expression.length; i++) {\n    groupArray.push(buildGroup$1(expression[i], style));\n  }\n\n  for (let i = 0; i < groupArray.length; i++) {\n    const group = groupArray[i];\n\n    // Suppress spacing between adjacent relations\n    if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) {\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) {\n      group.setAttribute(\"lspace\", \"0em\");\n    }\n\n    // Concatenate numbers\n    if (group.type === 'mn' && lastGroup && lastGroup.type === 'mn') {\n      // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      lastGroup.children.push(...group.children);\n      continue\n    } else if (isNumberPunctuation(group) && lastGroup && lastGroup.type === 'mn') {\n      // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      lastGroup.children.push(...group.children);\n      continue\n    } else if (lastGroup && lastGroup.type === \"mn\" && i < groupArray.length - 1 &&\n      groupArray[i + 1].type === \"mn\" && isComma(expression, i)) {\n      lastGroup.children.push(...group.children);\n      continue\n    } else if (group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n      // Concatenate <mi>.</mi> followed by <mn>...</mn>\n      group.children = [...lastGroup.children, ...group.children];\n      groups.pop();\n    } else if ((group.type === 'msup' || group.type === 'msub') &&\n        group.children.length >= 1 && lastGroup &&\n        (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n      // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n      // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n      const base = group.children[0];\n      if (base instanceof MathNode && base.type === 'mn' && lastGroup) {\n        base.children = [...lastGroup.children, ...base.children];\n        groups.pop();\n      }\n    }\n    groups.push(group);\n    lastGroup = group;\n  }\n  return groups\n};\n\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one.  Returns a single node instead of an array.\n */\nconst buildExpressionRow = function(expression, style, semisimple = false) {\n  return makeRow(buildExpression(expression, style, semisimple), semisimple);\n};\n\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nconst buildGroup$1 = function(group, style) {\n  if (!group) {\n    return new MathNode(\"mrow\");\n  }\n\n  if (_mathmlGroupBuilders[group.type]) {\n    // Call the groupBuilders function\n    const result = _mathmlGroupBuilders[group.type](group, style);\n    return result;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n\nconst glue$1 = _ => {\n  return new MathNode(\"mtd\", [], [], { padding: \"0\", width: \"50%\" })\n};\n\nconst labelContainers = [\"mrow\", \"mtd\", \"mtable\", \"mtr\"];\nconst getLabel = parent => {\n  for (const node of parent.children) {\n    if (node.type && labelContainers.includes(node.type)) {\n      if (node.classes && node.classes[0] === \"tml-label\") {\n        const label = node.label;\n        return label\n      } else {\n        const label = getLabel(node);\n        if (label) { return label }\n      }\n    } else if (!node.type) {\n      const label = getLabel(node);\n      if (label) { return label }\n    }\n  }\n};\n\nconst taggedExpression = (expression, tag, style, leqno) => {\n  tag = buildExpressionRow(tag[0].body, style);\n  tag = consolidateText(tag);  // tag is now an <mtext> element\n  tag.classes.push(\"tml-tag\"); // to be available for \\ref\n\n  const label = getLabel(expression); // from a \\label{} function.\n  expression = new MathNode(\"mtd\", [expression]);\n  const rowArray = [glue$1(), expression, glue$1()];\n  rowArray[leqno ? 0 : 2].children.push(tag);\n  const mtr = new MathNode(\"mtr\", rowArray, [\"tml-tageqn\"]);\n  if (label) { mtr.setAttribute(\"id\", label); }\n  const table = new MathNode(\"mtable\", [mtr]);\n  table.style.width = \"100%\";\n  table.setAttribute(\"displaystyle\", \"true\");\n  return table\n};\n\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it.\n */\nfunction buildMathML(tree, texExpression, style, settings) {\n  // Strip off outer tag wrapper for processing below.\n  let tag = null;\n  if (tree.length === 1 && tree[0].type === \"tag\") {\n    tag = tree[0].tag;\n    tree = tree[0].body;\n  }\n\n  const expression = buildExpression(tree, style);\n\n  if (expression.length === 1 && expression[0] instanceof AnchorNode) {\n    return expression[0]\n  }\n\n  const wrap = (settings.displayMode || settings.annotate) ? \"none\" : settings.wrap;\n\n  const n1 = expression.length === 0 ? null : expression[0];\n  let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode)\n      ? expression[0]\n      : setLineBreaks(expression, wrap, settings.displayMode);\n\n  if (tag) {\n    wrapper = taggedExpression(wrapper, tag, style, settings.leqno);\n  }\n\n  if (settings.annotate) {\n    // Build a TeX annotation of the source\n    const annotation = new MathNode(\n      \"annotation\", [new TextNode(texExpression)]);\n    annotation.setAttribute(\"encoding\", \"application/x-tex\");\n    wrapper = new MathNode(\"semantics\", [wrapper, annotation]);\n  }\n\n  const math = new MathNode(\"math\", [wrapper]);\n\n  if (settings.xml) {\n    math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n  }\n  if (settings.displayMode) {\n    math.setAttribute(\"display\", \"block\");\n    math.style.display = \"block math\"; // necessary in Chromium.\n    // Firefox and Safari do not recognize display: \"block math\".\n    // Set a class so that the CSS file can set display: block.\n    math.classes = [\"tml-display\"];\n  }\n  return math;\n}\n\n// From the KaTeX font metrics, identify letters whose accents need a italic correction.\nconst smallNudge = \"DHKLUcegorsuvxyzΠΥΨαδηιμνοτυχϵ\";\nconst mediumNudge = \"BCEGIMNOPQRSTXZlpqtwΓΘΞΣΦΩβεζθξρςφψϑϕϱ\";\nconst largeNudge = \"AFJdfΔΛ\";\n\nconst mathmlBuilder$a = (group, style) => {\n  const accentNode$1 = group.isStretchy\n    ? accentNode(group)\n    : new MathNode(\"mo\", [makeText(group.label, group.mode)]);\n  if (!group.isStretchy) {\n    accentNode$1.setAttribute(\"stretchy\", \"false\"); // Keep Firefox from stretching \\check\n  }\n  if (group.label !== \"\\\\vec\") {\n    accentNode$1.style.mathDepth = \"0\"; // not scriptstyle\n    // Don't use attribute accent=\"true\" because MathML Core eliminates a needed space.\n  }\n  const tag = group.label === \"\\\\c\" ? \"munder\" : \"mover\";\n  const needsWbkVertShift = needsWebkitVerticalShift.has(group.label);\n  if (tag === \"mover\" && group.mode === \"math\" && (!group.isStretchy) && group.base.text\n      && group.base.text.length === 1) {\n    const text = group.base.text;\n    const isVec = group.label === \"\\\\vec\";\n    const vecPostfix = isVec === \"\\\\vec\" ? \"-vec\" : \"\";\n    if (isVec) {\n      accentNode$1.classes.push(\"tml-vec\"); // Firefox sizing of \\vec arrow\n    }\n    const wbkPostfix = isVec ? \"-vec\" : needsWbkVertShift ? \"-acc\" : \"\";\n    if (smallNudge.indexOf(text) > -1) {\n      accentNode$1.classes.push(`chr-sml${vecPostfix}`);\n      accentNode$1.classes.push(`wbk-sml${wbkPostfix}`);\n    } else if (mediumNudge.indexOf(text) > -1) {\n      accentNode$1.classes.push(`chr-med${vecPostfix}`);\n      accentNode$1.classes.push(`wbk-med${wbkPostfix}`);\n    } else if (largeNudge.indexOf(text) > -1) {\n      accentNode$1.classes.push(`chr-lrg${vecPostfix}`);\n      accentNode$1.classes.push(`wbk-lrg${wbkPostfix}`);\n    } else if (isVec) {\n      accentNode$1.classes.push(`wbk-vec`);\n    } else if (needsWbkVertShift) {\n      accentNode$1.classes.push(`wbk-acc`);\n    }\n  } else if (needsWbkVertShift) {\n    // text-mode accents\n    accentNode$1.classes.push(\"wbk-acc\");\n  }\n  const node = new MathNode(tag, [buildGroup$1(group.base, style), accentNode$1]);\n  return node;\n};\n\nconst nonStretchyAccents = new Set([\n  \"\\\\acute\",\n  \"\\\\check\",\n  \"\\\\grave\",\n  \"\\\\ddot\",\n  \"\\\\dddot\",\n  \"\\\\ddddot\",\n  \"\\\\tilde\",\n  \"\\\\bar\",\n  \"\\\\breve\",\n  \"\\\\check\",\n  \"\\\\hat\",\n  \"\\\\vec\",\n  \"\\\\dot\",\n  \"\\\\mathring\"\n]);\n\nconst needsWebkitVerticalShift = new Set([\n  \"\\\\acute\",\n  \"\\\\bar\",\n  \"\\\\breve\",\n  \"\\\\check\",\n  \"\\\\dot\",\n  \"\\\\ddot\",\n  \"\\\\grave\",\n  \"\\\\hat\",\n  \"\\\\mathring\",\n  \"\\\\`\", \"\\\\'\", \"\\\\^\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"\n]);\n\nconst combiningChar = {\n  \"\\\\`\": \"\\u0300\",\n  \"\\\\'\": \"\\u0301\",\n  \"\\\\^\": \"\\u0302\",\n  \"\\\\~\": \"\\u0303\",\n  \"\\\\=\": \"\\u0304\",\n  \"\\\\u\": \"\\u0306\",\n  \"\\\\.\": \"\\u0307\",\n  '\\\\\"': \"\\u0308\",\n  \"\\\\r\": \"\\u030A\",\n  \"\\\\H\": \"\\u030B\",\n  \"\\\\v\": \"\\u030C\",\n  \"\\\\c\": \"\\u0327\"\n};\n\n// Accents\ndefineFunction({\n  type: \"accent\",\n  names: [\n    \"\\\\acute\",\n    \"\\\\grave\",\n    \"\\\\ddot\",\n    \"\\\\dddot\",\n    \"\\\\ddddot\",\n    \"\\\\tilde\",\n    \"\\\\bar\",\n    \"\\\\breve\",\n    \"\\\\check\",\n    \"\\\\hat\",\n    \"\\\\vec\",\n    \"\\\\dot\",\n    \"\\\\mathring\",\n    \"\\\\overparen\",\n    \"\\\\widecheck\",\n    \"\\\\widehat\",\n    \"\\\\wideparen\",\n    \"\\\\widetilde\",\n    \"\\\\overrightarrow\",\n    \"\\\\overleftarrow\",\n    \"\\\\Overrightarrow\",\n    \"\\\\overleftrightarrow\",\n    \"\\\\overgroup\",\n    \"\\\\overleftharpoon\",\n    \"\\\\overrightharpoon\"\n  ],\n  props: {\n    numArgs: 1\n  },\n  handler: (context, args) => {\n    const base = normalizeArgument(args[0]);\n\n    const isStretchy = !nonStretchyAccents.has(context.funcName);\n\n    return {\n      type: \"accent\",\n      mode: context.parser.mode,\n      label: context.funcName,\n      isStretchy,\n      base\n    };\n  },\n  mathmlBuilder: mathmlBuilder$a\n});\n\n// Text-mode accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\c\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const base = normalizeArgument(args[0]);\n    const mode = context.parser.mode;\n\n    if (mode === \"math\" && context.parser.settings.strict) {\n      // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning.\n      // eslint-disable-next-line no-console\n      console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`);\n    }\n\n    if (mode === \"text\" && base.text && base.text.length === 1\n        && context.funcName in combiningChar && smalls.indexOf(base.text) > -1) {\n      // Return a combining accent character\n      return {\n        type: \"textord\",\n        mode: \"text\",\n        text: base.text + combiningChar[context.funcName]\n      }\n    } else if (context.funcName === \"\\\\c\" && mode === \"text\" && base.text\n        && base.text.length === 1) {\n      // combining cedilla\n      return { type: \"textord\", mode: \"text\", text: base.text + \"\\u0327\" }\n    } else {\n      // Build up the accent\n      return {\n        type: \"accent\",\n        mode,\n        label: context.funcName,\n        isStretchy: false,\n        base\n      }\n    }\n  },\n  mathmlBuilder: mathmlBuilder$a\n});\n\ndefineFunction({\n  type: \"accentUnder\",\n  names: [\n    \"\\\\underleftarrow\",\n    \"\\\\underrightarrow\",\n    \"\\\\underleftrightarrow\",\n    \"\\\\undergroup\",\n    \"\\\\underparen\",\n    \"\\\\utilde\"\n  ],\n  props: {\n    numArgs: 1\n  },\n  handler: ({ parser, funcName }, args) => {\n    const base = args[0];\n    return {\n      type: \"accentUnder\",\n      mode: parser.mode,\n      label: funcName,\n      base: base\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const accentNode$1 = accentNode(group);\n    accentNode$1.style[\"math-depth\"] = 0;\n    const node = new MathNode(\"munder\", [\n      buildGroup$1(group.base, style),\n      accentNode$1\n    ]);\n    return node;\n  }\n});\n\n/**\n * This file does conversion between units.  In particular, it provides\n * calculateSize to convert other units into CSS units.\n */\n\n\nconst ptPerUnit = {\n  // Convert to CSS (Postscipt) points, not TeX points\n  // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n  // https://tex.stackexchange.com/a/8263\n  pt: 800 / 803, // convert TeX point to CSS (Postscript) point\n  pc: (12 * 800) / 803, // pica\n  dd: ((1238 / 1157) * 800) / 803, // didot\n  cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot)\n  nd: ((685 / 642) * 800) / 803, // new didot\n  nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot)\n  sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit)\n  mm: (25.4 / 72),\n  cm: (2.54 / 72),\n  in: (1 / 72),\n  px: (96 / 72)\n};\n\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nconst validUnits = [\n  \"em\",\n  \"ex\",\n  \"mu\",\n  \"pt\",\n  \"mm\",\n  \"cm\",\n  \"in\",\n  \"px\",\n  \"bp\",\n  \"pc\",\n  \"dd\",\n  \"cc\",\n  \"nd\",\n  \"nc\",\n  \"sp\"\n];\n\nconst validUnit = function(unit) {\n  if (typeof unit !== \"string\") {\n    unit = unit.unit;\n  }\n  return validUnits.indexOf(unit) > -1\n};\n\nconst emScale = styleLevel => {\n  const scriptLevel = Math.max(styleLevel - 1, 0);\n  return [1, 0.7, 0.5][scriptLevel]\n};\n\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS value.\n */\nconst calculateSize = function(sizeValue, style) {\n  let number = sizeValue.number;\n  if (style.maxSize[0] < 0 && number > 0) {\n    return { number: 0, unit: \"em\" }\n  }\n  const unit = sizeValue.unit;\n  switch (unit) {\n    case \"mm\":\n    case \"cm\":\n    case \"in\":\n    case \"px\": {\n      const numInCssPts = number * ptPerUnit[unit];\n      if (numInCssPts > style.maxSize[1]) {\n        return { number: style.maxSize[1], unit: \"pt\" }\n      }\n      return { number, unit }; // absolute CSS units.\n    }\n    case \"em\":\n    case \"ex\": {\n      // In TeX, em and ex do not change size in \\scriptstyle.\n      if (unit === \"ex\") { number *= 0.431; }\n      number = Math.min(number / emScale(style.level), style.maxSize[0]);\n      return { number: round(number), unit: \"em\" };\n    }\n    case \"bp\": {\n      if (number > style.maxSize[1]) { number = style.maxSize[1]; }\n      return { number, unit: \"pt\" }; // TeX bp is a CSS pt. (1/72 inch).\n    }\n    case \"pt\":\n    case \"pc\":\n    case \"dd\":\n    case \"cc\":\n    case \"nd\":\n    case \"nc\":\n    case \"sp\": {\n      number = Math.min(number * ptPerUnit[unit], style.maxSize[1]);\n      return { number: round(number), unit: \"pt\" }\n    }\n    case \"mu\": {\n      number = Math.min(number / 18, style.maxSize[0]);\n      return { number: round(number), unit: \"em\" }\n    }\n    default:\n      throw new ParseError(\"Invalid unit: '\" + unit + \"'\")\n  }\n};\n\n// Helper functions\n\nconst padding = width => {\n  const node = new MathNode(\"mspace\");\n  node.setAttribute(\"width\", width + \"em\");\n  return node\n};\n\nconst paddedNode = (group, lspace = 0.3, rspace = 0, mustSmash = false) => {\n  if (group == null && rspace === 0) { return padding(lspace) }\n  const row = group ? [group] : [];\n  if (lspace !== 0)   { row.unshift(padding(lspace)); }\n  if (rspace > 0) { row.push(padding(rspace)); }\n  if (mustSmash) {\n    // Used for the bottom arrow in a {CD} environment\n    const mpadded = new MathNode(\"mpadded\", row);\n    mpadded.setAttribute(\"height\", \"0.1px\"); // Don't use 0. WebKit would hide it.\n    return mpadded\n  } else {\n    return new MathNode(\"mrow\", row)\n  }\n};\n\nconst labelSize = (size, scriptLevel) =>  Number(size) / emScale(scriptLevel);\n\nconst munderoverNode = (fName, body, below, style) => {\n  const arrowNode = mathMLnode(fName);\n  // Is this the short part of a mhchem equilibrium arrow?\n  const isEq = fName.slice(1, 3) === \"eq\";\n  const minWidth = fName.charAt(1) === \"x\"\n    ? \"1.75\"  // mathtools extensible arrows are ≥ 1.75em long\n    : fName.slice(2, 4) === \"cd\"\n    ? \"3.0\"  // cd package arrows\n    : isEq\n    ? \"1.0\"  // The shorter harpoon of a mhchem equilibrium arrow\n    : \"2.0\"; // other mhchem arrows\n  // TODO: When Firefox supports minsize, use the next line.\n  //arrowNode.setAttribute(\"minsize\", String(minWidth) + \"em\")\n  arrowNode.setAttribute(\"lspace\", \"0\");\n  arrowNode.setAttribute(\"rspace\", (isEq ? \"0.5em\" : \"0\"));\n\n  // <munderover> upper and lower labels are set to scriptlevel by MathML\n  // So we have to adjust our label dimensions accordingly.\n  const labelStyle = style.withLevel(style.level < 2 ? 2 : 3);\n  const minArrowWidth = labelSize(minWidth, labelStyle.level);\n  // The dummyNode will be inside a <mover> inside a <mover>\n  // So it will be at scriptlevel 3\n  const dummyWidth = labelSize(minWidth, 3);\n  const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0);\n  const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0);\n  // The arrow is a little longer than the label. Set a spacer length.\n  const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4);\n  let upperNode;\n  let lowerNode;\n\n  const gotUpper = (body && body.body &&\n    // \\hphantom        visible content\n    (body.body.body || body.body.length > 0));\n  if (gotUpper) {\n    let label =  buildGroup$1(body, labelStyle);\n    const mustSmash = (fName === \"\\\\\\\\cdrightarrow\" || fName === \"\\\\\\\\cdleftarrow\");\n    label = paddedNode(label, space, space, mustSmash);\n    // Since Firefox does not support minsize, stack a invisible node\n    // on top of the label. Its width will serve as a min-width.\n    // TODO: Refactor this after Firefox supports minsize.\n    upperNode = new MathNode(\"mover\", [label, dummyNode]);\n  }\n  const gotLower = (below && below.body &&\n    (below.body.body || below.body.length > 0));\n  if (gotLower) {\n    let label =  buildGroup$1(below, labelStyle);\n    label = paddedNode(label, space, space);\n    lowerNode = new MathNode(\"munder\", [label, dummyNode]);\n  }\n\n  let node;\n  if (!gotUpper && !gotLower) {\n    node = new MathNode(\"mover\", [arrowNode, emptyLabel]);\n  } else if (gotUpper && gotLower) {\n    node = new MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n  } else if (gotUpper) {\n    node = new MathNode(\"mover\", [arrowNode, upperNode]);\n  } else {\n    node = new MathNode(\"munder\", [arrowNode, lowerNode]);\n  }\n  if (minWidth === \"3.0\") { node.style.height = \"1em\"; } // CD environment\n  node.setAttribute(\"accent\", \"false\"); // Necessary for MS Word\n  return node\n};\n\n// Stretchy arrows with an optional argument\ndefineFunction({\n  type: \"xArrow\",\n  names: [\n    \"\\\\xleftarrow\",\n    \"\\\\xrightarrow\",\n    \"\\\\xLeftarrow\",\n    \"\\\\xRightarrow\",\n    \"\\\\xleftrightarrow\",\n    \"\\\\xLeftrightarrow\",\n    \"\\\\xhookleftarrow\",\n    \"\\\\xhookrightarrow\",\n    \"\\\\xmapsto\",\n    \"\\\\xrightharpoondown\",\n    \"\\\\xrightharpoonup\",\n    \"\\\\xleftharpoondown\",\n    \"\\\\xleftharpoonup\",\n    \"\\\\xlongequal\",\n    \"\\\\xtwoheadrightarrow\",\n    \"\\\\xtwoheadleftarrow\",\n    \"\\\\xtofrom\",              // expfeil\n    \"\\\\xleftrightharpoons\",   // mathtools\n    \"\\\\xrightleftharpoons\",   // mathtools\n    // The next 7 functions are here only to support mhchem\n    \"\\\\yields\",\n    \"\\\\yieldsLeft\",\n    \"\\\\mesomerism\",\n    \"\\\\longrightharpoonup\",\n    \"\\\\longleftharpoondown\",\n    \"\\\\yieldsLeftRight\",\n    \"\\\\chemequilibrium\",\n    // The next 3 functions are here only to support the {CD} environment.\n    \"\\\\\\\\cdrightarrow\",\n    \"\\\\\\\\cdleftarrow\",\n    \"\\\\\\\\cdlongequal\"\n  ],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    return {\n      type: \"xArrow\",\n      mode: parser.mode,\n      name: funcName,\n      body: args[0],\n      below: optArgs[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Build the arrow and its labels.\n    const node = munderoverNode(group.name, group.body, group.below, style);\n    // Create operator spacing for a relation.\n    const row = [node];\n    row.unshift(padding(0.2778));\n    row.push(padding(0.2778));\n    return new MathNode(\"mrow\", row)\n  }\n});\n\nconst arrowComponent = {\n  \"\\\\equilibriumRight\": [\"\\\\longrightharpoonup\", \"\\\\eqleftharpoondown\"],\n  \"\\\\equilibriumLeft\": [\"\\\\eqrightharpoonup\", \"\\\\longleftharpoondown\"]\n};\n\n// Math fonts do not have a single glyph for these two mhchem functions.\n// So we stack a pair of single harpoons.\ndefineFunction({\n  type: \"stackedArrow\",\n  names: [\n    \"\\\\equilibriumRight\",\n    \"\\\\equilibriumLeft\"\n  ],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    const lowerArrowBody = args[0]\n      ? {\n        type: \"hphantom\",\n        mode: parser.mode,\n        body: args[0]\n      }\n      : null;\n    const upperArrowBelow = optArgs[0]\n      ? {\n        type: \"hphantom\",\n        mode: parser.mode,\n        body: optArgs[0]\n      }\n      : null;\n    return {\n      type: \"stackedArrow\",\n      mode: parser.mode,\n      name: funcName,\n      body: args[0],\n      upperArrowBelow,\n      lowerArrowBody,\n      below: optArgs[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    const topLabel = arrowComponent[group.name][0];\n    const botLabel = arrowComponent[group.name][1];\n    const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style);\n    const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style);\n    let wrapper;\n\n    const raiseNode = new MathNode(\"mpadded\", [topArrow]);\n    raiseNode.setAttribute(\"voffset\", \"0.3em\");\n    raiseNode.setAttribute(\"height\", \"+0.3em\");\n    raiseNode.setAttribute(\"depth\", \"-0.3em\");\n    // One of the arrows is given ~zero width. so the other has the same horzontal alignment.\n    if (group.name === \"\\\\equilibriumLeft\") {\n      const botNode =  new MathNode(\"mpadded\", [botArrow]);\n      botNode.setAttribute(\"width\", \"0.5em\");\n      wrapper = new MathNode(\n        \"mpadded\",\n        [padding(0.2778), botNode, raiseNode, padding(0.2778)]\n      );\n    } else {\n      raiseNode.setAttribute(\"width\", (group.name === \"\\\\equilibriumRight\" ? \"0.5em\" : \"0\"));\n      wrapper = new MathNode(\n        \"mpadded\",\n        [padding(0.2778), raiseNode, botArrow, padding(0.2778)]\n      );\n    }\n\n    wrapper.setAttribute(\"voffset\", \"-0.18em\");\n    wrapper.setAttribute(\"height\", \"-0.18em\");\n    wrapper.setAttribute(\"depth\", \"+0.18em\");\n    return wrapper\n  }\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nconst _environments = {};\n\nfunction defineEnvironment({ type, names, props, handler, mathmlBuilder }) {\n  // Set default values of environments.\n  const data = {\n    type,\n    numArgs: props.numArgs || 0,\n    allowedInText: false,\n    numOptionalArgs: 0,\n    handler\n  };\n  for (let i = 0; i < names.length; ++i) {\n    _environments[names[i]] = data;\n  }\n  if (mathmlBuilder) {\n    _mathmlGroupBuilders[type] = mathmlBuilder;\n  }\n}\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n  if (!node || node.type !== type) {\n    throw new Error(\n      `Expected node of type ${type}, but got ` +\n        (node ? `node of type ${node.type}` : String(node))\n    );\n  }\n  return node;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n  const typedNode = checkSymbolNodeType(node);\n  if (!typedNode) {\n    throw new Error(\n      `Expected node of symbol group type, but got ` +\n        (node ? `node of type ${node.type}` : String(node))\n    );\n  }\n  return typedNode;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n  if (node && (node.type === \"atom\" || node.type === \"delimiter\" ||\n      Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) {\n    return node;\n  }\n  return null;\n}\n\nconst cdArrowFunctionName = {\n  \">\": \"\\\\\\\\cdrightarrow\",\n  \"<\": \"\\\\\\\\cdleftarrow\",\n  \"=\": \"\\\\\\\\cdlongequal\",\n  A: \"\\\\uparrow\",\n  V: \"\\\\downarrow\",\n  \"|\": \"\\\\Vert\",\n  \".\": \"no arrow\"\n};\n\nconst newCell = () => {\n  // Create an empty cell, to be filled below with parse nodes.\n  return { type: \"styling\", body: [], mode: \"math\", scriptLevel: \"display\" };\n};\n\nconst isStartOfArrow = (node) => {\n  return node.type === \"textord\" && node.text === \"@\";\n};\n\nconst isLabelEnd = (node, endChar) => {\n  return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\n\nfunction cdArrow(arrowChar, labels, parser) {\n  // Return a parse tree of an arrow and its labels.\n  // This acts in a way similar to a macro expansion.\n  const funcName = cdArrowFunctionName[arrowChar];\n  switch (funcName) {\n    case \"\\\\\\\\cdrightarrow\":\n    case \"\\\\\\\\cdleftarrow\":\n      return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n    case \"\\\\uparrow\":\n    case \"\\\\downarrow\": {\n      const leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n      const bareArrow = {\n        type: \"atom\",\n        text: funcName,\n        mode: \"math\",\n        family: \"rel\"\n      };\n      const sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n      const rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n      const arrowGroup = {\n        type: \"ordgroup\",\n        mode: \"math\",\n        body: [leftLabel, sizedArrow, rightLabel],\n        semisimple: true\n      };\n      return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n    }\n    case \"\\\\\\\\cdlongequal\":\n      return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n    case \"\\\\Vert\": {\n      const arrow = { type: \"textord\", text: \"\\\\Vert\", mode: \"math\" };\n      return parser.callFunction(\"\\\\Big\", [arrow], []);\n    }\n    default:\n      return { type: \"textord\", text: \" \", mode: \"math\" };\n  }\n}\n\nfunction parseCD(parser) {\n  // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n  const parsedRows = [];\n  parser.gullet.beginGroup();\n  parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  parser.gullet.beginGroup();\n  while (true) {\n    // Get the parse nodes for the next row.\n    parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    const next = parser.fetch().text;\n    if (next === \"&\" || next === \"\\\\\\\\\") {\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      if (parsedRows[parsedRows.length - 1].length === 0) {\n        parsedRows.pop(); // final row ended in \\\\\n      }\n      break;\n    } else {\n      throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n\n  let row = [];\n  const body = [row];\n\n  // Loop thru the parse nodes. Collect them into cells and arrows.\n  for (let i = 0; i < parsedRows.length; i++) {\n    // Start a new row.\n    const rowNodes = parsedRows[i];\n    // Create the first cell.\n    let cell = newCell();\n\n    for (let j = 0; j < rowNodes.length; j++) {\n      if (!isStartOfArrow(rowNodes[j])) {\n        // If a parseNode is not an arrow, it goes into a cell.\n        cell.body.push(rowNodes[j]);\n      } else {\n        // Parse node j is an \"@\", the start of an arrow.\n        // Before starting on the arrow, push the cell into `row`.\n        row.push(cell);\n\n        // Now collect parseNodes into an arrow.\n        // The character after \"@\" defines the arrow type.\n        j += 1;\n        const arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n\n        // Create two empty label nodes. We may or may not use them.\n        const labels = new Array(2);\n        labels[0] = { type: \"ordgroup\", mode: \"math\", body: [] };\n        labels[1] = { type: \"ordgroup\", mode: \"math\", body: [] };\n\n        // Process the arrow.\n        if (\"=|.\".indexOf(arrowChar) > -1) ; else if (\"<>AV\".indexOf(arrowChar) > -1) {\n          // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n          // two optional labels. E.g. the right-point arrow syntax is\n          // really:  @>{optional label}>{optional label}>\n          // Collect parseNodes into labels.\n          for (let labelNum = 0; labelNum < 2; labelNum++) {\n            let inLabel = true;\n            for (let k = j + 1; k < rowNodes.length; k++) {\n              if (isLabelEnd(rowNodes[k], arrowChar)) {\n                inLabel = false;\n                j = k;\n                break;\n              }\n              if (isStartOfArrow(rowNodes[k])) {\n                throw new ParseError(\n                  \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n                  rowNodes[k]\n                );\n              }\n\n              labels[labelNum].body.push(rowNodes[k]);\n            }\n            if (inLabel) {\n              // isLabelEnd never returned a true.\n              throw new ParseError(\n                \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n                rowNodes[j]\n              );\n            }\n          }\n        } else {\n          throw new ParseError(`Expected one of \"<>AV=|.\" after @.`);\n        }\n\n        // Now join the arrow to its labels.\n        const arrow = cdArrow(arrowChar, labels, parser);\n\n        // Wrap the arrow in a styling node\n        row.push(arrow);\n        // In CD's syntax, cells are implicit. That is, everything that\n        // is not an arrow gets collected into a cell. So create an empty\n        // cell now. It will collect upcoming parseNodes.\n        cell = newCell();\n      }\n    }\n    if (i % 2 === 0) {\n      // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n      // The last cell is not yet pushed into `row`, so:\n      row.push(cell);\n    } else {\n      // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n      // Remove the empty cell that was placed at the beginning of `row`.\n      row.shift();\n    }\n    row = [];\n    body.push(row);\n  }\n  body.pop();\n\n  // End row group\n  parser.gullet.endGroup();\n  // End array group defining \\\\\n  parser.gullet.endGroup();\n\n  return {\n    type: \"array\",\n    mode: \"math\",\n    body,\n    tags: null,\n    labels: new Array(body.length + 1).fill(\"\"),\n    envClasses: [\"jot\", \"cd\"],\n    cols: [],\n    hLinesBeforeRow: new Array(body.length + 1).fill([])\n  };\n}\n\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\n\ndefineFunction({\n  type: \"cdlabel\",\n  names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser, funcName }, args) {\n    return {\n      type: \"cdlabel\",\n      mode: parser.mode,\n      side: funcName.slice(4),\n      label: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    if (group.label.body.length === 0) {\n      return new MathNode(\"mrow\", style)  // empty label\n    }\n    // Abuse an <mtable> to create vertically centered content.\n    const mrow = buildGroup$1(group.label, style);\n    if (group.side === \"left\") {\n      mrow.classes.push(\"tml-shift-left\");\n    }\n    const mtd = new MathNode(\"mtd\", [mrow]);\n    mtd.style.padding = \"0\";\n    const mtr = new MathNode(\"mtr\", [mtd]);\n    const mtable = new MathNode(\"mtable\", [mtr]);\n    const label = new MathNode(\"mpadded\", [mtable]);\n    // Set the label width to zero so that the arrow will be centered under the corner cell.\n    label.setAttribute(\"width\", \"0.1px\"); // Don't use 0. WebKit would hide it.\n    label.setAttribute(\"displaystyle\", \"false\");\n    label.setAttribute(\"scriptlevel\", \"1\");\n    return label;\n  }\n});\n\ndefineFunction({\n  type: \"cdlabelparent\",\n  names: [\"\\\\\\\\cdparent\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"cdlabelparent\",\n      mode: parser.mode,\n      fragment: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    return new MathNode(\"mrow\", [buildGroup$1(group.fragment, style)]);\n  }\n});\n\nconst ordGroup = (body) => {\n  return {\n    \"type\": \"ordgroup\",\n    \"mode\": \"math\",\n    \"body\": body,\n    \"semisimple\": true\n  }\n};\n\nconst phantom = (body, type) => {\n  return {\n    \"type\": type,\n    \"mode\": \"math\",\n    \"body\": ordGroup(body)\n  }\n};\n\n/*\n * A helper for \\bordermatrix.\n * parseArray() has parsed the tokens as if the environment\n * was \\begin{matrix}. That parse tree is this function’s input.\n * Here, we rearrange the parse tree to get one that will\n * result in TeX \\bordermatrix.\n * The final result includes a {pmatrix}, which is the bottom\n * half of a <mover> element. The top of the <mover> contains\n * the \\bordermatrix headings. The top section also contains the\n * contents of the bottom {pmatrix}. Those elements are hidden via\n * \\hphantom, but they ensure that column widths are the same top and\n * bottom.\n *\n * We also create a left {matrix} with a single column that contains\n * elements shifted out of the matrix. The left {matrix} also\n * contains \\vphantom copies of the other {pmatrix} elements.\n * As before, this ensures consistent row heights of left and main.\n */\n\nconst bordermatrixParseTree = (matrix, delimiters) => {\n  const body = matrix.body;\n  body[0].shift(); // dispose of top left cell\n\n  // Create an array for the left column\n  const leftColumnBody = new Array(body.length - 1).fill().map(() => []);\n  for (let i = 1; i < body.length; i++) {\n    // The visible part of the cell\n    leftColumnBody[i - 1].push(body[i].shift());\n    // A vphantom with contents from the pmatrix, to set minimum cell height\n    const phantomBody = [];\n    for (let j = 0; j < body[i].length; j++) {\n      phantomBody.push(body[i][j]);\n    }\n    leftColumnBody[i - 1].push(phantom(phantomBody, \"vphantom\"));\n  }\n\n  // Create an array for the top row\n  const topRowBody = new Array(body.length).fill().map(() => []);\n  for (let j = 0; j < body[0].length; j++) {\n    topRowBody[0].push(body[0][j]);\n  }\n  // Copy the rest of the pmatrix, but squashed via \\hphantom\n  for (let i = 1; i < body.length; i++) {\n    for (let j = 0; j < body[0].length; j++) {\n      topRowBody[i].push(phantom(body[i][j].body, \"hphantom\"));\n    }\n  }\n\n  // Squash the top row of the main {pmatrix}\n  for (let j = 0; j < body[0].length; j++) {\n    body[0][j] = phantom(body[0][j].body, \"hphantom\");\n  }\n\n  // Now wrap the arrays in the proper parse nodes.\n\n  const leftColumn = {\n    type: \"array\",\n    mode: \"math\",\n    body: leftColumnBody,\n    cols: [{ type: \"align\", align: \"c\" }],\n    rowGaps: new Array(leftColumnBody.length - 1).fill(null),\n    hLinesBeforeRow: new Array(leftColumnBody.length + 1).fill().map(() => []),\n    envClasses: [],\n    scriptLevel: \"text\",\n    arraystretch: 1,\n    labels: new Array(leftColumnBody.length).fill(\"\"),\n    arraycolsep: { \"number\": 0.04, unit: \"em\" }\n  };\n\n  const topRow = {\n    type: \"array\",\n    mode: \"math\",\n    body: topRowBody,\n    cols: new Array(topRowBody.length).fill({ type: \"align\", align: \"c\" }),\n    rowGaps: new Array(topRowBody.length - 1).fill(null),\n    hLinesBeforeRow: new Array(topRowBody.length + 1).fill().map(() => []),\n    envClasses: [],\n    scriptLevel: \"text\",\n    arraystretch: 1,\n    labels: new Array(topRowBody.length).fill(\"\"),\n    arraycolsep: null\n  };\n\n  const topWrapper = {\n    type: \"styling\",\n    mode: \"math\",\n    scriptLevel: \"text\", // Must set this explicitly.\n    body: [topRow]       // Default level is \"script\".\n  };\n\n  const container = {\n    type: \"leftright\",\n    mode: \"math\",\n    body: [matrix],\n    left: delimiters ? delimiters[0] : \"(\",\n    right: delimiters ? delimiters[1] : \")\",\n    rightColor: undefined\n  };\n\n  const base = {\n    type: \"op\",   // The base of a TeX \\overset\n    mode: \"math\",\n    limits: true,\n    alwaysHandleSupSub: true,\n    parentIsSupSub: true,\n    symbol: false,\n    suppressBaseShift: true,\n    body: [container]\n  };\n\n  const mover = {\n    type: \"supsub\",  // We're using the MathML equivalent\n    mode: \"math\",    // of TeX \\overset.\n    stack: true,\n    base: base,      // That keeps the {pmatrix} aligned with\n    sup: topWrapper, // the math centerline.\n    sub: null\n  };\n\n  return ordGroup([leftColumn, mover])\n};\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n  constructor(lexer, start, end) {\n    this.lexer = lexer; // Lexer holding the input string.\n    this.start = start; // Start offset, zero-based inclusive.\n    this.end = end;     // End offset, zero-based exclusive.\n  }\n\n  /**\n   * Merges two `SourceLocation`s from location providers, given they are\n   * provided in order of appearance.\n   * - Returns the first one's location if only the first is provided.\n   * - Returns a merged range of the first and the last if both are provided\n   *   and their lexers match.\n   * - Otherwise, returns null.\n   */\n  static range(first, second) {\n    if (!second) {\n      return first && first.loc;\n    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n      return null;\n    } else {\n      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n    }\n  }\n}\n\n/**\n * Interface required to break circular dependency between Token, Lexer, and\n * ParseError.\n */\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n  constructor(\n    text, // the text of this token\n    loc\n  ) {\n    this.text = text;\n    this.loc = loc;\n  }\n\n  /**\n   * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n   * the whole input range enclosed by these two.\n   */\n  range(\n    endToken, // last token of the range, inclusive\n    text // the text of the newly constructed token\n  ) {\n    return new Token(text, SourceLocation.range(this, endToken));\n  }\n}\n\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle, scriptstyle, and scriptscriptstyle.  These are\n// provided in the the arrays below, in that order.\n//\n\n// Math style is not quite the same thing as script level.\nconst StyleLevel = {\n  DISPLAY: 0,\n  TEXT: 1,\n  SCRIPT: 2,\n  SCRIPTSCRIPT: 3\n};\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nconst _macros = {};\n\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n  _macros[name] = body;\n}\n\n/**\n * Predefined macros for Temml.\n * This can be used to define some commands in terms of others.\n */\n\nconst macros = _macros;\n\n//////////////////////////////////////////////////////////////////////\n// macro tools\n\ndefineMacro(\"\\\\noexpand\", function(context) {\n  // The expansion is the token itself; but that token is interpreted\n  // as if its meaning were ‘\\relax’ if it is a control sequence that\n  // would ordinarily be expanded by TeX’s expansion rules.\n  const t = context.popToken();\n  if (context.isExpandable(t.text)) {\n    t.noexpand = true;\n    t.treatAsRelax = true;\n  }\n  return { tokens: [t], numArgs: 0 };\n});\n\ndefineMacro(\"\\\\expandafter\", function(context) {\n  // TeX first reads the token that comes immediately after \\expandafter,\n  // without expanding it; let’s call this token t. Then TeX reads the\n  // token that comes after t (and possibly more tokens, if that token\n  // has an argument), replacing it by its expansion. Finally TeX puts\n  // t back in front of that expansion.\n  const t = context.popToken();\n  context.expandOnce(true); // expand only an expandable token\n  return { tokens: [t], numArgs: 0 };\n});\n\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function(context) {\n  const args = context.consumeArgs(2);\n  return { tokens: args[0], numArgs: 0 };\n});\n\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function(context) {\n  const args = context.consumeArgs(2);\n  return { tokens: args[1], numArgs: 0 };\n});\n\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character.  If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function(context) {\n  const args = context.consumeArgs(3); // symbol, if, else\n  context.consumeSpaces();\n  const nextToken = context.future();\n  if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n    return { tokens: args[1], numArgs: 0 };\n  } else {\n    return { tokens: args[2], numArgs: 0 };\n  }\n});\n\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function(context) {\n  const args = context.consumeArgs(2);\n  if (context.mode === \"text\") {\n    return { tokens: args[0], numArgs: 0 };\n  } else {\n    return { tokens: args[1], numArgs: 0 };\n  }\n});\n\nconst stringFromArg = arg => {\n  // Reverse the order of the arg and return a string.\n  let str = \"\";\n  for (let i = arg.length - 1; i > -1; i--) {\n    str += arg[i].text;\n  }\n  return str\n};\n\n// Lookup table for parsing numbers in base 8 through 16\nconst digitToNumber = {\n  0: 0,\n  1: 1,\n  2: 2,\n  3: 3,\n  4: 4,\n  5: 5,\n  6: 6,\n  7: 7,\n  8: 8,\n  9: 9,\n  a: 10,\n  A: 10,\n  b: 11,\n  B: 11,\n  c: 12,\n  C: 12,\n  d: 13,\n  D: 13,\n  e: 14,\n  E: 14,\n  f: 15,\n  F: 15\n};\n\nconst nextCharNumber = context => {\n  const numStr = context.future().text;\n  if (numStr === \"EOF\") { return [null, \"\"] }\n  return [digitToNumber[numStr.charAt(0)], numStr]\n};\n\nconst appendCharNumbers = (number, numStr, base) => {\n  for (let i = 1; i < numStr.length; i++) {\n    const digit = digitToNumber[numStr.charAt(i)];\n    number *= base;\n    number += digit;\n  }\n  return number\n};\n\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n//   \\char123  -- decimal\n//   \\char'123 -- octal\n//   \\char\"123 -- hex\n//   \\char`x   -- character that can be written (i.e. isn't active)\n//   \\char`\\x  -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function(context) {\n  let token = context.popToken();\n  let base;\n  let number = \"\";\n  if (token.text === \"'\") {\n    base = 8;\n    token = context.popToken();\n  } else if (token.text === '\"') {\n    base = 16;\n    token = context.popToken();\n  } else if (token.text === \"`\") {\n    token = context.popToken();\n    if (token.text[0] === \"\\\\\") {\n      number = token.text.charCodeAt(1);\n    } else if (token.text === \"EOF\") {\n      throw new ParseError(\"\\\\char` missing argument\");\n    } else {\n      number = token.text.charCodeAt(0);\n    }\n  } else {\n    base = 10;\n  }\n  if (base) {\n    // Parse a number in the given base, starting with first `token`.\n    let numStr = token.text;\n    number = digitToNumber[numStr.charAt(0)];\n    if (number == null || number >= base) {\n      throw new ParseError(`Invalid base-${base} digit ${token.text}`);\n    }\n    number = appendCharNumbers(number, numStr, base);\n    let digit;\n    [digit, numStr] = nextCharNumber(context);\n    while (digit != null && digit < base) {\n      number *= base;\n      number += digit;\n      number = appendCharNumbers(number, numStr, base);\n      context.popToken();\n      [digit, numStr] = nextCharNumber(context);\n    }\n  }\n  return `\\\\@char{${number}}`;\n});\n\nfunction recreateArgStr(context) {\n  // Recreate the macro's original argument string from the array of parse tokens.\n  const tokens = context.consumeArgs(1)[0];\n  let str = \"\";\n  let expectedLoc = tokens[tokens.length - 1].loc.start;\n  for (let i = tokens.length - 1; i >= 0; i--) {\n    const actualLoc = tokens[i].loc.start;\n    if (actualLoc > expectedLoc) {\n      // context.consumeArgs has eaten a space.\n      str += \" \";\n      expectedLoc = actualLoc;\n    }\n    str += tokens[i].text;\n    expectedLoc += tokens[i].text.length;\n  }\n  return str\n}\n\n// The Latin Modern font renders <mi>√</mi> at the wrong vertical alignment.\n// This macro provides a better rendering.\ndefineMacro(\"\\\\surd\", '\\\\sqrt{\\\\vphantom{|}}');\n\n// See comment for \\oplus in symbols.js.\ndefineMacro(\"\\u2295\", \"\\\\oplus\");\n\n// Since Temml has no \\par, ignore \\long.\ndefineMacro(\"\\\\long\", \"\");\n\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\n\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n\n// \\vdots{\\vbox{\\baselineskip4\\p@  \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n\n// {array} environment gaps\ndefineMacro(\"\\\\arraystretch\", \"1\");     // line spacing factor times 12pt\ndefineMacro(\"\\\\arraycolsep\", \"6pt\");    // half the width separating columns\n\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nconst dotsByToken = {\n  \",\": \"\\\\dotsc\",\n  \"\\\\not\": \"\\\\dotsb\",\n  // \\keybin@ checks for the following:\n  \"+\": \"\\\\dotsb\",\n  \"=\": \"\\\\dotsb\",\n  \"<\": \"\\\\dotsb\",\n  \">\": \"\\\\dotsb\",\n  \"-\": \"\\\\dotsb\",\n  \"*\": \"\\\\dotsb\",\n  \":\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\DOTSB:\n  \"\\\\DOTSB\": \"\\\\dotsb\",\n  \"\\\\coprod\": \"\\\\dotsb\",\n  \"\\\\bigvee\": \"\\\\dotsb\",\n  \"\\\\bigwedge\": \"\\\\dotsb\",\n  \"\\\\biguplus\": \"\\\\dotsb\",\n  \"\\\\bigcap\": \"\\\\dotsb\",\n  \"\\\\bigcup\": \"\\\\dotsb\",\n  \"\\\\prod\": \"\\\\dotsb\",\n  \"\\\\sum\": \"\\\\dotsb\",\n  \"\\\\bigotimes\": \"\\\\dotsb\",\n  \"\\\\bigoplus\": \"\\\\dotsb\",\n  \"\\\\bigodot\": \"\\\\dotsb\",\n  \"\\\\bigsqcap\": \"\\\\dotsb\",\n  \"\\\\bigsqcup\": \"\\\\dotsb\",\n  \"\\\\bigtimes\": \"\\\\dotsb\",\n  \"\\\\And\": \"\\\\dotsb\",\n  \"\\\\longrightarrow\": \"\\\\dotsb\",\n  \"\\\\Longrightarrow\": \"\\\\dotsb\",\n  \"\\\\longleftarrow\": \"\\\\dotsb\",\n  \"\\\\Longleftarrow\": \"\\\\dotsb\",\n  \"\\\\longleftrightarrow\": \"\\\\dotsb\",\n  \"\\\\Longleftrightarrow\": \"\\\\dotsb\",\n  \"\\\\mapsto\": \"\\\\dotsb\",\n  \"\\\\longmapsto\": \"\\\\dotsb\",\n  \"\\\\hookrightarrow\": \"\\\\dotsb\",\n  \"\\\\doteq\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\mathbin:\n  \"\\\\mathbin\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\mathrel:\n  \"\\\\mathrel\": \"\\\\dotsb\",\n  \"\\\\relbar\": \"\\\\dotsb\",\n  \"\\\\Relbar\": \"\\\\dotsb\",\n  \"\\\\xrightarrow\": \"\\\\dotsb\",\n  \"\\\\xleftarrow\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\DOTSI:\n  \"\\\\DOTSI\": \"\\\\dotsi\",\n  \"\\\\int\": \"\\\\dotsi\",\n  \"\\\\oint\": \"\\\\dotsi\",\n  \"\\\\iint\": \"\\\\dotsi\",\n  \"\\\\iiint\": \"\\\\dotsi\",\n  \"\\\\iiiint\": \"\\\\dotsi\",\n  // Symbols whose definition starts with \\DOTSX:\n  \"\\\\DOTSX\": \"\\\\dotsx\"\n};\n\ndefineMacro(\"\\\\dots\", function(context) {\n  // TODO: If used in text mode, should expand to \\textellipsis.\n  // However, in Temml, \\textellipsis and \\ldots behave the same\n  // (in text mode), and it's unlikely we'd see any of the math commands\n  // that affect the behavior of \\dots when in text mode.  So fine for now\n  // (until we support \\ifmmode ... \\else ... \\fi).\n  let thedots = \"\\\\dotso\";\n  const next = context.expandAfterFuture().text;\n  if (next in dotsByToken) {\n    thedots = dotsByToken[next];\n  } else if (next.slice(0, 4) === \"\\\\not\") {\n    thedots = \"\\\\dotsb\";\n  } else if (next in symbols.math) {\n    if ([\"bin\", \"rel\"].includes(symbols.math[next].group)) {\n      thedots = \"\\\\dotsb\";\n    }\n  }\n  return thedots;\n});\n\nconst spaceAfterDots = {\n  // \\rightdelim@ checks for the following:\n  \")\": true,\n  \"]\": true,\n  \"\\\\rbrack\": true,\n  \"\\\\}\": true,\n  \"\\\\rbrace\": true,\n  \"\\\\rangle\": true,\n  \"\\\\rceil\": true,\n  \"\\\\rfloor\": true,\n  \"\\\\rgroup\": true,\n  \"\\\\rmoustache\": true,\n  \"\\\\right\": true,\n  \"\\\\bigr\": true,\n  \"\\\\biggr\": true,\n  \"\\\\Bigr\": true,\n  \"\\\\Biggr\": true,\n  // \\extra@ also tests for the following:\n  $: true,\n  // \\extrap@ checks for the following:\n  \";\": true,\n  \".\": true,\n  \",\": true\n};\n\ndefineMacro(\"\\\\dotso\", function(context) {\n  const next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\n\ndefineMacro(\"\\\\dotsc\", function(context) {\n  const next = context.future().text;\n  // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n  // ';' and '.', but doesn't check for ','.\n  if (next in spaceAfterDots && next !== \",\") {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\n\ndefineMacro(\"\\\\cdots\", function(context) {\n  const next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\@cdots\\\\,\";\n  } else {\n    return \"\\\\@cdots\";\n  }\n});\n\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\ndefineMacro(\"\\\\idotsint\", \"\\\\int\\\\!\\\\cdots\\\\!\\\\int\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n//   \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"{\\\\tmspace+{3mu}{.1667em}}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"{\\\\tmspace+{4mu}{.2222em}}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"{\\\\tmspace+{5mu}{.2777em}}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"{\\\\tmspace-{3mu}{.1667em}}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"{\\\\tmspace-{4mu}{.2222em}}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"{\\\\tmspace-{5mu}{.277em}}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n\ndefineMacro(\"\\\\AA\", \"\\\\TextOrMath{\\\\Angstrom}{\\\\mathring{A}}\\\\relax\");\n\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", (context) => {\n  if (context.macros.get(\"\\\\df@tag\")) {\n    throw new ParseError(\"Multiple \\\\tag\");\n  }\n  return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\n\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n//   {\\operator@font mod}\\penalty900\n//   \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n//   \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n//   \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathbin{\\\\text{mod}}\");\ndefineMacro(\n  \"\\\\pod\",\n  \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\"\n);\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\n  \"\\\\mod\",\n  \"\\\\allowbreak\" +\n    \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" +\n    \"{\\\\rm mod}\\\\,\\\\,#1\"\n);\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n\n// \\expandafter\\let\\expandafter\\@normalcr\n//     \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{T}\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125em\\\\textrm{X}\");\n\ndefineMacro(\n  \"\\\\LaTeX\",\n    \"\\\\textrm{L}\\\\kern-.35em\\\\raisebox{0.2em}{\\\\scriptstyle A}\\\\kern-.15em\\\\TeX\"\n);\n\ndefineMacro(\n  \"\\\\Temml\",\n  // eslint-disable-next-line max-len\n  \"\\\\textrm{T}\\\\kern-0.2em\\\\lower{0.2em}{\\\\textrm{E}}\\\\kern-0.08em{\\\\textrm{M}\\\\kern-0.08em\\\\raise{0.2em}\\\\textrm{M}\\\\kern-0.08em\\\\textrm{L}}\"\n);\n\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip  #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n//                 \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n\ndefineMacro(\"\\\\colon\", `\\\\mathpunct{\\\\char\"3a}`);\n\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n\ndefineMacro(\"\\\\prescript\", \"\\\\pres@cript{_{#1}^{#2}}{}{#3}\");\n\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", `\\\\char\"3a`);\n// Raise to center on the math axis, as closely as possible.\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2212}');\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", '\\\\mathrel{\\\\char\"2237\\\\char\"2212}');\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", '\\\\mathrel{\\\\char\"3d\\\\char\"2237}');\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", '\\\\mathrel{\\\\char\"2212\\\\char\"2237}');\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2248}');\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", '\\\\mathrel{\\\\char\"2237\\\\char\"2248}');\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\mathrel{\\\\char`\\u220C}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{\\\\text{lim}}}\");\n\ndefineMacro(\"\\\\centerdot\", \"{\\\\medspace\\\\rule{0.167em}{0.189em}\\\\medspace}\");\n\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\n\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\operatorname*{plim}\");\n\n//////////////////////////////////////////////////////////////////////\n// MnSymbol.sty\n\ndefineMacro(\"\\\\leftmodels\", \"\\\\mathop{\\\\reflectbox{$\\\\models$}}\");\n\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\n\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\n// A helper for \\Braket and \\Set\nconst replaceVert = (argStr, match) => {\n  const ch = match[0] === \"|\" ? \"\\\\vert\" : \"\\\\Vert\";\n  const replaceStr = `}\\\\,\\\\middle${ch}\\\\,{`;\n  return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length)\n};\ndefineMacro(\"\\\\Braket\",  function(context) {\n  let argStr = recreateArgStr(context);\n  const regEx = /\\|\\||\\||\\\\\\|/g;\n  let match;\n  while ((match = regEx.exec(argStr)) !== null) {\n    argStr = replaceVert(argStr, match);\n  }\n  return \"\\\\left\\\\langle{\" + argStr + \"}\\\\right\\\\rangle\"\n});\ndefineMacro(\"\\\\Set\",  function(context) {\n  let argStr = recreateArgStr(context);\n  const match = /\\|\\||\\||\\\\\\|/.exec(argStr);\n  if (match) {\n    argStr = replaceVert(argStr, match);\n  }\n  return \"\\\\left\\\\{\\\\:{\" + argStr + \"}\\\\:\\\\right\\\\}\"\n});\ndefineMacro(\"\\\\set\",  function(context) {\n  const argStr = recreateArgStr(context);\n  return \"\\\\{{\" + argStr.replace(/\\|/, \"}\\\\mid{\") + \"}\\\\}\"\n});\n\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n\n//////////////////////////////////////////////////////////////////////\n// derivative.sty\ndefineMacro(\"\\\\odv\", \"\\\\@ifstar\\\\odv@next\\\\odv@numerator\");\ndefineMacro(\"\\\\odv@numerator\", \"\\\\frac{\\\\mathrm{d}#1}{\\\\mathrm{d}#2}\");\ndefineMacro(\"\\\\odv@next\", \"\\\\frac{\\\\mathrm{d}}{\\\\mathrm{d}#2}#1\");\ndefineMacro(\"\\\\pdv\", \"\\\\@ifstar\\\\pdv@next\\\\pdv@numerator\");\n\nconst pdvHelper = args => {\n  const numerator = args[0][0].text;\n  const denoms = stringFromArg(args[1]).split(\",\");\n  const power = String(denoms.length);\n  const numOp = power === \"1\" ? \"\\\\partial\" : `\\\\partial^${power}`;\n  let denominator = \"\";\n  denoms.map(e => { denominator += \"\\\\partial \" + e.trim() +  \"\\\\,\";});\n  return [numerator, numOp,  denominator.replace(/\\\\,$/, \"\")]\n};\ndefineMacro(\"\\\\pdv@numerator\", function(context) {\n  const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n  return `\\\\frac{${numOp} ${numerator}}{${denominator}}`\n});\ndefineMacro(\"\\\\pdv@next\", function(context) {\n  const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n  return `\\\\frac{${numOp}}{${denominator}} ${numerator}`\n});\n\n//////////////////////////////////////////////////////////////////////\n// upgreek.dtx\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\upbeta\", \"\\\\up@greek{\\\\beta}\");\ndefineMacro(\"\\\\upgamma\", \"\\\\up@greek{\\\\gamma}\");\ndefineMacro(\"\\\\updelta\", \"\\\\up@greek{\\\\delta}\");\ndefineMacro(\"\\\\upepsilon\", \"\\\\up@greek{\\\\epsilon}\");\ndefineMacro(\"\\\\upzeta\", \"\\\\up@greek{\\\\zeta}\");\ndefineMacro(\"\\\\upeta\", \"\\\\up@greek{\\\\eta}\");\ndefineMacro(\"\\\\uptheta\", \"\\\\up@greek{\\\\theta}\");\ndefineMacro(\"\\\\upiota\", \"\\\\up@greek{\\\\iota}\");\ndefineMacro(\"\\\\upkappa\", \"\\\\up@greek{\\\\kappa}\");\ndefineMacro(\"\\\\uplambda\", \"\\\\up@greek{\\\\lambda}\");\ndefineMacro(\"\\\\upmu\", \"\\\\up@greek{\\\\mu}\");\ndefineMacro(\"\\\\upnu\", \"\\\\up@greek{\\\\nu}\");\ndefineMacro(\"\\\\upxi\", \"\\\\up@greek{\\\\xi}\");\ndefineMacro(\"\\\\upomicron\", \"\\\\up@greek{\\\\omicron}\");\ndefineMacro(\"\\\\uppi\", \"\\\\up@greek{\\\\pi}\");\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\uprho\", \"\\\\up@greek{\\\\rho}\");\ndefineMacro(\"\\\\upsigma\", \"\\\\up@greek{\\\\sigma}\");\ndefineMacro(\"\\\\uptau\", \"\\\\up@greek{\\\\tau}\");\ndefineMacro(\"\\\\upupsilon\", \"\\\\up@greek{\\\\upsilon}\");\ndefineMacro(\"\\\\upphi\", \"\\\\up@greek{\\\\phi}\");\ndefineMacro(\"\\\\upchi\", \"\\\\up@greek{\\\\chi}\");\ndefineMacro(\"\\\\uppsi\", \"\\\\up@greek{\\\\psi}\");\ndefineMacro(\"\\\\upomega\", \"\\\\up@greek{\\\\omega}\");\n\n//////////////////////////////////////////////////////////////////////\n// cmll package\ndefineMacro(\"\\\\invamp\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\parr\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\upand\", '\\\\mathbin{\\\\char\"214b}'); // STIX package\ndefineMacro(\"\\\\with\", '\\\\mathbin{\\\\char\"26}');\ndefineMacro(\"\\\\multimapinv\", '\\\\mathrel{\\\\char\"27dc}');\ndefineMacro(\"\\\\multimapboth\", '\\\\mathrel{\\\\char\"29df}');\ndefineMacro(\"\\\\scoh\", '{\\\\mkern5mu\\\\char\"2322\\\\mkern5mu}');\ndefineMacro(\"\\\\sincoh\", '{\\\\mkern5mu\\\\char\"2323\\\\mkern5mu}');\ndefineMacro(\"\\\\coh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2322}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2323}}}\\\\mkern5mu}`);\ndefineMacro(\"\\\\incoh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2323}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2322}}}\\\\mkern5mu}`);\n\n\n//////////////////////////////////////////////////////////////////////\n// chemstyle package\ndefineMacro(\"\\\\standardstate\", \"\\\\text{\\\\tiny\\\\char`⦵}\");\n\n﻿/* eslint-disable */\n/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */\n/* vim: set ts=2 et sw=2 tw=80: */\n\n/*************************************************************\n *\n *  Temml mhchem.js\n *\n *  This file implements a Temml version of mhchem version 3.3.0.\n *  It is adapted from MathJax/extensions/TeX/mhchem.js\n *  It differs from the MathJax version as follows:\n *    1. The interface is changed so that it can be called from Temml, not MathJax.\n *    2. \\rlap and \\llap are replaced with \\mathrlap and \\mathllap.\n *    3. The reaction arrow code is simplified. All reaction arrows are rendered\n *       using Temml extensible arrows instead of building non-extensible arrows.\n *    4. The ~bond forms are composed entirely of \\rule elements.\n *    5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-}\n *    6. The electron dot uses \\textbullet instead of \\bullet.\n *    7. \\smash[T] has been removed. (WebKit hides anything inside \\smash{…})\n *\n *    This code, as other Temml code, is released under the MIT license.\n * \n * /*************************************************************\n *\n *  MathJax/extensions/TeX/mhchem.js\n *\n *  Implements the \\ce command for handling chemical formulas\n *  from the mhchem LaTeX package.\n *\n *  ---------------------------------------------------------------------\n *\n *  Copyright (c) 2011-2015 The MathJax Consortium\n *  Copyright (c) 2015-2018 Martin Hensel\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\n\n//\n// Coding Style\n//   - use '' for identifiers that can by minified/uglified\n//   - use \"\" for strings that need to stay untouched\n\n// version: \"3.3.0\" for MathJax and Temml\n\n\n// Add \\ce, \\pu, and \\tripleDash to the Temml macros.\n\ndefineMacro(\"\\\\ce\", function(context) {\n  return chemParse(context.consumeArgs(1)[0], \"ce\")\n});\n\ndefineMacro(\"\\\\pu\", function(context) {\n  return chemParse(context.consumeArgs(1)[0], \"pu\");\n});\n\n// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry\n// So we'll compose characters built from \\rule elements.\ndefineMacro(\"\\\\uniDash\", `{\\\\rule{0.672em}{0.06em}}`)\ndefineMacro(\"\\\\triDash\", `{\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}}`)\ndefineMacro(\"\\\\tripleDash\", `\\\\kern0.075em\\\\raise0.25em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverLine\", `\\\\kern0.075em\\\\mathrlap{\\\\raise0.125em{\\\\uniDash}}\\\\raise0.34em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\triDash}}\\\\raise0.27em{\\\\uniDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashBetweenDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\uniDash}}\\\\raise0.27em{\\\\triDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\n\n  //\n  //  This is the main function for handing the \\ce and \\pu commands.\n  //  It takes the argument to \\ce or \\pu and returns the corresponding TeX string.\n  //\n\n  var chemParse = function (tokens, stateMachine) {\n    // Recreate the argument string from Temml's array of tokens.\n    var str = \"\";\n    var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start\n    for (var i = tokens.length - 1; i >= 0; i--) {\n      if(tokens[i].loc.start > expectedLoc) {\n        // context.consumeArgs has eaten a space.\n        str += \" \";\n        expectedLoc = tokens[i].loc.start;\n      }\n      str += tokens[i].text;\n      expectedLoc += tokens[i].text.length;\n    }\n    // Call the mhchem core parser.\n    var tex = texify.go(mhchemParser.go(str, stateMachine));\n    return tex;\n  };\n\n  //\n  // Core parser for mhchem syntax  (recursive)\n  //\n  /** @type {MhchemParser} */\n  var mhchemParser = {\n    //\n    // Parses mchem \\ce syntax\n    //\n    // Call like\n    //   go(\"H2O\");\n    //\n    go: function (input, stateMachine) {\n      if (!input) { return []; }\n      if (stateMachine === undefined) { stateMachine = 'ce'; }\n      var state = '0';\n\n      //\n      // String buffers for parsing:\n      //\n      // buffer.a == amount\n      // buffer.o == element\n      // buffer.b == left-side superscript\n      // buffer.p == left-side subscript\n      // buffer.q == right-side subscript\n      // buffer.d == right-side superscript\n      //\n      // buffer.r == arrow\n      // buffer.rdt == arrow, script above, type\n      // buffer.rd == arrow, script above, content\n      // buffer.rqt == arrow, script below, type\n      // buffer.rq == arrow, script below, content\n      //\n      // buffer.text_\n      // buffer.rm\n      // etc.\n      //\n      // buffer.parenthesisLevel == int, starting at 0\n      // buffer.sb == bool, space before\n      // buffer.beginsWithBond == bool\n      //\n      // These letters are also used as state names.\n      //\n      // Other states:\n      // 0 == begin of main part (arrow/operator unlikely)\n      // 1 == next entity\n      // 2 == next entity (arrow/operator unlikely)\n      // 3 == next atom\n      // c == macro\n      //\n      /** @type {Buffer} */\n      var buffer = {};\n      buffer['parenthesisLevel'] = 0;\n\n      input = input.replace(/\\n/g, \" \");\n      input = input.replace(/[\\u2212\\u2013\\u2014\\u2010]/g, \"-\");\n      input = input.replace(/[\\u2026]/g, \"...\");\n\n      //\n      // Looks through mhchemParser.transitions, to execute a matching action\n      // (recursive)\n      //\n      var lastInput;\n      var watchdog = 10;\n      /** @type {ParserOutput[]} */\n      var output = [];\n      while (true) {\n        if (lastInput !== input) {\n          watchdog = 10;\n          lastInput = input;\n        } else {\n          watchdog--;\n        }\n        //\n        // Find actions in transition table\n        //\n        var machine = mhchemParser.stateMachines[stateMachine];\n        var t = machine.transitions[state] || machine.transitions['*'];\n        iterateTransitions:\n        for (var i=0; i<t.length; i++) {\n          var matches = mhchemParser.patterns.match_(t[i].pattern, input);\n          if (matches) {\n            //\n            // Execute actions\n            //\n            var task = t[i].task;\n            for (var iA=0; iA<task.action_.length; iA++) {\n              var o;\n              //\n              // Find and execute action\n              //\n              if (machine.actions[task.action_[iA].type_]) {\n                o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n              } else if (mhchemParser.actions[task.action_[iA].type_]) {\n                o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n              } else {\n                throw [\"MhchemBugA\", \"mhchem bug A. Please report. (\" + task.action_[iA].type_ + \")\"];  // Trying to use non-existing action\n              }\n              //\n              // Add output\n              //\n              mhchemParser.concatArray(output, o);\n            }\n            //\n            // Set next state,\n            // Shorten input,\n            // Continue with next character\n            //   (= apply only one transition per position)\n            //\n            state = task.nextState || state;\n            if (input.length > 0) {\n              if (!task.revisit) {\n                input = matches.remainder;\n              }\n              if (!task.toContinue) {\n                break iterateTransitions;\n              }\n            } else {\n              return output;\n            }\n          }\n        }\n        //\n        // Prevent infinite loop\n        //\n        if (watchdog <= 0) {\n          throw [\"MhchemBugU\", \"mhchem bug U. Please report.\"];  // Unexpected character\n        }\n      }\n    },\n    concatArray: function (a, b) {\n      if (b) {\n        if (Array.isArray(b)) {\n          for (var iB=0; iB<b.length; iB++) {\n            a.push(b[iB]);\n          }\n        } else {\n          a.push(b);\n        }\n      }\n    },\n\n    patterns: {\n      //\n      // Matching patterns\n      // either regexps or function that return null or {match_:\"a\", remainder:\"bc\"}\n      //\n      patterns: {\n        // property names must not look like integers (\"2\") for correct property traversal order, later on\n        'empty': /^$/,\n        'else': /^./,\n        'else2': /^./,\n        'space': /^\\s/,\n        'space A': /^\\s(?=[A-Z\\\\$])/,\n        'space$': /^\\s$/,\n        'a-z': /^[a-z]/,\n        'x': /^x/,\n        'x$': /^x$/,\n        'i$': /^i$/,\n        'letters': /^(?:[a-zA-Z\\u03B1-\\u03C9\\u0391-\\u03A9?@]|(?:\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))))+/,\n        '\\\\greek': /^\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))/,\n        'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,\n        '$one lowercase latin letter$ $': /^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$/,\n        'one lowercase greek letter $': /^(?:\\$?[\\u03B1-\\u03C9]\\$?|\\$?\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\\s*\\$?)(?:\\s+|\\{\\}|(?![a-zA-Z]))$/,\n        'digits': /^[0-9]+/,\n        '-9.,9': /^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))/,\n        '-9.,9 no missing 0': /^[+\\-]?[0-9]+(?:[.,][0-9]+)?/,\n        '(-)(9.,9)(e)(99)': function (input) {\n          var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))?(\\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))\\))?(?:([eE]|\\s*(\\*|x|\\\\times|\\u00D7)\\s*10\\^)([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\}))?/);\n          if (m && m[0]) {\n            return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        '(-)(9)^(-9)': function (input) {\n          var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+)?)\\^([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\})/);\n          if (m && m[0]) {\n            return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        'state of aggregation $': function (input) {  // ... or crystal system\n          var a = mhchemParser.patterns.findObserveGroups(input, \"\", /^\\([a-z]{1,3}(?=[\\),])/, \")\", \"\");  // (aq), (aq,$\\infty$), (aq, sat)\n          if (a  &&  a.remainder.match(/^($|[\\s,;\\)\\]\\}])/)) { return a; }  //  AND end of 'phrase'\n          var m = input.match(/^(?:\\((?:\\\\ca\\s?)?\\$[amothc]\\$\\))/);  // OR crystal system ($o$) (\\ca$c$)\n          if (m) {\n            return { match_: m[0], remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        '_{(state of aggregation)}$': /^_\\{(\\([a-z]{1,3}\\))\\}/,\n        '{[(': /^(?:\\\\\\{|\\[|\\()/,\n        ')]}': /^(?:\\)|\\]|\\\\\\})/,\n        ', ': /^[,;]\\s*/,\n        ',': /^[,;]/,\n        '.': /^[.]/,\n        '. ': /^([.\\u22C5\\u00B7\\u2022])\\s*/,\n        '...': /^\\.\\.\\.(?=$|[^.])/,\n        '* ': /^([*])\\s*/,\n        '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^{\", \"\", \"\", \"}\"); },\n        '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", \"$\", \"$\", \"\"); },\n        '^a': /^\\^([0-9]+|[^\\\\_])/,\n        '^\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '^\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '^\\\\x': /^\\^(\\\\[a-zA-Z]+)\\s*/,\n        '^(-1)': /^\\^(-?\\d+)/,\n        '\\'': /^'/,\n        '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_{\", \"\", \"\", \"}\"); },\n        '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", \"$\", \"$\", \"\"); },\n        '_9': /^_([+\\-]?[0-9]+|[^\\\\])/,\n        '_\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '_\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '_\\\\x': /^_(\\\\[a-zA-Z]+)\\s*/,\n        '^_': /^(?:\\^(?=_)|\\_(?=\\^)|[\\^_]$)/,\n        '{}': /^\\{\\}/,\n        '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"{\", \"}\", \"\"); },\n        '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"{\", \"\", \"\", \"}\"); },\n        '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\"); },\n        '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"${\", \"\", \"\", \"}$\"); },\n        '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"$\", \"\", \"\", \"$\"); },\n        '=<>': /^[=<>]/,\n        '#': /^[#\\u2261]/,\n        '+': /^\\+/,\n        '-$': /^-(?=[\\s_},;\\]/]|$|\\([a-z]+\\))/,  // -space -, -; -] -/ -$ -state-of-aggregation\n        '-9': /^-(?=[0-9])/,\n        '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\\s,;\\)\\]\\}]))/,\n        '-': /^-/,\n        'pm-operator': /^(?:\\\\pm|\\$\\\\pm\\$|\\+-|\\+\\/-)/,\n        'operator': /^(?:\\+|(?:[\\-=<>]|<<|>>|\\\\approx|\\$\\\\approx\\$)(?=\\s|$|-?[0-9]))/,\n        'arrowUpDown': /^(?:v|\\(v\\)|\\^|\\(\\^\\))(?=$|[\\s,;\\)\\]\\}])/,\n        '\\\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\bond{\", \"\", \"\", \"}\"); },\n        '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\\u2192\\u27F6\\u21CC])/,\n        'CMT': /^[CMT](?=\\[)/,\n        '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"[\", \"\", \"\", \"]\"); },\n        '1st-level escape': /^(&|\\\\\\\\|\\\\hline)\\s*/,\n        '\\\\,': /^(?:\\\\[,\\ ;:])/,  // \\\\x - but output no space before\n        '\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '\\\\ca': /^\\\\ca(?:\\s+|(?![a-zA-Z]))/,\n        '\\\\x': /^(?:\\\\[a-zA-Z]+\\s*|\\\\[_&{}%])/,\n        'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,  // only those with numbers in front, because the others will be formatted correctly anyway\n        'others': /^[\\/~|]/,\n        '\\\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\frac{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\overset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underbrace{\", \"\", \"\", \"}_\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\"); },\n        '\\\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color\", \"\\\\\", \"\", /^(?=\\{)/, \"{\", \"\", \"\", \"}\"); },\n        '\\\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\ce{\", \"\", \"\", \"}\"); },\n        'oxidation$': /^(?:[+-][IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,\n        'd-oxidation$': /^(?:[+-]?\\s?[IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,  // 0 could be oxidation or charge\n        'roman numeral': /^[IVX]+/,\n        '1/2$': /^[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+(?:\\$[a-z]\\$|[a-z])?$/,\n        'amount': function (input) {\n          var match;\n          // e.g. 2, 0.5, 1/2, -2, n/2, +;  $a$ could be added later in parsing\n          match = input.match(/^(?:(?:(?:\\([+\\-]?[0-9]+\\/[0-9]+\\)|[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+|[+\\-]?[0-9]+[.,][0-9]+|[+\\-]?\\.[0-9]+|[+\\-]?[0-9]+)(?:[a-z](?=\\s*[A-Z]))?)|[+\\-]?[a-z](?=\\s*[A-Z])|\\+(?!\\s))/);\n          if (match) {\n            return { match_: match[0], remainder: input.substr(match[0].length) };\n          }\n          var a = mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\");\n          if (a) {  // e.g. $2n-1$, $-$\n            match = a.match_.match(/^\\$(?:\\(?[+\\-]?(?:[0-9]*[a-z]?[+\\-])?[0-9]*[a-z](?:[+\\-][0-9]*[a-z]?)?\\)?|\\+|-)\\$$/);\n            if (match) {\n              return { match_: match[0], remainder: input.substr(match[0].length) };\n            }\n          }\n          return null;\n        },\n        'amount2': function (input) { return this['amount'](input); },\n        '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,\n        'formula$': function (input) {\n          if (input.match(/^\\([a-z]+\\)$/)) { return null; }  // state of aggregation = no formula\n          var match = input.match(/^(?:[a-z]|(?:[0-9\\ \\+\\-\\,\\.\\(\\)]+[a-z])+[0-9\\ \\+\\-\\,\\.\\(\\)]*|(?:[a-z][0-9\\ \\+\\-\\,\\.\\(\\)]+)+[a-z]?)$/);\n          if (match) {\n            return { match_: match[0], remainder: input.substr(match[0].length) };\n          }\n          return null;\n        },\n        'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,\n        '/': /^\\s*(\\/)\\s*/,\n        '//': /^\\s*(\\/\\/)\\s*/,\n        '*': /^\\s*[*.]\\s*/\n      },\n      findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {\n        /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */\n        var _match = function (input, pattern) {\n          if (typeof pattern === \"string\") {\n            if (input.indexOf(pattern) !== 0) { return null; }\n            return pattern;\n          } else {\n            var match = input.match(pattern);\n            if (!match) { return null; }\n            return match[0];\n          }\n        };\n        /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */\n        var _findObserveGroups = function (input, i, endChars) {\n          var braces = 0;\n          while (i < input.length) {\n            var a = input.charAt(i);\n            var match = _match(input.substr(i), endChars);\n            if (match !== null  &&  braces === 0) {\n              return { endMatchBegin: i, endMatchEnd: i + match.length };\n            } else if (a === \"{\") {\n              braces++;\n            } else if (a === \"}\") {\n              if (braces === 0) {\n                throw [\"ExtraCloseMissingOpen\", \"Extra close brace or missing open brace\"];\n              } else {\n                braces--;\n              }\n            }\n            i++;\n          }\n          if (braces > 0) {\n            return null;\n          }\n          return null;\n        };\n        var match = _match(input, begExcl);\n        if (match === null) { return null; }\n        input = input.substr(match.length);\n        match = _match(input, begIncl);\n        if (match === null) { return null; }\n        var e = _findObserveGroups(input, match.length, endIncl || endExcl);\n        if (e === null) { return null; }\n        var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin));\n        if (!(beg2Excl || beg2Incl)) {\n          return {\n            match_: match1,\n            remainder: input.substr(e.endMatchEnd)\n          };\n        } else {\n          var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);\n          if (group2 === null) { return null; }\n          /** @type {string[]} */\n          var matchRet = [match1, group2.match_];\n          return {\n            match_: (combine ? matchRet.join(\"\") : matchRet),\n            remainder: group2.remainder\n          };\n        }\n      },\n\n      //\n      // Matching function\n      // e.g. match(\"a\", input) will look for the regexp called \"a\" and see if it matches\n      // returns null or {match_:\"a\", remainder:\"bc\"}\n      //\n      match_: function (m, input) {\n        var pattern = mhchemParser.patterns.patterns[m];\n        if (pattern === undefined) {\n          throw [\"MhchemBugP\", \"mhchem bug P. Please report. (\" + m + \")\"];  // Trying to use non-existing pattern\n        } else if (typeof pattern === \"function\") {\n          return mhchemParser.patterns.patterns[m](input);  // cannot use cached var pattern here, because some pattern functions need this===mhchemParser\n        } else {  // RegExp\n          var match = input.match(pattern);\n          if (match) {\n            var mm;\n            if (match[2]) {\n              mm = [ match[1], match[2] ];\n            } else if (match[1]) {\n              mm = match[1];\n            } else {\n              mm = match[0];\n            }\n            return { match_: mm, remainder: input.substr(match[0].length) };\n          }\n          return null;\n        }\n      }\n    },\n\n    //\n    // Generic state machine actions\n    //\n    actions: {\n      'a=': function (buffer, m) { buffer.a = (buffer.a || \"\") + m; },\n      'b=': function (buffer, m) { buffer.b = (buffer.b || \"\") + m; },\n      'p=': function (buffer, m) { buffer.p = (buffer.p || \"\") + m; },\n      'o=': function (buffer, m) { buffer.o = (buffer.o || \"\") + m; },\n      'q=': function (buffer, m) { buffer.q = (buffer.q || \"\") + m; },\n      'd=': function (buffer, m) { buffer.d = (buffer.d || \"\") + m; },\n      'rm=': function (buffer, m) { buffer.rm = (buffer.rm || \"\") + m; },\n      'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || \"\") + m; },\n      'insert': function (buffer, m, a) { return { type_: a }; },\n      'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; },\n      'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; },\n      'copy': function (buffer, m) { return m; },\n      'rm': function (buffer, m) { return { type_: 'rm', p1: m || \"\"}; },\n      'text': function (buffer, m) { return mhchemParser.go(m, 'text'); },\n      '{text}': function (buffer, m) {\n        var ret = [ \"{\" ];\n        mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));\n        ret.push(\"}\");\n        return ret;\n      },\n      'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); },\n      'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); },\n      'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; },\n      'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; },\n      'ce': function (buffer, m) { return mhchemParser.go(m); },\n      '1/2': function (buffer, m) {\n        /** @type {ParserOutput[]} */\n        var ret = [];\n        if (m.match(/^[+\\-]/)) {\n          ret.push(m.substr(0, 1));\n          m = m.substr(1);\n        }\n        var n = m.match(/^([0-9]+|\\$[a-z]\\$|[a-z])\\/([0-9]+)(\\$[a-z]\\$|[a-z])?$/);\n        n[1] = n[1].replace(/\\$/g, \"\");\n        ret.push({ type_: 'frac', p1: n[1], p2: n[2] });\n        if (n[3]) {\n          n[3] = n[3].replace(/\\$/g, \"\");\n          ret.push({ type_: 'tex-math', p1: n[3] });\n        }\n        return ret;\n      },\n      '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); }\n    },\n    //\n    // createTransitions\n    // convert  { 'letter': { 'state': { action_: 'output' } } }  to  { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }\n    // with expansion of 'a|b' to 'a' and 'b' (at 2 places)\n    //\n    createTransitions: function (o) {\n      var pattern, state;\n      /** @type {string[]} */\n      var stateArray;\n      var i;\n      //\n      // 1. Collect all states\n      //\n      /** @type {Transitions} */\n      var transitions = {};\n      for (pattern in o) {\n        for (state in o[pattern]) {\n          stateArray = state.split(\"|\");\n          o[pattern][state].stateArray = stateArray;\n          for (i=0; i<stateArray.length; i++) {\n            transitions[stateArray[i]] = [];\n          }\n        }\n      }\n      //\n      // 2. Fill states\n      //\n      for (pattern in o) {\n        for (state in o[pattern]) {\n          stateArray = o[pattern][state].stateArray || [];\n          for (i=0; i<stateArray.length; i++) {\n            //\n            // 2a. Normalize actions into array:  'text=' ==> [{type_:'text='}]\n            // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)\n            //\n            /** @type {any} */\n            var p = o[pattern][state];\n            if (p.action_) {\n              p.action_ = [].concat(p.action_);\n              for (var k=0; k<p.action_.length; k++) {\n                if (typeof p.action_[k] === \"string\") {\n                  p.action_[k] = { type_: p.action_[k] };\n                }\n              }\n            } else {\n              p.action_ = [];\n            }\n            //\n            // 2.b Multi-insert\n            //\n            var patternArray = pattern.split(\"|\");\n            for (var j=0; j<patternArray.length; j++) {\n              if (stateArray[i] === '*') {  // insert into all\n                for (var t in transitions) {\n                  transitions[t].push({ pattern: patternArray[j], task: p });\n                }\n              } else {\n                transitions[stateArray[i]].push({ pattern: patternArray[j], task: p });\n              }\n            }\n          }\n        }\n      }\n      return transitions;\n    },\n    stateMachines: {}\n  };\n\n  //\n  // Definition of state machines\n  //\n  mhchemParser.stateMachines = {\n    //\n    // \\ce state machines\n    //\n    //#region ce\n    'ce': {  // main parser\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        'else':  {\n          '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } },\n        'oxidation$': {\n          '0': { action_: 'oxidation-output' } },\n        'CMT': {\n          'r': { action_: 'rdt=', nextState: 'rt' },\n          'rd': { action_: 'rqt=', nextState: 'rdt' } },\n        'arrowUpDown': {\n          '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } },\n        'uprightEntities': {\n          '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } },\n        'orbital': {\n          '0|1|2|3': { action_: 'o=', nextState: 'o' } },\n        '->': {\n          '0|1|2|3': { action_: 'r=', nextState: 'r' },\n          'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' },\n          '*': { action_: [ 'output', 'r=' ], nextState: 'r' } },\n        '+': {\n          'o': { action_: 'd= kv',  nextState: 'd' },\n          'd|D': { action_: 'd=', nextState: 'd' },\n          'q': { action_: 'd=',  nextState: 'qd' },\n          'qd|qD': { action_: 'd=', nextState: 'qd' },\n          'dq': { action_: [ 'output', 'd=' ], nextState: 'd' },\n          '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n        'amount': {\n          '0|2': { action_: 'a=', nextState: 'a' } },\n        'pm-operator': {\n          '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\\\pm' } ], nextState: '0' } },\n        'operator': {\n          '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n        '-$': {\n          'o|q': { action_: [ 'charge or bond', 'output' ],  nextState: 'qd' },\n          'd': { action_: 'd=', nextState: 'd' },\n          'D': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          'q': { action_: 'd=',  nextState: 'qd' },\n          'qd': { action_: 'd=', nextState: 'qd' },\n          'qD|dq': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n        '-9': {\n          '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } },\n        '- orbital overlap': {\n          'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n          'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } },\n        '-': {\n          '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          '3': { action_: { type_: 'bond', option: \"-\" } },\n          'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n          'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          'b': { action_: 'b=' },\n          'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n          'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n          'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' },\n          'D|qD|p': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n        'amount2': {\n          '1|3': { action_: 'a=', nextState: 'a' } },\n        'letters': {\n          '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },\n          'q|dq': { action_: ['output', 'o='], nextState: 'o' },\n          'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } },\n        'digits': {\n          'o': { action_: 'q=', nextState: 'q' },\n          'd|D': { action_: 'q=', nextState: 'dq' },\n          'q': { action_: [ 'output', 'o=' ], nextState: 'o' },\n          'a': { action_: 'o=', nextState: 'o' } },\n        'space A': {\n          'b|p|bp': {} },\n        'space': {\n          'a': { nextState: 'as' },\n          '0': { action_: 'sb=false' },\n          '1|2': { action_: 'sb=true' },\n          'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' },\n          '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} },\n        '1st-level escape': {\n          '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] },\n          '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } },\n        '[(...)]': {\n          'r|rt': { action_: 'rd=', nextState: 'rd' },\n          'rd|rdt': { action_: 'rq=', nextState: 'rdq' } },\n        '...': {\n          'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: \"...\" } ], nextState: '3' },\n          '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } },\n        '. |* ': {\n          '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } },\n        'state of aggregation $': {\n          '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } },\n        '{[(': {\n          'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n          '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n          '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } },\n        ')]}': {\n          '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' },\n          'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } },\n        ', ': {\n          '*': { action_: [ 'output', 'comma' ], nextState: '0' } },\n        '^_': {  // ^ and _ without a sensible argument\n          '*': { } },\n        '^{(...)}|^($...$)': {\n          '0|1|2|as': { action_: 'b=', nextState: 'b' },\n          'p': { action_: 'b=', nextState: 'bp' },\n          '3|o': { action_: 'd= kv', nextState: 'D' },\n          'q': { action_: 'd=', nextState: 'qD' },\n          'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } },\n        '^a|^\\\\x{}{}|^\\\\x{}|^\\\\x|\\'': {\n          '0|1|2|as': { action_: 'b=', nextState: 'b' },\n          'p': { action_: 'b=', nextState: 'bp' },\n          '3|o': { action_: 'd= kv', nextState: 'd' },\n          'q': { action_: 'd=', nextState: 'qd' },\n          'd|qd|D|qD': { action_: 'd=' },\n          'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } },\n        '_{(state of aggregation)}$': {\n          'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n        '_{(...)}|_($...$)|_9|_\\\\x{}{}|_\\\\x{}|_\\\\x': {\n          '0|1|2|as': { action_: 'p=', nextState: 'p' },\n          'b': { action_: 'p=', nextState: 'bp' },\n          '3|o': { action_: 'q=', nextState: 'q' },\n          'd|D': { action_: 'q=', nextState: 'dq' },\n          'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n        '=<>': {\n          '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } },\n        '#': {\n          '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"#\" } ], nextState: '3' } },\n        '{}': {\n          '*': { action_: { type_: 'output', option: 1 },  nextState: '1' } },\n        '{...}': {\n          '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' },\n          'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n        '$...$': {\n          'a': { action_: 'a=' },  // 2$n$\n          '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },  // not 'amount'\n          'as|o': { action_: 'o=' },\n          'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n        '\\\\bond{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: \"3\" } },\n        '\\\\frac{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } },\n        '\\\\overset{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } },\n        '\\\\underset{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } },\n        '\\\\underbrace{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } },\n        '\\\\,': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } },\n        '\\\\x{}{}|\\\\x{}|\\\\x': {\n          '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' },\n          '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } },\n        'others': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } },\n        'else2': {\n          'a': { action_: 'a to o', nextState: 'o', revisit: true },\n          'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true },\n          'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true },\n          '*': { action_: [ 'output', 'copy' ], nextState: '3' } }\n      }),\n      actions: {\n        'o after d': function (buffer, m) {\n          var ret;\n          if ((buffer.d || \"\").match(/^[0-9]+$/)) {\n            var tmp = buffer.d;\n            buffer.d = undefined;\n            ret = this['output'](buffer);\n            buffer.b = tmp;\n          } else {\n            ret = this['output'](buffer);\n          }\n          mhchemParser.actions['o='](buffer, m);\n          return ret;\n        },\n        'd= kv': function (buffer, m) {\n          buffer.d = m;\n          buffer.dType = 'kv';\n        },\n        'charge or bond': function (buffer, m) {\n          if (buffer['beginsWithBond']) {\n            /** @type {ParserOutput[]} */\n            var ret = [];\n            mhchemParser.concatArray(ret, this['output'](buffer));\n            mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n            return ret;\n          } else {\n            buffer.d = m;\n          }\n        },\n        '- after o/d': function (buffer, m, isAfterD) {\n          var c1 = mhchemParser.patterns.match_('orbital', buffer.o || \"\");\n          var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || \"\");\n          var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || \"\");\n          var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || \"\");\n          var hyphenFollows =  m===\"-\" && ( c1 && c1.remainder===\"\"  ||  c2  ||  c3  ||  c4 );\n          if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {\n            buffer.o = '$' + buffer.o + '$';\n          }\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (hyphenFollows) {\n            mhchemParser.concatArray(ret, this['output'](buffer));\n            ret.push({ type_: 'hyphen' });\n          } else {\n            c1 = mhchemParser.patterns.match_('digits', buffer.d || \"\");\n            if (isAfterD && c1 && c1.remainder==='') {\n              mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));\n              mhchemParser.concatArray(ret, this['output'](buffer));\n            } else {\n              mhchemParser.concatArray(ret, this['output'](buffer));\n              mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n            }\n          }\n          return ret;\n        },\n        'a to o': function (buffer) {\n          buffer.o = buffer.a;\n          buffer.a = undefined;\n        },\n        'sb=true': function (buffer) { buffer.sb = true; },\n        'sb=false': function (buffer) { buffer.sb = false; },\n        'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; },\n        'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; },\n        'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; },\n        'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; },\n        'state of aggregation': function (buffer, m) {\n          return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') };\n        },\n        'comma': function (buffer, m) {\n          var a = m.replace(/\\s*$/, '');\n          var withSpace = (a !== m);\n          if (withSpace  &&  buffer['parenthesisLevel'] === 0) {\n            return { type_: 'comma enumeration L', p1: a };\n          } else {\n            return { type_: 'comma enumeration M', p1: a };\n          }\n        },\n        'output': function (buffer, m, entityFollows) {\n          // entityFollows:\n          //   undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)\n          //   1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)\n          //   2 = 1 + the entity can have an amount, so output a\\, instead of converting it to o (can only apply to states a|as)\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret;\n          if (!buffer.r) {\n            ret = [];\n            if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {\n              //ret = [];\n            } else {\n              if (buffer.sb) {\n                ret.push({ type_: 'entitySkip' });\n              }\n              if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) {\n                buffer.o = buffer.a;\n                buffer.a = undefined;\n              } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {\n                buffer.o = buffer.a;\n                buffer.d = buffer.b;\n                buffer.q = buffer.p;\n                buffer.a = buffer.b = buffer.p = undefined;\n              } else {\n                if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || \"\")) {\n                  buffer.dType = 'oxidation';\n                } else if (buffer.o && buffer.dType==='kv' && !buffer.q) {\n                  buffer.dType = undefined;\n                }\n              }\n              ret.push({\n                type_: 'chemfive',\n                a: mhchemParser.go(buffer.a, 'a'),\n                b: mhchemParser.go(buffer.b, 'bd'),\n                p: mhchemParser.go(buffer.p, 'pq'),\n                o: mhchemParser.go(buffer.o, 'o'),\n                q: mhchemParser.go(buffer.q, 'pq'),\n                d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')),\n                dType: buffer.dType\n              });\n            }\n          } else {  // r\n            /** @type {ParserOutput[]} */\n            var rd;\n            if (buffer.rdt === 'M') {\n              rd = mhchemParser.go(buffer.rd, 'tex-math');\n            } else if (buffer.rdt === 'T') {\n              rd = [ { type_: 'text', p1: buffer.rd || \"\" } ];\n            } else {\n              rd = mhchemParser.go(buffer.rd);\n            }\n            /** @type {ParserOutput[]} */\n            var rq;\n            if (buffer.rqt === 'M') {\n              rq = mhchemParser.go(buffer.rq, 'tex-math');\n            } else if (buffer.rqt === 'T') {\n              rq = [ { type_: 'text', p1: buffer.rq || \"\"} ];\n            } else {\n              rq = mhchemParser.go(buffer.rq);\n            }\n            ret = {\n              type_: 'arrow',\n              r: buffer.r,\n              rd: rd,\n              rq: rq\n            };\n          }\n          for (var p in buffer) {\n            if (p !== 'parenthesisLevel'  &&  p !== 'beginsWithBond') {\n              delete buffer[p];\n            }\n          }\n          return ret;\n        },\n        'oxidation-output': function (buffer, m) {\n          var ret = [ \"{\" ];\n          mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));\n          ret.push(\"}\");\n          return ret;\n        },\n        'frac-output': function (buffer, m) {\n          return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'overset-output': function (buffer, m) {\n          return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'underset-output': function (buffer, m) {\n          return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'underbrace-output': function (buffer, m) {\n          return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) };\n        },\n        'r=': function (buffer, m) { buffer.r = m; },\n        'rdt=': function (buffer, m) { buffer.rdt = m; },\n        'rd=': function (buffer, m) { buffer.rd = m; },\n        'rqt=': function (buffer, m) { buffer.rqt = m; },\n        'rq=': function (buffer, m) { buffer.rq = m; },\n        'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }\n      }\n    },\n    'a': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '1', revisit: true } },\n        '$(...)$': {\n          '*': { action_: 'tex-math tight', nextState: '1' } },\n        ',': {\n          '*': { action_: { type_: 'insert', option: 'commaDecimal' } } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {}\n    },\n    'o': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '1', revisit: true } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '\\\\ca': {\n          '*': { action_: { type_: 'insert', option: 'circa' } } },\n        '\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: '{text}' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {}\n    },\n    'text': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '{...}': {\n          '*': { action_: 'text=' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '\\\\greek': {\n          '*': { action_: [ 'output', 'rm' ] } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: [ 'output', 'copy' ] } },\n        'else': {\n          '*': { action_: 'text=' } }\n      }),\n      actions: {\n        'output': function (buffer) {\n          if (buffer.text_) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'text', p1: buffer.text_ };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    'pq': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'state of aggregation $': {\n          '*': { action_: 'state of aggregation' } },\n        'i$': {\n          '0': { nextState: '!f', revisit: true } },\n        '(KV letters),': {\n          '0': { action_: 'rm', nextState: '0' } },\n        'formula$': {\n          '0': { nextState: 'f', revisit: true } },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '!f', revisit: true } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: 'text' } },\n        'a-z': {\n          'f': { action_: 'tex-math' } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '-9.,9': {\n          '*': { action_: '9,9'  } },\n        ',': {\n          '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: 'color-output' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: 'color0-output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: 'ce' } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'state of aggregation': function (buffer, m) {\n          return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') };\n        },\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') };\n        }\n      }\n    },\n    'bd': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'x$': {\n          '0': { nextState: '!f', revisit: true } },\n        'formula$': {\n          '0': { nextState: 'f', revisit: true } },\n        'else': {\n          '0': { nextState: '!f', revisit: true } },\n        '-9.,9 no missing 0': {\n          '*': { action_: '9,9' } },\n        '.': {\n          '*': { action_: { type_: 'insert', option: 'electron dot' } } },\n        'a-z': {\n          'f': { action_: 'tex-math' } },\n        'x': {\n          '*': { action_: { type_: 'insert', option: 'KV x' } } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '\\'': {\n          '*': { action_: { type_: 'insert', option: 'prime' } } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: 'text' } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: 'color-output' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: 'color0-output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: 'ce' } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') };\n        }\n      }\n    },\n    'oxidation': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'roman numeral': {\n          '*': { action_: 'roman-numeral' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        'else': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || \"\" }; }\n      }\n    },\n    'tex-math': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ 'output', 'ce' ] } },\n        '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'o=' } },\n        'else': {\n          '*': { action_: 'o=' } }\n      }),\n      actions: {\n        'output': function (buffer) {\n          if (buffer.o) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'tex-math', p1: buffer.o };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    'tex-math tight': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ 'output', 'ce' ] } },\n        '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'o=' } },\n        '-|+': {\n          '*': { action_: 'tight operator' } },\n        'else': {\n          '*': { action_: 'o=' } }\n      }),\n      actions: {\n        'tight operator': function (buffer, m) { buffer.o = (buffer.o || \"\") + \"{\"+m+\"}\"; },\n        'output': function (buffer) {\n          if (buffer.o) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'tex-math', p1: buffer.o };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    '9,9': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        ',': {\n          '*': { action_: 'comma' } },\n        'else': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'comma': function () { return { type_: 'commaDecimal' }; }\n      }\n    },\n    //#endregion\n    //\n    // \\pu state machines\n    //\n    //#region pu\n    'pu': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        'space$': {\n          '*': { action_: [ 'output', 'space' ] } },\n        '{[(|)]}': {\n          '0|a': { action_: 'copy' } },\n        '(-)(9)^(-9)': {\n          '0': { action_: 'number^', nextState: 'a' } },\n        '(-)(9.,9)(e)(99)': {\n          '0': { action_: 'enumber', nextState: 'a' } },\n        'space': {\n          '0|a': {} },\n        'pm-operator': {\n          '0|a': { action_: { type_: 'operator', option: '\\\\pm' }, nextState: '0' } },\n        'operator': {\n          '0|a': { action_: 'copy', nextState: '0' } },\n        '//': {\n          'd': { action_: 'o=', nextState: '/' } },\n        '/': {\n          'd': { action_: 'o=', nextState: '/' } },\n        '{...}|else': {\n          '0|d': { action_: 'd=', nextState: 'd' },\n          'a': { action_: [ 'space', 'd=' ], nextState: 'd' },\n          '/|q': { action_: 'q=', nextState: 'q' } }\n      }),\n      actions: {\n        'enumber': function (buffer, m) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (m[0] === \"+-\"  ||  m[0] === \"+/-\") {\n            ret.push(\"\\\\pm \");\n          } else if (m[0]) {\n            ret.push(m[0]);\n          }\n          if (m[1]) {\n            mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n            if (m[2]) {\n              if (m[2].match(/[,.]/)) {\n                mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));\n              } else {\n                ret.push(m[2]);\n              }\n            }\n            m[3] = m[4] || m[3];\n            if (m[3]) {\n              m[3] = m[3].trim();\n              if (m[3] === \"e\"  ||  m[3].substr(0, 1) === \"*\") {\n                ret.push({ type_: 'cdot' });\n              } else {\n                ret.push({ type_: 'times' });\n              }\n            }\n          }\n          if (m[3]) {\n            ret.push(\"10^{\"+m[5]+\"}\");\n          }\n          return ret;\n        },\n        'number^': function (buffer, m) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (m[0] === \"+-\"  ||  m[0] === \"+/-\") {\n            ret.push(\"\\\\pm \");\n          } else if (m[0]) {\n            ret.push(m[0]);\n          }\n          mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n          ret.push(\"^{\"+m[2]+\"}\");\n          return ret;\n        },\n        'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; },\n        'space': function () { return { type_: 'pu-space-1' }; },\n        'output': function (buffer) {\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret;\n          var md = mhchemParser.patterns.match_('{(...)}', buffer.d || \"\");\n          if (md  &&  md.remainder === '') { buffer.d = md.match_; }\n          var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || \"\");\n          if (mq  &&  mq.remainder === '') { buffer.q = mq.match_; }\n          if (buffer.d) {\n            buffer.d = buffer.d.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n            buffer.d = buffer.d.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n          }\n          if (buffer.q) {  // fraction\n            buffer.q = buffer.q.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n            buffer.q = buffer.q.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n            var b5 = {\n              d: mhchemParser.go(buffer.d, 'pu'),\n              q: mhchemParser.go(buffer.q, 'pu')\n            };\n            if (buffer.o === '//') {\n              ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q };\n            } else {\n              ret = b5.d;\n              if (b5.d.length > 1  ||  b5.q.length > 1) {\n                ret.push({ type_: ' / ' });\n              } else {\n                ret.push({ type_: '/' });\n              }\n              mhchemParser.concatArray(ret, b5.q);\n            }\n          } else {  // no fraction\n            ret = mhchemParser.go(buffer.d, 'pu-2');\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    },\n    'pu-2': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '*': {\n          '*': { action_: [ 'output', 'cdot' ], nextState: '0' } },\n        '\\\\x': {\n          '*': { action_: 'rm=' } },\n        'space': {\n          '*': { action_: [ 'output', 'space' ], nextState: '0' } },\n        '^{(...)}|^(-1)': {\n          '1': { action_: '^(-1)' } },\n        '-9.,9': {\n          '0': { action_: 'rm=', nextState: '0' },\n          '1': { action_: '^(-1)', nextState: '0' } },\n        '{...}|else': {\n          '*': { action_: 'rm=', nextState: '1' } }\n      }),\n      actions: {\n        'cdot': function () { return { type_: 'tight cdot' }; },\n        '^(-1)': function (buffer, m) { buffer.rm += \"^{\"+m+\"}\"; },\n        'space': function () { return { type_: 'pu-space-2' }; },\n        'output': function (buffer) {\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret = [];\n          if (buffer.rm) {\n            var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || \"\");\n            if (mrm  &&  mrm.remainder === '') {\n              ret = mhchemParser.go(mrm.match_, 'pu');\n            } else {\n              ret = { type_: 'rm', p1: buffer.rm };\n            }\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    },\n    'pu-9,9': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '0': { action_: 'output-0' },\n          'o': { action_: 'output-o' } },\n        ',': {\n          '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } },\n        '.': {\n          '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } },\n        'else': {\n          '*': { action_: 'text=' } }\n      }),\n      actions: {\n        'comma': function () { return { type_: 'commaDecimal' }; },\n        'output-0': function (buffer) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          buffer.text_ = buffer.text_ || \"\";\n          if (buffer.text_.length > 4) {\n            var a = buffer.text_.length % 3;\n            if (a === 0) { a = 3; }\n            for (var i=buffer.text_.length-3; i>0; i-=3) {\n              ret.push(buffer.text_.substr(i, 3));\n              ret.push({ type_: '1000 separator' });\n            }\n            ret.push(buffer.text_.substr(0, a));\n            ret.reverse();\n          } else {\n            ret.push(buffer.text_);\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        },\n        'output-o': function (buffer) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          buffer.text_ = buffer.text_ || \"\";\n          if (buffer.text_.length > 4) {\n            var a = buffer.text_.length - 3;\n            for (var i=0; i<a; i+=3) {\n              ret.push(buffer.text_.substr(i, 3));\n              ret.push({ type_: '1000 separator' });\n            }\n            ret.push(buffer.text_.substr(i));\n          } else {\n            ret.push(buffer.text_);\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    }\n    //#endregion\n  };\n\n  //\n  // texify: Take MhchemParser output and convert it to TeX\n  //\n  /** @type {Texify} */\n  var texify = {\n    go: function (input, isInner) {  // (recursive, max 4 levels)\n      if (!input) { return \"\"; }\n      var res = \"\";\n      var cee = false;\n      for (var i=0; i < input.length; i++) {\n        var inputi = input[i];\n        if (typeof inputi === \"string\") {\n          res += inputi;\n        } else {\n          res += texify._go2(inputi);\n          if (inputi.type_ === '1st-level escape') { cee = true; }\n        }\n      }\n      if (!isInner && !cee && res) {\n        res = \"{\" + res + \"}\";\n      }\n      return res;\n    },\n    _goInner: function (input) {\n      if (!input) { return input; }\n      return texify.go(input, true);\n    },\n    _go2: function (buf) {\n      /** @type {undefined | string} */\n      var res;\n      switch (buf.type_) {\n        case 'chemfive':\n          res = \"\";\n          var b5 = {\n            a: texify._goInner(buf.a),\n            b: texify._goInner(buf.b),\n            p: texify._goInner(buf.p),\n            o: texify._goInner(buf.o),\n            q: texify._goInner(buf.q),\n            d: texify._goInner(buf.d)\n          };\n          //\n          // a\n          //\n          if (b5.a) {\n            if (b5.a.match(/^[+\\-]/)) { b5.a = \"{\"+b5.a+\"}\"; }\n            res += b5.a + \"\\\\,\";\n          }\n          //\n          // b and p\n          //\n          if (b5.b || b5.p) {\n            res += \"{\\\\vphantom{X}}\";\n            res += \"^{\\\\hphantom{\"+(b5.b||\"\")+\"}}_{\\\\hphantom{\"+(b5.p||\"\")+\"}}\";\n            res += \"{\\\\vphantom{X}}\";\n            // In the next two lines, I've removed \\smash[t] (ron)\n            // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n            //res += \"^{\\\\smash[t]{\\\\vphantom{2}}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n            res += \"^{\\\\vphantom{2}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n            //res += \"_{\\\\vphantom{2}\\\\mathllap{\\\\smash[t]{\"+(b5.p||\"\")+\"}}}\";\n            res += \"_{\\\\vphantom{2}\\\\mathllap{\"+(b5.p||\"\")+\"}}\";\n          }\n          //\n          // o\n          //\n          if (b5.o) {\n            if (b5.o.match(/^[+\\-]/)) { b5.o = \"{\"+b5.o+\"}\"; }\n            res += b5.o;\n          }\n          //\n          // q and d\n          //\n          if (buf.dType === 'kv') {\n            if (b5.d || b5.q) {\n              res += \"{\\\\vphantom{X}}\";\n            }\n            if (b5.d) {\n              res += \"^{\"+b5.d+\"}\";\n            }\n            if (b5.q) {\n              // In the next line, I've removed \\smash[t] (ron)\n              // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n              //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n              res += \"_{\"+b5.q+\"}\";\n            }\n          } else if (buf.dType === 'oxidation') {\n            if (b5.d) {\n              res += \"{\\\\vphantom{X}}\";\n              res += \"^{\"+b5.d+\"}\";\n            }\n            if (b5.q) {\n              // A Firefox bug adds a bogus depth to <mphantom>, so we change \\vphantom{X} to {}\n              // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n//              res += \"{\\\\vphantom{X}}\";\n              res += \"{{}}\";\n              // In the next line, I've removed \\smash[t] (ron)\n              // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n              //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n              res += \"_{\"+b5.q+\"}\";\n            }\n          } else {\n            if (b5.q) {\n              // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n//              res += \"{\\\\vphantom{X}}\";\n              res += \"{{}}\";\n              // In the next line, I've removed \\smash[t] (ron)\n              // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n              //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n              res += \"_{\"+b5.q+\"}\";\n            }\n            if (b5.d) {\n              // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n//              res += \"{\\\\vphantom{X}}\";\n              res += \"{{}}\";\n              res += \"^{\"+b5.d+\"}\";\n            }\n          }\n          break;\n        case 'rm':\n          res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          break;\n        case 'text':\n          if (buf.p1.match(/[\\^_]/)) {\n            buf.p1 = buf.p1.replace(\" \", \"~\").replace(\"-\", \"\\\\text{-}\");\n            res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          } else {\n            res = \"\\\\text{\"+buf.p1+\"}\";\n          }\n          break;\n        case 'roman numeral':\n          res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          break;\n        case 'state of aggregation':\n          res = \"\\\\mskip2mu \"+texify._goInner(buf.p1);\n          break;\n        case 'state of aggregation subscript':\n          res = \"\\\\mskip1mu \"+texify._goInner(buf.p1);\n          break;\n        case 'bond':\n          res = texify._getBond(buf.kind_);\n          if (!res) {\n            throw [\"MhchemErrorBond\", \"mhchem Error. Unknown bond type (\" + buf.kind_ + \")\"];\n          }\n          break;\n        case 'frac':\n          var c = \"\\\\frac{\" + buf.p1 + \"}{\" + buf.p2 + \"}\";\n          res = \"\\\\mathchoice{\\\\textstyle\"+c+\"}{\"+c+\"}{\"+c+\"}{\"+c+\"}\";\n          break;\n        case 'pu-frac':\n          var d = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          res = \"\\\\mathchoice{\\\\textstyle\"+d+\"}{\"+d+\"}{\"+d+\"}{\"+d+\"}\";\n          break;\n        case 'tex-math':\n          res = buf.p1 + \" \";\n          break;\n        case 'frac-ce':\n          res = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'overset':\n          res = \"\\\\overset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'underset':\n          res = \"\\\\underset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'underbrace':\n          res =  \"\\\\underbrace{\" + texify._goInner(buf.p1) + \"}_{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'color':\n          res = \"{\\\\color{\" + buf.color1 + \"}{\" + texify._goInner(buf.color2) + \"}}\";\n          break;\n        case 'color0':\n          res = \"\\\\color{\" + buf.color + \"}\";\n          break;\n        case 'arrow':\n          var b6 = {\n            rd: texify._goInner(buf.rd),\n            rq: texify._goInner(buf.rq)\n          };\n          var arrow = texify._getArrow(buf.r);\n          if (b6.rq) { arrow += \"[{\\\\rm \" + b6.rq + \"}]\"; }\n          if (b6.rd) {\n            arrow += \"{\\\\rm \" + b6.rd + \"}\";\n          } else {\n            arrow += \"{}\";\n          }\n          res = arrow;\n          break;\n        case 'operator':\n          res = texify._getOperator(buf.kind_);\n          break;\n        case '1st-level escape':\n          res = buf.p1+\" \";  // &, \\\\\\\\, \\\\hlin\n          break;\n        case 'space':\n          res = \" \";\n          break;\n        case 'entitySkip':\n          res = \"~\";\n          break;\n        case 'pu-space-1':\n          res = \"~\";\n          break;\n        case 'pu-space-2':\n          res = \"\\\\mkern3mu \";\n          break;\n        case '1000 separator':\n          res = \"\\\\mkern2mu \";\n          break;\n        case 'commaDecimal':\n          res = \"{,}\";\n          break;\n          case 'comma enumeration L':\n          res = \"{\"+buf.p1+\"}\\\\mkern6mu \";\n          break;\n        case 'comma enumeration M':\n          res = \"{\"+buf.p1+\"}\\\\mkern3mu \";\n          break;\n        case 'comma enumeration S':\n          res = \"{\"+buf.p1+\"}\\\\mkern1mu \";\n          break;\n        case 'hyphen':\n          res = \"\\\\text{-}\";\n          break;\n        case 'addition compound':\n          res = \"\\\\,{\\\\cdot}\\\\,\";\n          break;\n        case 'electron dot':\n          res = \"\\\\mkern1mu \\\\text{\\\\textbullet}\\\\mkern1mu \";\n          break;\n        case 'KV x':\n          res = \"{\\\\times}\";\n          break;\n        case 'prime':\n          res = \"\\\\prime \";\n          break;\n        case 'cdot':\n          res = \"\\\\cdot \";\n          break;\n        case 'tight cdot':\n          res = \"\\\\mkern1mu{\\\\cdot}\\\\mkern1mu \";\n          break;\n        case 'times':\n          res = \"\\\\times \";\n          break;\n        case 'circa':\n          res = \"{\\\\sim}\";\n          break;\n        case '^':\n          res = \"uparrow\";\n          break;\n        case 'v':\n          res = \"downarrow\";\n          break;\n        case 'ellipsis':\n          res = \"\\\\ldots \";\n          break;\n        case '/':\n          res = \"/\";\n          break;\n        case ' / ':\n          res = \"\\\\,/\\\\,\";\n          break;\n        default:\n          assertNever(buf);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];  // Missing texify rule or unknown MhchemParser output\n      }\n      assertString(res);\n      return res;\n    },\n    _getArrow: function (a) {\n      switch (a) {\n        case \"->\": return \"\\\\yields\";\n        case \"\\u2192\": return \"\\\\yields\";\n        case \"\\u27F6\": return \"\\\\yields\";\n        case \"<-\": return \"\\\\yieldsLeft\";\n        case \"<->\": return \"\\\\mesomerism\";\n        case \"<-->\": return \"\\\\yieldsLeftRight\";\n        case \"<=>\": return \"\\\\chemequilibrium\";\n        case \"\\u21CC\": return \"\\\\chemequilibrium\";\n        case \"<=>>\": return \"\\\\equilibriumRight\";\n        case \"<<=>\": return \"\\\\equilibriumLeft\";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    },\n    _getBond: function (a) {\n      switch (a) {\n        case \"-\": return \"{-}\";\n        case \"1\": return \"{-}\";\n        case \"=\": return \"{=}\";\n        case \"2\": return \"{=}\";\n        case \"#\": return \"{\\\\equiv}\";\n        case \"3\": return \"{\\\\equiv}\";\n        case \"~\": return \"{\\\\tripleDash}\";\n        case \"~-\": return \"{\\\\tripleDashOverLine}\";\n        case \"~=\": return \"{\\\\tripleDashOverDoubleLine}\";\n        case \"~--\": return \"{\\\\tripleDashOverDoubleLine}\";\n        case \"-~-\": return \"{\\\\tripleDashBetweenDoubleLine}\";\n        case \"...\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n        case \"....\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n        case \"->\": return \"{\\\\rightarrow}\";\n        case \"<-\": return \"{\\\\leftarrow}\";\n        case \"<\": return \"{<}\";\n        case \">\": return \"{>}\";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    },\n    _getOperator: function (a) {\n      switch (a) {\n        case \"+\": return \" {}+{} \";\n        case \"-\": return \" {}-{} \";\n        case \"=\": return \" {}={} \";\n        case \"<\": return \" {}<{} \";\n        case \">\": return \" {}>{} \";\n        case \"<<\": return \" {}\\\\ll{} \";\n        case \">>\": return \" {}\\\\gg{} \";\n        case \"\\\\pm\": return \" {}\\\\pm{} \";\n        case \"\\\\approx\": return \" {}\\\\approx{} \";\n        case \"$\\\\approx$\": return \" {}\\\\approx{} \";\n        case \"v\": return \" \\\\downarrow{} \";\n        case \"(v)\": return \" \\\\downarrow{} \";\n        case \"^\": return \" \\\\uparrow{} \";\n        case \"(^)\": return \" \\\\uparrow{} \";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    }\n  };\n\n  //\n  // Helpers for code analysis\n  // Will show type error at calling position\n  //\n  /** @param {number} a */\n  function assertNever(a) {}\n  /** @param {string} a */\n  function assertString(a) {}\n\n/* eslint-disable no-undef */\n\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\n\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\n\n/* eslint-disable no-undef */\n\n/****************************************************\n *\n *  physics.js\n *\n *  Implements the Physics Package for LaTeX input.\n *\n *  ---------------------------------------------------------------------\n *\n *  The original version of this file is licensed as follows:\n *  Copyright (c) 2015-2016 Kolen Cheung <https://github.com/ickc/MathJax-third-party-extensions>.\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  ---------------------------------------------------------------------\n *\n *  This file has been revised from the original in the following ways:\n *  1. The interface is changed so that it can be called from Temml, not MathJax.\n *  2. \\Re and \\Im are not used, to avoid conflict with existing LaTeX letters.\n *\n *  This revision of the file is released under the MIT license.\n *  https://mit-license.org/\n */\ndefineMacro(\"\\\\quantity\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pqty\", \"{\\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\bqty\", \"{\\\\left[ #1 \\\\right]}\");\ndefineMacro(\"\\\\vqty\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\Bqty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\absolutevalue\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\abs\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\norm\", \"{\\\\left\\\\Vert #1 \\\\right\\\\Vert}\");\ndefineMacro(\"\\\\evaluated\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\eval\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\order\", \"{\\\\mathcal{O} \\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\commutator\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\comm\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\anticommutator\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\acomm\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\poissonbracket\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pb\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\vectorbold\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vb\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vectorarrow\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\va\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\vectorunit\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\vu\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\dotproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\vdot\", \"{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\crossproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cross\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cp\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\gradient\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\grad\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\divergence\", \"{\\\\grad\\\\vdot}\");\n//defineMacro(\"\\\\div\", \"{\\\\grad\\\\vdot}\"); Not included in Temml. Conflicts w/LaTeX \\div\ndefineMacro(\"\\\\curl\", \"{\\\\grad\\\\cross}\");\ndefineMacro(\"\\\\laplacian\", \"\\\\nabla^2\");\ndefineMacro(\"\\\\tr\", \"{\\\\operatorname{tr}}\");\ndefineMacro(\"\\\\Tr\", \"{\\\\operatorname{Tr}}\");\ndefineMacro(\"\\\\rank\", \"{\\\\operatorname{rank}}\");\ndefineMacro(\"\\\\erf\", \"{\\\\operatorname{erf}}\");\ndefineMacro(\"\\\\Res\", \"{\\\\operatorname{Res}}\");\ndefineMacro(\"\\\\principalvalue\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\pv\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\PV\", \"{\\\\operatorname{P.V.}}\");\n// Temml does not use the next two lines. They conflict with LaTeX letters.\n//defineMacro(\"\\\\Re\", \"{\\\\operatorname{Re} \\\\left\\\\{ #1 \\\\right\\\\}}\");\n//defineMacro(\"\\\\Im\", \"{\\\\operatorname{Im} \\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qqtext\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qq\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qcomma\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qc\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qcc\", \"{\\\\quad\\\\text{c.c.}\\\\quad}\");\ndefineMacro(\"\\\\qif\", \"{\\\\quad\\\\text{if}\\\\quad}\");\ndefineMacro(\"\\\\qthen\", \"{\\\\quad\\\\text{then}\\\\quad}\");\ndefineMacro(\"\\\\qelse\", \"{\\\\quad\\\\text{else}\\\\quad}\");\ndefineMacro(\"\\\\qotherwise\", \"{\\\\quad\\\\text{otherwise}\\\\quad}\");\ndefineMacro(\"\\\\qunless\", \"{\\\\quad\\\\text{unless}\\\\quad}\");\ndefineMacro(\"\\\\qgiven\", \"{\\\\quad\\\\text{given}\\\\quad}\");\ndefineMacro(\"\\\\qusing\", \"{\\\\quad\\\\text{using}\\\\quad}\");\ndefineMacro(\"\\\\qassume\", \"{\\\\quad\\\\text{assume}\\\\quad}\");\ndefineMacro(\"\\\\qsince\", \"{\\\\quad\\\\text{since}\\\\quad}\");\ndefineMacro(\"\\\\qlet\", \"{\\\\quad\\\\text{let}\\\\quad}\");\ndefineMacro(\"\\\\qfor\", \"{\\\\quad\\\\text{for}\\\\quad}\");\ndefineMacro(\"\\\\qall\", \"{\\\\quad\\\\text{all}\\\\quad}\");\ndefineMacro(\"\\\\qeven\", \"{\\\\quad\\\\text{even}\\\\quad}\");\ndefineMacro(\"\\\\qodd\", \"{\\\\quad\\\\text{odd}\\\\quad}\");\ndefineMacro(\"\\\\qinteger\", \"{\\\\quad\\\\text{integer}\\\\quad}\");\ndefineMacro(\"\\\\qand\", \"{\\\\quad\\\\text{and}\\\\quad}\");\ndefineMacro(\"\\\\qor\", \"{\\\\quad\\\\text{or}\\\\quad}\");\ndefineMacro(\"\\\\qas\", \"{\\\\quad\\\\text{as}\\\\quad}\");\ndefineMacro(\"\\\\qin\", \"{\\\\quad\\\\text{in}\\\\quad}\");\ndefineMacro(\"\\\\differential\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\dd\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\derivative\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\dv\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\partialderivative\", \"{\\\\frac{\\\\partial{ #1 }}{\\\\partial{ #2 }}}\");\ndefineMacro(\"\\\\variation\", \"{\\\\delta}\");\ndefineMacro(\"\\\\var\", \"{\\\\delta}\");\ndefineMacro(\"\\\\functionalderivative\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\fdv\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\innerproduct\", \"{\\\\left\\\\langle {#1} \\\\mid { #2} \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\outerproduct\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\dyad\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\ketbra\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\op\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\expectationvalue\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\expval\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\ev\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixelement\",\n  \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixel\",\n  \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\mel\",\n  \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\n\n// Helper functions\nfunction getHLines(parser) {\n  // Return an array. The array length = number of hlines.\n  // Each element in the array tells if the line is dashed.\n  const hlineInfo = [];\n  parser.consumeSpaces();\n  let nxt = parser.fetch().text;\n  if (nxt === \"\\\\relax\") {\n    parser.consume();\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n    parser.consume();\n    hlineInfo.push(nxt === \"\\\\hdashline\");\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  return hlineInfo;\n}\n\nconst validateAmsEnvironmentContext = context => {\n  const settings = context.parser.settings;\n  if (!settings.displayMode) {\n    throw new ParseError(`{${context.envName}} can be used only in display mode.`);\n  }\n};\n\nconst sizeRegEx$1 = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst arrayGaps = macros => {\n  let arraystretch = macros.get(\"\\\\arraystretch\");\n  if (typeof arraystretch !== \"string\") {\n    arraystretch = stringFromArg(arraystretch.tokens);\n  }\n  arraystretch = isNaN(arraystretch) ? null : Number(arraystretch);\n  let arraycolsepStr = macros.get(\"\\\\arraycolsep\");\n  if (typeof arraycolsepStr !== \"string\") {\n    arraycolsepStr = stringFromArg(arraycolsepStr.tokens);\n  }\n  const match = sizeRegEx$1.exec(arraycolsepStr);\n  const arraycolsep = match\n    ? { number: +(match[1] + match[2]), unit: match[3] }\n    : null;\n  return [arraystretch, arraycolsep]\n};\n\nconst checkCellForLabels = cell => {\n  // Check if the author wrote a \\tag{} inside this cell.\n  let rowLabel = \"\";\n  for (let i = 0; i < cell.length; i++) {\n    if (cell[i].type === \"label\") {\n      if (rowLabel) { throw new ParseError((\"Multiple \\\\labels in one row\")) }\n      rowLabel = cell[i].string;\n    }\n  }\n  return rowLabel\n};\n\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n  if (name.indexOf(\"ed\") === -1) {\n    return name.indexOf(\"*\") === -1;\n  }\n  // return undefined;\n}\n\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell.  If given an optional argument scriptLevel\n * (\"text\", \"display\", etc.), then each cell is cast into that scriptLevel.\n */\nfunction parseArray(\n  parser,\n  {\n    cols, // [{ type: string , align: l|c|r|null }]\n    envClasses, // align(ed|at|edat) | array | cases | cd | small | multline\n    autoTag,        // boolean\n    singleRow,      // boolean\n    emptySingleRow, // boolean\n    maxNumCols,     // number\n    leqno,          // boolean\n    arraystretch,   // number  | null\n    arraycolsep     // size value | null\n},\n  scriptLevel\n) {\n  const endToken = envClasses && envClasses.includes(\"bordermatrix\") ? \"}\" : \"\\\\end\";\n  parser.gullet.beginGroup();\n  if (!singleRow) {\n    // \\cr is equivalent to \\\\ without the optional size argument (see below)\n    // TODO: provide helpful error when \\cr is used outside array environment\n    parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  }\n\n  // Start group for first cell\n  parser.gullet.beginGroup();\n\n  let row = [];\n  const body = [row];\n  const rowGaps = [];\n  const labels = [];\n\n  const hLinesBeforeRow = [];\n\n  const tags = (autoTag != null ? [] : undefined);\n\n  // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n  // whether this row should have an equation number.  Simulate this with\n  // a \\@eqnsw macro set to 1 or 0.\n  function beginRow() {\n    if (autoTag) {\n      parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n    }\n  }\n  function endRow() {\n    if (tags) {\n      if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n        tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n        parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n      } else {\n        tags.push(Boolean(autoTag) &&\n            parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n      }\n    }\n  }\n  beginRow();\n\n  // Test for \\hline at the top of the array.\n  hLinesBeforeRow.push(getHLines(parser));\n\n  while (true) {\n    // Parse each cell in its own group (namespace)\n    let cell = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n\n    cell = {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body: cell,\n      semisimple: true\n    };\n    row.push(cell);\n    const next = parser.fetch().text;\n    if (next === \"&\") {\n      if (maxNumCols && row.length === maxNumCols) {\n        if (envClasses.includes(\"array\")) {\n          if (parser.settings.strict) {\n            throw new ParseError(\"Too few columns \" + \"specified in the {array} column argument.\",\n              parser.nextToken)\n          }\n        } else if (maxNumCols === 2) {\n          throw new ParseError(\"The split environment accepts no more than two columns\",\n            parser.nextToken);\n        } else {\n          throw new ParseError(\"The equation environment accepts only one column\",\n            parser.nextToken)\n        }\n      }\n      parser.consume();\n    } else if (next === endToken) {\n      endRow();\n      // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n      // the last line is empty.  However, AMS environments keep the\n      // empty row if it's the only one.\n      // NOTE: Currently, `cell` is the last item added into `row`.\n      if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n        body.pop();\n      }\n      labels.push(checkCellForLabels(cell.body));\n      if (hLinesBeforeRow.length < body.length + 1) {\n        hLinesBeforeRow.push([]);\n      }\n      break;\n    } else if (next === \"\\\\\\\\\") {\n      parser.consume();\n      let size;\n      // \\def\\Let@{\\let\\\\\\math@cr}\n      // \\def\\math@cr{...\\math@cr@}\n      // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n      // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n      // \\def\\math@cr@@@{\\cr}\n      if (parser.gullet.future().text !== \" \") {\n        size = parser.parseSizeGroup(true);\n      }\n      rowGaps.push(size ? size.value : null);\n      endRow();\n\n      labels.push(checkCellForLabels(cell.body));\n\n      // check for \\hline(s) following the row separator\n      hLinesBeforeRow.push(getHLines(parser));\n\n      row = [];\n      body.push(row);\n      beginRow();\n    } else {\n      throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \" + endToken, parser.nextToken);\n    }\n  }\n\n  // End cell group\n  parser.gullet.endGroup();\n  // End array group defining \\cr\n  parser.gullet.endGroup();\n\n  return {\n    type: \"array\",\n    mode: parser.mode,\n    body,\n    cols,\n    rowGaps,\n    hLinesBeforeRow,\n    envClasses,\n    autoTag,\n    scriptLevel,\n    tags,\n    labels,\n    leqno,\n    arraystretch,\n    arraycolsep\n  };\n}\n\n// Decides on a scriptLevel for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n  return envName.slice(0, 1) === \"d\" ? \"display\" : \"text\"\n}\n\nconst alignMap = {\n  c: \"center \",\n  l: \"left \",\n  r: \"right \"\n};\n\nconst glue = group => {\n  const glueNode = new MathNode(\"mtd\", []);\n  glueNode.style = { padding: \"0\", width: \"50%\" };\n  if (group.envClasses.includes(\"multline\")) {\n    glueNode.style.width = \"7.5%\";\n  }\n  return glueNode\n};\n\nconst mathmlBuilder$9 = function(group, style) {\n  const tbl = [];\n  const numRows = group.body.length;\n  const hlines = group.hLinesBeforeRow;\n  const tagIsPresent = (group.tags && group.tags.some((tag) => tag));\n\n  for (let i = 0; i < numRows; i++) {\n    const rw = group.body[i];\n    const row = [];\n    const cellLevel = group.scriptLevel === \"text\"\n      ? StyleLevel.TEXT\n      : group.scriptLevel === \"script\"\n      ? StyleLevel.SCRIPT\n      : StyleLevel.DISPLAY;\n\n    for (let j = 0; j < rw.length; j++) {\n      const mtd = new MathNode(\n        \"mtd\",\n        [buildGroup$1(rw[j], style.withLevel(cellLevel))]\n      );\n\n      if (group.envClasses.includes(\"multline\")) {\n        const align = i === 0 ? \"left\" : i === numRows - 1 ? \"right\" : \"center\";\n        if (align !== \"center\") {\n          mtd.classes.push(\"tml-\" + align);\n        }\n      }\n      row.push(mtd);\n    }\n    const numColumns = group.body[0].length;\n    // Fill out a short row with empty <mtd> elements.\n    for (let k = 0; k < numColumns - rw.length; k++) {\n      row.push(new MathNode(\"mtd\", [], [], style));\n    }\n    if (tagIsPresent) {\n      const tag = group.tags[i];\n      let tagElement;\n      if (tag === true) {  // automatic numbering\n        tagElement = new MathNode(\"mtext\", [new Span([\"tml-eqn\"])]);\n      } else if (tag === false) {\n        // \\nonumber/\\notag or starred environment\n        tagElement = new MathNode(\"mtext\", [], []);\n      } else {  // manual \\tag\n        tagElement = buildExpressionRow(tag[0].body, style.withLevel(cellLevel), true);\n        tagElement = consolidateText(tagElement);\n        tagElement.classes = [\"tml-tag\"];\n      }\n      if (tagElement) {\n        row.unshift(glue(group));\n        row.push(glue(group));\n        if (group.leqno) {\n          row[0].children.push(tagElement);\n        } else {\n          row[row.length - 1].children.push(tagElement);\n        }\n      }\n    }\n    const mtr = new MathNode(\"mtr\", row, []);\n    const label = group.labels.shift();\n    if (label && group.tags && group.tags[i]) {\n      mtr.setAttribute(\"id\", label);\n      if (Array.isArray(group.tags[i])) { mtr.classes.push(\"tml-tageqn\"); }\n    }\n\n    // Write horizontal rules\n    if (i === 0 && hlines[0].length > 0) {\n      if (hlines[0].length === 2) {\n        mtr.children.forEach(cell => { cell.style.borderTop = \"0.15em double\"; });\n      } else {\n        mtr.children.forEach(cell => {\n          cell.style.borderTop = hlines[0][0] ? \"0.06em dashed\" : \"0.06em solid\";\n        });\n      }\n    }\n    if (hlines[i + 1].length > 0) {\n      if (hlines[i + 1].length === 2) {\n        mtr.children.forEach(cell => { cell.style.borderBottom = \"0.15em double\"; });\n      } else {\n        mtr.children.forEach(cell => {\n          cell.style.borderBottom = hlines[i + 1][0] ? \"0.06em dashed\" : \"0.06em solid\";\n        });\n      }\n    }\n\n    // Check for \\hphantom \\from \\bordermatrix\n    let mustSquashRow = true;\n    for (let j = 0; j < mtr.children.length; j++) {\n      const child = mtr.children[j].children[0];\n      if (!(child && child.type === \"mpadded\" && child.attributes.height === \"0px\")) {\n        mustSquashRow = false;\n        break\n      }\n    }\n    if (mustSquashRow) {\n      // All the cell contents are \\hphantom. Squash the cell.\n      // TODO: Remove the next line when Firefox no longer needs it.\n      mtr.classes.push(\"ff-squash\"); // necessary in Firefox only.\n      for (let j = 0; j < mtr.children.length; j++) {\n        mtr.children[j].style.paddingTop = \"0\";\n        mtr.children[j].style.paddingBottom = \"0\";\n      }\n    }\n\n    tbl.push(mtr);\n  }\n\n  if (group.arraystretch && group.arraystretch !== 1) {\n    // In LaTeX, \\arraystretch is a factor applied to a 12pt strut height.\n    // It defines a baseline to baseline distance.\n    // Here, we do an approximation of that approach.\n    const pad = String(1.4 * group.arraystretch - 0.8) + \"ex\";\n    for (let i = 0; i < tbl.length; i++) {\n      for (let j = 0; j < tbl[i].children.length; j++) {\n        tbl[i].children[j].style.paddingTop = pad;\n        tbl[i].children[j].style.paddingBottom = pad;\n      }\n    }\n  }\n\n  let sidePadding;\n  let sidePadUnit;\n  if (group.envClasses.length > 0) {\n    sidePadding = group.envClasses.includes(\"abut\")\n      ? \"0\"\n      : group.envClasses.includes(\"cases\")\n      ? \"0\"\n      : group.envClasses.includes(\"small\")\n      ? \"0.1389\"\n      : group.envClasses.includes(\"cd\")\n      ? \"0.25\"\n      : \"0.4\"; // default side padding\n    sidePadUnit = \"em\";\n  }\n  if (group.arraycolsep) {\n    const arraySidePad = calculateSize(group.arraycolsep, style);\n    sidePadding = arraySidePad.number.toFixed(4);\n    sidePadUnit = arraySidePad.unit;\n  }\n  if (sidePadding) {\n    const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;\n\n    const sidePad = (j, hand) => {\n      if (j === 0 && hand === 0) { return \"0\" }\n      if (j === numCols - 1 && hand === 1) { return \"0\" }\n      if (group.envClasses[0] !== \"align\") { return sidePadding }\n      if (hand === 1) { return \"0\" }\n      if (tagIsPresent) {\n        return (j % 2) ? \"1\" : \"0\"\n      } else {\n        return (j % 2) ? \"0\" : \"1\"\n      }\n    };\n\n    // Side padding\n    for (let i = 0; i < tbl.length; i++) {\n      for (let j = 0; j < tbl[i].children.length; j++) {\n        tbl[i].children[j].style.paddingLeft = `${sidePad(j, 0)}${sidePadUnit}`;\n        tbl[i].children[j].style.paddingRight = `${sidePad(j, 1)}${sidePadUnit}`;\n      }\n    }\n  }\n  if (group.envClasses.length === 0) {\n    // Set zero padding on side of the matrix\n    for (let i = 0; i < tbl.length; i++) {\n      tbl[i].children[0].style.paddingLeft = \"0em\";\n      if (tbl[i].children.length === tbl[0].children.length) {\n        tbl[i].children[tbl[i].children.length - 1].style.paddingRight = \"0em\";\n      }\n    }\n  }\n\n  if (group.envClasses.length > 0) {\n    // Justification\n    const align = group.envClasses.includes(\"align\") || group.envClasses.includes(\"alignat\");\n    for (let i = 0; i < tbl.length; i++) {\n      const row = tbl[i];\n      if (align) {\n        for (let j = 0; j < row.children.length; j++) {\n          // Chromium does not recognize text-align: left. Use -webkit-\n          // TODO: Remove -webkit- when Chromium no longer needs it.\n          row.children[j].classes = [\"tml-\" + (j % 2 ? \"left\" : \"right\")];\n        }\n        if (tagIsPresent) {\n          const k = group.leqno ? 0 : row.children.length - 1;\n          row.children[k].classes = [];  // Default is center.\n        }\n      }\n      if (row.children.length > 1 && group.envClasses.includes(\"cases\")) {\n        row.children[1].style.paddingLeft = \"1em\";\n      }\n\n      if (group.envClasses.includes(\"cases\") || group.envClasses.includes(\"subarray\")) {\n        for (const cell of row.children) {\n          cell.classes.push(\"tml-left\");\n        }\n      }\n    }\n  }\n\n  let table = new MathNode(\"mtable\", tbl);\n  if (group.envClasses.length > 0) {\n    // Top & bottom padding\n    if (group.envClasses.includes(\"jot\")) {\n      table.classes.push(\"tml-jot\");\n    } else if (group.envClasses.includes(\"small\")) {\n      table.classes.push(\"tml-small\");\n    }\n  }\n  if (group.scriptLevel === \"display\") { table.setAttribute(\"displaystyle\", \"true\"); }\n\n  if (group.autoTag || group.envClasses.includes(\"multline\")) {\n    table.style.width = \"100%\";\n  }\n\n  // Column separator lines and column alignment\n\n  if (group.cols && group.cols.length > 0) {\n    const cols = group.cols;\n    let prevTypeWasAlign = false;\n    let iStart = 0;\n    let iEnd = cols.length;\n\n    while (cols[iStart].type === \"separator\") {\n      iStart += 1;\n    }\n    while (cols[iEnd - 1].type === \"separator\") {\n      iEnd -= 1;\n    }\n\n    if (cols[0].type === \"separator\") {\n      const sep = cols[1].type === \"separator\"\n        ? \"0.15em double\"\n        : cols[0].separator === \"|\"\n        ? \"0.06em solid \"\n        : \"0.06em dashed \";\n      for (const row of table.children) {\n        row.children[0].style.borderLeft = sep;\n      }\n    }\n    let iCol = tagIsPresent ? 0 : -1;\n    for (let i = iStart; i < iEnd; i++) {\n      if (cols[i].type === \"align\") {\n        const colAlign = alignMap[cols[i].align];\n        iCol += 1;\n        for (const row of table.children) {\n          if (colAlign.trim() !== \"center\" && iCol < row.children.length) {\n            row.children[iCol].classes = [\"tml-\" + colAlign.trim()];\n          }\n        }\n        prevTypeWasAlign = true;\n      } else if (cols[i].type === \"separator\") {\n        // MathML accepts only single lines between cells.\n        // So we read only the first of consecutive separators.\n        if (prevTypeWasAlign) {\n          const sep = cols[i + 1].type === \"separator\"\n            ? \"0.15em double\"\n            : cols[i].separator === \"|\"\n            ? \"0.06em solid\"\n            : \"0.06em dashed\";\n          for (const row of table.children) {\n            if (iCol < row.children.length) {\n              row.children[iCol].style.borderRight = sep;\n            }\n          }\n        }\n        prevTypeWasAlign = false;\n      }\n    }\n    if (cols[cols.length - 1].type === \"separator\") {\n      const sep = cols[cols.length - 2].type === \"separator\"\n        ? \"0.15em double\"\n        : cols[cols.length - 1].separator === \"|\"\n        ? \"0.06em solid\"\n        : \"0.06em dashed\";\n      for (const row of table.children) {\n        row.children[row.children.length - 1].style.borderRight = sep;\n        row.children[row.children.length - 1].style.paddingRight = \"0.4em\";\n      }\n    }\n  }\n\n  if (group.envClasses.includes(\"small\")) {\n    // A small array. Wrap in scriptstyle.\n    table = new MathNode(\"mstyle\", [table]);\n    table.setAttribute(\"scriptlevel\", \"1\");\n  }\n\n  return table\n};\n\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split.\nconst alignedHandler = function(context, args) {\n  if (context.envName.indexOf(\"ed\") === -1) {\n    validateAmsEnvironmentContext(context);\n  }\n  const isSplit = context.envName === \"split\";\n  const cols = [];\n  const res = parseArray(\n    context.parser,\n    {\n      cols,\n      emptySingleRow: true,\n      autoTag: isSplit ? undefined : getAutoTag(context.envName),\n      envClasses: [\"abut\", \"jot\"], // set row spacing & provisional column spacing\n      maxNumCols: context.envName === \"split\" ? 2 : undefined,\n      leqno: context.parser.settings.leqno\n    },\n    \"display\"\n  );\n\n  // Determining number of columns.\n  // 1. If the first argument is given, we use it as a number of columns,\n  //    and makes sure that each row doesn't exceed that number.\n  // 2. Otherwise, just count number of columns = maximum number\n  //    of cells in each row (\"aligned\" mode -- isAligned will be true).\n  //\n  // At the same time, prepend empty group {} at beginning of every second\n  // cell in each row (starting with second cell) so that operators become\n  // binary.  This behavior is implemented in amsmath's \\start@aligned.\n  let numMaths;\n  let numCols = 0;\n  const isAlignedAt = context.envName.indexOf(\"at\") > -1;\n  if (args[0] && isAlignedAt) {\n    // alignat environment takes an argument w/ number of columns\n    let arg0 = \"\";\n    for (let i = 0; i < args[0].body.length; i++) {\n      const textord = assertNodeType(args[0].body[i], \"textord\");\n      arg0 += textord.text;\n    }\n    if (isNaN(arg0)) {\n      throw new ParseError(\"The alignat enviroment requires a numeric first argument.\")\n    }\n    numMaths = Number(arg0);\n    numCols = numMaths * 2;\n  }\n  res.body.forEach(function(row) {\n    if (isAlignedAt) {\n      // Case 1\n      const curMaths = row.length / 2;\n      if (numMaths < curMaths) {\n        throw new ParseError(\n          \"Too many math in a row: \" + `expected ${numMaths}, but got ${curMaths}`,\n          row[0]\n        );\n      }\n    } else if (numCols < row.length) {\n      // Case 2\n      numCols = row.length;\n    }\n  });\n\n  // Adjusting alignment.\n  // In aligned mode, we add one \\qquad between columns;\n  // otherwise we add nothing.\n  for (let i = 0; i < numCols; ++i) {\n    let align = \"r\";\n    if (i % 2 === 1) {\n      align = \"l\";\n    }\n    cols[i] = {\n      type: \"align\",\n      align: align\n    };\n  }\n  if (context.envName === \"split\") ; else if (isAlignedAt) {\n    res.envClasses.push(\"alignat\"); // Sets justification\n  } else {\n    res.envClasses[0] = \"align\"; // Sets column spacing & justification\n  }\n  return res;\n};\n\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"array\", \"darray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Since no types are specified above, the two possibilities are\n    // - The argument is wrapped in {} or [], in which case Parser's\n    //   parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n    // - The argument is a bare symbol node.\n    const symNode = checkSymbolNodeType(args[0]);\n    const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    const cols = colalign.map(function(nde) {\n      const node = assertSymbolNodeType(nde);\n      const ca = node.text;\n      if (\"lcr\".indexOf(ca) !== -1) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      } else if (ca === \"|\") {\n        return {\n          type: \"separator\",\n          separator: \"|\"\n        };\n      } else if (ca === \":\") {\n        return {\n          type: \"separator\",\n          separator: \":\"\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n    const res = {\n      cols,\n      envClasses: [\"array\"],\n      maxNumCols: cols.length,\n      arraystretch,\n      arraycolsep\n    };\n    return parseArray(context.parser, res, dCellStyle(context.envName));\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// The matrix environments of amsmath build on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n  type: \"array\",\n  names: [\n    \"matrix\",\n    \"pmatrix\",\n    \"bmatrix\",\n    \"Bmatrix\",\n    \"vmatrix\",\n    \"Vmatrix\",\n    \"matrix*\",\n    \"pmatrix*\",\n    \"bmatrix*\",\n    \"Bmatrix*\",\n    \"vmatrix*\",\n    \"Vmatrix*\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const delimiters = {\n      matrix: null,\n      pmatrix: [\"(\", \")\"],\n      bmatrix: [\"[\", \"]\"],\n      Bmatrix: [\"\\\\{\", \"\\\\}\"],\n      vmatrix: [\"|\", \"|\"],\n      Vmatrix: [\"\\\\Vert\", \"\\\\Vert\"]\n    }[context.envName.replace(\"*\", \"\")];\n    // \\hskip -\\arraycolsep in amsmath\n    let colAlign = \"c\";\n    const payload = {\n      envClasses: [],\n      cols: []\n    };\n    if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n      // It's one of the mathtools starred functions.\n      // Parse the optional alignment argument.\n      const parser = context.parser;\n      parser.consumeSpaces();\n      if (parser.fetch().text === \"[\") {\n        parser.consume();\n        parser.consumeSpaces();\n        colAlign = parser.fetch().text;\n        if (\"lcr\".indexOf(colAlign) === -1) {\n          throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n        }\n        parser.consume();\n        parser.consumeSpaces();\n        parser.expect(\"]\");\n        parser.consume();\n        payload.cols = [];\n      }\n    }\n    const res = parseArray(context.parser, payload, \"text\");\n    res.cols = res.body.length > 0\n      ? new Array(res.body[0].length).fill({ type: \"align\", align: colAlign })\n      : [];\n    const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n    res.arraystretch = arraystretch;\n    if (arraycolsep && !(arraycolsep === 6 && arraycolsep === \"pt\")) {\n      res.arraycolsep = arraycolsep;\n    }\n    return delimiters\n      ? {\n        type: \"leftright\",\n        mode: context.mode,\n        body: [res],\n        left: delimiters[0],\n        right: delimiters[1],\n        rightColor: undefined // \\right uninfluenced by \\color in array\n      }\n      : res;\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"bordermatrix\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const payload = { cols: [], envClasses: [\"bordermatrix\"] };\n    const res = parseArray(context.parser, payload, \"text\");\n    res.cols = res.body.length > 0\n      ? new Array(res.body[0].length).fill({ type: \"align\", align: \"c\" })\n      : [];\n    res.envClasses = [];\n    res.arraystretch = 1;\n    if (context.envName === \"matrix\") { return res}\n    return bordermatrixParseTree(res, context.delimiters)\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"smallmatrix\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const payload = { envClasses: [\"small\"] };\n    const res = parseArray(context.parser, payload, \"script\");\n    return res;\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"subarray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Parsing of {subarray} is similar to {array}\n    const symNode = checkSymbolNodeType(args[0]);\n    const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    const cols = colalign.map(function(nde) {\n      const node = assertSymbolNodeType(nde);\n      const ca = node.text;\n      // {subarray} only recognizes \"l\" & \"c\"\n      if (\"lc\".indexOf(ca) !== -1) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    if (cols.length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    let res = {\n      cols,\n      envClasses: [\"small\"]\n    };\n    res = parseArray(context.parser, res, \"script\");\n    if (res.body.length > 0 && res.body[0].length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    return res;\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const payload = {\n      cols: [],\n      envClasses: [\"cases\"]\n    };\n    const res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    return {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: context.envName.indexOf(\"r\") > -1 ? \".\" : \"\\\\{\",\n      right: context.envName.indexOf(\"r\") > -1 ? \"\\\\}\" : \".\",\n      rightColor: undefined\n    };\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"align\", \"align*\", \"aligned\", \"split\"],\n  props: {\n    numArgs: 0\n  },\n  handler: alignedHandler,\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust where spacing occurs.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"alignat\", \"alignat*\", \"alignedat\"],\n  props: {\n    numArgs: 1\n  },\n  handler: alignedHandler,\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"gathered\", \"gather\", \"gather*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    if (context.envName !== \"gathered\") {\n      validateAmsEnvironmentContext(context);\n    }\n    const res = {\n      cols: [],\n      envClasses: [\"abut\", \"jot\"],\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"equation\", \"equation*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    const res = {\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      singleRow: true,\n      maxNumCols: 1,\n      envClasses: [\"align\"],\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"multline\", \"multline*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    const res = {\n      autoTag: context.envName === \"multline\",\n      maxNumCols: 1,\n      envClasses: [\"jot\", \"multline\"],\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"CD\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    return parseCD(context.parser);\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\n// Catch \\hline outside array environment\ndefineFunction({\n  type: \"text\", // Doesn't matter what this is.\n  names: [\"\\\\hline\", \"\\\\hdashline\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: true\n  },\n  handler(context, args) {\n    throw new ParseError(`${context.funcName} valid only within array environment`);\n  }\n});\n\nconst environments = _environments;\n\n// \\bordermatrix  from TeXbook pp 177 & 361\n// Optional argument from Herbert Voß, Math mode, p 20\n// Ref: https://tug.ctan.org/obsolete/info/math/voss/mathmode/Mathmode.pdf\n\ndefineFunction({\n  type: \"bordermatrix\",\n  names: [\"\\\\bordermatrix\", \"\\\\matrix\"],\n  props: {\n    numArgs: 0,\n    numOptionalArgs: 1\n  },\n  handler: ({ parser, funcName }, args, optArgs) => {\n    // Find out if the author has defined custom delimiters\n    let delimiters = [\"(\", \")\"]; // default\n    if (funcName === \"\\\\bordermatrix\" && optArgs[0] && optArgs[0].body) {\n      const body = optArgs[0].body;\n      if (body.length === 1 && body[0].type === \"delimiter\") {\n        delimiters = [body[0].left, body[0].right];\n      }\n    }\n    // consume the opening brace\n    parser.consumeSpaces();\n    parser.consume();\n\n    // Pass control to the environment handler in array.js.\n    const env = environments[\"bordermatrix\"];\n    const context = {\n      mode: parser.mode,\n      envName: funcName.slice(1),\n      delimiters,\n      parser\n    };\n    const result = env.handler(context);\n    parser.expect(\"}\", true);\n    return result\n  }\n});\n\ndefineFunction({\n  type: \"cancelto\",\n  names: [\"\\\\cancelto\"],\n  props: {\n    numArgs: 2\n  },\n  handler({ parser }, args) {\n    const to = args[0];\n    const body = args[1];\n    return {\n      type: \"cancelto\",\n      mode: parser.mode,\n      body,\n      to,\n      isCharacterBox: isCharacterBox(body)\n    };\n  },\n  mathmlBuilder(group, style) {\n    const fromNode = new MathNode(\n      \"mrow\",\n      [buildGroup$1(group.body, style)],\n      [\"ff-narrow\"] // A zero-width mrow.\n    );\n    // Write the arrow in a node written after the content.\n    // That way, the arrow will be an overlay on the content.\n    const phantom = new MathNode(\"mphantom\", [buildGroup$1(group.body, style)]);\n    const arrow = new MathNode(\"mrow\", [phantom], [\"tml-cancelto\"]);\n    arrow.style.color = style.color;\n    if (group.isCharacterBox && smalls.indexOf(group.body.body[0].text) > -1) {\n      arrow.style.left = \"0.1em\";\n      arrow.style.width = \"90%\";\n    }\n    const node = new MathNode(\"mrow\", [fromNode, arrow], [\"menclose\"]);\n    if (!group.isCharacterBox || /[f∫∑]/.test(group.body.body[0].text)) {\n      // Add 0.2em space to right of content to make room for the arrowhead.\n      phantom.style.paddingRight = \"0.2em\";\n    } else {\n      phantom.style.padding = \"0.5ex 0.1em 0 0\";\n      const strut = new MathNode('mspace', []);\n      strut.setAttribute('height', \"0.85em\");\n      fromNode.children.push(strut);\n    }\n\n    // Create the \"to\" value above and to the right of the arrow.\n    // First, we want a dummy node with the same height as the `from` content.\n    // We'll place the `to` node above the dummy to get the correct vertical alignment.\n    let dummyNode;\n    if (group.isCharacterBox) {\n      dummyNode = new MathNode('mspace', []);\n      dummyNode.setAttribute('height', \"1em\");\n    } else {\n      // Create a phantom node with the same content as the body.\n      const inner = buildGroup$1(group.body, style);\n      // The phantom node will be zero-width, so it won't affect horizontal spacing.\n      const zeroWidthNode = new MathNode(\"mpadded\", [inner]);\n      zeroWidthNode.setAttribute(\"width\", \"0.1px\"); // Don't use 0. WebKit would omit it.\n      dummyNode = new MathNode(\"mphantom\", [zeroWidthNode]); // Hide it.\n    }\n    const toNode = buildGroup$1(group.to, style);\n    toNode.style.color = style.color;\n    const zeroWidthToNode = new MathNode(\"mpadded\", [toNode]);\n    if (!group.isCharacterBox || /[f∫∑]/.test(group.body.body[0].text)) {\n      const w = new MathNode(\"mspace\", []);\n      w.setAttribute('width', \"0.2em\");\n      zeroWidthToNode.children.unshift(w);\n    }\n    zeroWidthToNode.setAttribute(\"width\", \"0.1px\"); // Don't use 0. WebKit would hide it.\n    const mover = new MathNode(\"mover\", [dummyNode, zeroWidthToNode]);\n    // Fix Firefox positioning.\n    const nudgeLeft = new MathNode('mrow', [], [\"ff-nudge-left\"]);\n    return newDocumentFragment([makeRow([node, mover]), nudgeLeft])\n  }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123.  It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n  type: \"textord\",\n  names: [\"\\\\@char\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser, token }, args) {\n    const arg = assertNodeType(args[0], \"ordgroup\");\n    const group = arg.body;\n    let number = \"\";\n    for (let i = 0; i < group.length; i++) {\n      const node = assertNodeType(group[i], \"textord\");\n      number += node.text;\n    }\n    const code = parseInt(number);\n    if (isNaN(code)) {\n      throw new ParseError(`\\\\@char has non-numeric argument ${number}`, token)\n    }\n    return {\n      type: \"textord\",\n      mode: parser.mode,\n      text: String.fromCodePoint(code)\n    }\n  }\n});\n\n// Helpers\nconst htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i;\nconst htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i;\nconst RGBregEx = /^ *\\d{1,3} *(?:, *\\d{1,3} *){2}$/;\nconst rgbRegEx = /^ *[10](?:\\.\\d*)? *(?:, *[10](?:\\.\\d*)? *){2}$/;\nconst xcolorHtmlRegEx = /^[a-f0-9]{6}$/i;\nconst toHex = num => {\n  let str = num.toString(16);\n  if (str.length === 1) { str = \"0\" + str; }\n  return str\n};\n\n// Colors from Tables 4.1 and 4.2 of the xcolor package.\n// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx.\n// Table 4.2 (Capitalized) values were sampled, because Chroma contains a unreliable\n// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274.\nconst xcolors = JSON.parse(`{\n  \"Apricot\": \"#ffb484\",\n  \"Aquamarine\": \"#08b4bc\",\n  \"Bittersweet\": \"#c84c14\",\n  \"blue\": \"#0000FF\",\n  \"Blue\": \"#303494\",\n  \"BlueGreen\": \"#08b4bc\",\n  \"BlueViolet\": \"#503c94\",\n  \"BrickRed\": \"#b8341c\",\n  \"brown\": \"#BF8040\",\n  \"Brown\": \"#802404\",\n  \"BurntOrange\": \"#f8941c\",\n  \"CadetBlue\": \"#78749c\",\n  \"CarnationPink\": \"#f884b4\",\n  \"Cerulean\": \"#08a4e4\",\n  \"CornflowerBlue\": \"#40ace4\",\n  \"cyan\": \"#00FFFF\",\n  \"Cyan\": \"#08acec\",\n  \"Dandelion\": \"#ffbc44\",\n  \"darkgray\": \"#404040\",\n  \"DarkOrchid\": \"#a8548c\",\n  \"Emerald\": \"#08ac9c\",\n  \"ForestGreen\": \"#089c54\",\n  \"Fuchsia\": \"#90348c\",\n  \"Goldenrod\": \"#ffdc44\",\n  \"gray\": \"#808080\",\n  \"Gray\": \"#98949c\",\n  \"green\": \"#00FF00\",\n  \"Green\": \"#08a44c\",\n  \"GreenYellow\": \"#e0e474\",\n  \"JungleGreen\": \"#08ac9c\",\n  \"Lavender\": \"#f89cc4\",\n  \"lightgray\": \"#c0c0c0\",\n  \"lime\": \"#BFFF00\",\n  \"LimeGreen\": \"#90c43c\",\n  \"magenta\": \"#FF00FF\",\n  \"Magenta\": \"#f0048c\",\n  \"Mahogany\": \"#b0341c\",\n  \"Maroon\": \"#b03434\",\n  \"Melon\": \"#f89c7c\",\n  \"MidnightBlue\": \"#086494\",\n  \"Mulberry\": \"#b03c94\",\n  \"NavyBlue\": \"#086cbc\",\n  \"olive\": \"#7F7F00\",\n  \"OliveGreen\": \"#407c34\",\n  \"orange\": \"#FF8000\",\n  \"Orange\": \"#f8843c\",\n  \"OrangeRed\": \"#f0145c\",\n  \"Orchid\": \"#b074ac\",\n  \"Peach\": \"#f8945c\",\n  \"Periwinkle\": \"#8074bc\",\n  \"PineGreen\": \"#088c74\",\n  \"pink\": \"#ff7f7f\",\n  \"Plum\": \"#98248c\",\n  \"ProcessBlue\": \"#08b4ec\",\n  \"purple\": \"#BF0040\",\n  \"Purple\": \"#a0449c\",\n  \"RawSienna\": \"#983c04\",\n  \"red\": \"#ff0000\",\n  \"Red\": \"#f01c24\",\n  \"RedOrange\": \"#f86434\",\n  \"RedViolet\": \"#a0246c\",\n  \"Rhodamine\": \"#f0549c\",\n  \"Royallue\": \"#0874bc\",\n  \"RoyalPurple\": \"#683c9c\",\n  \"RubineRed\": \"#f0047c\",\n  \"Salmon\": \"#f8948c\",\n  \"SeaGreen\": \"#30bc9c\",\n  \"Sepia\": \"#701404\",\n  \"SkyBlue\": \"#48c4dc\",\n  \"SpringGreen\": \"#c8dc64\",\n  \"Tan\": \"#e09c74\",\n  \"teal\": \"#007F7F\",\n  \"TealBlue\": \"#08acb4\",\n  \"Thistle\": \"#d884b4\",\n  \"Turquoise\": \"#08b4cc\",\n  \"violet\": \"#800080\",\n  \"Violet\": \"#60449c\",\n  \"VioletRed\": \"#f054a4\",\n  \"WildStrawberry\": \"#f0246c\",\n  \"yellow\": \"#FFFF00\",\n  \"Yellow\": \"#fff404\",\n  \"YellowGreen\": \"#98cc6c\",\n  \"YellowOrange\": \"#ffa41c\"\n}`);\n\nconst colorFromSpec = (model, spec) => {\n  let color = \"\";\n  if (model === \"HTML\") {\n    if (!htmlRegEx.test(spec)) {\n      throw new ParseError(\"Invalid HTML input.\")\n    }\n    color = spec;\n  } else if (model === \"RGB\") {\n    if (!RGBregEx.test(spec)) {\n      throw new ParseError(\"Invalid RGB input.\")\n    }\n    spec.split(\",\").map(e => { color += toHex(Number(e.trim())); });\n  } else {\n    if (!rgbRegEx.test(spec)) {\n      throw new ParseError(\"Invalid rbg input.\")\n    }\n    spec.split(\",\").map(e => {\n      const num = Number(e.trim());\n      if (num > 1) { throw new ParseError(\"Color rgb input must be < 1.\") }\n      color += toHex(Number((num * 255).toFixed(0)));\n    });\n  }\n  if (color.charAt(0) !== \"#\") { color = \"#\" + color; }\n  return color\n};\n\nconst validateColor = (color, macros, token) => {\n  const macroName = `\\\\\\\\color@${color}`; // from \\defineColor.\n  const match = htmlOrNameRegEx.exec(color);\n  if (!match) { throw new ParseError(\"Invalid color: '\" + color + \"'\", token) }\n  // We allow a 6-digit HTML color spec without a leading \"#\".\n  // This follows the xcolor package's HTML color model.\n  // Predefined color names are all missed by this RegEx pattern.\n  if (xcolorHtmlRegEx.test(color)) {\n    return \"#\" + color\n  } else if (color.charAt(0) === \"#\") {\n    return color\n  } else if (macros.has(macroName)) {\n    color = macros.get(macroName).tokens[0].text;\n  } else if (xcolors[color]) {\n    color = xcolors[color];\n  }\n  return color\n};\n\nconst mathmlBuilder$8 = (group, style) => {\n  // In LaTeX, color is not supposed to change the spacing of any node.\n  // So instead of wrapping the group in an <mstyle>, we apply\n  // the color individually to each node and return a document fragment.\n  let expr = buildExpression(group.body, style.withColor(group.color));\n  if (expr.length === 0) {\n    expr.push(new MathNode(\"mrow\"));\n  }\n  expr = expr.map(e => {\n    e.style.color = group.color;\n    return e\n  });\n  return newDocumentFragment(expr)\n};\n\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\textcolor\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"original\"]\n  },\n  handler({ parser, token }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let color = \"\";\n    if (model) {\n      const spec = assertNodeType(args[0], \"raw\").string;\n      color = colorFromSpec(model, spec);\n    } else {\n      color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n    }\n    const body = args[1];\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      isTextColor: true,\n      body: ordargument(body)\n    }\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\color\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\"]\n  },\n  handler({ parser, breakOnTokenText, token }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let color = \"\";\n    if (model) {\n      const spec = assertNodeType(args[0], \"raw\").string;\n      color = colorFromSpec(model, spec);\n    } else {\n      color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n    }\n\n    // Parse out the implicit body that should be colored.\n    const body = parser.parseExpression(true, breakOnTokenText, true);\n\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      isTextColor: false,\n      body\n    }\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\definecolor\"],\n  props: {\n    numArgs: 3,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"raw\"]\n  },\n  handler({ parser, funcName, token }, args) {\n    const name = assertNodeType(args[0], \"raw\").string;\n    if (!/^[A-Za-z]+$/.test(name)) {\n      throw new ParseError(\"Color name must be latin letters.\", token)\n    }\n    const model = assertNodeType(args[1], \"raw\").string;\n    if (![\"HTML\", \"RGB\", \"rgb\"].includes(model)) {\n      throw new ParseError(\"Color model must be HTML, RGB, or rgb.\", token)\n    }\n    const spec = assertNodeType(args[2], \"raw\").string;\n    const color = colorFromSpec(model, spec);\n    parser.gullet.macros.set(`\\\\\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 });\n    return { type: \"internal\", mode: parser.mode }\n  }\n  // No mathmlBuilder. The point of \\definecolor is to set a macro.\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n\n\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n  type: \"cr\",\n  names: [\"\\\\\\\\\"],\n  props: {\n    numArgs: 0,\n    numOptionalArgs: 0,\n    allowedInText: true\n  },\n\n  handler({ parser }, args, optArgs) {\n    const size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n    const newLine = !parser.settings.displayMode;\n    return {\n      type: \"cr\",\n      mode: parser.mode,\n      newLine,\n      size: size && assertNodeType(size, \"size\").value\n    }\n  },\n\n  // The following builder is called only at the top level,\n  // not within tabular/array environments.\n\n  mathmlBuilder(group, style) {\n    // MathML 3.0 calls for newline to occur in an <mo> or an <mspace>.\n    // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking\n    const node = new MathNode(\"mo\");\n    if (group.newLine) {\n      node.setAttribute(\"linebreak\", \"newline\");\n      if (group.size) {\n        const size = calculateSize(group.size, style);\n        node.setAttribute(\"height\", size.number + size.unit);\n      }\n    }\n    return node\n  }\n});\n\nconst globalMap = {\n  \"\\\\global\": \"\\\\global\",\n  \"\\\\long\": \"\\\\\\\\globallong\",\n  \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n  \"\\\\def\": \"\\\\gdef\",\n  \"\\\\gdef\": \"\\\\gdef\",\n  \"\\\\edef\": \"\\\\xdef\",\n  \"\\\\xdef\": \"\\\\xdef\",\n  \"\\\\let\": \"\\\\\\\\globallet\",\n  \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\n\nconst checkControlSequence = (tok) => {\n  const name = tok.text;\n  if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n    throw new ParseError(\"Expected a control sequence\", tok);\n  }\n  return name;\n};\n\nconst getRHS = (parser) => {\n  let tok = parser.gullet.popToken();\n  if (tok.text === \"=\") {\n    // consume optional equals\n    tok = parser.gullet.popToken();\n    if (tok.text === \" \") {\n      // consume one optional space\n      tok = parser.gullet.popToken();\n    }\n  }\n  return tok;\n};\n\nconst letCommand = (parser, name, tok, global) => {\n  let macro = parser.gullet.macros.get(tok.text);\n  if (macro == null) {\n    // don't expand it later even if a macro with the same name is defined\n    // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n    tok.noexpand = true;\n    macro = {\n      tokens: [tok],\n      numArgs: 0,\n      // reproduce the same behavior in expansion\n      unexpandable: !parser.gullet.isExpandable(tok.text)\n    };\n  }\n  parser.gullet.macros.set(name, macro, global);\n};\n\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n  type: \"internal\",\n  names: [\n    \"\\\\global\",\n    \"\\\\long\",\n    \"\\\\\\\\globallong\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler({ parser, funcName }) {\n    parser.consumeSpaces();\n    const token = parser.fetch();\n    if (globalMap[token.text]) {\n      // Temml doesn't have \\par, so ignore \\long\n      if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n        token.text = globalMap[token.text];\n      }\n      return assertNodeType(parser.parseFunction(), \"internal\");\n    }\n    throw new ParseError(`Invalid token after macro prefix`, token);\n  }\n});\n\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    let tok = parser.gullet.popToken();\n    const name = tok.text;\n    if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n      throw new ParseError(\"Expected a control sequence\", tok);\n    }\n\n    let numArgs = 0;\n    let insert;\n    const delimiters = [[]];\n    // <parameter text> contains no braces\n    while (parser.gullet.future().text !== \"{\") {\n      tok = parser.gullet.popToken();\n      if (tok.text === \"#\") {\n        // If the very last character of the <parameter text> is #, so that\n        // this # is immediately followed by {, TeX will behave as if the {\n        // had been inserted at the right end of both the parameter text\n        // and the replacement text.\n        if (parser.gullet.future().text === \"{\") {\n          insert = parser.gullet.future();\n          delimiters[numArgs].push(\"{\");\n          break;\n        }\n\n        // A parameter, the first appearance of # must be followed by 1,\n        // the next by 2, and so on; up to nine #’s are allowed\n        tok = parser.gullet.popToken();\n        if (!/^[1-9]$/.test(tok.text)) {\n          throw new ParseError(`Invalid argument number \"${tok.text}\"`);\n        }\n        if (parseInt(tok.text) !== numArgs + 1) {\n          throw new ParseError(`Argument number \"${tok.text}\" out of order`);\n        }\n        numArgs++;\n        delimiters.push([]);\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Expected a macro definition\");\n      } else {\n        delimiters[numArgs].push(tok.text);\n      }\n    }\n    // replacement text, enclosed in '{' and '}' and properly nested\n    let { tokens } = parser.gullet.consumeArg();\n    if (insert) {\n      tokens.unshift(insert);\n    }\n\n    if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n      tokens = parser.gullet.expandTokens(tokens);\n      if (tokens.length > parser.gullet.settings.maxExpand) {\n        throw new ParseError(\"Too many expansions in an \" + funcName);\n      }\n      tokens.reverse(); // to fit in with stack order\n    }\n    // Final arg is the expansion of the macro\n    parser.gullet.macros.set(\n      name,\n      { tokens, numArgs, delimiters },\n      funcName === globalMap[funcName]\n    );\n    return { type: \"internal\", mode: parser.mode };\n  }\n});\n\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n//     | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n  type: \"internal\",\n  names: [\n    \"\\\\let\",\n    \"\\\\\\\\globallet\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    const name = checkControlSequence(parser.gullet.popToken());\n    parser.gullet.consumeSpaces();\n    const tok = getRHS(parser);\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n    return { type: \"internal\", mode: parser.mode };\n  }\n});\n\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n  type: \"internal\",\n  names: [\n    \"\\\\futurelet\",\n    \"\\\\\\\\globalfuture\" // can’t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    const name = checkControlSequence(parser.gullet.popToken());\n    const middle = parser.gullet.popToken();\n    const tok = parser.gullet.popToken();\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n    parser.gullet.pushToken(tok);\n    parser.gullet.pushToken(middle);\n    return { type: \"internal\", mode: parser.mode };\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\newcommand\", \"\\\\renewcommand\", \"\\\\providecommand\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    let name = \"\";\n    const tok = parser.gullet.popToken();\n    if (tok.text === \"{\") {\n      name = checkControlSequence(parser.gullet.popToken());\n      parser.gullet.popToken();\n    } else {\n      name = checkControlSequence(tok);\n    }\n\n    const exists = parser.gullet.isDefined(name);\n    if (exists && funcName === \"\\\\newcommand\") {\n      throw new ParseError(\n        `\\\\newcommand{${name}} attempting to redefine ${name}; use \\\\renewcommand`\n      );\n    }\n    if (!exists && funcName === \"\\\\renewcommand\") {\n      throw new ParseError(\n        `\\\\renewcommand{${name}} when command ${name} does not yet exist; use \\\\newcommand`\n      );\n    }\n\n    let numArgs = 0;\n    if (parser.gullet.future().text === \"[\") {\n      let tok = parser.gullet.popToken();\n      tok = parser.gullet.popToken();\n      if (!/^[0-9]$/.test(tok.text)) {\n        throw new ParseError(`Invalid number of arguments: \"${tok.text}\"`);\n      }\n      numArgs = parseInt(tok.text);\n      tok = parser.gullet.popToken();\n      if (tok.text !== \"]\") {\n        throw new ParseError(`Invalid argument \"${tok.text}\"`);\n      }\n    }\n\n    // replacement text, enclosed in '{' and '}' and properly nested\n    const { tokens } = parser.gullet.consumeArg();\n\n    if (!(funcName === \"\\\\providecommand\" && parser.gullet.macros.has(name))) {\n      // Ignore \\providecommand\n      parser.gullet.macros.set(\n        name,\n        { tokens, numArgs }\n      );\n    }\n\n    return { type: \"internal\", mode: parser.mode };\n\n  }\n});\n\n// Extra data needed for the delimiter handler down below\nconst delimiterSizes = {\n  \"\\\\bigl\": { mclass: \"mopen\", size: 1 },\n  \"\\\\Bigl\": { mclass: \"mopen\", size: 2 },\n  \"\\\\biggl\": { mclass: \"mopen\", size: 3 },\n  \"\\\\Biggl\": { mclass: \"mopen\", size: 4 },\n  \"\\\\bigr\": { mclass: \"mclose\", size: 1 },\n  \"\\\\Bigr\": { mclass: \"mclose\", size: 2 },\n  \"\\\\biggr\": { mclass: \"mclose\", size: 3 },\n  \"\\\\Biggr\": { mclass: \"mclose\", size: 4 },\n  \"\\\\bigm\": { mclass: \"mrel\", size: 1 },\n  \"\\\\Bigm\": { mclass: \"mrel\", size: 2 },\n  \"\\\\biggm\": { mclass: \"mrel\", size: 3 },\n  \"\\\\Biggm\": { mclass: \"mrel\", size: 4 },\n  \"\\\\big\": { mclass: \"mord\", size: 1 },\n  \"\\\\Big\": { mclass: \"mord\", size: 2 },\n  \"\\\\bigg\": { mclass: \"mord\", size: 3 },\n  \"\\\\Bigg\": { mclass: \"mord\", size: 4 }\n};\n\nconst leftToRight = {\n  \"(\": \")\",\n  \"\\\\lparen\": \"\\\\rparen\",\n  \"[\": \"]\",\n  \"\\\\lbrack\": \"\\\\rbrack\",\n  \"\\\\{\": \"\\\\}\",\n  \"\\\\lbrace\": \"\\\\rbrace\",\n  \"⦇\": \"⦈\",\n  \"\\\\llparenthesis\": \"\\\\rrparenthesis\",\n  \"\\\\lfloor\": \"\\\\rfloor\",\n  \"\\u230a\": \"\\u230b\",\n  \"\\\\lceil\": \"\\\\rceil\",\n  \"\\u2308\": \"\\u2309\",\n  \"\\\\langle\": \"\\\\rangle\",\n  \"\\u27e8\": \"\\u27e9\",\n  \"\\\\lAngle\": \"\\\\rAngle\",\n  \"\\u27ea\": \"\\u27eb\",\n  \"\\\\llangle\": \"\\\\rrangle\",\n  \"⦉\": \"⦊\",\n  \"\\\\lvert\": \"\\\\rvert\",\n  \"\\\\lVert\": \"\\\\rVert\",\n  \"\\\\lgroup\": \"\\\\rgroup\",\n  \"\\u27ee\": \"\\u27ef\",\n  \"\\\\lmoustache\": \"\\\\rmoustache\",\n  \"\\u23b0\": \"\\u23b1\",\n  \"\\\\llbracket\": \"\\\\rrbracket\",\n  \"\\u27e6\": \"\\u27e7\",\n  \"\\\\lBrace\": \"\\\\rBrace\",\n  \"\\u2983\": \"\\u2984\"\n};\n\nconst leftDelimiterNames = new Set(Object.keys(leftToRight));\nnew Set(Object.values(leftToRight));\n\nconst delimiters = new Set([\n  \"(\",\n  \"\\\\lparen\",\n  \")\",\n  \"\\\\rparen\",\n  \"[\",\n  \"\\\\lbrack\",\n  \"]\",\n  \"\\\\rbrack\",\n  \"\\\\{\",\n  \"\\\\lbrace\",\n  \"\\\\}\",\n  \"\\\\rbrace\",\n  \"⦇\",\n  \"\\\\llparenthesis\",\n  \"⦈\",\n  \"\\\\rrparenthesis\",\n  \"\\\\lfloor\",\n  \"\\\\rfloor\",\n  \"\\u230a\",\n  \"\\u230b\",\n  \"\\\\lceil\",\n  \"\\\\rceil\",\n  \"\\u2308\",\n  \"\\u2309\",\n  \"<\",\n  \">\",\n  \"\\\\langle\",\n  \"\\u27e8\",\n  \"\\\\rangle\",\n  \"\\u27e9\",\n  \"\\\\lAngle\",\n  \"\\u27ea\",\n  \"\\\\rAngle\",\n  \"\\u27eb\",\n  \"\\\\llangle\",\n  \"⦉\",\n  \"\\\\rrangle\",\n  \"⦊\",\n  \"\\\\lt\",\n  \"\\\\gt\",\n  \"\\\\lvert\",\n  \"\\\\rvert\",\n  \"\\\\lVert\",\n  \"\\\\rVert\",\n  \"\\\\lgroup\",\n  \"\\\\rgroup\",\n  \"\\u27ee\",\n  \"\\u27ef\",\n  \"\\\\lmoustache\",\n  \"\\\\rmoustache\",\n  \"\\u23b0\",\n  \"\\u23b1\",\n  \"\\\\llbracket\",\n  \"\\\\rrbracket\",\n  \"\\u27e6\",\n  \"\\u27e7\",\n  \"\\\\lBrace\",\n  \"\\\\rBrace\",\n  \"\\u2983\",\n  \"\\u2984\",\n  \"/\",\n  \"\\\\backslash\",\n  \"|\",\n  \"\\\\vert\",\n  \"\\\\|\",\n  \"\\\\Vert\",\n  \"\\u2016\",\n  \"\\\\uparrow\",\n  \"\\\\Uparrow\",\n  \"\\\\downarrow\",\n  \"\\\\Downarrow\",\n  \"\\\\updownarrow\",\n  \"\\\\Updownarrow\",\n  \".\"\n]);\n\n// Export isDelimiter for benefit of parser.\nconst dels = new Set([\"}\", \"\\\\left\", \"\\\\middle\", \"\\\\right\"]);\nconst isDelimiter = str => str.length > 0 &&\n  (delimiters.has(str) || delimiterSizes[str] || dels.has(str));\n\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nconst sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n  if (delim.type === \"ordgroup\" && delim.body.length === 1) {\n    delim = delim.body[0]; // Unwrap the braces\n  }\n  const symDelim = checkSymbolNodeType(delim);\n  if (symDelim && delimiters.has(symDelim.text)) {\n    // If a character is not in the MathML operator dictionary, it will not stretch.\n    // Replace such characters w/characters that will stretch.\n    if (symDelim.text === \"<\" || symDelim.text === \"\\\\lt\") { symDelim.text = \"⟨\"; }\n    if (symDelim.text === \">\" || symDelim.text === \"\\\\gt\") { symDelim.text = \"⟩\"; }\n    return symDelim;\n  } else if (symDelim) {\n    throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim);\n  } else {\n    throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim);\n  }\n}\n\n//                               /         \\\nconst needExplicitStretch = new Set([\"\\u002F\", \"\\u005C\", \"\\\\backslash\", \"\\u2216\", \"\\\\vert\", \"|\"]);\n\nconst makeFenceMo = (delim, mode, form, isStretchy) => {\n  const text = delim === \".\" ? \"\" : delim;\n  const node = new MathNode(\"mo\", [makeText(text, mode)]);\n  node.setAttribute(\"fence\", \"true\");\n  node.setAttribute(\"form\", form);\n  node.setAttribute(\"stretchy\", isStretchy ? \"true\" : \"false\");\n  return node;\n};\n\ndefineFunction({\n  type: \"delimsizing\",\n  names: [\n    \"\\\\bigl\",\n    \"\\\\Bigl\",\n    \"\\\\biggl\",\n    \"\\\\Biggl\",\n    \"\\\\bigr\",\n    \"\\\\Bigr\",\n    \"\\\\biggr\",\n    \"\\\\Biggr\",\n    \"\\\\bigm\",\n    \"\\\\Bigm\",\n    \"\\\\biggm\",\n    \"\\\\Biggm\",\n    \"\\\\big\",\n    \"\\\\Big\",\n    \"\\\\bigg\",\n    \"\\\\Bigg\"\n  ],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const delim = checkDelimiter(args[0], context);\n\n    const delimNode = {\n      type: \"delimsizing\",\n      mode: context.parser.mode,\n      size: delimiterSizes[context.funcName].size,\n      mclass: delimiterSizes[context.funcName].mclass,\n      delim: delim.text\n    };\n    const nextToken = context.parser.fetch().text;\n    if (nextToken !== \"^\" && nextToken !== \"_\") {\n      return delimNode\n    } else {\n      // Chromium mis-renders a sized delim if it is the base of a supsub.\n      // So wrap it in a ordgroup.\n      return {\n        type: \"ordgroup\",\n        mode: \"math\",\n        body: [delimNode, { type: \"ordgroup\", mode: \"math\", body: [] }]\n      }\n    }\n  },\n  mathmlBuilder: (group) => {\n    const children = [];\n    const delim = group.delim === \".\" ? \"\" : group.delim;\n\n    children.push(makeText(delim, group.mode));\n\n    const node = new MathNode(\"mo\", children);\n\n    if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      // Only some of the delimsizing functions act as fences, and they\n      // return \"mopen\" or \"mclose\" mclass.\n      node.setAttribute(\"fence\", \"true\");\n    } else {\n      // Explicitly disable fencing if it's not a fence, to override the\n      // defaults.\n      node.setAttribute(\"fence\", \"false\");\n    }\n    if (needExplicitStretch.has(delim) || delim.indexOf(\"arrow\") > -1) {\n      // We have to explicitly set stretchy to true.\n      node.setAttribute(\"stretchy\", \"true\");\n    }\n    node.setAttribute(\"symmetric\", \"true\"); // Needed for tall arrows in Firefox.\n    node.setAttribute(\"minsize\", sizeToMaxHeight[group.size] + \"em\");\n    node.setAttribute(\"maxsize\", sizeToMaxHeight[group.size] + \"em\");\n    return node;\n  }\n});\n\nfunction assertParsed(group) {\n  if (!group.body) {\n    throw new Error(\"Bug: The delim ParseNode wasn't fully parsed.\");\n  }\n}\n\ndefineFunction({\n  type: \"leftright-right\",\n  names: [\"\\\\right\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    return {\n      type: \"leftright-right\",\n      mode: context.parser.mode,\n      delim: checkDelimiter(args[0], context).text\n    };\n  }\n});\n\ndefineFunction({\n  type: \"leftright\",\n  names: [\"\\\\left\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const delim = checkDelimiter(args[0], context);\n\n    const parser = context.parser;\n    ++parser.leftrightDepth;\n    let body = parser.parseExpression(false, \"\\\\right\", true);\n    let nextToken = parser.fetch();\n    while (nextToken.text === \"\\\\middle\") {\n      parser.consume();\n      const middle = parser.fetch().text;\n      if (!symbols.math[middle]) {\n        throw new ParseError(`Invalid delimiter '${middle}' after '\\\\middle'`);\n      }\n      checkDelimiter({ type: \"atom\", mode: \"math\", text: middle }, { funcName: \"\\\\middle\" });\n      body.push({ type: \"middle\", mode: \"math\", delim: middle });\n      parser.consume();\n      body = body.concat(parser.parseExpression(false, \"\\\\right\", true));\n      nextToken = parser.fetch();\n    }\n    --parser.leftrightDepth;\n    parser.expect(\"\\\\right\", false);\n    const right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n    return {\n      type: \"leftright\",\n      mode: parser.mode,\n      body,\n      left: delim.text,\n      right: right.delim,\n      isStretchy: true\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    assertParsed(group);\n    const inner = buildExpression(group.body, style);\n\n    const leftNode = makeFenceMo(group.left, group.mode, \"prefix\", true);\n    inner.unshift(leftNode);\n\n    const rightNode = makeFenceMo(group.right, group.mode, \"postfix\", true);\n    if (group.body.length > 0) {\n      const lastElement = group.body[group.body.length - 1];\n      if (lastElement.type === \"color\" && !lastElement.isTextColor) {\n        rightNode.setAttribute(\"mathcolor\", lastElement.color);\n      }\n    }\n    inner.push(rightNode);\n\n    return makeRow(inner);\n  }\n});\n\ndefineFunction({\n  type: \"delimiter\",\n  names: Array.from(leftDelimiterNames),\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: true,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName, token }) => {\n    if (parser.mode === \"text\") {\n      return {\n        type: \"textord\",\n        mode: \"text\",\n        text: funcName,\n        loc: token.loc\n      }\n    } else if (!parser.settings.wrapDelimiterPairs) {\n      // Treat this token as an ordinary symbol.\n      return {\n        type: \"atom\",\n        mode: \"math\",\n        family: \"open\",\n        loc: token.loc,\n        text: funcName\n      };\n    }\n    // Otherwise, try to wrap a pair of delimiters with an <mrow>.\n    const rightDelim = leftToRight[funcName];\n    // Parse the inner expression, looking for the corresponding right delimiter.\n    const body = parser.parseExpression(false, rightDelim, false);\n    const nextToken = parser.fetch().text;\n\n    if (nextToken !== rightDelim) {\n      // We were unable to find a matching right delimiter.\n      // Throw control back to renderToMathMLTree.\n      // It will reparse the entire expression with wrapDelimiterPairs set to false.\n      throw new ParseError(\"Unmatched delimiter\");\n    }\n    parser.consume();\n\n    return {\n      type: \"delimiter\",\n      mode: parser.mode,\n      body,\n      left: funcName,\n      right: rightDelim\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    assertParsed(group);\n    const inner = buildExpression(group.body, style);\n\n    const leftNode = makeFenceMo(group.left, group.mode, \"prefix\", false);\n    inner.unshift(leftNode);\n\n    const rightNode = makeFenceMo(group.right, group.mode, \"postfix\", false);\n    if (group.body.length > 0) {\n      const lastElement = group.body[group.body.length - 1];\n      if (lastElement.type === \"color\" && !lastElement.isTextColor) {\n        rightNode.setAttribute(\"mathcolor\", lastElement.color);\n      }\n    }\n    inner.push(rightNode);\n\n    return makeRow(inner);\n  }\n});\n\ndefineFunction({\n  type: \"middle\",\n  names: [\"\\\\middle\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const delim = checkDelimiter(args[0], context);\n    if (!context.parser.leftrightDepth) {\n      throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n    }\n\n    return {\n      type: \"middle\",\n      mode: context.parser.mode,\n      delim: delim.text\n    };\n  },\n  mathmlBuilder: (group) => {\n    const textNode = makeText(group.delim, group.mode);\n    const middleNode = new MathNode(\"mo\", [textNode]);\n    middleNode.setAttribute(\"stretchy\", \"true\");\n    middleNode.setAttribute(\"form\", \"infix\");\n    if (textNode.text !== \"/\") {\n      // MathML gives 5/18em spacing to each <mo> element.\n      // \\middle should get delimiter spacing instead.\n      middleNode.setAttribute(\"lspace\", \"0.05em\");\n      middleNode.setAttribute(\"rspace\", \"0.05em\");\n    }\n    return middleNode;\n  }\n});\n\nconst boxTags = [\"\\\\boxed\", \"\\\\fcolorbox\", \"\\\\colorbox\"];\n\nconst mathmlBuilder$7 = (group, style) => {\n  const tag = boxTags.includes(group.label) ? \"mrow\" : \"menclose\";\n  const node = new MathNode(tag, [buildGroup$1(group.body, style)]);\n  switch (group.label) {\n    case \"\\\\overline\":\n      node.setAttribute(\"notation\", \"top\"); // for Firefox & WebKit\n      node.classes.push(\"tml-overline\");    // for Chromium\n      break\n    case \"\\\\underline\":\n      node.setAttribute(\"notation\", \"bottom\");\n      node.classes.push(\"tml-underline\");\n      break\n    case \"\\\\cancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike\");\n      node.children.push(new MathNode(\"mrow\", [], [\"tml-cancel\", \"upstrike\"]));\n      break\n    case \"\\\\bcancel\":\n      node.setAttribute(\"notation\", \"downdiagonalstrike\");\n      node.children.push(new MathNode(\"mrow\", [], [\"tml-cancel\", \"downstrike\"]));\n      break\n    case \"\\\\sout\":\n      node.setAttribute(\"notation\", \"horizontalstrike\");\n      node.children.push(new MathNode(\"mrow\", [], [\"tml-cancel\", \"sout\"]));\n      break\n    case \"\\\\xcancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n      node.children.push(new MathNode(\"mrow\", [], [\"tml-cancel\", \"tml-xcancel\"]));\n      break\n    // cancelto is handled in cancelto.js\n    case \"\\\\longdiv\":\n      node.setAttribute(\"notation\", \"longdiv\");\n      node.classes.push(\"longdiv-top\");\n      node.children.push(new MathNode(\"mrow\", [], [\"longdiv-arc\"]));\n      break\n    case \"\\\\phase\":\n      node.setAttribute(\"notation\", \"phasorangle\");\n      node.classes.push(\"phasor-bottom\");\n      node.children.push(new MathNode(\"mrow\", [], [\"phasor-angle\"]));\n      break\n    case \"\\\\textcircled\":\n      node.setAttribute(\"notation\", \"circle\");\n      node.classes.push(\"circle-pad\");\n      node.children.push(new MathNode(\"mrow\", [], [\"textcircle\"]));\n      break\n    case \"\\\\angl\":\n      node.setAttribute(\"notation\", \"actuarial\");\n      node.classes.push(\"actuarial\");\n      break\n    case \"\\\\boxed\":\n      // \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}} from amsmath.sty\n      node.style.padding = \"3pt\";\n      node.style.border = \"1px solid\";\n      node.setAttribute(\"scriptlevel\", \"0\");\n      node.setAttribute(\"displaystyle\", \"true\");\n      break\n    case \"\\\\fbox\":\n      node.setAttribute(\"notation\", \"box\");\n      node.classes.push(\"tml-fbox\");\n      break\n    case \"\\\\fcolorbox\":\n    case \"\\\\colorbox\": {\n      // Don't use <menclose>. WebKit would show a radical.\n      node.style.padding = \"0.3em\";  // 3 pt from LaTeX source2e for a 10pt font\n      if (group.label === \"\\\\fcolorbox\") {\n        node.style.border = \"0.0667em solid \" + String(group.borderColor);\n      }\n      break\n    }\n  }\n  if (group.backgroundColor) {\n    node.setAttribute(\"mathbackground\", group.backgroundColor);\n  }\n  return node;\n};\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\colorbox\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"text\"]\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let color = \"\";\n    if (model) {\n      const spec = assertNodeType(args[0], \"raw\").string;\n      color = colorFromSpec(model, spec);\n    } else {\n      color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n    }\n    const body = args[1];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor: color,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fcolorbox\"],\n  props: {\n    numArgs: 3,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"raw\", \"text\"]\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let borderColor = \"\";\n    let backgroundColor;\n    if (model) {\n      const borderSpec = assertNodeType(args[0], \"raw\").string;\n      const backgroundSpec = assertNodeType(args[0], \"raw\").string;\n      borderColor = colorFromSpec(model, borderSpec);\n      backgroundColor = colorFromSpec(model, backgroundSpec);\n    } else {\n      borderColor = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n      backgroundColor = validateColor(assertNodeType(args[1], \"raw\").string, parser.gullet.macros);\n    }\n    const body = args[2];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor,\n      borderColor,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: true\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\fbox\",\n      body: args[0]\n    };\n  }\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\angl\", \"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\overline\",\n    \"\\\\boxed\", \"\\\\longdiv\", \"\\\\phase\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\sout\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\underline\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\textcircled\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n  type: \"environment\",\n  names: [\"\\\\begin\", \"\\\\end\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"]\n  },\n  handler({ parser, funcName }, args) {\n    const nameGroup = args[0];\n    if (nameGroup.type !== \"ordgroup\") {\n      throw new ParseError(\"Invalid environment name\", nameGroup);\n    }\n    let envName = \"\";\n    for (let i = 0; i < nameGroup.body.length; ++i) {\n      envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n    }\n\n    if (funcName === \"\\\\begin\") {\n      // begin...end is similar to left...right\n      if (!Object.prototype.hasOwnProperty.call(environments, envName )) {\n        throw new ParseError(\"No such environment: \" + envName, nameGroup);\n      }\n      // Build the environment object. Arguments and other information will\n      // be made available to the begin and end methods using properties.\n      const env = environments[envName];\n      const { args, optArgs } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n      const context = {\n        mode: parser.mode,\n        envName,\n        parser\n      };\n      const result = env.handler(context, args, optArgs);\n      parser.expect(\"\\\\end\", false);\n      const endNameToken = parser.nextToken;\n      const end = assertNodeType(parser.parseFunction(), \"environment\");\n      if (end.name !== envName) {\n        throw new ParseError(\n          `Mismatch: \\\\begin{${envName}} matched by \\\\end{${end.name}}`,\n          endNameToken\n        );\n      }\n      return result;\n    }\n\n    return {\n      type: \"environment\",\n      mode: parser.mode,\n      name: envName,\n      nameGroup\n    };\n  }\n});\n\ndefineFunction({\n  type: \"envTag\",\n  names: [\"\\\\env@tag\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"math\"]\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"envTag\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    return new MathNode(\"mrow\");\n  }\n});\n\ndefineFunction({\n  type: \"noTag\",\n  names: [\"\\\\env@notag\"],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser }) {\n    return {\n      type: \"noTag\",\n      mode: parser.mode\n    };\n  },\n  mathmlBuilder(group, style) {\n    return new MathNode(\"mrow\");\n  }\n});\n\n// Chromium does not support the MathML `mathvariant` attribute.\n// Instead, we replace ASCII characters with Unicode characters that\n// are defined in the font as bold, italic, double-struck, etc.\n// This module identifies those Unicode code points.\n\n// First, a few helpers.\nconst script = Object.freeze({\n  B: 0x20EA, // Offset from ASCII B to Unicode script B\n  E: 0x20EB,\n  F: 0x20EB,\n  H: 0x20C3,\n  I: 0x20C7,\n  L: 0x20C6,\n  M: 0x20E6,\n  R: 0x20C9,\n  e: 0x20CA,\n  g: 0x20A3,\n  o: 0x20C5\n});\n\nconst frak = Object.freeze({\n  C: 0x20EA,\n  H: 0x20C4,\n  I: 0x20C8,\n  R: 0x20CA,\n  Z: 0x20CE\n});\n\nconst bbb = Object.freeze({\n  C: 0x20BF, // blackboard bold\n  H: 0x20C5,\n  N: 0x20C7,\n  P: 0x20C9,\n  Q: 0x20C9,\n  R: 0x20CB,\n  Z: 0x20CA\n});\n\nconst bold = Object.freeze({\n  \"\\u03f5\": 0x1D2E7, // lunate epsilon\n  \"\\u03d1\": 0x1D30C, // vartheta\n  \"\\u03f0\": 0x1D2EE, // varkappa\n  \"\\u03c6\": 0x1D319, // varphi\n  \"\\u03f1\": 0x1D2EF, // varrho\n  \"\\u03d6\": 0x1D30B  // varpi\n});\n\nconst boldItalic = Object.freeze({\n  \"\\u03f5\": 0x1D35B, // lunate epsilon\n  \"\\u03d1\": 0x1D380, // vartheta\n  \"\\u03f0\": 0x1D362, // varkappa\n  \"\\u03c6\": 0x1D38D, // varphi\n  \"\\u03f1\": 0x1D363, // varrho\n  \"\\u03d6\": 0x1D37F  // varpi\n});\n\nconst boldsf = Object.freeze({\n  \"\\u03f5\": 0x1D395, // lunate epsilon\n  \"\\u03d1\": 0x1D3BA, // vartheta\n  \"\\u03f0\": 0x1D39C, // varkappa\n  \"\\u03c6\": 0x1D3C7, // varphi\n  \"\\u03f1\": 0x1D39D, // varrho\n  \"\\u03d6\": 0x1D3B9  // varpi\n});\n\nconst bisf = Object.freeze({\n  \"\\u03f5\": 0x1D3CF, // lunate epsilon\n  \"\\u03d1\": 0x1D3F4, // vartheta\n  \"\\u03f0\": 0x1D3D6, // varkappa\n  \"\\u03c6\": 0x1D401, // varphi\n  \"\\u03f1\": 0x1D3D7, // varrho\n  \"\\u03d6\": 0x1D3F3  // varpi\n});\n\n// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf\nconst offset = Object.freeze({\n  upperCaseLatin: { // A-Z\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D3BF },\n    \"italic\": ch =>                 { return 0x1D3F3 },\n    \"bold-italic\": ch =>            { return 0x1D427 },\n    \"script\": ch =>                 { return script[ch] || 0x1D45B },\n    \"script-bold\": ch =>            { return 0x1D48F },\n    \"fraktur\": ch =>                { return frak[ch] || 0x1D4C3 },\n    \"fraktur-bold\": ch =>           { return 0x1D52B },\n    \"double-struck\": ch =>          { return bbb[ch] || 0x1D4F7 },\n    \"sans-serif\": ch =>             { return 0x1D55F },\n    \"sans-serif-bold\": ch =>        { return 0x1D593 },\n    \"sans-serif-italic\": ch =>      { return 0x1D5C7 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D63C },\n    \"monospace\": ch =>              { return 0x1D62F }\n  },\n  lowerCaseLatin: { // a-z\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D3B9 },\n    \"italic\": ch =>                 { return ch === \"h\" ? 0x20A6 : 0x1D3ED },\n    \"bold-italic\": ch =>            { return 0x1D421 },\n    \"script\": ch =>                 { return script[ch] || 0x1D455 },\n    \"script-bold\": ch =>            { return 0x1D489 },\n    \"fraktur\": ch =>                { return 0x1D4BD },\n    \"fraktur-bold\": ch =>           { return 0x1D525 },\n    \"double-struck\": ch =>          { return 0x1D4F1 },\n    \"sans-serif\": ch =>             { return 0x1D559 },\n    \"sans-serif-bold\": ch =>        { return 0x1D58D },\n    \"sans-serif-italic\": ch =>      { return 0x1D5C1 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D5F5 },\n    \"monospace\": ch =>              { return 0x1D629 }\n  },\n  upperCaseGreek: { // A-Ω\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D317 },\n    \"italic\": ch =>                 { return 0x1D351 },\n    // \\boldsymbol actually returns upright bold for upperCaseGreek\n    \"bold-italic\": ch =>            { return 0x1D317 },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0 },\n    // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n    \"sans-serif\": ch =>             { return 0x1D3C5 },\n    \"sans-serif-bold\": ch =>        { return 0x1D3C5 },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D3FF },\n    \"monospace\": ch =>              { return 0 }\n  },\n  lowerCaseGreek: { // α-ω\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D311 },\n    \"italic\": ch =>                 { return 0x1D34B },\n    \"bold-italic\": ch =>            { return ch === \"\\u03d5\" ? 0x1D37E : 0x1D385 },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0 },\n    // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n    \"sans-serif\": ch =>             { return 0x1D3BF },\n    \"sans-serif-bold\": ch =>        { return 0x1D3BF },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D3F9 },\n    \"monospace\": ch =>              { return 0 }\n  },\n  varGreek: { // \\varGamma, etc\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return  bold[ch] || -51 },\n    \"italic\": ch =>                 { return 0 },\n    \"bold-italic\": ch =>            { return boldItalic[ch] || 0x3A },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0 },\n    \"sans-serif\": ch =>             { return boldsf[ch] || 0x74 },\n    \"sans-serif-bold\": ch =>        { return boldsf[ch] || 0x74 },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return bisf[ch] || 0xAE },\n    \"monospace\": ch =>              { return 0 }\n  },\n  numeral: { // 0-9\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D79E },\n    \"italic\": ch =>                 { return 0 },\n    \"bold-italic\": ch =>            { return 0 },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0x1D7A8 },\n    \"sans-serif\": ch =>             { return 0x1D7B2 },\n    \"sans-serif-bold\": ch =>        { return 0x1D7BC },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return 0 },\n    \"monospace\": ch =>              { return 0x1D7C6 }\n  }\n});\n\nconst variantChar = (ch, variant) => {\n  const codePoint = ch.codePointAt(0);\n  const block = 0x40 < codePoint && codePoint < 0x5b\n    ? \"upperCaseLatin\"\n    : 0x60 < codePoint && codePoint < 0x7b\n    ? \"lowerCaseLatin\"\n    : (0x390  < codePoint && codePoint < 0x3AA)\n    ? \"upperCaseGreek\"\n    : 0x3B0 < codePoint && codePoint < 0x3CA || ch === \"\\u03d5\"\n    ? \"lowerCaseGreek\"\n    : 0x1D6E1 < codePoint && codePoint < 0x1D6FC  || bold[ch]\n    ? \"varGreek\"\n    : (0x2F < codePoint && codePoint <  0x3A)\n    ? \"numeral\"\n    : \"other\";\n  return block === \"other\"\n    ? ch\n    : String.fromCodePoint(codePoint + offset[block][variant](ch))\n};\n\nconst smallCaps = Object.freeze({\n  a: \"ᴀ\",\n  b: \"ʙ\",\n  c: \"ᴄ\",\n  d: \"ᴅ\",\n  e: \"ᴇ\",\n  f: \"ꜰ\",\n  g: \"ɢ\",\n  h: \"ʜ\",\n  i: \"ɪ\",\n  j: \"ᴊ\",\n  k: \"ᴋ\",\n  l: \"ʟ\",\n  m: \"ᴍ\",\n  n: \"ɴ\",\n  o: \"ᴏ\",\n  p: \"ᴘ\",\n  q: \"ǫ\",\n  r: \"ʀ\",\n  s: \"s\",\n  t: \"ᴛ\",\n  u: \"ᴜ\",\n  v: \"ᴠ\",\n  w: \"ᴡ\",\n  x: \"x\",\n  y: \"ʏ\",\n  z: \"ᴢ\"\n});\n\nconst varNameFonts = [\"mathrm\", \"mathit\"];\n\nconst isLongVariableName = (group, font) => {\n  if (!varNameFonts.includes(font) || !group.body || group.body.type !== \"ordgroup\" ||\n      group.body.body.length === 1) {\n    return false\n  }\n  if (group.body.body[0].type !== \"mathord\") { return false }\n  for (let i = 1; i < group.body.body.length; i++) {\n    const parseNodeType = group.body.body[i].type;\n    if (!(parseNodeType ===  \"mathord\" ||\n    (parseNodeType ===  \"textord\" && !isNaN(group.body.body[i].text)))) {\n      return false\n    }\n  }\n  return true\n};\n\nconst mathmlBuilder$6 = (group, style) => {\n  const font = group.font;\n  const newStyle = style.withFont(font);\n  const mathGroup = buildGroup$1(group.body, newStyle);\n\n  if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \\mathrm{}\n  if (font === \"boldsymbol\" && [\"mo\", \"mpadded\", \"mrow\"].includes(mathGroup.type)) {\n    mathGroup.style.fontWeight = \"bold\";\n    return mathGroup\n  }\n  // Check if it is possible to consolidate elements into a single <mi> element.\n  if (isLongVariableName(group, font)) {\n    // This is a \\mathrm{…} or \\mathit{…} group. It gets special treatment.\n    const mi = mathGroup.children[0].children[0].children\n      ? mathGroup.children[0].children[0]\n      : mathGroup.children[0];\n    delete mi.attributes.mathvariant;\n    for (let i = 1; i < mathGroup.children.length; i++) {\n      mi.children[0].text += mathGroup.children[i].children[0].children\n        ? mathGroup.children[i].children[0].children[0].text\n        : mathGroup.children[i].children[0].text;\n    }\n    if (font === \"mathit\") {\n      // Long <mi> elements are normally rendered in upright font.\n      // To get italic, we need to convert each character to the corresponding italic character.\n      mi.children[0].text = mi.children[0].text.split(\"\")\n        .map(c => variantChar(c, \"italic\")).join(\"\");\n      return mi\n    }\n    // Otherwise, font is \"mathrm\". Wrap in a <mpadded> to prevent a Firefox spacing bug.\n    const mpadded = new MathNode(\"mpadded\", [mi]);\n    mpadded.setAttribute(\"lspace\", \"0\");\n    return mpadded\n  }\n  let canConsolidate = mathGroup.children[0].type === \"mo\";\n  for (let i = 1; i < mathGroup.children.length; i++) {\n    if (mathGroup.children[i].type === \"mo\" && font === \"boldsymbol\") {\n      mathGroup.children[i].style.fontWeight = \"bold\";\n    }\n    if (mathGroup.children[i].type !== \"mi\") { canConsolidate = false; }\n    const localVariant = mathGroup.children[i].attributes &&\n      mathGroup.children[i].attributes.mathvariant || \"\";\n    if (localVariant !== \"normal\") { canConsolidate = false; }\n  }\n  if (!canConsolidate) { return mathGroup }\n  // Consolidate the <mi> elements.\n  const mi = mathGroup.children[0];\n  for (let i = 1; i < mathGroup.children.length; i++) {\n    mi.children.push(mathGroup.children[i].children[0]);\n  }\n  if (mi.attributes.mathvariant && mi.attributes.mathvariant === \"normal\") {\n    // Workaround for a Firefox bug that renders spurious space around\n    // a <mi mathvariant=\"normal\">\n    // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097\n    // We insert a text node that contains a zero-width space and wrap in an mrow.\n    // TODO: Get rid of this <mi> workaround when the Firefox bug is fixed.\n    const bogus = new MathNode(\"mtext\", new TextNode(\"\\u200b\"));\n    return new MathNode(\"mrow\", [bogus, mi])\n  }\n  return mi\n};\n\nconst fontAliases = {\n  \"\\\\Bbb\": \"\\\\mathbb\",\n  \"\\\\bold\": \"\\\\mathbf\",\n  \"\\\\frak\": \"\\\\mathfrak\",\n  \"\\\\bm\": \"\\\\boldsymbol\"\n};\n\ndefineFunction({\n  type: \"font\",\n  names: [\n    // styles\n    \"\\\\mathrm\",\n    \"\\\\mathit\",\n    \"\\\\mathbf\",\n    \"\\\\mathnormal\",\n    \"\\\\up@greek\",\n    \"\\\\boldsymbol\",\n\n    // families\n    \"\\\\mathbb\",\n    \"\\\\mathcal\",\n    \"\\\\mathfrak\",\n    \"\\\\mathscr\",\n    \"\\\\mathsf\",\n    \"\\\\mathsfit\",\n    \"\\\\mathtt\",\n\n    // aliases\n    \"\\\\Bbb\",\n    \"\\\\bm\",\n    \"\\\\bold\",\n    \"\\\\frak\"\n  ],\n  props: {\n    numArgs: 1,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName }, args) => {\n    const body = normalizeArgument(args[0]);\n    let func = funcName;\n    if (func in fontAliases) {\n      func = fontAliases[func];\n    }\n    return {\n      type: \"font\",\n      mode: parser.mode,\n      font: func.slice(1),\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$6\n});\n\n// Old font changing functions\ndefineFunction({\n  type: \"font\",\n  names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: ({ parser, funcName, breakOnTokenText }, args) => {\n    const { mode } = parser;\n    const body = parser.parseExpression(true, breakOnTokenText, true);\n    const fontStyle = `math${funcName.slice(1)}`;\n\n    return {\n      type: \"font\",\n      mode: mode,\n      font: fontStyle,\n      body: {\n        type: \"ordgroup\",\n        mode: parser.mode,\n        body\n      }\n    };\n  },\n  mathmlBuilder: mathmlBuilder$6\n});\n\nconst stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nconst scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 };\n\nconst adjustStyle = (functionSize, originalStyle) => {\n  // Figure out what style this fraction should be in based on the\n  // function used\n  let style = originalStyle;\n  if (functionSize === \"display\") {  //\\tfrac or \\cfrac\n    // Get display style as a default.\n    // If incoming style is sub/sup, use style.text() to get correct size.\n    const newSize = style.level >= StyleLevel.SCRIPT ? StyleLevel.TEXT : StyleLevel.DISPLAY;\n    style = style.withLevel(newSize);\n  } else if (functionSize === \"text\" &&\n    style.level === StyleLevel.DISPLAY) {\n    // We're in a \\tfrac but incoming style is displaystyle, so:\n    style = style.withLevel(StyleLevel.TEXT);\n  } else if (functionSize === \"auto\") {\n    style = style.incrementLevel();\n  } else if (functionSize === \"script\") {\n    style = style.withLevel(StyleLevel.SCRIPT);\n  } else if (functionSize === \"scriptscript\") {\n    style = style.withLevel(StyleLevel.SCRIPTSCRIPT);\n  }\n  return style;\n};\n\nconst mathmlBuilder$5 = (group, style) => {\n  style = adjustStyle(group.scriptLevel, style);\n\n  // Chromium (wrongly) continues to shrink fractions beyond scriptscriptlevel.\n  // So we check for levels that Chromium shrinks too small.\n  // If necessary, set an explicit fraction depth.\n  const numer = buildGroup$1(group.numer, style);\n  const denom = buildGroup$1(group.denom, style);\n  if (style.level === 3) {\n    numer.style.mathDepth = \"2\";\n    numer.setAttribute(\"scriptlevel\", \"2\");\n    denom.style.mathDepth = \"2\";\n    denom.setAttribute(\"scriptlevel\", \"2\");\n  }\n\n  let node = new MathNode(\"mfrac\", [numer, denom]);\n\n  if (!group.hasBarLine) {\n    node.setAttribute(\"linethickness\", \"0px\");\n  } else if (group.barSize) {\n    const ruleWidth = calculateSize(group.barSize, style);\n    node.setAttribute(\"linethickness\", ruleWidth.number + ruleWidth.unit);\n  }\n\n  if (group.leftDelim != null || group.rightDelim != null) {\n    const withDelims = [];\n\n    if (group.leftDelim != null) {\n      const leftOp = new MathNode(\"mo\", [\n        new TextNode(group.leftDelim.replace(\"\\\\\", \"\"))\n      ]);\n      leftOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(leftOp);\n    }\n\n    withDelims.push(node);\n\n    if (group.rightDelim != null) {\n      const rightOp = new MathNode(\"mo\", [\n        new TextNode(group.rightDelim.replace(\"\\\\\", \"\"))\n      ]);\n      rightOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(rightOp);\n    }\n\n    node = makeRow(withDelims);\n  }\n\n  if (group.scriptLevel !== \"auto\") {\n    node = new MathNode(\"mstyle\", [node]);\n    node.setAttribute(\"displaystyle\", String(group.scriptLevel === \"display\"));\n    node.setAttribute(\"scriptlevel\", scriptLevel[group.scriptLevel]);\n  }\n\n  return node;\n};\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\n    \"\\\\cfrac\",\n    \"\\\\dfrac\",\n    \"\\\\frac\",\n    \"\\\\tfrac\",\n    \"\\\\dbinom\",\n    \"\\\\binom\",\n    \"\\\\tbinom\",\n    \"\\\\\\\\atopfrac\", // can’t be entered directly\n    \"\\\\\\\\bracefrac\",\n    \"\\\\\\\\brackfrac\" // ditto\n  ],\n  props: {\n    numArgs: 2,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName }, args) => {\n    const numer = args[0];\n    const denom = args[1];\n    let hasBarLine = false;\n    let leftDelim = null;\n    let rightDelim = null;\n    let scriptLevel = \"auto\";\n\n    switch (funcName) {\n      case \"\\\\cfrac\":\n      case \"\\\\dfrac\":\n      case \"\\\\frac\":\n      case \"\\\\tfrac\":\n        hasBarLine = true;\n        break;\n      case \"\\\\\\\\atopfrac\":\n        hasBarLine = false;\n        break;\n      case \"\\\\dbinom\":\n      case \"\\\\binom\":\n      case \"\\\\tbinom\":\n        leftDelim = \"(\";\n        rightDelim = \")\";\n        break;\n      case \"\\\\\\\\bracefrac\":\n        leftDelim = \"\\\\{\";\n        rightDelim = \"\\\\}\";\n        break;\n      case \"\\\\\\\\brackfrac\":\n        leftDelim = \"[\";\n        rightDelim = \"]\";\n        break;\n      default:\n        throw new Error(\"Unrecognized genfrac command\");\n    }\n\n    if (funcName === \"\\\\cfrac\" || funcName.startsWith(\"\\\\d\")) {\n      scriptLevel = \"display\";\n    } else if (funcName.startsWith(\"\\\\t\")) {\n      scriptLevel = \"text\";\n    }\n\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      continued: false,\n      numer,\n      denom,\n      hasBarLine,\n      leftDelim,\n      rightDelim,\n      scriptLevel,\n      barSize: null\n    };\n  },\n  mathmlBuilder: mathmlBuilder$5\n});\n\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n  props: {\n    numArgs: 0,\n    infix: true\n  },\n  handler({ parser, funcName, token }) {\n    let replaceWith;\n    switch (funcName) {\n      case \"\\\\over\":\n        replaceWith = \"\\\\frac\";\n        break;\n      case \"\\\\choose\":\n        replaceWith = \"\\\\binom\";\n        break;\n      case \"\\\\atop\":\n        replaceWith = \"\\\\\\\\atopfrac\";\n        break;\n      case \"\\\\brace\":\n        replaceWith = \"\\\\\\\\bracefrac\";\n        break;\n      case \"\\\\brack\":\n        replaceWith = \"\\\\\\\\brackfrac\";\n        break;\n      default:\n        throw new Error(\"Unrecognized infix genfrac command\");\n    }\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith,\n      token\n    };\n  }\n});\n\nconst delimFromValue = function(delimString) {\n  let delim = null;\n  if (delimString.length > 0) {\n    delim = delimString;\n    delim = delim === \".\" ? null : delim;\n  }\n  return delim;\n};\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\genfrac\"],\n  props: {\n    numArgs: 6,\n    allowedInArgument: true,\n    argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n  },\n  handler({ parser }, args) {\n    const numer = args[4];\n    const denom = args[5];\n\n    // Look into the parse nodes to get the desired delimiters.\n    const leftNode = normalizeArgument(args[0]);\n    const leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\"\n      ? delimFromValue(leftNode.text)\n      : null;\n    const rightNode = normalizeArgument(args[1]);\n    const rightDelim =\n      rightNode.type === \"atom\" && rightNode.family === \"close\"\n        ? delimFromValue(rightNode.text)\n        : null;\n\n    const barNode = assertNodeType(args[2], \"size\");\n    let hasBarLine;\n    let barSize = null;\n    if (barNode.isBlank) {\n      // \\genfrac acts differently than \\above.\n      // \\genfrac treats an empty size group as a signal to use a\n      // standard bar size. \\above would see size = 0 and omit the bar.\n      hasBarLine = true;\n    } else {\n      barSize = barNode.value;\n      hasBarLine = barSize.number > 0;\n    }\n\n    // Find out if we want displaystyle, textstyle, etc.\n    let scriptLevel = \"auto\";\n    let styl = args[3];\n    if (styl.type === \"ordgroup\") {\n      if (styl.body.length > 0) {\n        const textOrd = assertNodeType(styl.body[0], \"textord\");\n        scriptLevel = stylArray[Number(textOrd.text)];\n      }\n    } else {\n      styl = assertNodeType(styl, \"textord\");\n      scriptLevel = stylArray[Number(styl.text)];\n    }\n\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim,\n      rightDelim,\n      scriptLevel\n    };\n  },\n  mathmlBuilder: mathmlBuilder$5\n});\n\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\above\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    infix: true\n  },\n  handler({ parser, funcName, token }, args) {\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith: \"\\\\\\\\abovefrac\",\n      barSize: assertNodeType(args[0], \"size\").value,\n      token\n    };\n  }\n});\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\\\\\abovefrac\"],\n  props: {\n    numArgs: 3,\n    argTypes: [\"math\", \"size\", \"math\"]\n  },\n  handler: ({ parser, funcName }, args) => {\n    const numer = args[0];\n    const barSize = assert(assertNodeType(args[1], \"infix\").barSize);\n    const denom = args[2];\n\n    const hasBarLine = barSize.number > 0;\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim: null,\n      rightDelim: null,\n      scriptLevel: \"auto\"\n    };\n  },\n\n  mathmlBuilder: mathmlBuilder$5\n});\n\n// \\hbox is provided for compatibility with LaTeX functions that act on a box.\n// This function by itself doesn't do anything but set scriptlevel to \\textstyle\n// and prevent a soft line break.\n\ndefineFunction({\n  type: \"hbox\",\n  names: [\"\\\\hbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInArgument: true,\n    allowedInText: false\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"hbox\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    };\n  },\n  mathmlBuilder(group, style) {\n    const newStyle = style.withLevel(StyleLevel.TEXT);\n    const mrow = buildExpressionRow(group.body, newStyle);\n    return consolidateText(mrow)\n  }\n});\n\nconst mathmlBuilder$4 = (group, style) => {\n  const accentNode = mathMLnode(group.label);\n  accentNode.style[\"math-depth\"] = 0;\n  return new MathNode(group.isOver ? \"mover\" : \"munder\", [\n    buildGroup$1(group.base, style),\n    accentNode\n  ]);\n};\n\n// Horizontal stretchy brackets\ndefineFunction({\n  type: \"horizBracket\",\n  names: [\"\\\\overbrace\", \"\\\\underbrace\", \"\\\\overbracket\", \"\\\\underbracket\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser, funcName }, args) {\n    return {\n      type: \"horizBracket\",\n      mode: parser.mode,\n      label: funcName,\n      isOver: /^\\\\over/.test(funcName),\n      base: args[0]\n    };\n  },\n  mathmlBuilder: mathmlBuilder$4\n});\n\ndefineFunction({\n  type: \"html\",\n  names: [\"\\\\class\", \"\\\\id\", \"\\\\style\", \"\\\\data\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"raw\", \"original\"],\n    allowedInText: true\n  },\n  handler: ({ parser, funcName, token }, args) => {\n    const value = assertNodeType(args[0], \"raw\").string;\n    const body = args[1];\n\n    if (parser.settings.strict) {\n      throw new ParseError(`Function \"${funcName}\" is disabled in strict mode`, token)\n    }\n\n    let trustContext;\n    const attributes = {};\n\n    switch (funcName) {\n      case \"\\\\class\":\n        attributes.class = value;\n        trustContext = {\n          command: \"\\\\class\",\n          class: value\n        };\n        break;\n      case \"\\\\id\":\n        attributes.id = value;\n        trustContext = {\n          command: \"\\\\id\",\n          id: value\n        };\n        break;\n      case \"\\\\style\":\n        attributes.style = value;\n        trustContext = {\n          command: \"\\\\style\",\n          style: value\n        };\n        break;\n      case \"\\\\data\": {\n        const data = value.split(\",\");\n        for (let i = 0; i < data.length; i++) {\n          const keyVal = data[i].split(\"=\");\n          if (keyVal.length !== 2) {\n            throw new ParseError(\"Error parsing key-value for \\\\data\");\n          }\n          attributes[\"data-\" + keyVal[0].trim()] = keyVal[1].trim();\n        }\n\n        trustContext = {\n          command: \"\\\\data\",\n          attributes\n        };\n        break;\n      }\n      default:\n        throw new Error(\"Unrecognized html command\");\n    }\n\n    if (!parser.settings.isTrusted(trustContext)) {\n      throw new ParseError(`Function \"${funcName}\" is not trusted`, token)\n    }\n    return {\n      type: \"html\",\n      mode: parser.mode,\n      attributes,\n      body: ordargument(body)\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const element =  buildExpressionRow(group.body, style);\n\n    const classes = [];\n    if (group.attributes.class) {\n      classes.push(...group.attributes.class.trim().split(/\\s+/));\n    }\n    element.classes = classes;\n\n    for (const attr in group.attributes) {\n      if (attr !== \"class\" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) {\n        element.setAttribute(attr, group.attributes[attr]);\n      }\n    }\n\n    return element;\n  }\n});\n\nconst sizeData = function(str) {\n  if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n    // str is a number with no unit specified.\n    // default unit is bp, per graphix package.\n    return { number: +str, unit: \"bp\" }\n  } else {\n    const match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n    }\n    const data = {\n      number: +(match[1] + match[2]), // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n    }\n    return data\n  }\n};\n\ndefineFunction({\n  type: \"includegraphics\",\n  names: [\"\\\\includegraphics\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    argTypes: [\"raw\", \"url\"],\n    allowedInText: false\n  },\n  handler: ({ parser, token }, args, optArgs) => {\n    let width = { number: 0, unit: \"em\" };\n    let height = { number: 0.9, unit: \"em\" };  // sorta character sized.\n    let totalheight = { number: 0, unit: \"em\" };\n    let alt = \"\";\n\n    if (optArgs[0]) {\n      const attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n\n      // Parser.js does not parse key/value pairs. We get a string.\n      const attributes = attributeStr.split(\",\");\n      for (let i = 0; i < attributes.length; i++) {\n        const keyVal = attributes[i].split(\"=\");\n        if (keyVal.length === 2) {\n          const str = keyVal[1].trim();\n          switch (keyVal[0].trim()) {\n            case \"alt\":\n              alt = str;\n              break\n            case \"width\":\n              width = sizeData(str);\n              break\n            case \"height\":\n              height = sizeData(str);\n              break\n            case \"totalheight\":\n              totalheight = sizeData(str);\n              break\n            default:\n              throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\")\n          }\n        }\n      }\n    }\n\n    const src = assertNodeType(args[0], \"url\").url;\n\n    if (alt === \"\") {\n      // No alt given. Use the file name. Strip away the path.\n      alt = src;\n      alt = alt.replace(/^.*[\\\\/]/, \"\");\n      alt = alt.substring(0, alt.lastIndexOf(\".\"));\n    }\n\n    if (\n      !parser.settings.isTrusted({\n        command: \"\\\\includegraphics\",\n        url: src\n      })\n    ) {\n      throw new ParseError(`Function \"\\\\includegraphics\" is not trusted`, token)\n    }\n\n    return {\n      type: \"includegraphics\",\n      mode: parser.mode,\n      alt: alt,\n      width: width,\n      height: height,\n      totalheight: totalheight,\n      src: src\n    }\n  },\n  mathmlBuilder: (group, style) => {\n    const height = calculateSize(group.height, style);\n    const depth = { number: 0, unit: \"em\" };\n\n    if (group.totalheight.number > 0) {\n      if (group.totalheight.unit === height.unit &&\n        group.totalheight.number > height.number) {\n        depth.number = group.totalheight.number - height.number;\n        depth.unit = height.unit;\n      }\n    }\n\n    let width = 0;\n    if (group.width.number > 0) {\n      width = calculateSize(group.width, style);\n    }\n\n    const graphicStyle = { height: height.number + depth.number + \"em\" };\n    if (width.number > 0) {\n      graphicStyle.width = width.number + width.unit;\n    }\n    if (depth.number > 0) {\n      graphicStyle.verticalAlign = -depth.number + depth.unit;\n    }\n\n    const node = new Img(group.src, group.alt, graphicStyle);\n    node.height = height;\n    node.depth = depth;\n    return new MathNode(\"mtext\", [node])\n  }\n});\n\n// Horizontal spacing commands\n\n\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\n\ndefineFunction({\n  type: \"kern\",\n  names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    primitive: true,\n    allowedInText: true\n  },\n  handler({ parser, funcName, token }, args) {\n    const size = assertNodeType(args[0], \"size\");\n    if (parser.settings.strict) {\n      const mathFunction = funcName[1] === \"m\"; // \\mkern, \\mskip\n      const muUnit = size.value.unit === \"mu\";\n      if (mathFunction) {\n        if (!muUnit) {\n          throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` +\n            `not ${size.value.unit} units`, token)\n        }\n        if (parser.mode !== \"math\") {\n          throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token)\n        }\n      } else {\n        // !mathFunction\n        if (muUnit) {\n          throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token)\n        }\n      }\n    }\n    return {\n      type: \"kern\",\n      mode: parser.mode,\n      dimension: size.value\n    };\n  },\n  mathmlBuilder(group, style) {\n    const dimension = calculateSize(group.dimension, style);\n    const ch = dimension.number > 0 && dimension.unit === \"em\"\n      ? spaceCharacter(dimension.number)\n      : \"\";\n    if (group.mode === \"text\" && ch.length > 0) {\n      const character = new TextNode(ch);\n      return new MathNode(\"mtext\", [character]);\n    } else {\n      if (dimension.number >= 0) {\n        const node = new MathNode(\"mspace\");\n        node.setAttribute(\"width\", dimension.number + dimension.unit);\n        return node\n      } else {\n        // Don't use <mspace> or <mpadded> because\n        // WebKit recognizes negative left margin only on a <mrow> element\n        const node = new MathNode(\"mrow\");\n        node.style.marginLeft = dimension.number + dimension.unit;\n        return node\n      }\n    }\n  }\n});\n\nconst spaceCharacter = function(width) {\n  if (width >= 0.05555 && width <= 0.05556) {\n    return \"\\u200a\"; // &VeryThinSpace;\n  } else if (width >= 0.1666 && width <= 0.1667) {\n    return \"\\u2009\"; // &ThinSpace;\n  } else if (width >= 0.2222 && width <= 0.2223) {\n    return \"\\u2005\"; // &MediumSpace;\n  } else if (width >= 0.2777 && width <= 0.2778) {\n    return \"\\u2005\\u200a\"; // &ThickSpace;\n  } else {\n    return \"\";\n  }\n};\n\n// Limit valid characters to a small set, for safety.\nconst invalidIdRegEx = /[^A-Za-z_0-9-]/g;\n\ndefineFunction({\n  type: \"label\",\n  names: [\"\\\\label\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"raw\"]\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"label\",\n      mode: parser.mode,\n      string: args[0].string.replace(invalidIdRegEx, \"\")\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Return a no-width, no-ink element with an HTML id.\n    const node = new MathNode(\"mrow\", [], [\"tml-label\"]);\n    if (group.string.length > 0) {\n      node.setLabel(group.string);\n    }\n    return node\n  }\n});\n\n// Horizontal overlap functions\n\nconst textModeLap = [\"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"];\n\ndefineFunction({\n  type: \"lap\",\n  names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\", \"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser, funcName, token }, args) => {\n    if (textModeLap.includes(funcName)) {\n      if (parser.settings.strict && parser.mode !== \"text\") {\n        throw new ParseError(`{${funcName}} can be used only in text mode.\n Try \\\\math${funcName.slice(1)}`, token)\n      }\n      funcName = funcName.slice(1);\n    } else {\n      funcName = funcName.slice(5);\n    }\n    const body = args[0];\n    return {\n      type: \"lap\",\n      mode: parser.mode,\n      alignment: funcName,\n      body\n    }\n  },\n  mathmlBuilder: (group, style) => {\n    // mathllap, mathrlap, mathclap\n    let strut;\n    if (group.alignment === \"llap\") {\n      // We need an invisible strut with the same depth as the group.\n      // We can't just read the depth, so we use \\vphantom methods.\n      const phantomInner = buildExpression(ordargument(group.body), style);\n      const phantom = new MathNode(\"mphantom\", phantomInner);\n      strut = new MathNode(\"mpadded\", [phantom]);\n      strut.setAttribute(\"width\", \"0.1px\");  // Don't use 0. WebKit would hide it.\n    }\n\n    const inner = buildGroup$1(group.body, style);\n    let node;\n    if (group.alignment === \"llap\") {\n      inner.style.position = \"absolute\";\n      inner.style.right = \"0\";\n      inner.style.bottom = `0`; // If we could have read the ink depth, it would go here.\n      node = new MathNode(\"mpadded\", [strut, inner]);\n    } else {\n      node = new MathNode(\"mpadded\", [inner]);\n    }\n\n    if (group.alignment === \"rlap\") {\n      if (group.body.body.length > 0 && group.body.body[0].type === \"genfrac\") {\n        // In Firefox, a <mpadded> squashes the 3/18em padding of a child \\frac. Put it back.\n        node.setAttribute(\"lspace\", \"0.16667em\");\n      }\n    } else {\n      const offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n      node.setAttribute(\"lspace\", offset + \"width\");\n      if (group.alignment === \"llap\") {\n        node.style.position = \"relative\";\n      } else {\n        node.style.display = \"flex\";\n        node.style.justifyContent = \"center\";\n      }\n    }\n    node.setAttribute(\"width\", \"0.1px\"); // Don't use 0. WebKit would hide it.\n    return node\n  }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n  type: \"ordgroup\",\n  names: [\"\\\\(\", \"$\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler({ funcName, parser }, args) {\n    const outerMode = parser.mode;\n    parser.switchMode(\"math\");\n    const close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n    const body = parser.parseExpression(false, close);\n    parser.expect(close);\n    parser.switchMode(outerMode);\n    return {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body\n    };\n  }\n});\n\n// Check for extra closing math delimiters\ndefineFunction({\n  type: \"text\", // Doesn't matter what this is.\n  names: [\"\\\\)\", \"\\\\]\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler(context, token) {\n    throw new ParseError(`Mismatched ${context.funcName}`, token);\n  }\n});\n\nconst chooseStyle = (group, style) => {\n  switch (style.level) {\n    case StyleLevel.DISPLAY:       // 0\n      return group.display;\n    case StyleLevel.TEXT:          // 1\n      return group.text;\n    case StyleLevel.SCRIPT:        // 2\n      return group.script;\n    case StyleLevel.SCRIPTSCRIPT:  // 3\n      return group.scriptscript;\n    default:\n      return group.text;\n  }\n};\n\ndefineFunction({\n  type: \"mathchoice\",\n  names: [\"\\\\mathchoice\"],\n  props: {\n    numArgs: 4,\n    primitive: true\n  },\n  handler: ({ parser }, args) => {\n    return {\n      type: \"mathchoice\",\n      mode: parser.mode,\n      display: ordargument(args[0]),\n      text: ordargument(args[1]),\n      script: ordargument(args[2]),\n      scriptscript: ordargument(args[3])\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const body = chooseStyle(group, style);\n    return buildExpressionRow(body, style);\n  }\n});\n\nconst textAtomTypes = [\"text\", \"textord\", \"mathord\", \"atom\"];\n\nfunction mathmlBuilder$3(group, style) {\n  let node;\n  const inner = buildExpression(group.body, style);\n\n  if (group.mclass === \"minner\") {\n    node = new MathNode(\"mpadded\", inner);\n  } else if (group.mclass === \"mord\") {\n    if (group.isCharacterBox || inner[0].type === \"mathord\") {\n      node = inner[0];\n      node.type = \"mi\";\n      if (node.children.length === 1 && node.children[0].text && node.children[0].text === \"∇\") {\n        node.setAttribute(\"mathvariant\", \"normal\");\n      }\n    } else {\n      node = new MathNode(\"mi\", inner);\n    }\n  } else {\n    node = new MathNode(\"mrow\", inner);\n    if (group.mustPromote) {\n      node = inner[0];\n      node.type = \"mo\";\n      if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) {\n        node.setAttribute(\"mathvariant\", \"italic\");\n      }\n    } else {\n      node = new MathNode(\"mrow\", inner);\n    }\n\n    // Set spacing based on what is the most likely adjacent atom type.\n    // See TeXbook p170.\n    const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script.\n    if (node.type === \"mrow\") {\n      if (doSpacing ) {\n        if (group.mclass === \"mbin\") {\n          // medium space\n          node.children.unshift(padding(0.2222));\n          node.children.push(padding(0.2222));\n        } else if (group.mclass === \"mrel\") {\n          // thickspace\n          node.children.unshift(padding(0.2778));\n          node.children.push(padding(0.2778));\n        } else if (group.mclass === \"mpunct\") {\n          node.children.push(padding(0.1667));\n        } else if (group.mclass === \"minner\") {\n          node.children.unshift(padding(0.0556));  // 1 mu is the most likely option\n          node.children.push(padding(0.0556));\n        }\n      }\n    } else {\n      if (group.mclass === \"mbin\") {\n        // medium space\n        node.attributes.lspace = (doSpacing ? \"0.2222em\" : \"0\");\n        node.attributes.rspace = (doSpacing ? \"0.2222em\" : \"0\");\n      } else if (group.mclass === \"mrel\") {\n        // thickspace\n        node.attributes.lspace = (doSpacing ? \"0.2778em\" : \"0\");\n        node.attributes.rspace = (doSpacing ? \"0.2778em\" : \"0\");\n      } else if (group.mclass === \"mpunct\") {\n        node.attributes.lspace = \"0em\";\n        node.attributes.rspace = (doSpacing ? \"0.1667em\" : \"0\");\n      } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n        node.attributes.lspace = \"0em\";\n        node.attributes.rspace = \"0em\";\n      } else if (group.mclass === \"minner\" && doSpacing) {\n        node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n        node.attributes.width = \"+0.1111em\";\n      }\n    }\n\n    if (!(group.mclass === \"mopen\" || group.mclass === \"mclose\")) {\n      delete node.attributes.stretchy;\n      delete node.attributes.form;\n    }\n  }\n  return node;\n}\n\n// Math class commands except \\mathop\ndefineFunction({\n  type: \"mclass\",\n  names: [\n    \"\\\\mathord\",\n    \"\\\\mathbin\",\n    \"\\\\mathrel\",\n    \"\\\\mathopen\",\n    \"\\\\mathclose\",\n    \"\\\\mathpunct\",\n    \"\\\\mathinner\"\n  ],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    const isCharacterBox$1 = isCharacterBox(body);\n    // We should not wrap a <mo> around a <mi> or <mord>. That would be invalid MathML.\n    // In that case, we instead promote the text contents of the body to the parent.\n    let mustPromote = true;\n    const mord = { type: \"mathord\", text: \"\", mode: parser.mode };\n    const arr = (body.body) ? body.body : [body];\n    for (const arg of arr) {\n      if (textAtomTypes.includes(arg.type)) {\n        if (symbols[parser.mode][arg.text]) {\n          mord.text += symbols[parser.mode][arg.text].replace;\n        } else if (arg.text) {\n          mord.text += arg.text;\n        } else if (arg.body) {\n          arg.body.map(e => { mord.text += e.text; });\n        }\n      } else {\n        mustPromote = false;\n        break\n      }\n    }\n    if (mustPromote && funcName === \"\\\\mathord\" && mord.type === \"mathord\"\n                    && mord.text.length > 1) {\n      return mord\n    } else {\n      return {\n        type: \"mclass\",\n        mode: parser.mode,\n        mclass: \"m\" + funcName.slice(5),\n        body: ordargument(mustPromote ? mord : body),\n        isCharacterBox: isCharacterBox$1,\n        mustPromote\n      };\n    }\n  },\n  mathmlBuilder: mathmlBuilder$3\n});\n\nconst binrelClass = (arg) => {\n  // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n  // (by rendering separately and with {}s before and after, and measuring\n  // the change in spacing).  We'll do roughly the same by detecting the\n  // atom type directly.\n  const atom = arg.type === \"ordgroup\" && arg.body.length && arg.body.length === 1\n    ? arg.body[0]\n    : arg;\n  if (atom.type === \"atom\") {\n    // BIN args are sometimes changed to OPEN, so check the original family.\n    const family = arg.body.length > 0 && arg.body[0].text && symbols.math[arg.body[0].text]\n      ? symbols.math[arg.body[0].text].group\n      : atom.family;\n    if (family === \"bin\" || family === \"rel\") {\n      return \"m\" + family;\n    } else {\n      return \"mord\";\n    }\n  } else {\n    return \"mord\";\n  }\n};\n\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\@binrel\"],\n  props: {\n    numArgs: 2\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[1]),\n      isCharacterBox: isCharacterBox(args[1])\n    };\n  }\n});\n\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n  props: {\n    numArgs: 2\n  },\n  handler({ parser, funcName }, args) {\n    const baseArg = args[1];\n    const shiftedArg = args[0];\n\n    let mclass;\n    if (funcName !== \"\\\\stackrel\") {\n      // LaTeX applies \\binrel spacing to \\overset and \\underset.\n      mclass = binrelClass(baseArg);\n    } else {\n      mclass = \"mrel\";  // for \\stackrel\n    }\n\n    const baseType = mclass === \"mrel\" || mclass === \"mbin\"\n      ? \"op\"\n      : \"ordgroup\";\n\n    const baseOp = {\n      type: baseType,\n      mode: baseArg.mode,\n      limits: true,\n      alwaysHandleSupSub: true,\n      parentIsSupSub: false,\n      symbol: false,\n      suppressBaseShift: funcName !== \"\\\\stackrel\",\n      body: ordargument(baseArg)\n    };\n\n    return {\n      type: \"supsub\",\n      mode: shiftedArg.mode,\n      stack: true,\n      base: baseOp,\n      sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n      sub: funcName === \"\\\\underset\" ? shiftedArg : null\n    };\n  },\n  mathmlBuilder: mathmlBuilder$3\n});\n\n// Helper function\nconst buildGroup = (el, style, noneNode) => {\n  if (!el) { return noneNode }\n  const node = buildGroup$1(el, style);\n  if (node.type === \"mrow\" && node.children.length === 0) { return noneNode }\n  return node\n};\n\ndefineFunction({\n  type: \"multiscript\",\n  names: [\"\\\\sideset\", \"\\\\pres@cript\"], // See macros.js for \\prescript\n  props: {\n    numArgs: 3\n  },\n  handler({ parser, funcName, token }, args) {\n    if (args[2].body.length === 0) {\n      throw new ParseError(funcName + `cannot parse an empty base.`)\n    }\n    const base = args[2].body[0];\n    if (parser.settings.strict && funcName === \"\\\\sideset\" && !base.symbol) {\n      throw new ParseError(`The base of \\\\sideset must be a big operator. Try \\\\prescript.`)\n    }\n\n    if ((args[0].body.length > 0 && args[0].body[0].type !== \"supsub\") ||\n        (args[1].body.length > 0 && args[1].body[0].type !== \"supsub\")) {\n      throw new ParseError(\"\\\\sideset can parse only subscripts and \" +\n                            \"superscripts in its first two arguments\", token)\n    }\n\n    // The prescripts and postscripts come wrapped in a supsub.\n    const prescripts = args[0].body.length > 0 ? args[0].body[0] : null;\n    const postscripts = args[1].body.length > 0 ? args[1].body[0] : null;\n\n    if (!prescripts && !postscripts) {\n      return base\n    } else if (!prescripts) {\n      // It's not a multi-script. Get a \\textstyle supsub.\n      return {\n        type: \"styling\",\n        mode: parser.mode,\n        scriptLevel: \"text\",\n        body: [{\n          type: \"supsub\",\n          mode: parser.mode,\n          base,\n          sup: postscripts.sup,\n          sub: postscripts.sub\n        }]\n      }\n    } else {\n      return {\n        type: \"multiscript\",\n        mode: parser.mode,\n        isSideset: funcName === \"\\\\sideset\",\n        prescripts,\n        postscripts,\n        base\n      }\n    }\n  },\n  mathmlBuilder(group, style) {\n    const base =  buildGroup$1(group.base, style);\n\n    const prescriptsNode = new MathNode(\"mprescripts\");\n    const noneNode = new MathNode(\"none\");\n    let children = [];\n\n    const preSub = buildGroup(group.prescripts.sub, style, noneNode);\n    const preSup = buildGroup(group.prescripts.sup, style, noneNode);\n    if (group.isSideset) {\n      // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad.\n      preSub.setAttribute(\"style\", \"text-align: left;\");\n      preSup.setAttribute(\"style\", \"text-align: left;\");\n    }\n\n    if (group.postscripts) {\n      const postSub = buildGroup(group.postscripts.sub, style, noneNode);\n      const postSup = buildGroup(group.postscripts.sup, style, noneNode);\n      children = [base, postSub, postSup, prescriptsNode, preSub, preSup];\n    } else {\n      children = [base, prescriptsNode, preSub, preSup];\n    }\n\n    return new MathNode(\"mmultiscripts\", children);\n  }\n});\n\ndefineFunction({\n  type: \"not\",\n  names: [\"\\\\not\"],\n  props: {\n    numArgs: 1,\n    primitive: true,\n    allowedInText: false\n  },\n  handler({ parser }, args) {\n    const isCharacterBox$1 = isCharacterBox(args[0]);\n    let body;\n    if (isCharacterBox$1) {\n      body = ordargument(args[0]);\n      if (body[0].text.charAt(0) === \"\\\\\") {\n        body[0].text = symbols.math[body[0].text].replace;\n      }\n      // \\u0338 is the Unicode Combining Long Solidus Overlay\n      body[0].text = body[0].text.slice(0, 1) + \"\\u0338\" + body[0].text.slice(1);\n    } else {\n      // When the argument is not a character box, TeX does an awkward, poorly placed overlay.\n      // We'll do the same.\n      const notNode = { type: \"textord\", mode: \"math\", text: \"\\u0338\" };\n      const kernNode = { type: \"kern\", mode: \"math\", dimension: { number: -0.6, unit: \"em\" } };\n      body = [notNode, kernNode, args[0]];\n    }\n    return {\n      type: \"not\",\n      mode: parser.mode,\n      body,\n      isCharacterBox: isCharacterBox$1\n    };\n  },\n  mathmlBuilder(group, style) {\n    if (group.isCharacterBox) {\n      const inner = buildExpression(group.body, style, true);\n      return inner[0]\n    } else {\n      return buildExpressionRow(group.body, style)\n    }\n  }\n});\n\n// Limits, symbols\n\n// Some helpers\n\nconst ordAtomTypes = [\"textord\", \"mathord\", \"atom\"];\n\n// Most operators have a large successor symbol, but these don't.\nconst noSuccessor = [\"\\\\smallint\"];\n\n// Math operators (e.g. \\sin) need a space between these types and themselves:\nconst ordTypes = [\"textord\", \"mathord\", \"ordgroup\", \"close\", \"leftright\", \"font\"];\n\n// NOTE: Unlike most `builders`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\n\nconst setSpacing = node => {\n  // The user wrote a \\mathop{…} function. Change spacing from default to OP spacing.\n  // The most likely spacing for an OP is a thin space per TeXbook p170.\n  node.attributes.lspace = \"0.1667em\";\n  node.attributes.rspace = \"0.1667em\";\n};\n\nconst mathmlBuilder$2 = (group, style) => {\n  let node;\n\n  if (group.symbol) {\n    // This is a symbol. Just add the symbol.\n    node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n    if (noSuccessor.includes(group.name)) {\n      node.setAttribute(\"largeop\", \"false\");\n    } else {\n      node.setAttribute(\"movablelimits\", \"false\");\n    }\n    if (group.fromMathOp) { setSpacing(node); }\n  } else if (group.body) {\n    // This is an operator with children. Add them.\n    node = new MathNode(\"mo\", buildExpression(group.body, style));\n    if (group.fromMathOp) { setSpacing(node); }\n  } else {\n    // This is a text operator. Add all of the characters from the operator's name.\n    node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n\n    if (!group.parentIsSupSub) {\n      // Append an invisible <mo>&ApplyFunction;</mo>.\n      // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n      const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n      const row = [node, operator];\n      // Set spacing\n      if (group.needsLeadingSpace) {\n        const lead = new MathNode(\"mspace\");\n        lead.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        row.unshift(lead);\n      }\n      if (!group.isFollowedByDelimiter) {\n        const trail = new MathNode(\"mspace\");\n        trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        row.push(trail);\n      }\n      node = new MathNode(\"mrow\", row);\n    }\n  }\n\n  return node;\n};\n\nconst singleCharBigOps = {\n  \"\\u220F\": \"\\\\prod\",\n  \"\\u2210\": \"\\\\coprod\",\n  \"\\u2211\": \"\\\\sum\",\n  \"\\u22c0\": \"\\\\bigwedge\",\n  \"\\u22c1\": \"\\\\bigvee\",\n  \"\\u22c2\": \"\\\\bigcap\",\n  \"\\u22c3\": \"\\\\bigcup\",\n  \"\\u2a00\": \"\\\\bigodot\",\n  \"\\u2a01\": \"\\\\bigoplus\",\n  \"\\u2a02\": \"\\\\bigotimes\",\n  \"\\u2a04\": \"\\\\biguplus\",\n  \"\\u2a05\": \"\\\\bigsqcap\",\n  \"\\u2a06\": \"\\\\bigsqcup\",\n  \"\\u2a03\": \"\\\\bigcupdot\",\n  \"\\u2a07\": \"\\\\bigdoublevee\",\n  \"\\u2a08\": \"\\\\bigdoublewedge\",\n  \"\\u2a09\": \"\\\\bigtimes\"\n};\n\ndefineFunction({\n  type: \"op\",\n  names: [\n    \"\\\\coprod\",\n    \"\\\\bigvee\",\n    \"\\\\bigwedge\",\n    \"\\\\biguplus\",\n    \"\\\\bigcupplus\",\n    \"\\\\bigcupdot\",\n    \"\\\\bigcap\",\n    \"\\\\bigcup\",\n    \"\\\\bigdoublevee\",\n    \"\\\\bigdoublewedge\",\n    \"\\\\intop\",\n    \"\\\\prod\",\n    \"\\\\sum\",\n    \"\\\\bigotimes\",\n    \"\\\\bigoplus\",\n    \"\\\\bigodot\",\n    \"\\\\bigsqcap\",\n    \"\\\\bigsqcup\",\n    \"\\\\bigtimes\",\n    \"\\\\smallint\",\n    \"\\u220F\",\n    \"\\u2210\",\n    \"\\u2211\",\n    \"\\u22c0\",\n    \"\\u22c1\",\n    \"\\u22c2\",\n    \"\\u22c3\",\n    \"\\u2a00\",\n    \"\\u2a01\",\n    \"\\u2a02\",\n    \"\\u2a03\",\n    \"\\u2a04\",\n    \"\\u2a05\",\n    \"\\u2a06\",\n    \"\\u2a07\",\n    \"\\u2a08\",\n    \"\\u2a09\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler: ({ parser, funcName }, args) => {\n    let fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharBigOps[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: true,\n      stack: false, // This is true for \\stackrel{}, not here.\n      name: fName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// Note: calling defineFunction with a type that's already been defined only\n// works because the same mathmlBuilder is being used.\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\mathop\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    // It would be convienient to just wrap a <mo> around the argument.\n    // But if the argument is a <mi> or <mord>, that would be invalid MathML.\n    // In that case, we instead promote the text contents of the body to the parent.\n    const arr = (body.body) ? body.body : [body];\n    const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type);\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: isSymbol,\n      fromMathOp: true,\n      stack: false,\n      name: isSymbol ? arr[0].text : null,\n      body: isSymbol ? null : ordargument(body)\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\n\nconst singleCharIntegrals = {\n  \"\\u222b\": \"\\\\int\",\n  \"\\u222c\": \"\\\\iint\",\n  \"\\u222d\": \"\\\\iiint\",\n  \"\\u222e\": \"\\\\oint\",\n  \"\\u222f\": \"\\\\oiint\",\n  \"\\u2230\": \"\\\\oiiint\",\n  \"\\u2231\": \"\\\\intclockwise\",\n  \"\\u2232\": \"\\\\varointclockwise\",\n  \"\\u2a0c\": \"\\\\iiiint\",\n  \"\\u2a0d\": \"\\\\intbar\",\n  \"\\u2a0e\": \"\\\\intBar\",\n  \"\\u2a0f\": \"\\\\fint\",\n  \"\\u2a12\": \"\\\\rppolint\",\n  \"\\u2a13\": \"\\\\scpolint\",\n  \"\\u2a15\": \"\\\\pointint\",\n  \"\\u2a16\": \"\\\\sqint\",\n  \"\\u2a17\": \"\\\\intlarhk\",\n  \"\\u2a18\": \"\\\\intx\",\n  \"\\u2a19\": \"\\\\intcap\",\n  \"\\u2a1a\": \"\\\\intcup\"\n};\n\n// No limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\n    \"\\\\arcsin\",\n    \"\\\\arccos\",\n    \"\\\\arctan\",\n    \"\\\\arctg\",\n    \"\\\\arcctg\",\n    \"\\\\arg\",\n    \"\\\\ch\",\n    \"\\\\cos\",\n    \"\\\\cosec\",\n    \"\\\\cosh\",\n    \"\\\\cot\",\n    \"\\\\cotg\",\n    \"\\\\coth\",\n    \"\\\\csc\",\n    \"\\\\ctg\",\n    \"\\\\cth\",\n    \"\\\\deg\",\n    \"\\\\dim\",\n    \"\\\\exp\",\n    \"\\\\hom\",\n    \"\\\\ker\",\n    \"\\\\lg\",\n    \"\\\\ln\",\n    \"\\\\log\",\n    \"\\\\sec\",\n    \"\\\\sin\",\n    \"\\\\sinh\",\n    \"\\\\sh\",\n    \"\\\\sgn\",\n    \"\\\\tan\",\n    \"\\\\tanh\",\n    \"\\\\tg\",\n    \"\\\\th\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser, funcName }) {\n    const prevAtomType = parser.prevAtomType;\n    const next = parser.gullet.future().text;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      stack: false,\n      isFollowedByDelimiter: isDelimiter(next),\n      needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n      name: funcName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// Limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser, funcName }) {\n    const prevAtomType = parser.prevAtomType;\n    const next = parser.gullet.future().text;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: false,\n      stack: false,\n      isFollowedByDelimiter: isDelimiter(next),\n      needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n      name: funcName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// No limits, symbols\ndefineFunction({\n  type: \"op\",\n  names: [\n    \"\\\\int\",\n    \"\\\\iint\",\n    \"\\\\iiint\",\n    \"\\\\iiiint\",\n    \"\\\\oint\",\n    \"\\\\oiint\",\n    \"\\\\oiiint\",\n    \"\\\\intclockwise\",\n    \"\\\\varointclockwise\",\n    \"\\\\intbar\",\n    \"\\\\intBar\",\n    \"\\\\fint\",\n    \"\\\\rppolint\",\n    \"\\\\scpolint\",\n    \"\\\\pointint\",\n    \"\\\\sqint\",\n    \"\\\\intlarhk\",\n    \"\\\\intx\",\n    \"\\\\intcap\",\n    \"\\\\intcup\",\n    \"\\u222b\",\n    \"\\u222c\",\n    \"\\u222d\",\n    \"\\u222e\",\n    \"\\u222f\",\n    \"\\u2230\",\n    \"\\u2231\",\n    \"\\u2232\",\n    \"\\u2a0c\",\n    \"\\u2a0d\",\n    \"\\u2a0e\",\n    \"\\u2a0f\",\n    \"\\u2a12\",\n    \"\\u2a13\",\n    \"\\u2a15\",\n    \"\\u2a16\",\n    \"\\u2a17\",\n    \"\\u2a18\",\n    \"\\u2a19\",\n    \"\\u2a1a\"\n  ],\n  props: {\n    numArgs: 0,\n    allowedInArgument: true\n  },\n  handler({ parser, funcName }) {\n    let fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharIntegrals[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: true,\n      stack: false,\n      name: fName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// NOTE: Unlike most builders, this one handles not only\n// \"operatorname\", but also  \"supsub\" since \\operatorname* can\n// affect super/subscripting.\n\nconst mathmlBuilder$1 = (group, style) => {\n  let expression = buildExpression(group.body, style.withFont(\"mathrm\"));\n\n  // Is expression a string or has it something like a fraction?\n  let isAllString = true; // default\n  for (let i = 0; i < expression.length; i++) {\n    let node = expression[i];\n    if (node instanceof MathNode) {\n      if ((node.type === \"mrow\" || node.type === \"mpadded\") && node.children.length === 1 &&\n          node.children[0] instanceof MathNode) {\n        node = node.children[0];\n      } else if (node.type === \"mrow\" && node.children.length === 2 &&\n                 node.children[0] instanceof MathNode &&\n                 node.children[1] instanceof MathNode &&\n                 node.children[1].type === \"mspace\" && !node.children[1].attributes.width &&\n                 node.children[1].children.length === 0) {\n        // This is a workaround for a Firefox bug that applies spacing to\n        // an <mi> with mathvariant=\"normal\".\n        node = node.children[0];\n      }\n      switch (node.type) {\n        case \"mi\":\n        case \"mn\":\n        case \"ms\":\n        case \"mtext\":\n          break; // Do nothing yet.\n        case \"mspace\":\n          {\n            if (node.attributes.width) {\n              const width = node.attributes.width.replace(\"em\", \"\");\n              const ch = spaceCharacter(Number(width));\n              if (ch === \"\") {\n                isAllString = false;\n              } else {\n                expression[i] = new MathNode(\"mtext\", [new TextNode(ch)]);\n              }\n            }\n          }\n          break\n        case \"mo\": {\n          const child = node.children[0];\n          if (node.children.length === 1 && child instanceof TextNode) {\n            child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n          } else {\n            isAllString = false;\n          }\n          break\n        }\n        default:\n          isAllString = false;\n      }\n    } else {\n      isAllString = false;\n    }\n  }\n\n  if (isAllString) {\n    // Write a single TextNode instead of multiple nested tags.\n    const word = expression.map((node) => node.toText()).join(\"\");\n    expression = [new TextNode(word)];\n  } else if (\n    expression.length === 1\n    && [\"mover\", \"munder\"].includes(expression[0].type) &&\n    (expression[0].children[0].type === \"mi\" || expression[0].children[0].type === \"mtext\")\n  ) {\n    expression[0].children[0].type = \"mi\";\n    if (group.parentIsSupSub) {\n      return new MathNode(\"mrow\", expression)\n    } else {\n      const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n      return newDocumentFragment([expression[0], operator])\n    }\n  }\n\n  let wrapper;\n  if (isAllString) {\n    wrapper = new MathNode(\"mi\", expression);\n    if (expression[0].text.length === 1) {\n      wrapper.setAttribute(\"mathvariant\", \"normal\");\n    }\n  } else {\n    wrapper = new MathNode(\"mrow\", expression);\n  }\n\n  if (!group.parentIsSupSub) {\n    // Append an <mo>&ApplyFunction;</mo>.\n    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n    const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n    const fragment = [wrapper, operator];\n    if (group.needsLeadingSpace) {\n      // LaTeX gives operator spacing, but a <mi> gets ord spacing.\n      // So add a leading space.\n      const space = new MathNode(\"mspace\");\n      space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n      fragment.unshift(space);\n    }\n    if (!group.isFollowedByDelimiter) {\n      const trail = new MathNode(\"mspace\");\n      trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n      fragment.push(trail);\n    }\n    return newDocumentFragment(fragment)\n  }\n\n  return wrapper\n};\n\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n  type: \"operatorname\",\n  names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n  props: {\n    numArgs: 1,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName }, args) => {\n    const body = args[0];\n    const prevAtomType = parser.prevAtomType;\n    const next = parser.gullet.future().text;\n    return {\n      type: \"operatorname\",\n      mode: parser.mode,\n      body: ordargument(body),\n      alwaysHandleSupSub: (funcName === \"\\\\operatornamewithlimits\"),\n      limits: false,\n      parentIsSupSub: false,\n      isFollowedByDelimiter: isDelimiter(next),\n      needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType)\n    };\n  },\n  mathmlBuilder: mathmlBuilder$1\n});\n\ndefineMacro(\"\\\\operatorname\",\n  \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n  type: \"ordgroup\",\n  mathmlBuilder(group, style) {\n    return buildExpressionRow(group.body, style, group.semisimple);\n  }\n});\n\ndefineFunction({\n  type: \"phantom\",\n  names: [\"\\\\phantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    return {\n      type: \"phantom\",\n      mode: parser.mode,\n      body: ordargument(body)\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const inner = buildExpression(group.body, style);\n    return new MathNode(\"mphantom\", inner);\n  }\n});\n\ndefineFunction({\n  type: \"hphantom\",\n  names: [\"\\\\hphantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    return {\n      type: \"hphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const inner = buildExpression(ordargument(group.body), style);\n    const phantom = new MathNode(\"mphantom\", inner);\n    const node = new MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"height\", \"0px\");\n    node.setAttribute(\"depth\", \"0px\");\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"vphantom\",\n  names: [\"\\\\vphantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    return {\n      type: \"vphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const inner = buildExpression(ordargument(group.body), style);\n    const phantom = new MathNode(\"mphantom\", inner);\n    const node = new MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"width\", \"0.1px\");\n    return node;\n  }\n});\n\n// In LaTeX, \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies of the argument\n// with small offsets. We use CSS font-weight:bold.\n\ndefineFunction({\n  type: \"pmb\",\n  names: [\"\\\\pmb\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"pmb\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    }\n  },\n  mathmlBuilder(group, style) {\n    const inner = buildExpression(group.body, style);\n    // Wrap with an <mstyle> element.\n    const node = wrapWithMstyle(inner);\n    node.setAttribute(\"style\", \"font-weight:bold\");\n    return node\n  }\n});\n\n// \\raise, \\lower, and \\raisebox\n\nconst mathmlBuilder = (group, style) => {\n  const newStyle = style.withLevel(StyleLevel.TEXT);\n  const node = new MathNode(\"mpadded\", [buildGroup$1(group.body, newStyle)]);\n  const dy = calculateSize(group.dy, style);\n  node.setAttribute(\"voffset\", dy.number + dy.unit);\n  // Add padding, which acts to increase height in Chromium.\n  // TODO: Figure out some way to change height in Firefox w/o breaking Chromium.\n  if (dy.number > 0) {\n    node.style.padding = dy.number + dy.unit + \" 0 0 0\";\n  } else {\n    node.style.padding = \"0 0 \" + Math.abs(dy.number) + dy.unit + \" 0\";\n  }\n  return node\n};\n\ndefineFunction({\n  type: \"raise\",\n  names: [\"\\\\raise\", \"\\\\lower\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"size\", \"primitive\"],\n    primitive: true\n  },\n  handler({ parser, funcName }, args) {\n    const amount = assertNodeType(args[0], \"size\").value;\n    if (funcName === \"\\\\lower\") { amount.number *= -1; }\n    const body = args[1];\n    return {\n      type: \"raise\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  mathmlBuilder\n});\n\n\ndefineFunction({\n  type: \"raise\",\n  names: [\"\\\\raisebox\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"size\", \"hbox\"],\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const amount = assertNodeType(args[0], \"size\").value;\n    const body = args[1];\n    return {\n      type: \"raise\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  mathmlBuilder\n});\n\ndefineFunction({\n  type: \"ref\",\n  names: [\"\\\\ref\", \"\\\\eqref\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"raw\"]\n  },\n  handler({ parser, funcName }, args) {\n    return {\n      type: \"ref\",\n      mode: parser.mode,\n      funcName,\n      string: args[0].string.replace(invalidIdRegEx, \"\")\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Create an empty <a> node. Set a class and an href attribute.\n    // The post-processor will populate with the target's tag or equation number.\n    const classes = group.funcName === \"\\\\ref\" ? [\"tml-ref\"] : [\"tml-ref\", \"tml-eqref\"];\n    return new AnchorNode(\"#\" + group.string, classes, null)\n  }\n});\n\ndefineFunction({\n  type: \"reflect\",\n  names: [\"\\\\reflectbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: true\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"reflect\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    const node = buildGroup$1(group.body, style);\n    node.style.transform = \"scaleX(-1)\";\n    return node\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\relax\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInArgument: true\n  },\n  handler({ parser }) {\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\ndefineFunction({\n  type: \"rule\",\n  names: [\"\\\\rule\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    argTypes: [\"size\", \"size\", \"size\"]\n  },\n  handler({ parser }, args, optArgs) {\n    const shift = optArgs[0];\n    const width = assertNodeType(args[0], \"size\");\n    const height = assertNodeType(args[1], \"size\");\n    return {\n      type: \"rule\",\n      mode: parser.mode,\n      shift: shift && assertNodeType(shift, \"size\").value,\n      width: width.value,\n      height: height.value\n    };\n  },\n  mathmlBuilder(group, style) {\n    const width = calculateSize(group.width, style);\n    const height = calculateSize(group.height, style);\n    const shift = group.shift\n      ? calculateSize(group.shift, style)\n      : { number: 0, unit: \"em\" };\n    const color = (style.color && style.getColor()) || \"black\";\n\n    const rule = new MathNode(\"mspace\");\n    if (width.number > 0 && height.number > 0) {\n      rule.setAttribute(\"mathbackground\", color);\n    }\n    rule.setAttribute(\"width\", width.number + width.unit);\n    rule.setAttribute(\"height\", height.number + height.unit);\n    if (shift.number === 0) { return rule }\n\n    const wrapper = new MathNode(\"mpadded\", [rule]);\n    if (shift.number >= 0) {\n      wrapper.setAttribute(\"height\", \"+\" + shift.number + shift.unit);\n    } else {\n      wrapper.setAttribute(\"height\", shift.number + shift.unit);\n      wrapper.setAttribute(\"depth\", \"+\" + -shift.number + shift.unit);\n    }\n    wrapper.setAttribute(\"voffset\", shift.number + shift.unit);\n    return wrapper;\n  }\n});\n\nconst numRegEx = /^[0-9]$/;\nconst unicodeNumSubs = {\n  '0': '₀',\n  '1': '₁',\n  '2': '₂',\n  '3': '₃',\n  '4': '₄',\n  '5': '₅',\n  '6': '₆',\n  '7': '₇',\n  '8': '₈',\n  '9': '₉'\n};\nconst unicodeNumSups = {\n  '0': '⁰',\n  '1': '¹',\n  '2': '²',\n  '3': '³',\n  '4': '⁴',\n  '5': '⁵',\n  '6': '⁶',\n  '7': '⁷',\n  '8': '⁸',\n  '9': '⁹'\n};\n\ndefineFunction({\n  type: \"sfrac\",\n  names: [\"\\\\sfrac\"],\n  props: {\n    numArgs: 2,\n    allowedInText: true,\n    allowedInMath: true\n  },\n  handler({ parser }, args) {\n    let numerator = \"\";\n    for (const node of args[0].body) {\n      if (node.type !== \"textord\" || !numRegEx.test(node.text)) {\n        throw new ParseError(\"Numerator must be an integer.\", node)\n      }\n      numerator += node.text;\n    }\n    let denominator = \"\";\n    for (const node of args[1].body) {\n      if (node.type !== \"textord\" || !numRegEx.test(node.text)) {\n        throw new ParseError(\"Denominator must be an integer.\", node)\n      }\n      denominator += node.text;\n    }\n    return {\n      type: \"sfrac\",\n      mode: parser.mode,\n      numerator,\n      denominator\n    };\n  },\n  mathmlBuilder(group, style) {\n    const numerator = group.numerator.split('').map(c => unicodeNumSups[c]).join('');\n    const denominator = group.denominator.split('').map(c => unicodeNumSubs[c]).join('');\n    // Use a fraction slash.\n    const text = new TextNode(numerator + \"\\u2044\" + denominator, group.mode, style);\n    return new MathNode(\"mn\", [text], [\"special-fraction\"])\n  }\n});\n\n// The size mappings are taken from TeX with \\normalsize=10pt.\n// We don't have to track script level. MathML does that.\nconst sizeMap = {\n  \"\\\\tiny\": 0.5,\n  \"\\\\sixptsize\": 0.6,\n  \"\\\\Tiny\": 0.6,\n  \"\\\\scriptsize\": 0.7,\n  \"\\\\footnotesize\": 0.8,\n  \"\\\\small\": 0.9,\n  \"\\\\normalsize\": 1.0,\n  \"\\\\large\": 1.2,\n  \"\\\\Large\": 1.44,\n  \"\\\\LARGE\": 1.728,\n  \"\\\\huge\": 2.074,\n  \"\\\\Huge\": 2.488\n};\n\ndefineFunction({\n  type: \"sizing\",\n  names: [\n    \"\\\\tiny\",\n    \"\\\\sixptsize\",\n    \"\\\\Tiny\",\n    \"\\\\scriptsize\",\n    \"\\\\footnotesize\",\n    \"\\\\small\",\n    \"\\\\normalsize\",\n    \"\\\\large\",\n    \"\\\\Large\",\n    \"\\\\LARGE\",\n    \"\\\\huge\",\n    \"\\\\Huge\"\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: ({ breakOnTokenText, funcName, parser }, args) => {\n    if (parser.settings.strict && parser.mode === \"math\") {\n      // eslint-disable-next-line no-console\n      console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`);\n    }\n    const body = parser.parseExpression(false, breakOnTokenText, true);\n    return {\n      type: \"sizing\",\n      mode: parser.mode,\n      funcName,\n      body\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const newStyle = style.withFontSize(sizeMap[group.funcName]);\n    const inner = buildExpression(group.body, newStyle);\n    // Wrap with an <mstyle> element.\n    const node = wrapWithMstyle(inner);\n    const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4);\n    node.setAttribute(\"mathsize\", factor + \"em\");\n    return node;\n  }\n});\n\n// smash, with optional [tb], as in AMS\n\ndefineFunction({\n  type: \"smash\",\n  names: [\"\\\\smash\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args, optArgs) => {\n    let smashHeight = false;\n    let smashDepth = false;\n    const tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n    if (tbArg) {\n      // Optional [tb] argument is engaged.\n      // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n      //               def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n      let letter = \"\";\n      for (let i = 0; i < tbArg.body.length; ++i) {\n        const node = tbArg.body[i];\n        // TODO: Write an AssertSymbolNode\n        letter = node.text;\n        if (letter === \"t\") {\n          smashHeight = true;\n        } else if (letter === \"b\") {\n          smashDepth = true;\n        } else {\n          smashHeight = false;\n          smashDepth = false;\n          break;\n        }\n      }\n    } else {\n      smashHeight = true;\n      smashDepth = true;\n    }\n\n    const body = args[0];\n    return {\n      type: \"smash\",\n      mode: parser.mode,\n      body,\n      smashHeight,\n      smashDepth\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const node = new MathNode(\"mpadded\", [buildGroup$1(group.body, style)]);\n\n    if (group.smashHeight) {\n      node.setAttribute(\"height\", \"0px\");\n    }\n\n    if (group.smashDepth) {\n      node.setAttribute(\"depth\", \"0px\");\n    }\n\n    return node;\n  }\n});\n\n// Letters that are x-height w/o a descender.\nconst xHeights = ['a', 'c', 'e', 'ı', 'm', 'n', 'o', 'r', 's', 'u', 'v', 'w', 'x', 'z', 'α',\n  'ε', 'ι', 'κ', 'ν', 'ο', 'π', 'σ', 'τ', 'υ', 'ω', '\\\\alpha', '\\\\epsilon', \"\\\\iota\",\n  '\\\\kappa', '\\\\nu', '\\\\omega', '\\\\pi', '\\\\tau', '\\\\omega'];\n\ndefineFunction({\n  type: \"sqrt\",\n  names: [\"\\\\sqrt\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler({ parser }, args, optArgs) {\n    const index = optArgs[0];\n    const body = args[0];\n    // Check if the body consists entirely of an x-height letter.\n    // TODO: Remove this check after Chromium is fixed.\n    if (body.body && body.body.length === 1 && body.body[0].text &&\n          xHeights.includes(body.body[0].text)) {\n      // Chromium does not put enough space above an x-height letter.\n      // Insert a strut.\n      body.body.push({\n        \"type\": \"rule\",\n        \"mode\": \"math\",\n        \"shift\": null,\n        \"width\": { \"number\": 0, \"unit\": \"pt\" },\n        \"height\": { \"number\": 0.5, \"unit\": \"em\" }\n      });\n    }\n    return {\n      type: \"sqrt\",\n      mode: parser.mode,\n      body,\n      index\n    };\n  },\n  mathmlBuilder(group, style) {\n    const { body, index } = group;\n    return index\n      ? new MathNode(\"mroot\", [\n        buildGroup$1(body, style),\n        buildGroup$1(index, style.incrementLevel())\n      ])\n    : new MathNode(\"msqrt\", [buildGroup$1(body, style)]);\n  }\n});\n\nconst styleMap = {\n  display: 0,\n  text: 1,\n  script: 2,\n  scriptscript: 3\n};\n\nconst styleAttributes = {\n  display: [\"0\", \"true\"],\n  text: [\"0\", \"false\"],\n  script: [\"1\", \"false\"],\n  scriptscript: [\"2\", \"false\"]\n};\n\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ breakOnTokenText, funcName, parser }, args) {\n    // parse out the implicit body\n    const body = parser.parseExpression(true, breakOnTokenText, true);\n\n    const scriptLevel = funcName.slice(1, funcName.length - 5);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      // Figure out what scriptLevel to use by pulling out the scriptLevel from\n      // the function name\n      scriptLevel,\n      body\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Figure out what scriptLevel we're changing to.\n    const newStyle = style.withLevel(styleMap[group.scriptLevel]);\n    // The style argument in the next line does NOT directly set a MathML script level.\n    // It just tracks the style level, in case we need to know it for supsub or mathchoice.\n    const inner = buildExpression(group.body, newStyle);\n    // Wrap with an <mstyle> element.\n    const node = wrapWithMstyle(inner);\n\n    const attr = styleAttributes[group.scriptLevel];\n\n    // Here is where we set the MathML script level.\n    node.setAttribute(\"scriptlevel\", attr[0]);\n    node.setAttribute(\"displaystyle\", attr[1]);\n\n    return node;\n  }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\n\n// Helpers\nconst symbolRegEx = /^m(over|under|underover)$/;\n\n// From the KaTeX font metrics, identify letters that encroach on a superscript.\nconst smallPad = \"DHKLUcegorsuvxyzΠΥΨαδηιμνοτυχϵ\";\nconst mediumPad = \"BCEFGIMNOPQRSTXZlpqtwΓΘΞΣΦΩβεζθξρςφψϑϕϱ\";\nconst largePad = \"AJdfΔΛ\";\n\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n  type: \"supsub\",\n  mathmlBuilder(group, style) {\n    // Is the inner group a relevant horizontal brace or bracket?\n    let isBracket = false;\n    let isOver;\n    let isSup;\n    let appendApplyFunction = false;\n    let appendSpace = false;\n    let needsLeadingSpace = false;\n\n    if (group.base && group.base.type === \"horizBracket\") {\n      isSup = !!group.sup;\n      if (isSup === group.base.isOver) {\n        isBracket = true;\n        isOver = group.base.isOver;\n      }\n    }\n\n    if (group.base && !group.stack &&\n      (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n      group.base.parentIsSupSub = true;\n      appendApplyFunction = !group.base.symbol;\n      appendSpace = appendApplyFunction && !group.isFollowedByDelimiter;\n      needsLeadingSpace = group.base.needsLeadingSpace;\n    }\n\n    const children = group.stack && group.base.body.length === 1\n      ? [buildGroup$1(group.base.body[0], style)]\n      : [buildGroup$1(group.base, style)];\n\n    // Note regarding scriptstyle level.\n    // (Sub|super)scripts should not shrink beyond MathML scriptlevel 2 aka \\scriptscriptstyle\n    // Ref: https://w3c.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes\n    // (BTW, MathML scriptlevel 2 is equal to Temml level 3.)\n    // But Chromium continues to shrink the (sub|super)scripts. So we explicitly set scriptlevel 2.\n\n    const childStyle = style.inSubOrSup();\n    if (group.sub) {\n      const sub = buildGroup$1(group.sub, childStyle);\n      if (style.level === 3) { sub.setAttribute(\"scriptlevel\", \"2\"); }\n      children.push(sub);\n    }\n\n    if (group.sup) {\n      const sup = buildGroup$1(group.sup, childStyle);\n      if (style.level === 3) { sup.setAttribute(\"scriptlevel\", \"2\"); }\n      if (group.base && group.base.text && group.base.text.length === 1) {\n        // Make an italic correction on the superscript.\n        const text = group.base.text;\n        if (smallPad.indexOf(text) > -1) {\n          sup.classes.push(\"tml-sml-pad\");\n        } else if (mediumPad.indexOf(text) > -1) {\n          sup.classes.push(\"tml-med-pad\");\n        } else if (largePad.indexOf(text) > -1) {\n          sup.classes.push(\"tml-lrg-pad\");\n        }\n      }\n      children.push(sup);\n    }\n\n    let nodeType;\n    if (isBracket) {\n      nodeType = isOver ? \"mover\" : \"munder\";\n    } else if (!group.sub) {\n      const base = group.base;\n      if (\n        base &&\n        base.type === \"op\" &&\n        base.limits &&\n        (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n      ) {\n        nodeType = \"mover\";\n      } else if (\n        base &&\n        base.type === \"operatorname\" &&\n        base.alwaysHandleSupSub &&\n        (base.limits || style.level === StyleLevel.DISPLAY)\n      ) {\n        nodeType = \"mover\";\n      } else {\n        nodeType = \"msup\";\n      }\n    } else if (!group.sup) {\n      const base = group.base;\n      if (group.stack) {\n        nodeType = \"munder\";\n      } else if (\n        base &&\n        base.type === \"op\" &&\n        base.limits &&\n        (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n      ) {\n        nodeType = \"munder\";\n      } else if (\n        base &&\n        base.type === \"operatorname\" &&\n        base.alwaysHandleSupSub &&\n        (base.limits || style.level === StyleLevel.DISPLAY)\n      ) {\n        nodeType = \"munder\";\n      } else {\n        nodeType = \"msub\";\n      }\n    } else {\n      const base = group.base;\n      if (base && ((base.type === \"op\" && base.limits) || base.type === \"multiscript\") &&\n        (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n      ) {\n        nodeType = \"munderover\";\n      } else if (\n        base &&\n        base.type === \"operatorname\" &&\n        base.alwaysHandleSupSub &&\n        (style.level === StyleLevel.DISPLAY || base.limits)\n      ) {\n        nodeType = \"munderover\";\n      } else {\n        nodeType = \"msubsup\";\n      }\n    }\n\n    let node = new MathNode(nodeType, children);\n    if (appendApplyFunction) {\n      // Append an <mo>&ApplyFunction;</mo>.\n      // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n      const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n      if (needsLeadingSpace) {\n        const space = new MathNode(\"mspace\");\n        space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        node = newDocumentFragment([space, node, operator]);\n      } else {\n        node = newDocumentFragment([node, operator]);\n      }\n      if (appendSpace) {\n        const space = new MathNode(\"mspace\");\n        space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        node.children.push(space);\n      }\n    } else if (symbolRegEx.test(nodeType)) {\n      // Wrap in a <mrow>. Otherwise Firefox stretchy parens will not stretch to include limits.\n      node = new MathNode(\"mrow\", [node]);\n    }\n\n    return node\n  }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\n\nconst short = [\"\\\\shortmid\", \"\\\\nshortmid\", \"\\\\shortparallel\",\n  \"\\\\nshortparallel\", \"\\\\smallsetminus\"];\n\nconst arrows = [\"\\\\Rsh\", \"\\\\Lsh\", \"\\\\restriction\"];\n\nconst isArrow = str => {\n  if (str.length === 1) {\n    const codePoint = str.codePointAt(0);\n    return (0x218f < codePoint && codePoint < 0x2200)\n  }\n  return str.indexOf(\"arrow\") > -1 || str.indexOf(\"harpoon\") > -1 || arrows.includes(str)\n};\n\ndefineFunctionBuilders({\n  type: \"atom\",\n  mathmlBuilder(group, style) {\n    const node = new MathNode(\"mo\", [makeText(group.text, group.mode)]);\n    if (group.family === \"punct\") {\n      node.setAttribute(\"separator\", \"true\");\n    } else if (group.family === \"open\" || group.family === \"close\") {\n      // Delims built here should not stretch vertically.\n      // See delimsizing.js for stretchy delims.\n      if (group.family === \"open\") {\n        node.setAttribute(\"form\", \"prefix\");\n        // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong.\n        node.setAttribute(\"stretchy\", \"false\");\n      } else if (group.family === \"close\") {\n        node.setAttribute(\"form\", \"postfix\");\n        node.setAttribute(\"stretchy\", \"false\");\n      }\n    } else if (group.text === \"\\\\mid\") {\n      // Firefox messes up this spacing if at the end of an <mrow>. See it explicitly.\n      node.setAttribute(\"lspace\", \"0.22em\"); // medium space\n      node.setAttribute(\"rspace\", \"0.22em\");\n      node.setAttribute(\"stretchy\", \"false\");\n    } else if (group.family === \"rel\" && isArrow(group.text)) {\n      node.setAttribute(\"stretchy\", \"false\");\n    } else if (short.includes(group.text)) {\n      node.setAttribute(\"mathsize\", \"70%\");\n    } else if (group.text === \":\") {\n      // \":\" is not in the MathML operator dictionary. Give it BIN spacing.\n      node.attributes.lspace = \"0.2222em\";\n      node.attributes.rspace = \"0.2222em\";\n    } else if (group.needsSpacing) {\n      // Fix a MathML bug that occurs when a <mo> is between two <mtext> elements.\n      if (group.family === \"bin\") {\n        return new MathNode(\"mrow\", [padding(0.222), node, padding(0.222)])\n      } else {\n        // REL spacing\n        return new MathNode(\"mrow\", [padding(0.2778), node, padding(0.2778)])\n      }\n    }\n    return node;\n  }\n});\n\n/**\n * Maps TeX font commands to \"mathvariant\" attribute in buildMathML.js\n */\nconst fontMap = {\n  // styles\n  mathbf: \"bold\",\n  mathrm: \"normal\",\n  textit: \"italic\",\n  mathit: \"italic\",\n  mathnormal: \"italic\",\n\n  // families\n  mathbb: \"double-struck\",\n  mathcal: \"script\",\n  mathfrak: \"fraktur\",\n  mathscr: \"script\",\n  mathsf: \"sans-serif\",\n  mathtt: \"monospace\"\n};\n\n/**\n * Returns the math variant as a string or null if none is required.\n */\nconst getVariant = function(group, style) {\n  // Handle font specifiers as best we can.\n  // Chromium does not support the MathML mathvariant attribute.\n  // So we'll use Unicode replacement characters instead.\n  // But first, determine the math variant.\n\n  // Deal with the \\textit, \\textbf, etc., functions.\n  if (style.fontFamily === \"texttt\") {\n    return \"monospace\"\n  } else if (style.fontFamily === \"textsc\") {\n    return \"normal\"; // handled via character substitution in symbolsOrd.js.\n  } else if (style.fontFamily === \"textsf\") {\n    if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n      return \"sans-serif-bold-italic\"\n    } else if (style.fontShape === \"textit\") {\n      return \"sans-serif-italic\"\n    } else if (style.fontWeight === \"textbf\") {\n      return \"sans-serif-bold\"\n    } else {\n      return \"sans-serif\"\n    }\n  } else if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n    return \"bold-italic\"\n  } else if (style.fontShape === \"textit\") {\n    return \"italic\"\n  } else if (style.fontWeight === \"textbf\") {\n    return \"bold\"\n  }\n\n  // Deal with the \\mathit, mathbf, etc, functions.\n  const font = style.font;\n  if (!font || font === \"mathnormal\") {\n    return null\n  }\n\n  const mode = group.mode;\n  switch (font) {\n    case \"mathit\":\n      return \"italic\"\n    case \"mathrm\": {\n      const codePoint = group.text.codePointAt(0);\n      // LaTeX \\mathrm returns italic for Greek characters.\n      return  (0x03ab < codePoint && codePoint < 0x03cf) ? \"italic\" : \"normal\"\n    }\n    case \"greekItalic\":\n      return \"italic\"\n    case \"up@greek\":\n      return \"normal\"\n    case \"boldsymbol\":\n    case \"mathboldsymbol\":\n      return \"bold-italic\"\n    case \"mathbf\":\n      return \"bold\"\n    case \"mathbb\":\n      return \"double-struck\"\n    case \"mathfrak\":\n      return \"fraktur\"\n    case \"mathscr\":\n    case \"mathcal\":\n      return \"script\"\n    case \"mathsf\":\n      return \"sans-serif\"\n    case \"mathsfit\":\n      return \"sans-serif-italic\"\n    case \"mathtt\":\n      return \"monospace\"\n  }\n\n  let text = group.text;\n  if (symbols[mode][text] && symbols[mode][text].replace) {\n    text = symbols[mode][text].replace;\n  }\n\n  return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null\n};\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\n\nconst numberRegEx = /^\\d(?:[\\d,.]*\\d)?$/;\nconst latinRegEx = /[A-Ba-z]/;\nconst primes = new Set([\"\\\\prime\", \"\\\\dprime\", \"\\\\trprime\", \"\\\\qprime\",\n  \"\\\\backprime\", \"\\\\backdprime\", \"\\\\backtrprime\"]);\n\nconst italicNumber = (text, variant, tag) => {\n  const mn = new MathNode(tag, [text]);\n  const wrapper = new MathNode(\"mstyle\", [mn]);\n  wrapper.style[\"font-style\"] = \"italic\";\n  wrapper.style[\"font-family\"] = \"Cambria, 'Times New Roman', serif\";\n  if (variant === \"bold-italic\") { wrapper.style[\"font-weight\"] = \"bold\"; }\n  return wrapper\n};\n\ndefineFunctionBuilders({\n  type: \"mathord\",\n  mathmlBuilder(group, style) {\n    const text = makeText(group.text, group.mode, style);\n    const codePoint = text.text.codePointAt(0);\n    // Test for upper-case Greek\n    const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? \"normal\" : \"italic\";\n    const variant = getVariant(group, style) || defaultVariant;\n    if (variant === \"script\") {\n      text.text = variantChar(text.text, variant);\n      return new MathNode(\"mi\", [text], [style.font])\n    } else if (variant !== \"italic\") {\n      text.text = variantChar(text.text, variant);\n    }\n    let node = new MathNode(\"mi\", [text]);\n    // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf\n    if (variant === \"normal\") {\n      node.setAttribute(\"mathvariant\", \"normal\");\n      if (text.text.length === 1) {\n        // A Firefox bug will apply spacing here, but there should be none. Fix it.\n        const mspace = new MathNode(\"mspace\", []);\n        node = new MathNode(\"mrow\", [node, mspace]);\n      }\n    }\n    return node\n  }\n});\n\ndefineFunctionBuilders({\n  type: \"textord\",\n  mathmlBuilder(group, style) {\n    let ch = group.text;\n    const codePoint = ch.codePointAt(0);\n    if (style.fontFamily === \"textsc\") {\n      // Convert small latin letters to small caps.\n      if (96 < codePoint && codePoint < 123) {\n        ch = smallCaps[ch];\n      }\n    }\n    const text = makeText(ch, group.mode, style);\n    const variant = getVariant(group, style) || \"normal\";\n\n    let node;\n    if (numberRegEx.test(group.text)) {\n      const tag = group.mode === \"text\" ? \"mtext\" : \"mn\";\n      if (variant === \"italic\" || variant === \"bold-italic\") {\n        return italicNumber(text, variant, tag)\n      } else {\n        if (variant !== \"normal\") {\n          text.text = text.text.split(\"\").map(c => variantChar(c, variant)).join(\"\");\n        }\n        node = new MathNode(tag, [text]);\n      }\n    } else if (group.mode === \"text\") {\n      if (variant !== \"normal\") {\n        text.text = variantChar(text.text, variant);\n      }\n      node = new MathNode(\"mtext\", [text]);\n    } else if (primes.has(group.text)) {\n      node = new MathNode(\"mo\", [text]);\n      // TODO: If/when Chromium uses ssty variant for prime, remove the next line.\n      node.classes.push(\"tml-prime\");\n    } else {\n      const origText = text.text;\n      if (variant !== \"italic\") {\n        text.text = variantChar(text.text, variant);\n      }\n      node = new MathNode(\"mi\", [text]);\n      if (text.text === origText && latinRegEx.test(origText)) {\n        node.setAttribute(\"mathvariant\", \"italic\");\n      }\n    }\n    return node\n  }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nconst cssSpace = {\n  \"\\\\nobreak\": \"nobreak\",\n  \"\\\\allowbreak\": \"allowbreak\"\n};\n\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character.  If a symbol or command is a key\n// in this table, then it should be a regular space character.  Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nconst regularSpace = {\n  \" \": {},\n  \"\\\\ \": {},\n  \"~\": {\n    className: \"nobreak\"\n  },\n  \"\\\\space\": {},\n  \"\\\\nobreakspace\": {\n    className: \"nobreak\"\n  }\n};\n\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n  type: \"spacing\",\n  mathmlBuilder(group, style) {\n    let node;\n\n    if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) {\n      // Firefox does not render a space in a <mtext> </mtext>. So write a no-break space.\n      // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node.\n      //const ch = (regularSpace[group.text].className === \"nobreak\") ? \"\\u00a0\" : \" \"\n      node = new MathNode(\"mtext\", [new TextNode(\"\\u00a0\")]);\n    } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) {\n      // MathML 3.0 calls for nobreak to occur in an <mo>, not an <mtext>\n      // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs\n      node = new MathNode(\"mo\");\n      if (group.text === \"\\\\nobreak\") {\n        node.setAttribute(\"linebreak\", \"nobreak\");\n      }\n    } else {\n      throw new ParseError(`Unknown type of space \"${group.text}\"`)\n    }\n\n    return node\n  }\n});\n\ndefineFunctionBuilders({\n  type: \"tag\"\n});\n\n// For a \\tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js.\n// That way, a \\tag can be pulled out of the parse tree and wrapped around the outer node.\n\n// Non-mathy text, possibly in a font\nconst textFontFamilies = {\n  \"\\\\text\": undefined,\n  \"\\\\textrm\": \"textrm\",\n  \"\\\\textsf\": \"textsf\",\n  \"\\\\texttt\": \"texttt\",\n  \"\\\\textnormal\": \"textrm\",\n  \"\\\\textsc\": \"textsc\"      // small caps\n};\n\nconst textFontWeights = {\n  \"\\\\textbf\": \"textbf\",\n  \"\\\\textmd\": \"textmd\"\n};\n\nconst textFontShapes = {\n  \"\\\\textit\": \"textit\",\n  \"\\\\textup\": \"textup\"\n};\n\nconst styleWithFont = (group, style) => {\n  const font = group.font;\n  // Checks if the argument is a font family or a font style.\n  if (!font) {\n    return style;\n  } else if (textFontFamilies[font]) {\n    return style.withTextFontFamily(textFontFamilies[font]);\n  } else if (textFontWeights[font]) {\n    return style.withTextFontWeight(textFontWeights[font]);\n  } else if (font === \"\\\\emph\") {\n    return style.fontShape === \"textit\"\n      ? style.withTextFontShape(\"textup\")\n      : style.withTextFontShape(\"textit\")\n  }\n  return style.withTextFontShape(textFontShapes[font])\n};\n\ndefineFunction({\n  type: \"text\",\n  names: [\n    // Font families\n    \"\\\\text\",\n    \"\\\\textrm\",\n    \"\\\\textsf\",\n    \"\\\\texttt\",\n    \"\\\\textnormal\",\n    \"\\\\textsc\",\n    // Font weights\n    \"\\\\textbf\",\n    \"\\\\textmd\",\n    // Font Shapes\n    \"\\\\textit\",\n    \"\\\\textup\",\n    \"\\\\emph\"\n  ],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"text\",\n      mode: parser.mode,\n      body: ordargument(body),\n      font: funcName\n    };\n  },\n  mathmlBuilder(group, style) {\n    const newStyle = styleWithFont(group, style);\n    const mrow = buildExpressionRow(group.body, newStyle);\n    return consolidateText(mrow)\n  }\n});\n\n// \\vcenter:  Vertically center the argument group on the math axis.\n\ndefineFunction({\n  type: \"vcenter\",\n  names: [\"\\\\vcenter\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"original\"],\n    allowedInText: false\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"vcenter\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Use a math table to create vertically centered content.\n    const mtd = new MathNode(\"mtd\", [buildGroup$1(group.body, style)]);\n    mtd.style.padding = \"0\";\n    const mtr = new MathNode(\"mtr\", [mtd]);\n    return new MathNode(\"mtable\", [mtr])\n  }\n});\n\ndefineFunction({\n  type: \"verb\",\n  names: [\"\\\\verb\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler(context, args, optArgs) {\n    // \\verb and \\verb* are dealt with directly in Parser.js.\n    // If we end up here, it's because of a failure to match the two delimiters\n    // in the regex in Lexer.js.  LaTeX raises the following error when \\verb is\n    // terminated by end of line (or file).\n    throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n  },\n  mathmlBuilder(group, style) {\n    const text = new TextNode(makeVerb(group));\n    const node = new MathNode(\"mtext\", [text]);\n    node.setAttribute(\"mathvariant\", \"monospace\");\n    return node;\n  }\n});\n\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nconst makeVerb = (group) => group.body.replace(/ /g, group.star ? \"\\u2423\" : \"\\xA0\");\n\n/** Include this to ensure that all functions are defined. */\n\nconst functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n\n\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first two groups\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - mathches numerals\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n *   [1] regular whitespace\n *   [2] backslash followed by whitespace\n *   [3] anything else, which may include:\n *     [4] left character of \\verb*\n *     [5] left character of \\verb\n *     [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nconst spaceRegexString = \"[ \\r\\n\\t]\";\nconst controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nconst controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nconst controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*`;\nconst controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nconst combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nconst combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`);\nconst tokenRegexString =\n  `(${spaceRegexString}+)|` + // whitespace\n  `${controlSpaceRegexString}|` +  // whitespace\n  \"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + // single codepoint\n  `${combiningDiacriticalMarkString}*` + // ...plus accents\n  \"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + // surrogate pair\n  `${combiningDiacriticalMarkString}*` + // ...plus accents\n  \"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" + // \\verb*\n  \"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + // \\verb unstarred\n  `|${controlWordWhitespaceRegexString}` + // \\macroName + spaces\n  `|${controlSymbolRegexString})`; // \\\\, \\', etc.\n\n/** Main Lexer class */\nclass Lexer {\n  constructor(input, settings) {\n    // Separate accents from characters\n    this.input = input;\n    this.settings = settings;\n    this.tokenRegex = new RegExp(tokenRegexString, 'g');\n    // Category codes. The lexer only supports comment characters (14) for now.\n    // MacroExpander additionally distinguishes active (13).\n    this.catcodes = {\n      \"%\": 14, // comment character\n      \"~\": 13  // active character\n    };\n  }\n\n  setCatcode(char, code) {\n    this.catcodes[char] = code;\n  }\n\n  /**\n   * This function lexes a single token.\n   */\n  lex() {\n    const input = this.input;\n    const pos = this.tokenRegex.lastIndex;\n    if (pos === input.length) {\n      return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n    }\n    const match = this.tokenRegex.exec(input);\n    if (match === null || match.index !== pos) {\n      throw new ParseError(\n        `Unexpected character: '${input[pos]}'`,\n        new Token(input[pos], new SourceLocation(this, pos, pos + 1))\n      );\n    }\n    const text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n\n    if (this.catcodes[text] === 14) {\n      // comment character\n      const nlIndex = input.indexOf(\"\\n\", this.tokenRegex.lastIndex);\n      if (nlIndex === -1) {\n        this.tokenRegex.lastIndex = input.length; // EOF\n        if (this.settings.strict) {\n          throw new ParseError(\"% comment has no terminating newline; LaTeX would \" +\n              \"fail because of commenting the end of math mode\")\n        }\n      } else {\n        this.tokenRegex.lastIndex = nlIndex + 1;\n      }\n      return this.lex();\n    }\n\n    return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n  }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\n\n\nclass Namespace {\n  /**\n   * Both arguments are optional.  The first argument is an object of\n   * built-in mappings which never change.  The second argument is an object\n   * of initial (global-level) mappings, which will constantly change\n   * according to any global/top-level `set`s done.\n   */\n  constructor(builtins = {}, globalMacros = {}) {\n    this.current = globalMacros;\n    this.builtins = builtins;\n    this.undefStack = [];\n  }\n\n  /**\n   * Start a new nested group, affecting future local `set`s.\n   */\n  beginGroup() {\n    this.undefStack.push({});\n  }\n\n  /**\n   * End current nested group, restoring values before the group began.\n   */\n  endGroup() {\n    if (this.undefStack.length === 0) {\n      throw new ParseError(\n        \"Unbalanced namespace destruction: attempt \" +\n          \"to pop global namespace; please report this as a bug\"\n      );\n    }\n    const undefs = this.undefStack.pop();\n    for (const undef in undefs) {\n      if (Object.prototype.hasOwnProperty.call(undefs, undef )) {\n        if (undefs[undef] === undefined) {\n          delete this.current[undef];\n        } else {\n          this.current[undef] = undefs[undef];\n        }\n      }\n    }\n  }\n\n  /**\n   * Detect whether `name` has a definition.  Equivalent to\n   * `get(name) != null`.\n   */\n  has(name) {\n    return Object.prototype.hasOwnProperty.call(this.current, name ) ||\n    Object.prototype.hasOwnProperty.call(this.builtins, name );\n  }\n\n  /**\n   * Get the current value of a name, or `undefined` if there is no value.\n   *\n   * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n   * is defined, as the definition may be the empty string which evaluates\n   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or\n   * `if (namespace.has(...))`.\n   */\n  get(name) {\n    if (Object.prototype.hasOwnProperty.call(this.current, name )) {\n      return this.current[name];\n    } else {\n      return this.builtins[name];\n    }\n  }\n\n  /**\n   * Set the current value of a name, and optionally set it globally too.\n   * Local set() sets the current value and (when appropriate) adds an undo\n   * operation to the undo stack.  Global set() may change the undo\n   * operation at every level, so takes time linear in their number.\n   */\n  set(name, value, global = false) {\n    if (global) {\n      // Global set is equivalent to setting in all groups.  Simulate this\n      // by destroying any undos currently scheduled for this name,\n      // and adding an undo with the *new* value (in case it later gets\n      // locally reset within this environment).\n      for (let i = 0; i < this.undefStack.length; i++) {\n        delete this.undefStack[i][name];\n      }\n      if (this.undefStack.length > 0) {\n        this.undefStack[this.undefStack.length - 1][name] = value;\n      }\n    } else {\n      // Undo this set at end of this group (possibly to `undefined`),\n      // unless an undo is already in place, in which case that older\n      // value is the correct one.\n      const top = this.undefStack[this.undefStack.length - 1];\n      if (top && !Object.prototype.hasOwnProperty.call(top, name )) {\n        top[name] = this.current[name];\n      }\n    }\n    this.current[name] = value;\n  }\n}\n\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n\n\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol.  Used in `isDefined`.\nconst implicitCommands = {\n  \"^\": true, // Parser.js\n  _: true, // Parser.js\n  \"\\\\limits\": true, // Parser.js\n  \"\\\\nolimits\": true // Parser.js\n};\n\nclass MacroExpander {\n  constructor(input, settings, mode) {\n    this.settings = settings;\n    this.expansionCount = 0;\n    this.feed(input);\n    // Make new global namespace\n    this.macros = new Namespace(macros, settings.macros);\n    this.mode = mode;\n    this.stack = []; // contains tokens in REVERSE order\n  }\n\n  /**\n   * Feed a new input string to the same MacroExpander\n   * (with existing macros etc.).\n   */\n  feed(input) {\n    this.lexer = new Lexer(input, this.settings);\n  }\n\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n  }\n\n  /**\n   * Start a new group nesting within all namespaces.\n   */\n  beginGroup() {\n    this.macros.beginGroup();\n  }\n\n  /**\n   * End current group nesting within all namespaces.\n   */\n  endGroup() {\n    this.macros.endGroup();\n  }\n\n  /**\n   * Returns the topmost token on the stack, without expanding it.\n   * Similar in behavior to TeX's `\\futurelet`.\n   */\n  future() {\n    if (this.stack.length === 0) {\n      this.pushToken(this.lexer.lex());\n    }\n    return this.stack[this.stack.length - 1]\n  }\n\n  /**\n   * Remove and return the next unexpanded token.\n   */\n  popToken() {\n    this.future(); // ensure non-empty stack\n    return this.stack.pop();\n  }\n\n  /**\n   * Add a given token to the token stack.  In particular, this get be used\n   * to put back a token returned from one of the other methods.\n   */\n  pushToken(token) {\n    this.stack.push(token);\n  }\n\n  /**\n   * Append an array of tokens to the token stack.\n   */\n  pushTokens(tokens) {\n    this.stack.push(...tokens);\n  }\n\n  /**\n   * Find an macro argument without expanding tokens and append the array of\n   * tokens to the token stack. Uses Token as a container for the result.\n   */\n  scanArgument(isOptional) {\n    let start;\n    let end;\n    let tokens;\n    if (isOptional) {\n      this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n      if (this.future().text !== \"[\") {\n        return null;\n      }\n      start = this.popToken(); // don't include [ in tokens\n      ({ tokens, end } = this.consumeArg([\"]\"]));\n    } else {\n      ({ tokens, start, end } = this.consumeArg());\n    }\n\n    // indicate the end of an argument\n    this.pushToken(new Token(\"EOF\", end.loc));\n\n    this.pushTokens(tokens);\n    return new Token(\"\", SourceLocation.range(start, end));\n  }\n\n  /**\n   * Consume all following space tokens, without expansion.\n   */\n  consumeSpaces() {\n    for (;;) {\n      const token = this.future();\n      if (token.text === \" \") {\n        this.stack.pop();\n      } else {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Consume an argument from the token stream, and return the resulting array\n   * of tokens and start/end token.\n   */\n  consumeArg(delims) {\n    // The argument for a delimited parameter is the shortest (possibly\n    // empty) sequence of tokens with properly nested {...} groups that is\n    // followed ... by this particular list of non-parameter tokens.\n    // The argument for an undelimited parameter is the next nonblank\n    // token, unless that token is ‘{’, when the argument will be the\n    // entire {...} group that follows.\n    const tokens = [];\n    const isDelimited = delims && delims.length > 0;\n    if (!isDelimited) {\n      // Ignore spaces between arguments.  As the TeXbook says:\n      // \"After you have said ‘\\def\\row#1#2{...}’, you are allowed to\n      //  put spaces between the arguments (e.g., ‘\\row x n’), because\n      //  TeX doesn’t use single spaces as undelimited arguments.\"\n      this.consumeSpaces();\n    }\n    const start = this.future();\n    let tok;\n    let depth = 0;\n    let match = 0;\n    do {\n      tok = this.popToken();\n      tokens.push(tok);\n      if (tok.text === \"{\") {\n        ++depth;\n      } else if (tok.text === \"}\") {\n        --depth;\n        if (depth === -1) {\n          throw new ParseError(\"Extra }\", tok);\n        }\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\n          \"Unexpected end of input in a macro argument\" +\n            \", expected '\" +\n            (delims && isDelimited ? delims[match] : \"}\") +\n            \"'\",\n          tok\n        );\n      }\n      if (delims && isDelimited) {\n        if ((depth === 0 || (depth === 1 && delims[match] === \"{\")) && tok.text === delims[match]) {\n          ++match;\n          if (match === delims.length) {\n            // don't include delims in tokens\n            tokens.splice(-match, match);\n            break;\n          }\n        } else {\n          match = 0;\n        }\n      }\n    } while (depth !== 0 || isDelimited);\n    // If the argument found ... has the form ‘{<nested tokens>}’,\n    // ... the outermost braces enclosing the argument are removed\n    if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n      tokens.pop();\n      tokens.shift();\n    }\n    tokens.reverse(); // to fit in with stack order\n    return { tokens, start, end: tok };\n  }\n\n  /**\n   * Consume the specified number of (delimited) arguments from the token\n   * stream and return the resulting array of arguments.\n   */\n  consumeArgs(numArgs, delimiters) {\n    if (delimiters) {\n      if (delimiters.length !== numArgs + 1) {\n        throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n      }\n      const delims = delimiters[0];\n      for (let i = 0; i < delims.length; i++) {\n        const tok = this.popToken();\n        if (delims[i] !== tok.text) {\n          throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n        }\n      }\n    }\n\n    const args = [];\n    for (let i = 0; i < numArgs; i++) {\n      args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens);\n    }\n    return args;\n  }\n\n  /**\n   * Expand the next token only once if possible.\n   *\n   * If the token is expanded, the resulting tokens will be pushed onto\n   * the stack in reverse order, and the number of such tokens will be\n   * returned.  This number might be zero or positive.\n   *\n   * If not, the return value is `false`, and the next token remains at the\n   * top of the stack.\n   *\n   * In either case, the next token will be on the top of the stack,\n   * or the stack will be empty (in case of empty expansion\n   * and no other tokens).\n   *\n   * Used to implement `expandAfterFuture` and `expandNextToken`.\n   *\n   * If expandableOnly, only expandable tokens are expanded and\n   * an undefined control sequence results in an error.\n   */\n  expandOnce(expandableOnly) {\n    const topToken = this.popToken();\n    const name = topToken.text;\n    const expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n    if (expansion == null || (expandableOnly && expansion.unexpandable)) {\n      if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n        throw new ParseError(\"Undefined control sequence: \" + name);\n      }\n      this.pushToken(topToken);\n      return false;\n    }\n    this.expansionCount++;\n    if (this.expansionCount > this.settings.maxExpand) {\n      throw new ParseError(\n        \"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\"\n      );\n    }\n    let tokens = expansion.tokens;\n    const args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n    if (expansion.numArgs) {\n      // paste arguments in place of the placeholders\n      tokens = tokens.slice(); // make a shallow copy\n      for (let i = tokens.length - 1; i >= 0; --i) {\n        let tok = tokens[i];\n        if (tok.text === \"#\") {\n          if (i === 0) {\n            throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n          }\n          tok = tokens[--i]; // next token on stack\n          if (tok.text === \"#\") {\n            // ## → #\n            tokens.splice(i + 1, 1); // drop first #\n          } else if (/^[1-9]$/.test(tok.text)) {\n            // replace the placeholder with the indicated argument\n            tokens.splice(i, 2, ...args[+tok.text - 1]);\n          } else {\n            throw new ParseError(\"Not a valid argument number\", tok);\n          }\n        }\n      }\n    }\n    // Concatenate expansion onto top of stack.\n    this.pushTokens(tokens);\n    return tokens.length;\n  }\n\n  /**\n   * Expand the next token only once (if possible), and return the resulting\n   * top token on the stack (without removing anything from the stack).\n   * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n   * Equivalent to expandOnce() followed by future().\n   */\n  expandAfterFuture() {\n    this.expandOnce();\n    return this.future();\n  }\n\n  /**\n   * Recursively expand first token, then return first non-expandable token.\n   */\n  expandNextToken() {\n    for (;;) {\n      if (this.expandOnce() === false) { // fully expanded\n        const token = this.stack.pop();\n        // The token after \\noexpand is interpreted as if its meaning were ‘\\relax’\n        if (token.treatAsRelax) {\n          token.text = \"\\\\relax\";\n        }\n        return token\n      }\n    }\n\n    // This pathway is impossible.\n    throw new Error(); // eslint-disable-line no-unreachable\n  }\n\n  /**\n   * Fully expand the given macro name and return the resulting list of\n   * tokens, or return `undefined` if no such macro is defined.\n   */\n  expandMacro(name) {\n    return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n  }\n\n  /**\n   * Fully expand the given token stream and return the resulting list of\n   * tokens.  Note that the input tokens are in reverse order, but the\n   * output tokens are in forward order.\n   */\n  expandTokens(tokens) {\n    const output = [];\n    const oldStackLength = this.stack.length;\n    this.pushTokens(tokens);\n    while (this.stack.length > oldStackLength) {\n      // Expand only expandable tokens\n      if (this.expandOnce(true) === false) {  // fully expanded\n        const token = this.stack.pop();\n        if (token.treatAsRelax) {\n          // the expansion of \\noexpand is the token itself\n          token.noexpand = false;\n          token.treatAsRelax = false;\n        }\n        output.push(token);\n      }\n    }\n    return output;\n  }\n\n  /**\n   * Fully expand the given macro name and return the result as a string,\n   * or return `undefined` if no such macro is defined.\n   */\n  expandMacroAsText(name) {\n    const tokens = this.expandMacro(name);\n    if (tokens) {\n      return tokens.map((token) => token.text).join(\"\");\n    } else {\n      return tokens;\n    }\n  }\n\n  /**\n   * Returns the expanded macro as a reversed array of tokens and a macro\n   * argument count.  Or returns `null` if no such macro.\n   */\n  _getExpansion(name) {\n    const definition = this.macros.get(name);\n    if (definition == null) {\n      // mainly checking for undefined here\n      return definition;\n    }\n    // If a single character has an associated catcode other than 13\n    // (active character), then don't expand it.\n    if (name.length === 1) {\n      const catcode = this.lexer.catcodes[name];\n      if (catcode != null && catcode !== 13) {\n        return\n      }\n    }\n    const expansion = typeof definition === \"function\" ? definition(this) : definition;\n    if (typeof expansion === \"string\") {\n      let numArgs = 0;\n      if (expansion.indexOf(\"#\") !== -1) {\n        const stripped = expansion.replace(/##/g, \"\");\n        while (stripped.indexOf(\"#\" + (numArgs + 1)) !== -1) {\n          ++numArgs;\n        }\n      }\n      const bodyLexer = new Lexer(expansion, this.settings);\n      const tokens = [];\n      let tok = bodyLexer.lex();\n      while (tok.text !== \"EOF\") {\n        tokens.push(tok);\n        tok = bodyLexer.lex();\n      }\n      tokens.reverse(); // to fit in with stack using push and pop\n      const expanded = { tokens, numArgs };\n      return expanded;\n    }\n\n    return expansion;\n  }\n\n  /**\n   * Determine whether a command is currently \"defined\" (has some\n   * functionality), meaning that it's a macro (in the current group),\n   * a function, a symbol, or one of the special commands listed in\n   * `implicitCommands`.\n   */\n  isDefined(name) {\n    return (\n      this.macros.has(name) ||\n      Object.prototype.hasOwnProperty.call(functions, name ) ||\n      Object.prototype.hasOwnProperty.call(symbols.math, name ) ||\n      Object.prototype.hasOwnProperty.call(symbols.text, name ) ||\n      Object.prototype.hasOwnProperty.call(implicitCommands, name )\n    );\n  }\n\n  /**\n   * Determine whether a command is expandable.\n   */\n  isExpandable(name) {\n    const macro = this.macros.get(name);\n    return macro != null\n      ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable\n      : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive;\n  }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\n\nconst unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\n\nconst uSubsAndSups = Object.freeze({\n  '₊': '+',\n  '₋': '-',\n  '₌': '=',\n  '₍': '(',\n  '₎': ')',\n  '₀': '0',\n  '₁': '1',\n  '₂': '2',\n  '₃': '3',\n  '₄': '4',\n  '₅': '5',\n  '₆': '6',\n  '₇': '7',\n  '₈': '8',\n  '₉': '9',\n  '\\u2090': 'a',\n  '\\u2091': 'e',\n  '\\u2095': 'h',\n  '\\u1D62': 'i',\n  '\\u2C7C': 'j',\n  '\\u2096': 'k',\n  '\\u2097': 'l',\n  '\\u2098': 'm',\n  '\\u2099': 'n',\n  '\\u2092': 'o',\n  '\\u209A': 'p',\n  '\\u1D63': 'r',\n  '\\u209B': 's',\n  '\\u209C': 't',\n  '\\u1D64': 'u',\n  '\\u1D65': 'v',\n  '\\u2093': 'x',\n  '\\u1D66': 'β',\n  '\\u1D67': 'γ',\n  '\\u1D68': 'ρ',\n  '\\u1D69': '\\u03d5',\n  '\\u1D6A': 'χ',\n  '⁺': '+',\n  '⁻': '-',\n  '⁼': '=',\n  '⁽': '(',\n  '⁾': ')',\n  '⁰': '0',\n  '¹': '1',\n  '²': '2',\n  '³': '3',\n  '⁴': '4',\n  '⁵': '5',\n  '⁶': '6',\n  '⁷': '7',\n  '⁸': '8',\n  '⁹': '9',\n  '\\u1D2C': 'A',\n  '\\u1D2E': 'B',\n  '\\u1D30': 'D',\n  '\\u1D31': 'E',\n  '\\u1D33': 'G',\n  '\\u1D34': 'H',\n  '\\u1D35': 'I',\n  '\\u1D36': 'J',\n  '\\u1D37': 'K',\n  '\\u1D38': 'L',\n  '\\u1D39': 'M',\n  '\\u1D3A': 'N',\n  '\\u1D3C': 'O',\n  '\\u1D3E': 'P',\n  '\\u1D3F': 'R',\n  '\\u1D40': 'T',\n  '\\u1D41': 'U',\n  '\\u2C7D': 'V',\n  '\\u1D42': 'W',\n  '\\u1D43': 'a',\n  '\\u1D47': 'b',\n  '\\u1D9C': 'c',\n  '\\u1D48': 'd',\n  '\\u1D49': 'e',\n  '\\u1DA0': 'f',\n  '\\u1D4D': 'g',\n  '\\u02B0': 'h',\n  '\\u2071': 'i',\n  '\\u02B2': 'j',\n  '\\u1D4F': 'k',\n  '\\u02E1': 'l',\n  '\\u1D50': 'm',\n  '\\u207F': 'n',\n  '\\u1D52': 'o',\n  '\\u1D56': 'p',\n  '\\u02B3': 'r',\n  '\\u02E2': 's',\n  '\\u1D57': 't',\n  '\\u1D58': 'u',\n  '\\u1D5B': 'v',\n  '\\u02B7': 'w',\n  '\\u02E3': 'x',\n  '\\u02B8': 'y',\n  '\\u1DBB': 'z',\n  '\\u1D5D': 'β',\n  '\\u1D5E': 'γ',\n  '\\u1D5F': 'δ',\n  '\\u1D60': '\\u03d5',\n  '\\u1D61': 'χ',\n  '\\u1DBF': 'θ'\n});\n\n// Used for Unicode input of calligraphic and script letters\nconst asciiFromScript = Object.freeze({\n  \"\\ud835\\udc9c\": \"A\",\n  \"\\u212c\": \"B\",\n  \"\\ud835\\udc9e\": \"C\",\n  \"\\ud835\\udc9f\": \"D\",\n  \"\\u2130\": \"E\",\n  \"\\u2131\": \"F\",\n  \"\\ud835\\udca2\": \"G\",\n  \"\\u210B\": \"H\",\n  \"\\u2110\": \"I\",\n  \"\\ud835\\udca5\": \"J\",\n  \"\\ud835\\udca6\": \"K\",\n  \"\\u2112\": \"L\",\n  \"\\u2133\": \"M\",\n  \"\\ud835\\udca9\": \"N\",\n  \"\\ud835\\udcaa\": \"O\",\n  \"\\ud835\\udcab\": \"P\",\n  \"\\ud835\\udcac\": \"Q\",\n  \"\\u211B\": \"R\",\n  \"\\ud835\\udcae\": \"S\",\n  \"\\ud835\\udcaf\": \"T\",\n  \"\\ud835\\udcb0\": \"U\",\n  \"\\ud835\\udcb1\": \"V\",\n  \"\\ud835\\udcb2\": \"W\",\n  \"\\ud835\\udcb3\": \"X\",\n  \"\\ud835\\udcb4\": \"Y\",\n  \"\\ud835\\udcb5\": \"Z\"\n});\n\n// Mapping of Unicode accent characters to their LaTeX equivalent in text and\n// math mode (when they exist).\nvar unicodeAccents = {\n  \"\\u0301\": { text: \"\\\\'\", math: \"\\\\acute\" },\n  \"\\u0300\": { text: \"\\\\`\", math: \"\\\\grave\" },\n  \"\\u0308\": { text: '\\\\\"', math: \"\\\\ddot\" },\n  \"\\u0303\": { text: \"\\\\~\", math: \"\\\\tilde\" },\n  \"\\u0304\": { text: \"\\\\=\", math: \"\\\\bar\" },\n  \"\\u0306\": { text: \"\\\\u\", math: \"\\\\breve\" },\n  \"\\u030c\": { text: \"\\\\v\", math: \"\\\\check\" },\n  \"\\u0302\": { text: \"\\\\^\", math: \"\\\\hat\" },\n  \"\\u0307\": { text: \"\\\\.\", math: \"\\\\dot\" },\n  \"\\u030a\": { text: \"\\\\r\", math: \"\\\\mathring\" },\n  \"\\u030b\": { text: \"\\\\H\" },\n  '\\u0327': { text: '\\\\c' }\n};\n\nvar unicodeSymbols = {\n  \"á\": \"á\",\n  \"à\": \"à\",\n  \"ä\": \"ä\",\n  \"ǟ\": \"ǟ\",\n  \"ã\": \"ã\",\n  \"ā\": \"ā\",\n  \"ă\": \"ă\",\n  \"ắ\": \"ắ\",\n  \"ằ\": \"ằ\",\n  \"ẵ\": \"ẵ\",\n  \"ǎ\": \"ǎ\",\n  \"â\": \"â\",\n  \"ấ\": \"ấ\",\n  \"ầ\": \"ầ\",\n  \"ẫ\": \"ẫ\",\n  \"ȧ\": \"ȧ\",\n  \"ǡ\": \"ǡ\",\n  \"å\": \"å\",\n  \"ǻ\": \"ǻ\",\n  \"ḃ\": \"ḃ\",\n  \"ć\": \"ć\",\n  \"č\": \"č\",\n  \"ĉ\": \"ĉ\",\n  \"ċ\": \"ċ\",\n  \"ď\": \"ď\",\n  \"ḋ\": \"ḋ\",\n  \"é\": \"é\",\n  \"è\": \"è\",\n  \"ë\": \"ë\",\n  \"ẽ\": \"ẽ\",\n  \"ē\": \"ē\",\n  \"ḗ\": \"ḗ\",\n  \"ḕ\": \"ḕ\",\n  \"ĕ\": \"ĕ\",\n  \"ě\": \"ě\",\n  \"ê\": \"ê\",\n  \"ế\": \"ế\",\n  \"ề\": \"ề\",\n  \"ễ\": \"ễ\",\n  \"ė\": \"ė\",\n  \"ḟ\": \"ḟ\",\n  \"ǵ\": \"ǵ\",\n  \"ḡ\": \"ḡ\",\n  \"ğ\": \"ğ\",\n  \"ǧ\": \"ǧ\",\n  \"ĝ\": \"ĝ\",\n  \"ġ\": \"ġ\",\n  \"ḧ\": \"ḧ\",\n  \"ȟ\": \"ȟ\",\n  \"ĥ\": \"ĥ\",\n  \"ḣ\": \"ḣ\",\n  \"í\": \"í\",\n  \"ì\": \"ì\",\n  \"ï\": \"ï\",\n  \"ḯ\": \"ḯ\",\n  \"ĩ\": \"ĩ\",\n  \"ī\": \"ī\",\n  \"ĭ\": \"ĭ\",\n  \"ǐ\": \"ǐ\",\n  \"î\": \"î\",\n  \"ǰ\": \"ǰ\",\n  \"ĵ\": \"ĵ\",\n  \"ḱ\": \"ḱ\",\n  \"ǩ\": \"ǩ\",\n  \"ĺ\": \"ĺ\",\n  \"ľ\": \"ľ\",\n  \"ḿ\": \"ḿ\",\n  \"ṁ\": \"ṁ\",\n  \"ń\": \"ń\",\n  \"ǹ\": \"ǹ\",\n  \"ñ\": \"ñ\",\n  \"ň\": \"ň\",\n  \"ṅ\": \"ṅ\",\n  \"ó\": \"ó\",\n  \"ò\": \"ò\",\n  \"ö\": \"ö\",\n  \"ȫ\": \"ȫ\",\n  \"õ\": \"õ\",\n  \"ṍ\": \"ṍ\",\n  \"ṏ\": \"ṏ\",\n  \"ȭ\": \"ȭ\",\n  \"ō\": \"ō\",\n  \"ṓ\": \"ṓ\",\n  \"ṑ\": \"ṑ\",\n  \"ŏ\": \"ŏ\",\n  \"ǒ\": \"ǒ\",\n  \"ô\": \"ô\",\n  \"ố\": \"ố\",\n  \"ồ\": \"ồ\",\n  \"ỗ\": \"ỗ\",\n  \"ȯ\": \"ȯ\",\n  \"ȱ\": \"ȱ\",\n  \"ő\": \"ő\",\n  \"ṕ\": \"ṕ\",\n  \"ṗ\": \"ṗ\",\n  \"ŕ\": \"ŕ\",\n  \"ř\": \"ř\",\n  \"ṙ\": \"ṙ\",\n  \"ś\": \"ś\",\n  \"ṥ\": \"ṥ\",\n  \"š\": \"š\",\n  \"ṧ\": \"ṧ\",\n  \"ŝ\": \"ŝ\",\n  \"ṡ\": \"ṡ\",\n  \"ẗ\": \"ẗ\",\n  \"ť\": \"ť\",\n  \"ṫ\": \"ṫ\",\n  \"ú\": \"ú\",\n  \"ù\": \"ù\",\n  \"ü\": \"ü\",\n  \"ǘ\": \"ǘ\",\n  \"ǜ\": \"ǜ\",\n  \"ǖ\": \"ǖ\",\n  \"ǚ\": \"ǚ\",\n  \"ũ\": \"ũ\",\n  \"ṹ\": \"ṹ\",\n  \"ū\": \"ū\",\n  \"ṻ\": \"ṻ\",\n  \"ŭ\": \"ŭ\",\n  \"ǔ\": \"ǔ\",\n  \"û\": \"û\",\n  \"ů\": \"ů\",\n  \"ű\": \"ű\",\n  \"ṽ\": \"ṽ\",\n  \"ẃ\": \"ẃ\",\n  \"ẁ\": \"ẁ\",\n  \"ẅ\": \"ẅ\",\n  \"ŵ\": \"ŵ\",\n  \"ẇ\": \"ẇ\",\n  \"ẘ\": \"ẘ\",\n  \"ẍ\": \"ẍ\",\n  \"ẋ\": \"ẋ\",\n  \"ý\": \"ý\",\n  \"ỳ\": \"ỳ\",\n  \"ÿ\": \"ÿ\",\n  \"ỹ\": \"ỹ\",\n  \"ȳ\": \"ȳ\",\n  \"ŷ\": \"ŷ\",\n  \"ẏ\": \"ẏ\",\n  \"ẙ\": \"ẙ\",\n  \"ź\": \"ź\",\n  \"ž\": \"ž\",\n  \"ẑ\": \"ẑ\",\n  \"ż\": \"ż\",\n  \"Á\": \"Á\",\n  \"À\": \"À\",\n  \"Ä\": \"Ä\",\n  \"Ǟ\": \"Ǟ\",\n  \"Ã\": \"Ã\",\n  \"Ā\": \"Ā\",\n  \"Ă\": \"Ă\",\n  \"Ắ\": \"Ắ\",\n  \"Ằ\": \"Ằ\",\n  \"Ẵ\": \"Ẵ\",\n  \"Ǎ\": \"Ǎ\",\n  \"Â\": \"Â\",\n  \"Ấ\": \"Ấ\",\n  \"Ầ\": \"Ầ\",\n  \"Ẫ\": \"Ẫ\",\n  \"Ȧ\": \"Ȧ\",\n  \"Ǡ\": \"Ǡ\",\n  \"Å\": \"Å\",\n  \"Ǻ\": \"Ǻ\",\n  \"Ḃ\": \"Ḃ\",\n  \"Ć\": \"Ć\",\n  \"Č\": \"Č\",\n  \"Ĉ\": \"Ĉ\",\n  \"Ċ\": \"Ċ\",\n  \"Ď\": \"Ď\",\n  \"Ḋ\": \"Ḋ\",\n  \"É\": \"É\",\n  \"È\": \"È\",\n  \"Ë\": \"Ë\",\n  \"Ẽ\": \"Ẽ\",\n  \"Ē\": \"Ē\",\n  \"Ḗ\": \"Ḗ\",\n  \"Ḕ\": \"Ḕ\",\n  \"Ĕ\": \"Ĕ\",\n  \"Ě\": \"Ě\",\n  \"Ê\": \"Ê\",\n  \"Ế\": \"Ế\",\n  \"Ề\": \"Ề\",\n  \"Ễ\": \"Ễ\",\n  \"Ė\": \"Ė\",\n  \"Ḟ\": \"Ḟ\",\n  \"Ǵ\": \"Ǵ\",\n  \"Ḡ\": \"Ḡ\",\n  \"Ğ\": \"Ğ\",\n  \"Ǧ\": \"Ǧ\",\n  \"Ĝ\": \"Ĝ\",\n  \"Ġ\": \"Ġ\",\n  \"Ḧ\": \"Ḧ\",\n  \"Ȟ\": \"Ȟ\",\n  \"Ĥ\": \"Ĥ\",\n  \"Ḣ\": \"Ḣ\",\n  \"Í\": \"Í\",\n  \"Ì\": \"Ì\",\n  \"Ï\": \"Ï\",\n  \"Ḯ\": \"Ḯ\",\n  \"Ĩ\": \"Ĩ\",\n  \"Ī\": \"Ī\",\n  \"Ĭ\": \"Ĭ\",\n  \"Ǐ\": \"Ǐ\",\n  \"Î\": \"Î\",\n  \"İ\": \"İ\",\n  \"Ĵ\": \"Ĵ\",\n  \"Ḱ\": \"Ḱ\",\n  \"Ǩ\": \"Ǩ\",\n  \"Ĺ\": \"Ĺ\",\n  \"Ľ\": \"Ľ\",\n  \"Ḿ\": \"Ḿ\",\n  \"Ṁ\": \"Ṁ\",\n  \"Ń\": \"Ń\",\n  \"Ǹ\": \"Ǹ\",\n  \"Ñ\": \"Ñ\",\n  \"Ň\": \"Ň\",\n  \"Ṅ\": \"Ṅ\",\n  \"Ó\": \"Ó\",\n  \"Ò\": \"Ò\",\n  \"Ö\": \"Ö\",\n  \"Ȫ\": \"Ȫ\",\n  \"Õ\": \"Õ\",\n  \"Ṍ\": \"Ṍ\",\n  \"Ṏ\": \"Ṏ\",\n  \"Ȭ\": \"Ȭ\",\n  \"Ō\": \"Ō\",\n  \"Ṓ\": \"Ṓ\",\n  \"Ṑ\": \"Ṑ\",\n  \"Ŏ\": \"Ŏ\",\n  \"Ǒ\": \"Ǒ\",\n  \"Ô\": \"Ô\",\n  \"Ố\": \"Ố\",\n  \"Ồ\": \"Ồ\",\n  \"Ỗ\": \"Ỗ\",\n  \"Ȯ\": \"Ȯ\",\n  \"Ȱ\": \"Ȱ\",\n  \"Ő\": \"Ő\",\n  \"Ṕ\": \"Ṕ\",\n  \"Ṗ\": \"Ṗ\",\n  \"Ŕ\": \"Ŕ\",\n  \"Ř\": \"Ř\",\n  \"Ṙ\": \"Ṙ\",\n  \"Ś\": \"Ś\",\n  \"Ṥ\": \"Ṥ\",\n  \"Š\": \"Š\",\n  \"Ṧ\": \"Ṧ\",\n  \"Ŝ\": \"Ŝ\",\n  \"Ṡ\": \"Ṡ\",\n  \"Ť\": \"Ť\",\n  \"Ṫ\": \"Ṫ\",\n  \"Ú\": \"Ú\",\n  \"Ù\": \"Ù\",\n  \"Ü\": \"Ü\",\n  \"Ǘ\": \"Ǘ\",\n  \"Ǜ\": \"Ǜ\",\n  \"Ǖ\": \"Ǖ\",\n  \"Ǚ\": \"Ǚ\",\n  \"Ũ\": \"Ũ\",\n  \"Ṹ\": \"Ṹ\",\n  \"Ū\": \"Ū\",\n  \"Ṻ\": \"Ṻ\",\n  \"Ŭ\": \"Ŭ\",\n  \"Ǔ\": \"Ǔ\",\n  \"Û\": \"Û\",\n  \"Ů\": \"Ů\",\n  \"Ű\": \"Ű\",\n  \"Ṽ\": \"Ṽ\",\n  \"Ẃ\": \"Ẃ\",\n  \"Ẁ\": \"Ẁ\",\n  \"Ẅ\": \"Ẅ\",\n  \"Ŵ\": \"Ŵ\",\n  \"Ẇ\": \"Ẇ\",\n  \"Ẍ\": \"Ẍ\",\n  \"Ẋ\": \"Ẋ\",\n  \"Ý\": \"Ý\",\n  \"Ỳ\": \"Ỳ\",\n  \"Ÿ\": \"Ÿ\",\n  \"Ỹ\": \"Ỹ\",\n  \"Ȳ\": \"Ȳ\",\n  \"Ŷ\": \"Ŷ\",\n  \"Ẏ\": \"Ẏ\",\n  \"Ź\": \"Ź\",\n  \"Ž\": \"Ž\",\n  \"Ẑ\": \"Ẑ\",\n  \"Ż\": \"Ż\",\n  \"ά\": \"ά\",\n  \"ὰ\": \"ὰ\",\n  \"ᾱ\": \"ᾱ\",\n  \"ᾰ\": \"ᾰ\",\n  \"έ\": \"έ\",\n  \"ὲ\": \"ὲ\",\n  \"ή\": \"ή\",\n  \"ὴ\": \"ὴ\",\n  \"ί\": \"ί\",\n  \"ὶ\": \"ὶ\",\n  \"ϊ\": \"ϊ\",\n  \"ΐ\": \"ΐ\",\n  \"ῒ\": \"ῒ\",\n  \"ῑ\": \"ῑ\",\n  \"ῐ\": \"ῐ\",\n  \"ό\": \"ό\",\n  \"ὸ\": \"ὸ\",\n  \"ύ\": \"ύ\",\n  \"ὺ\": \"ὺ\",\n  \"ϋ\": \"ϋ\",\n  \"ΰ\": \"ΰ\",\n  \"ῢ\": \"ῢ\",\n  \"ῡ\": \"ῡ\",\n  \"ῠ\": \"ῠ\",\n  \"ώ\": \"ώ\",\n  \"ὼ\": \"ὼ\",\n  \"Ύ\": \"Ύ\",\n  \"Ὺ\": \"Ὺ\",\n  \"Ϋ\": \"Ϋ\",\n  \"Ῡ\": \"Ῡ\",\n  \"Ῠ\": \"Ῠ\",\n  \"Ώ\": \"Ώ\",\n  \"Ὼ\": \"Ὼ\"\n};\n\n/* eslint no-constant-condition:0 */\n\nconst binLeftCancellers = [\"bin\", \"op\", \"open\", \"punct\", \"rel\"];\nconst sizeRegEx = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst textRegEx = /^ *\\\\text/;\n\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\n\nclass Parser {\n  constructor(input, settings, isPreamble = false) {\n    // Start in math mode\n    this.mode = \"math\";\n    // Create a new macro expander (gullet) and (indirectly via that) also a\n    // new lexer (mouth) for this parser (stomach, in the language of TeX)\n    this.gullet = new MacroExpander(input, settings, this.mode);\n    // Store the settings for use in parsing\n    this.settings = settings;\n    // Are we defining a preamble?\n    this.isPreamble = isPreamble;\n    // Count leftright depth (for \\middle errors)\n    this.leftrightDepth = 0;\n    this.prevAtomType = \"\";\n  }\n\n  /**\n   * Checks a result to make sure it has the right type, and throws an\n   * appropriate error otherwise.\n   */\n  expect(text, consume = true) {\n    if (this.fetch().text !== text) {\n      throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch());\n    }\n    if (consume) {\n      this.consume();\n    }\n  }\n\n  /**\n   * Discards the current lookahead token, considering it consumed.\n   */\n  consume() {\n    this.nextToken = null;\n  }\n\n  /**\n   * Return the current lookahead token, or if there isn't one (at the\n   * beginning, or if the previous lookahead token was consume()d),\n   * fetch the next token as the new lookahead token and return it.\n   */\n  fetch() {\n    if (this.nextToken == null) {\n      this.nextToken = this.gullet.expandNextToken();\n    }\n    return this.nextToken;\n  }\n\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n    this.gullet.switchMode(newMode);\n  }\n\n  /**\n   * Main parsing function, which parses an entire input.\n   */\n  parse() {\n    // Create a group namespace for every $...$, $$...$$, \\[...\\].)\n    // A \\def is then valid only within that pair of delimiters.\n    this.gullet.beginGroup();\n\n    if (this.settings.colorIsTextColor) {\n      // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n      // We do this within the group for the math expression, so it doesn't\n      // pollute settings.macros.\n      this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n    }\n\n    // Try to parse the input\n    const parse = this.parseExpression(false);\n\n    // If we succeeded, make sure there's an EOF at the end\n    this.expect(\"EOF\");\n\n    if (this.isPreamble) {\n      const macros = Object.create(null);\n      Object.entries(this.gullet.macros.current).forEach(([key, value]) => {\n        macros[key] = value;\n      });\n      this.gullet.endGroup();\n      return macros\n    }\n\n    // The only local macro that we want to save is from \\tag.\n    const tag = this.gullet.macros.get(\"\\\\df@tag\");\n\n    // End the group namespace for the expression\n    this.gullet.endGroup();\n\n    if (tag) { this.gullet.macros.current[\"\\\\df@tag\"] = tag; }\n\n    return parse;\n  }\n\n  static get endOfExpression() {\n    return [\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"\\\\endtoggle\", \"&\"];\n  }\n\n  /**\n   * Fully parse a separate sequence of tokens as a separate job.\n   * Tokens should be specified in reverse order, as in a MacroDefinition.\n   */\n  subparse(tokens) {\n    // Save the next token from the current job.\n    const oldToken = this.nextToken;\n    this.consume();\n\n    // Run the new job, terminating it with an excess '}'\n    this.gullet.pushToken(new Token(\"}\"));\n    this.gullet.pushTokens(tokens);\n    const parse = this.parseExpression(false);\n    this.expect(\"}\");\n\n    // Restore the next token from the current job.\n    this.nextToken = oldToken;\n\n    return parse;\n  }\n\n/**\n   * Parses an \"expression\", which is a list of atoms.\n   *\n   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n   *                 happens when functions have higher precedence than infix\n   *                 nodes in implicit parses.\n   *\n   * `breakOnTokenText`: The text of the token that the expression should end\n   *                     with, or `null` if something else should end the\n   *                     expression.\n   *\n   * `breakOnMiddle`: \\color, \\over, and old styling functions work on an implicit group.\n   *                  These groups end just before the usual tokens, but they also\n   *                  end just before `\\middle`.\n   */\n  parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) {\n    const body = [];\n    this.prevAtomType = \"\";\n    // Keep adding atoms to the body until we can't parse any more atoms (either\n    // we reached the end, a }, or a \\right)\n    while (true) {\n      // Ignore spaces in math mode\n      if (this.mode === \"math\") {\n        this.consumeSpaces();\n      }\n      const lex = this.fetch();\n      if (Parser.endOfExpression.indexOf(lex.text) !== -1) {\n        break;\n      }\n      if (breakOnTokenText && lex.text === breakOnTokenText) {\n        break;\n      }\n      if (breakOnMiddle && lex.text === \"\\\\middle\") {\n        break\n      }\n      if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n        break;\n      }\n      const atom = this.parseAtom(breakOnTokenText);\n      if (!atom) {\n        break;\n      } else if (atom.type === \"internal\") {\n        // Internal nodes do not appear in parse tree\n        continue;\n      }\n      body.push(atom);\n      // Keep a record of the atom type, so that op.js can set correct spacing.\n      this.prevAtomType = atom.type === \"atom\" ? atom.family : atom.type;\n    }\n    if (this.mode === \"text\") {\n      this.formLigatures(body);\n    }\n    return this.handleInfixNodes(body);\n  }\n\n  /**\n   * Rewrites infix operators such as \\over with corresponding commands such\n   * as \\frac.\n   *\n   * There can only be one infix operator per group.  If there's more than one\n   * then the expression is ambiguous.  This can be resolved by adding {}.\n   */\n  handleInfixNodes(body) {\n    let overIndex = -1;\n    let funcName;\n\n    for (let i = 0; i < body.length; i++) {\n      if (body[i].type === \"infix\") {\n        if (overIndex !== -1) {\n          throw new ParseError(\"only one infix operator per group\", body[i].token);\n        }\n        overIndex = i;\n        funcName = body[i].replaceWith;\n      }\n    }\n\n    if (overIndex !== -1 && funcName) {\n      let numerNode;\n      let denomNode;\n\n      const numerBody = body.slice(0, overIndex);\n      const denomBody = body.slice(overIndex + 1);\n\n      if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n        numerNode = numerBody[0];\n      } else {\n        numerNode = { type: \"ordgroup\", mode: this.mode, body: numerBody };\n      }\n\n      if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n        denomNode = denomBody[0];\n      } else {\n        denomNode = { type: \"ordgroup\", mode: this.mode, body: denomBody };\n      }\n\n      let node;\n      if (funcName === \"\\\\\\\\abovefrac\") {\n        node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n      } else {\n        node = this.callFunction(funcName, [numerNode, denomNode], []);\n      }\n      return [node];\n    } else {\n      return body;\n    }\n  }\n\n  /**\n   * Handle a subscript or superscript with nice errors.\n   */\n  handleSupSubscript(\n    name // For error reporting.\n  ) {\n    const symbolToken = this.fetch();\n    const symbol = symbolToken.text;\n    this.consume();\n    this.consumeSpaces(); // ignore spaces before sup/subscript argument\n    // Skip over allowed internal nodes such as \\relax\n    let group;\n    do {\n      group = this.parseGroup(name);\n    } while (group.type && group.type === \"internal\")\n\n    if (!group) {\n      throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n    }\n\n    return group;\n  }\n\n  /**\n   * Converts the textual input of an unsupported command into a text node\n   * contained within a color node whose color is determined by errorColor\n   */\n  formatUnsupportedCmd(text) {\n    const textordArray = [];\n\n    for (let i = 0; i < text.length; i++) {\n      textordArray.push({ type: \"textord\", mode: \"text\", text: text[i] });\n    }\n\n    const textNode = {\n      type: \"text\",\n      mode: this.mode,\n      body: textordArray\n    };\n\n    const colorNode = {\n      type: \"color\",\n      mode: this.mode,\n      color: this.settings.errorColor,\n      body: [textNode]\n    };\n\n    return colorNode;\n  }\n\n  /**\n   * Parses a group with optional super/subscripts.\n   */\n  parseAtom(breakOnTokenText) {\n    // The body of an atom is an implicit group, so that things like\n    // \\left(x\\right)^2 work correctly.\n    const base = this.parseGroup(\"atom\", breakOnTokenText);\n\n    // Internal nodes (e.g. \\relax) cannot support super/subscripts.\n    // Instead we will pick up super/subscripts with blank base next round.\n    if (base && base.type === \"internal\") {\n      return base\n    }\n\n    // In text mode, we don't have superscripts or subscripts\n    if (this.mode === \"text\") {\n      return base\n    }\n\n    // Note that base may be empty (i.e. null) at this point.\n\n    let superscript;\n    let subscript;\n    while (true) {\n      // Guaranteed in math mode, so eat any spaces first.\n      this.consumeSpaces();\n\n      // Lex the first token\n      const lex = this.fetch();\n\n      if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n        // We got a limit control\n        if (base && base.type === \"op\") {\n          const limits = lex.text === \"\\\\limits\";\n          base.limits = limits;\n          base.alwaysHandleSupSub = true;\n        } else if (base && base.type === \"operatorname\") {\n          if (base.alwaysHandleSupSub) {\n            base.limits = lex.text === \"\\\\limits\";\n          }\n        } else {\n          throw new ParseError(\"Limit controls must follow a math operator\", lex);\n        }\n        this.consume();\n      } else if (lex.text === \"^\") {\n        // We got a superscript start\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        superscript = this.handleSupSubscript(\"superscript\");\n      } else if (lex.text === \"_\") {\n        // We got a subscript start\n        if (subscript) {\n          throw new ParseError(\"Double subscript\", lex);\n        }\n        subscript = this.handleSupSubscript(\"subscript\");\n      } else if (lex.text === \"'\") {\n        // We got a prime\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        const prime = { type: \"textord\", mode: this.mode, text: \"\\\\prime\" };\n\n        // Many primes can be grouped together, so we handle this here\n        const primes = [prime];\n        this.consume();\n        // Keep lexing tokens until we get something that's not a prime\n        while (this.fetch().text === \"'\") {\n          // For each one, add another prime to the list\n          primes.push(prime);\n          this.consume();\n        }\n        // If there's a superscript following the primes, combine that\n        // superscript in with the primes.\n        if (this.fetch().text === \"^\") {\n          primes.push(this.handleSupSubscript(\"superscript\"));\n        }\n        // Put everything into an ordgroup as the superscript\n        superscript = { type: \"ordgroup\", mode: this.mode, body: primes };\n      } else if (uSubsAndSups[lex.text]) {\n        // A Unicode subscript or superscript character.\n        // We treat these similarly to the unicode-math package.\n        // So we render a string of Unicode (sub|super)scripts the\n        // same as a (sub|super)script of regular characters.\n        const isSub = unicodeSubRegEx.test(lex.text);\n        const subsupTokens = [];\n        subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n        this.consume();\n        // Continue fetching tokens to fill out the group.\n        while (true) {\n          const token = this.fetch().text;\n          if (!(uSubsAndSups[token])) { break }\n          if (unicodeSubRegEx.test(token) !== isSub) { break }\n          subsupTokens.unshift(new Token(uSubsAndSups[token]));\n          this.consume();\n        }\n        // Now create a (sub|super)script.\n        const body = this.subparse(subsupTokens);\n        if (isSub) {\n          subscript = { type: \"ordgroup\", mode: \"math\", body };\n        } else {\n          superscript = { type: \"ordgroup\", mode: \"math\", body };\n        }\n      } else {\n        // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts\n        break;\n      }\n    }\n\n    if (superscript || subscript) {\n      if (base && base.type === \"multiscript\" && !base.postscripts) {\n        // base is the result of a \\prescript function.\n        // Write the sub- & superscripts into the multiscript element.\n        base.postscripts = { sup: superscript, sub: subscript };\n        return base\n      } else {\n        // We got either a superscript or subscript, create a supsub\n        const isFollowedByDelimiter = (!base || base.type !== \"op\" && base.type !== \"operatorname\")\n          ? undefined\n          : isDelimiter(this.nextToken.text);\n        return {\n          type: \"supsub\",\n          mode: this.mode,\n          base: base,\n          sup: superscript,\n          sub: subscript,\n          isFollowedByDelimiter\n        }\n      }\n    } else {\n      // Otherwise return the original body\n      return base;\n    }\n  }\n\n  /**\n   * Parses an entire function, including its base and all of its arguments.\n   */\n  parseFunction(\n    breakOnTokenText,\n    name // For determining its context\n  ) {\n    const token = this.fetch();\n    const func = token.text;\n    const funcData = functions[func];\n    if (!funcData) {\n      return null;\n    }\n    this.consume(); // consume command token\n\n    if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n      throw new ParseError(\n        \"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"),\n        token\n      );\n    } else if (this.mode === \"text\" && !funcData.allowedInText) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n    } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n    }\n\n    const prevAtomType = this.prevAtomType;\n    const { args, optArgs } = this.parseArguments(func, funcData);\n    this.prevAtomType = prevAtomType;\n    return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n  }\n\n  /**\n   * Call a function handler with a suitable context and arguments.\n   */\n  callFunction(name, args, optArgs, token, breakOnTokenText) {\n    const context = {\n      funcName: name,\n      parser: this,\n      token,\n      breakOnTokenText\n    };\n    const func = functions[name];\n    if (func && func.handler) {\n      return func.handler(context, args, optArgs);\n    } else {\n      throw new ParseError(`No function handler for ${name}`);\n    }\n  }\n\n  /**\n   * Parses the arguments of a function or environment\n   */\n  parseArguments(\n    func, // Should look like \"\\name\" or \"\\begin{name}\".\n    funcData\n  ) {\n    const totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n    if (totalArgs === 0) {\n      return { args: [], optArgs: [] };\n    }\n\n    const args = [];\n    const optArgs = [];\n\n    for (let i = 0; i < totalArgs; i++) {\n      let argType = funcData.argTypes && funcData.argTypes[i];\n      const isOptional = i < funcData.numOptionalArgs;\n\n      if (\n        (funcData.primitive && argType == null) ||\n        // \\sqrt expands into primitive if optional argument doesn't exist\n        (funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null)\n      ) {\n        argType = \"primitive\";\n      }\n\n      const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional);\n      if (isOptional) {\n        optArgs.push(arg);\n      } else if (arg != null) {\n        args.push(arg);\n      } else {\n        // should be unreachable\n        throw new ParseError(\"Null argument, please report this as a bug\");\n      }\n    }\n\n    return { args, optArgs };\n  }\n\n  /**\n   * Parses a group when the mode is changing.\n   */\n  parseGroupOfType(name, type, optional) {\n    switch (type) {\n      case \"size\":\n        return this.parseSizeGroup(optional);\n      case \"url\":\n        return this.parseUrlGroup(optional);\n      case \"math\":\n      case \"text\":\n        return this.parseArgumentGroup(optional, type);\n      case \"hbox\": {\n        // hbox argument type wraps the argument in the equivalent of\n        // \\hbox, which is like \\text but switching to \\textstyle size.\n        const group = this.parseArgumentGroup(optional, \"text\");\n        return group != null\n          ? {\n            type: \"styling\",\n            mode: group.mode,\n            body: [group],\n            scriptLevel: \"text\" // simulate \\textstyle\n          }\n          : null;\n      }\n      case \"raw\": {\n        const token = this.parseStringGroup(\"raw\", optional);\n        return token != null\n          ? {\n            type: \"raw\",\n            mode: \"text\",\n            string: token.text\n          }\n          : null;\n      }\n      case \"primitive\": {\n        if (optional) {\n          throw new ParseError(\"A primitive argument cannot be optional\");\n        }\n        const group = this.parseGroup(name);\n        if (group == null) {\n          throw new ParseError(\"Expected group as \" + name, this.fetch());\n        }\n        return group;\n      }\n      case \"original\":\n      case null:\n      case undefined:\n        return this.parseArgumentGroup(optional);\n      default:\n        throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n    }\n  }\n\n  /**\n   * Discard any space tokens, fetching the next non-space token.\n   */\n  consumeSpaces() {\n    while (true) {\n      const ch = this.fetch().text;\n      // \\ufe0e is the Unicode variation selector to supress emoji. Ignore it.\n      if (ch === \" \" || ch === \"\\u00a0\" || ch === \"\\ufe0e\") {\n        this.consume();\n      } else {\n        break\n      }\n    }\n  }\n\n  /**\n   * Parses a group, essentially returning the string formed by the\n   * brace-enclosed tokens plus some position information.\n   */\n  parseStringGroup(\n    modeName, // Used to describe the mode in error messages.\n    optional\n  ) {\n    const argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    let str = \"\";\n    let nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\") {\n      str += nextToken.text;\n      this.consume();\n    }\n    this.consume(); // consume the end of the argument\n    argToken.text = str;\n    return argToken;\n  }\n\n  /**\n   * Parses a regex-delimited group: the largest sequence of tokens\n   * whose concatenated strings match `regex`. Returns the string\n   * formed by the tokens plus some position information.\n   */\n  parseRegexGroup(\n    regex,\n    modeName // Used to describe the mode in error messages.\n  ) {\n    const firstToken = this.fetch();\n    let lastToken = firstToken;\n    let str = \"\";\n    let nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n      lastToken = nextToken;\n      str += lastToken.text;\n      this.consume();\n    }\n    if (str === \"\") {\n      throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n    }\n    return firstToken.range(lastToken, str);\n  }\n\n  /**\n   * Parses a size specification, consisting of magnitude and unit.\n   */\n  parseSizeGroup(optional) {\n    let res;\n    let isBlank = false;\n    // don't expand before parseStringGroup\n    this.gullet.consumeSpaces();\n    if (!optional && this.gullet.future().text !== \"{\") {\n      res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n    } else {\n      res = this.parseStringGroup(\"size\", optional);\n    }\n    if (!res) {\n      return null;\n    }\n    if (!optional && res.text.length === 0) {\n      // Because we've tested for what is !optional, this block won't\n      // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n      // to \\genfrac and \\above.\n      res.text = \"0pt\"; // Enable \\above{}\n      isBlank = true; // This is here specifically for \\genfrac\n    }\n    const match = sizeRegEx.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n    }\n    const data = {\n      number: +(match[1] + match[2]), // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n    }\n    return {\n      type: \"size\",\n      mode: this.mode,\n      value: data,\n      isBlank\n    };\n  }\n\n  /**\n   * Parses an URL, checking escaped letters and allowed protocols,\n   * and setting the catcode of % as an active character (as in \\hyperref).\n   */\n  parseUrlGroup(optional) {\n    this.gullet.lexer.setCatcode(\"%\", 13); // active character\n    this.gullet.lexer.setCatcode(\"~\", 12); // other character\n    const res = this.parseStringGroup(\"url\", optional);\n    this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n    this.gullet.lexer.setCatcode(\"~\", 13); // active character\n    if (res == null) {\n      return null;\n    }\n    // hyperref package allows backslashes alone in href, but doesn't\n    // generate valid links in such cases; we interpret this as\n    // \"undefined\" behaviour, and keep them as-is. Some browser will\n    // replace backslashes with forward slashes.\n    let url = res.text.replace(/\\\\([#$%&~_^{}])/g, \"$1\");\n    url = res.text.replace(/{\\u2044}/g, \"/\");\n    return {\n      type: \"url\",\n      mode: this.mode,\n      url\n    };\n  }\n\n  /**\n   * Parses an argument with the mode specified.\n   */\n  parseArgumentGroup(optional, mode) {\n    const argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    const outerMode = this.mode;\n    if (mode) {\n      // Switch to specified mode\n      this.switchMode(mode);\n    }\n\n    this.gullet.beginGroup();\n    const expression = this.parseExpression(false, \"EOF\");\n    // TODO: find an alternative way to denote the end\n    this.expect(\"EOF\"); // expect the end of the argument\n    this.gullet.endGroup();\n    const result = {\n      type: \"ordgroup\",\n      mode: this.mode,\n      loc: argToken.loc,\n      body: expression\n    };\n\n    if (mode) {\n      // Switch mode back\n      this.switchMode(outerMode);\n    }\n    return result;\n  }\n\n  /**\n   * Parses an ordinary group, which is either a single nucleus (like \"x\")\n   * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n   * that starts at the current position, and ends right before a higher explicit\n   * group ends, or at EOF.\n   */\n  parseGroup(\n    name, // For error reporting.\n    breakOnTokenText\n  ) {\n    const firstToken = this.fetch();\n    const text = firstToken.text;\n    if (name === \"argument to '\\\\left'\") { return this.parseSymbol() }\n    let result;\n    // Try to parse an open brace or \\begingroup\n    if (text === \"{\" || text === \"\\\\begingroup\" || text === \"\\\\toggle\") {\n      this.consume();\n      const groupEnd = text === \"{\"\n        ? \"}\"\n        : text === \"\\\\begingroup\"\n        ? \"\\\\endgroup\"\n        : \"\\\\endtoggle\";\n\n      this.gullet.beginGroup();\n      // If we get a brace, parse an expression\n      const expression = this.parseExpression(false, groupEnd);\n      const lastToken = this.fetch();\n      this.expect(groupEnd); // Check that we got a matching closing brace\n      this.gullet.endGroup();\n      result = {\n        type: (lastToken.text === \"\\\\endtoggle\" ? \"toggle\" : \"ordgroup\"),\n        mode: this.mode,\n        loc: SourceLocation.range(firstToken, lastToken),\n        body: expression,\n        // A group formed by \\begingroup...\\endgroup is a semi-simple group\n        // which doesn't affect spacing in math mode, i.e., is transparent.\n        // https://tex.stackexchange.com/questions/1930/\n        semisimple: text === \"\\\\begingroup\" || undefined\n      };\n    } else {\n      // If there exists a function with this name, parse the function.\n      // Otherwise, just return a nucleus\n      result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n      if (result == null && text[0] === \"\\\\\" &&\n          !Object.prototype.hasOwnProperty.call(implicitCommands, text )) {\n        if (this.settings.throwOnError) {\n          throw new ParseError(\"Unsupported function name: \" + text, firstToken);\n        }\n        // For people getting dyanamically rendered math, it's better to\n        // show the unsupported command in red rather than panicking for every\n        // partially written expression.\n        result = this.formatUnsupportedCmd(text);\n        this.consume();\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Form ligature-like combinations of characters for text mode.\n   * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n   * The result will simply replace multiple textord nodes with a single\n   * character in each value by a single textord node having multiple\n   * characters in its value.  The representation is still ASCII source.\n   * The group will be modified in place.\n   */\n  formLigatures(group) {\n    let n = group.length - 1;\n    for (let i = 0; i < n; ++i) {\n      const a = group[i];\n      const v = a.text;\n      if (v === \"-\" && group[i + 1].text === \"-\") {\n        if (i + 1 < n && group[i + 2].text === \"-\") {\n          group.splice(i, 3, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, group[i + 2]),\n            text: \"---\"\n          });\n          n -= 2;\n        } else {\n          group.splice(i, 2, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, group[i + 1]),\n            text: \"--\"\n          });\n          n -= 1;\n        }\n      }\n      if ((v === \"'\" || v === \"`\") && group[i + 1].text === v) {\n        group.splice(i, 2, {\n          type: \"textord\",\n          mode: \"text\",\n          loc: SourceLocation.range(a, group[i + 1]),\n          text: v + v\n        });\n        n -= 1;\n      }\n    }\n  }\n\n  /**\n   * Parse a single symbol out of the string. Here, we handle single character\n   * symbols and special functions like \\verb.\n   */\n  parseSymbol() {\n    const nucleus = this.fetch();\n    let text = nucleus.text;\n\n    if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n      this.consume();\n      let arg = text.slice(5);\n      const star = arg.charAt(0) === \"*\";\n      if (star) {\n        arg = arg.slice(1);\n      }\n      // Lexer's tokenRegex is constructed to always have matching\n      // first/last characters.\n      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n        throw new ParseError(`\\\\verb assertion failed --\n                    please report what input caused this bug`);\n      }\n      arg = arg.slice(1, -1); // remove first and last char\n      return {\n        type: \"verb\",\n        mode: \"text\",\n        body: arg,\n        star\n      };\n    }\n    // At this point, we should have a symbol, possibly with accents.\n    // First expand any accented base symbol according to unicodeSymbols.\n    if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) &&\n      this.mode === \"math\" && !symbols[this.mode][text[0]]) {\n      // This behavior is not strict (XeTeX-compatible) in math mode.\n      if (this.settings.strict && this.mode === \"math\") {\n        throw new ParseError(`Accented Unicode text character \"${text[0]}\" used in ` + `math mode`,\n          nucleus\n        );\n      }\n      text = unicodeSymbols[text[0]] + text.slice(1);\n    }\n    // Strip off any combining characters\n    const match = this.mode === \"math\"\n      ? combiningDiacriticalMarksEndRegex.exec(text)\n      : null;\n    if (match) {\n      text = text.substring(0, match.index);\n      if (text === \"i\") {\n        text = \"\\u0131\"; // dotless i, in math and text mode\n      } else if (text === \"j\") {\n        text = \"\\u0237\"; // dotless j, in math and text mode\n      }\n    }\n    // Recognize base symbol\n    let symbol;\n    if (symbols[this.mode][text]) {\n      let group = symbols[this.mode][text].group;\n      if (group === \"bin\" &&\n        (binLeftCancellers.includes(this.prevAtomType) || this.prevAtomType === \"\")) {\n        // Change from a binary operator to a unary (prefix) operator\n        group = \"open\";\n      }\n      const loc = SourceLocation.range(nucleus);\n      let s;\n      if (Object.prototype.hasOwnProperty.call(ATOMS, group )) {\n        const family = group;\n        s = {\n          type: \"atom\",\n          mode: this.mode,\n          family,\n          loc,\n          text\n        };\n        if ((family === \"rel\" || family === \"bin\") && this.prevAtomType === \"text\") {\n          if (textRegEx.test(loc.lexer.input.slice(loc.end))) {\n            s.needsSpacing = true;  // Fix a MathML bug.\n          }\n        }\n      } else {\n        if (asciiFromScript[text]) {\n          // Unicode 14 disambiguates chancery from roundhand.\n          // See https://www.unicode.org/charts/PDF/U1D400.pdf\n          this.consume();\n          const nextCode = this.fetch().text.charCodeAt(0);\n          // mathcal is Temml default. Use mathscript if called for.\n          const font = nextCode === 0xfe01 ? \"mathscr\" : \"mathcal\";\n          if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); }\n          return {\n            type: \"font\",\n            mode: \"math\",\n            font,\n            body: { type: \"mathord\", mode: \"math\", loc, text: asciiFromScript[text] }\n          }\n        }\n        // Default ord character. No disambiguation necessary.\n        s = {\n          type: group,\n          mode: this.mode,\n          loc,\n          text\n        };\n      }\n      symbol = s;\n    } else if (text.charCodeAt(0) >= 0x80 || combiningDiacriticalMarksEndRegex.exec(text)) {\n      // no symbol for e.g. ^\n      if (this.settings.strict && this.mode === \"math\") {\n        throw new ParseError(`Unicode text character \"${text[0]}\" used in math mode`, nucleus)\n      }\n      // All nonmathematical Unicode characters are rendered as if they\n      // are in text mode (wrapped in \\text) because that's what it\n      // takes to render them in LaTeX.\n      symbol = {\n        type: \"textord\",\n        mode: \"text\",\n        loc: SourceLocation.range(nucleus),\n        text\n      };\n    } else {\n      return null; // EOF, ^, _, {, }, etc.\n    }\n    this.consume();\n    // Transform combining characters into accents\n    if (match) {\n      for (let i = 0; i < match[0].length; i++) {\n        const accent = match[0][i];\n        if (!unicodeAccents[accent]) {\n          throw new ParseError(`Unknown accent ' ${accent}'`, nucleus);\n        }\n        const command = unicodeAccents[accent][this.mode] ||\n                        unicodeAccents[accent].text;\n        if (!command) {\n          throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus);\n        }\n        symbol = {\n          type: \"accent\",\n          mode: this.mode,\n          loc: SourceLocation.range(nucleus),\n          label: command,\n          isStretchy: false,\n          base: symbol\n        };\n      }\n    }\n    return symbol;\n  }\n}\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nconst parseTree = function(toParse, settings) {\n  if (!(typeof toParse === \"string\" || toParse instanceof String)) {\n    throw new TypeError(\"Temml can only parse string typed expression\")\n  }\n  let tree;\n  let parser;\n  try {\n    parser = new Parser(toParse, settings);\n    // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n    delete parser.gullet.macros.current[\"\\\\df@tag\"];\n\n    tree = parser.parse();\n  } catch (error) {\n    if (error.toString() === \"ParseError:  Unmatched delimiter\") {\n      // Abandon the attempt to wrap delimiter pairs in an <mrow>.\n      // Try again, and put each delimiter into an <mo> element.\n      settings.wrapDelimiterPairs = false;\n      parser = new Parser(toParse, settings);\n      // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n      delete parser.gullet.macros.current[\"\\\\df@tag\"];\n      tree = parser.parse();\n    } else {\n      throw error;\n    }\n  }\n\n  // LaTeX ignores a \\tag placed outside an AMS environment.\n  if (!(tree.length > 0 &&  tree[0].type && tree[0].type === \"array\" && tree[0].addEqnNum)) {\n    // If the input used \\tag, it will set the \\df@tag macro to the tag.\n    // In this case, we separately parse the tag and wrap the tree.\n    if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n      if (!settings.displayMode) {\n        throw new ParseError(\"\\\\tag works only in display mode\")\n      }\n      parser.gullet.feed(\"\\\\df@tag\");\n      tree = [\n        {\n          type: \"tag\",\n          mode: \"text\",\n          body: tree,\n          tag: parser.parse()\n        }\n      ];\n    }\n  }\n\n  return tree\n};\n\n/**\n * This file contains information about the style that the mathmlBuilder carries\n * around with it. Data is held in an `Style` object, and when\n * recursing, a new `Style` object can be created with the `.with*` functions.\n */\n\nconst subOrSupLevel = [2, 2, 3, 3];\n\n/**\n * This is the main Style class. It contains the current style.level, color, and font.\n *\n * Style objects should not be modified. To create a new Style with\n * different properties, call a `.with*` method.\n */\nclass Style {\n  constructor(data) {\n    // Style.level can be 0 | 1 | 2 | 3, which correspond to\n    //       displaystyle, textstyle, scriptstyle, and scriptscriptstyle.\n    // style.level usually does not directly set MathML's script level. MathML does that itself.\n    // However, Chromium does not stop shrinking after scriptscriptstyle, so we do explicitly\n    // set a scriptlevel attribute in those conditions.\n    // We also use style.level to track math style so that we can get the correct\n    // scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em.\n    this.level = data.level;\n    this.color = data.color;  // string | void\n    // A font family applies to a group of fonts (i.e. SansSerif), while a font\n    // represents a specific font (i.e. SansSerif Bold).\n    // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n    this.font = data.font || \"\";                // string\n    this.fontFamily = data.fontFamily || \"\";    // string\n    this.fontSize = data.fontSize || 1.0;       // number\n    this.fontWeight = data.fontWeight || \"\";\n    this.fontShape = data.fontShape || \"\";\n    this.maxSize = data.maxSize;                // [number, number]\n  }\n\n  /**\n   * Returns a new style object with the same properties as \"this\".  Properties\n   * from \"extension\" will be copied to the new style object.\n   */\n  extend(extension) {\n    const data = {\n      level: this.level,\n      color: this.color,\n      font: this.font,\n      fontFamily: this.fontFamily,\n      fontSize: this.fontSize,\n      fontWeight: this.fontWeight,\n      fontShape: this.fontShape,\n      maxSize: this.maxSize\n    };\n\n    for (const key in extension) {\n      if (Object.prototype.hasOwnProperty.call(extension, key)) {\n        data[key] = extension[key];\n      }\n    }\n\n    return new Style(data);\n  }\n\n  withLevel(n) {\n    return this.extend({\n      level: n\n    });\n  }\n\n  incrementLevel() {\n    return this.extend({\n      level: Math.min(this.level + 1, 3)\n    });\n  }\n\n  inSubOrSup() {\n    return this.extend({\n      level: subOrSupLevel[this.level]\n    })\n  }\n\n  /**\n   * Create a new style object with the given color.\n   */\n  withColor(color) {\n    return this.extend({\n      color: color\n    });\n  }\n\n  /**\n   * Creates a new style object with the given math font or old text font.\n   * @type {[type]}\n   */\n  withFont(font) {\n    return this.extend({\n      font\n    });\n  }\n\n  /**\n   * Create a new style objects with the given fontFamily.\n   */\n  withTextFontFamily(fontFamily) {\n    return this.extend({\n      fontFamily,\n      font: \"\"\n    });\n  }\n\n  /**\n   * Creates a new style object with the given font size\n   */\n  withFontSize(num) {\n    return this.extend({\n      fontSize: num\n    });\n  }\n\n  /**\n   * Creates a new style object with the given font weight\n   */\n  withTextFontWeight(fontWeight) {\n    return this.extend({\n      fontWeight,\n      font: \"\"\n    });\n  }\n\n  /**\n   * Creates a new style object with the given font weight\n   */\n  withTextFontShape(fontShape) {\n    return this.extend({\n      fontShape,\n      font: \"\"\n    });\n  }\n\n  /**\n   * Gets the CSS color of the current style object\n   */\n  getColor() {\n    return this.color;\n  }\n}\n\n/* Temml Post Process\n * Populate the text contents of each \\ref & \\eqref\n *\n * As with other Temml code, this file is released under terms of the MIT license.\n * https://mit-license.org/\n */\n\nconst version = \"0.13.4\";\n\nfunction postProcess(block) {\n  const labelMap = {};\n  let i = 0;\n\n  // Get a collection of the parents of each \\tag & auto-numbered equation\n  const amsEqns = document.getElementsByClassName('tml-eqn');\n  for (let parent of amsEqns) {\n    // AMS automatically numbered equation.\n    // Assign an id.\n    i += 1;\n    parent.setAttribute(\"id\", \"tml-eqn-\" + String(i));\n    // No need to write a number into the text content of the element.\n    // A CSS counter has done that even if this postProcess() function is not used.\n\n    // Find any \\label that refers to an AMS automatic eqn number.\n    while (true) {\n      if (parent.tagName === \"mtable\") { break }\n      const labels = parent.getElementsByClassName(\"tml-label\");\n      if (labels.length > 0) {\n        const id = parent.attributes.id.value;\n        labelMap[id] = String(i);\n        break\n      } else {\n        parent = parent.parentElement;\n      }\n    }\n  }\n\n  // Find \\labels associated with \\tag\n  const taggedEqns = document.getElementsByClassName('tml-tageqn');\n  for (const parent of taggedEqns) {\n    const labels = parent.getElementsByClassName(\"tml-label\");\n    if (labels.length > 0) {\n      const tags = parent.getElementsByClassName(\"tml-tag\");\n      if (tags.length > 0) {\n        const id = parent.attributes.id.value;\n        labelMap[id] = tags[0].textContent;\n      }\n    }\n  }\n\n  // Populate \\ref & \\eqref text content\n  const refs = block.getElementsByClassName(\"tml-ref\");\n  [...refs].forEach(ref => {\n    const attr = ref.getAttribute(\"href\");\n    let str = labelMap[attr.slice(1)];\n    if (ref.className.indexOf(\"tml-eqref\") === -1) {\n      // \\ref. Omit parens.\n      str = str.replace(/^\\(/, \"\");\n      str = str.replace(/\\)$/, \"\");\n    } else {\n      // \\eqref. Include parens\n      if (str.charAt(0) !== \"(\") { str = \"(\" + str; }\n      if (str.slice(-1) !== \")\") { str =  str + \")\"; }\n    }\n    const mtext = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mtext\");\n    mtext.appendChild(document.createTextNode(str));\n    const math =  document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"math\");\n    math.appendChild(mtext);\n    ref.textContent = '';\n    ref.appendChild(math);\n  });\n}\n\nconst findEndOfMath = function(delimiter, text, startIndex) {\n  // Adapted from\n  // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx\n  let index = startIndex;\n  let braceLevel = 0;\n\n  const delimLength = delimiter.length;\n\n  while (index < text.length) {\n    const character = text[index];\n\n    if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {\n      return index;\n    } else if (character === \"\\\\\") {\n      index++;\n    } else if (character === \"{\") {\n      braceLevel++;\n    } else if (character === \"}\") {\n      braceLevel--;\n    }\n\n    index++;\n  }\n\n  return -1;\n};\n\nconst escapeRegex = function(string) {\n  return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n\nconst amsRegex = /^\\\\(?:begin|(?:eq)?ref){/;\n\nconst splitAtDelimiters = function(text, delimiters) {\n  let index;\n  const data = [];\n\n  const regexLeft = new RegExp(\n    \"(\" + delimiters.map((x) => escapeRegex(x.left)).join(\"|\") + \")\"\n  );\n\n  while (true) {\n    index = text.search(regexLeft);\n    if (index === -1) {\n      break;\n    }\n    if (index > 0) {\n      data.push({\n        type: \"text\",\n        data: text.slice(0, index)\n      });\n      text = text.slice(index); // now text starts with delimiter\n    }\n    // ... so this always succeeds:\n    const i = delimiters.findIndex((delim) => text.startsWith(delim.left));\n    index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length);\n    if (index === -1) {\n      break;\n    }\n    const rawData = text.slice(0, index + delimiters[i].right.length);\n    const math = amsRegex.test(rawData)\n      ? rawData\n      : text.slice(delimiters[i].left.length, index);\n    data.push({\n      type: \"math\",\n      data: math,\n      rawData,\n      display: delimiters[i].display\n    });\n    text = text.slice(index + delimiters[i].right.length);\n  }\n\n  if (text !== \"\") {\n    data.push({\n      type: \"text\",\n      data: text\n    });\n  }\n\n  return data;\n};\n\nconst defaultDelimiters = [\n  { left: \"$$\", right: \"$$\", display: true },\n  { left: \"\\\\(\", right: \"\\\\)\", display: false },\n  // LaTeX uses $…$, but it ruins the display of normal `$` in text:\n  // {left: \"$\", right: \"$\", display: false},\n  // $ must come after $$\n\n  // Render AMS environments even if outside $$…$$ delimiters.\n  { left: \"\\\\begin{equation}\", right: \"\\\\end{equation}\", display: true },\n  { left: \"\\\\begin{equation*}\", right: \"\\\\end{equation*}\", display: true },\n  { left: \"\\\\begin{align}\", right: \"\\\\end{align}\", display: true },\n  { left: \"\\\\begin{align*}\", right: \"\\\\end{align*}\", display: true },\n  { left: \"\\\\begin{alignat}\", right: \"\\\\end{alignat}\", display: true },\n  { left: \"\\\\begin{alignat*}\", right: \"\\\\end{alignat*}\", display: true },\n  { left: \"\\\\begin{gather}\", right: \"\\\\end{gather}\", display: true },\n  { left: \"\\\\begin{gather*}\", right: \"\\\\end{gather*}\", display: true },\n  { left: \"\\\\begin{CD}\", right: \"\\\\end{CD}\", display: true },\n  // Ditto \\ref & \\eqref\n  { left: \"\\\\ref{\", right: \"}\", display: false },\n  { left: \"\\\\eqref{\", right: \"}\", display: false },\n\n  { left: \"\\\\[\", right: \"\\\\]\", display: true }\n];\n\nconst firstDraftDelimiters = {\n  \"$\": [\n         { left: \"$$\", right: \"$$\", display: true },\n         { left: \"$`\", right: \"`$\", display: false },\n         { left: \"$\", right: \"$\", display: false }\n  ],\n  \"(\": [\n    { left: \"\\\\[\", right: \"\\\\]\", display: true },\n    { left: \"\\\\(\", right: \"\\\\)\", display: false }\n  ]\n};\n\nconst amsDelimiters = [\n  { left: \"\\\\begin{equation}\", right: \"\\\\end{equation}\", display: true },\n  { left: \"\\\\begin{equation*}\", right: \"\\\\end{equation*}\", display: true },\n  { left: \"\\\\begin{align}\", right: \"\\\\end{align}\", display: true },\n  { left: \"\\\\begin{align*}\", right: \"\\\\end{align*}\", display: true },\n  { left: \"\\\\begin{alignat}\", right: \"\\\\end{alignat}\", display: true },\n  { left: \"\\\\begin{alignat*}\", right: \"\\\\end{alignat*}\", display: true },\n  { left: \"\\\\begin{gather}\", right: \"\\\\end{gather}\", display: true },\n  { left: \"\\\\begin{gather*}\", right: \"\\\\end{gather*}\", display: true },\n  { left: \"\\\\begin{CD}\", right: \"\\\\end{CD}\", display: true },\n  { left: \"\\\\ref{\", right: \"}\", display: false },\n  { left: \"\\\\eqref{\", right: \"}\", display: false }\n];\n\nconst delimitersFromKey = key => {\n  if (key === \"$\" || key === \"(\") {\n    return firstDraftDelimiters[key];\n  } else if (key === \"$+\" || key === \"(+\") {\n    const firstDraft = firstDraftDelimiters[key.slice(0, 1)];\n    return firstDraft.concat(amsDelimiters)\n  } else if (key === \"ams\") {\n    return amsDelimiters\n  } else if (key === \"all\") {\n    return (firstDraftDelimiters[\"(\"]).concat(firstDraftDelimiters[\"$\"]).concat(amsDelimiters)\n  } else {\n    return defaultDelimiters\n  }\n};\n\n/* Note: optionsCopy is mutated by this method. If it is ever exposed in the\n * API, we should copy it before mutating.\n */\nconst renderMathInText = function(text, optionsCopy) {\n  const data = splitAtDelimiters(text, optionsCopy.delimiters);\n  if (data.length === 1 && data[0].type === \"text\") {\n    // There is no formula in the text.\n    // Let's return null which means there is no need to replace\n    // the current text node with a new one.\n    return null;\n  }\n\n  const fragment = document.createDocumentFragment();\n\n  for (let i = 0; i < data.length; i++) {\n    if (data[i].type === \"text\") {\n      fragment.appendChild(document.createTextNode(data[i].data));\n    } else {\n      const span = document.createElement(\"span\");\n      let math = data[i].data;\n      // Override any display mode defined in the settings with that\n      // defined by the text itself\n      optionsCopy.displayMode = data[i].display;\n      try {\n        if (optionsCopy.preProcess) {\n          math = optionsCopy.preProcess(math);\n        }\n        // Importing render() from temml.js would be a circular dependency.\n        // So call the global version.\n        // eslint-disable-next-line no-undef\n        temml.render(math, span, optionsCopy);\n      } catch (e) {\n        if (!(e instanceof ParseError)) {\n          throw e;\n        }\n        optionsCopy.errorCallback(\n          \"Temml auto-render: Failed to parse `\" + data[i].data + \"` with \",\n          e\n        );\n        fragment.appendChild(document.createTextNode(data[i].rawData));\n        continue;\n      }\n      fragment.appendChild(span);\n    }\n  }\n\n  return fragment;\n};\n\nconst renderElem = function(elem, optionsCopy) {\n  for (let i = 0; i < elem.childNodes.length; i++) {\n    const childNode = elem.childNodes[i];\n    if (childNode.nodeType === 3) {\n      // Text node\n      const frag = renderMathInText(childNode.textContent, optionsCopy);\n      if (frag) {\n        i += frag.childNodes.length - 1;\n        elem.replaceChild(frag, childNode);\n      }\n    } else if (childNode.nodeType === 1) {\n      // Element node\n      const className = \" \" + childNode.className + \" \";\n      const shouldRender =\n        optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 &&\n        optionsCopy.ignoredClasses.every((x) => className.indexOf(\" \" + x + \" \") === -1);\n\n      if (shouldRender) {\n        renderElem(childNode, optionsCopy);\n      }\n    }\n    // Otherwise, it's something else, and ignore it.\n  }\n};\n\nconst renderMathInElement = function(elem, options) {\n  if (!elem) {\n    throw new Error(\"No element provided to render\");\n  }\n\n  const optionsCopy = {};\n\n  // Object.assign(optionsCopy, option)\n  for (const option in options) {\n    if (Object.prototype.hasOwnProperty.call(options, option)) {\n      optionsCopy[option] = options[option];\n    }\n  }\n\n  if (optionsCopy.fences) {\n    optionsCopy.delimiters = delimitersFromKey(optionsCopy.fences);\n  } else {\n    optionsCopy.delimiters = optionsCopy.delimiters || defaultDelimiters;\n  }\n  optionsCopy.ignoredTags = optionsCopy.ignoredTags || [\n    \"script\",\n    \"noscript\",\n    \"style\",\n    \"textarea\",\n    \"pre\",\n    \"code\",\n    \"option\"\n  ];\n  optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];\n  // eslint-disable-next-line no-console\n  optionsCopy.errorCallback = optionsCopy.errorCallback || console.error;\n\n  // Enable sharing of global macros defined via `\\gdef` between different\n  // math elements within a single call to `renderMathInElement`.\n  optionsCopy.macros = optionsCopy.macros || {};\n\n  renderElem(elem, optionsCopy);\n  postProcess(elem);\n};\n\n/* eslint no-console:0 */\n/**\n * This is the main entry point for Temml. Here, we expose functions for\n * rendering expressions either to DOM nodes or to markup strings.\n *\n * We also expose the ParseError class to check if errors thrown from Temml are\n * errors in the expression, or errors in javascript handling.\n */\n\n\n/**\n * @type {import('./temml').render}\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nlet render = function(expression, baseNode, options = {}) {\n  baseNode.textContent = \"\";\n  const alreadyInMathElement = baseNode.tagName.toLowerCase() === \"math\";\n  if (alreadyInMathElement) { options.wrap = \"none\"; }\n  const math = renderToMathMLTree(expression, options);\n  if (alreadyInMathElement) {\n    // The <math> element already exists. Populate it.\n    baseNode.textContent = \"\";\n    math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n  } else if (math.children.length > 1) {\n    baseNode.textContent = \"\";\n    math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n  } else {\n    baseNode.appendChild(math.toNode());\n  }\n};\n\n// Temml's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n  if (document.compatMode !== \"CSS1Compat\") {\n    typeof console !== \"undefined\" &&\n      console.warn(\n        \"Warning: Temml doesn't work in quirks mode. Make sure your \" +\n          \"website has a suitable doctype.\"\n      );\n\n    render = function() {\n      throw new ParseError(\"Temml doesn't work in quirks mode.\");\n    };\n  }\n}\n\n/**\n * @type {import('./temml').renderToString}\n * Parse and build an expression, and return the markup for that.\n */\nconst renderToString = function(expression, options) {\n  const markup = renderToMathMLTree(expression, options).toMarkup();\n  return markup;\n};\n\n/**\n * @type {import('./temml').generateParseTree}\n * Parse an expression and return the parse tree.\n */\nconst generateParseTree = function(expression, options) {\n  const settings = new Settings(options);\n  return parseTree(expression, settings);\n};\n\n/**\n * @type {import('./temml').definePreamble}\n * Take an expression which contains a preamble.\n * Parse it and return the macros.\n */\nconst definePreamble = function(expression, options) {\n  const settings = new Settings(options);\n  settings.macros = {};\n  if (!(typeof expression === \"string\" || expression instanceof String)) {\n    throw new TypeError(\"Temml can only parse string typed expression\")\n  }\n  const parser = new Parser(expression, settings, true);\n  // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n  delete parser.gullet.macros.current[\"\\\\df@tag\"];\n  const macros = parser.parse();\n  return macros\n};\n\n/**\n * If the given error is a Temml ParseError,\n * renders the invalid LaTeX as a span with hover title giving the Temml\n * error message.  Otherwise, simply throws the error.\n */\nconst renderError = function(error, expression, options) {\n  if (options.throwOnError || !(error instanceof ParseError)) {\n    throw error;\n  }\n  const node = new Span([\"temml-error\"], [new TextNode$1(expression + \"\\n\\n\" + error.toString())]);\n  node.style.color = options.errorColor;\n  node.style.whiteSpace = \"pre-line\";\n  return node;\n};\n\n/**\n * @type {import('./temml').renderToMathMLTree}\n * Generates and returns the Temml build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nconst renderToMathMLTree = function(expression, options) {\n  const settings = new Settings(options);\n  try {\n    const tree = parseTree(expression, settings);\n    const style = new Style({\n      level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT,\n      maxSize: settings.maxSize\n    });\n    return buildMathML(tree, expression, style, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\n\n/** @type {import('./temml').default} */\nvar temml$1 = {\n  /**\n   * Current Temml version\n   */\n  version: version,\n  /**\n   * Renders the given LaTeX into MathML, and adds\n   * it as a child to the specified DOM node.\n   */\n  render,\n  /**\n   * Renders the given LaTeX into MathML string,\n   * for sending to the client.\n   */\n  renderToString,\n  /**\n   * Finds all the math delimiters in a given element of a running HTML document\n   * and converts the contents of each instance into a <math> element.\n   */\n  renderMathInElement,\n  /**\n   * Post-process an entire HTML block.\n   * Writes AMS auto-numbers and implements \\ref{}.\n   * Typcally called once, after a loop has rendered many individual spans.\n   */\n  postProcess,\n  /**\n   * Temml error, usually during parsing.\n   */\n  ParseError,\n  /**\n   * Creates a set of macros with document-wide scope.\n   */\n  definePreamble,\n  /**\n   * Parses the given LaTeX into Temml's internal parse tree structure,\n   * without rendering to HTML or MathML.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __parse: generateParseTree,\n  /**\n   * Renders the given LaTeX into a MathML internal DOM tree\n   * representation, without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToMathMLTree: renderToMathMLTree,\n  /**\n   * adds a new symbol to builtin symbols table\n   */\n  __defineSymbol: defineSymbol,\n  /**\n   * adds a new macro to builtin macro list\n   */\n  __defineMacro: defineMacro\n};\n\nexport { temml$1 as default };\n","import { type NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\nimport temml from 'temml';\n\nexport class NodeMath extends Node {\n  override name = 'math';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      attrs: {\n        lang: { default: 'mathml' },\n        content: {},\n      },\n      group: 'inline',\n      draggable: true,\n      // parseDOM: [\n      //   {\n      //     tag: 'math',\n      //     getAttrs(dom: HTMLElement) {\n      //       return {\n      //         content: dom.outerHTML,\n      //       };\n      //     },\n      //   },\n      // ],\n      parseDOM: [{\n        tag: 'math',\n        getAttrs: (dom) => ({\n          lang: 'mathml',\n          content: new XMLSerializer().serializeToString(dom),\n        }),\n      }],\n      toDOM(node) {\n        let content = node.attrs.content;\n        if (node.attrs.lang === 'latex') {\n          content = temml.renderToString(content);\n        }\n\n        const parser = new DOMParser();\n        const parsed = parser.parseFromString(\n          content,\n          'application/xml',\n        );\n\n        // Check for parsing errors (e.g., invalid XML)\n        const errorNode = parsed.getElementsByTagName('parsererror');\n        if (errorNode.length > 0) {\n          return ['span', { class: 'mathml-error' }, 'Invalid MathML'];\n        }\n\n        // Import and return the parsed MathML element\n        return document.importNode(parsed.documentElement, true);\n      },\n    };\n  }\n}\n\n/*\nMathML vs. LaTeX: Which is Better for Web Math Equations?\nNeither is universally \"better\"—it depends on your goals (authoring, rendering, accessibility, or storage). MathML and LaTeX serve different primary purposes but can complement each other on the web (e.g., via converters like MathJax). Here's a comparison focused on web use:\nKey Differences\n\nPurpose:\n\nLaTeX: A human-readable markup language for typesetting math (e.g., $E=mc^2$). It's concise and widely used for authoring documents, papers, and web input. Not native to HTML; requires a processor (e.g., MathJax, KaTeX) to render as HTML/CSS/SVG.\nMathML: An XML-based standard (part of HTML5) for describing math structure and presentation (Presentation MathML for visuals; Content MathML for semantics). Designed for direct embedding in web pages (e.g., <math><mi>E</mi>=<mi>m</mi><msup><mi>c</mi><mn>2</mn></msup></math>). Browsers like Firefox and Safari support it natively; others need polyfills.\n\n\nEase of Authoring:\n\nLaTeX: Wins for humans—shorter, intuitive syntax familiar to mathematicians. Easier to write/edit manually or in editors like Overleaf. Verbose MathML is painful for hand-coding complex equations.\nMathML: Better for programmatic generation (e.g., from tools or APIs) due to its structured XML. Use WYSIWYG editors (like those above) to avoid writing tags.\n\n\nRendering on Web:\n\nLaTeX: Requires a JS library (MathJax ~300KB, KaTeX lighter ~100KB) for cross-browser display. Renders beautifully everywhere but adds load time and JS dependency. No native browser support.\nMathML: Native in Firefox/Safari (fast, no JS). Improving in Chrome/Edge (as of 2023+), but still needs MathJax fallback for full support. Outputs scalable HTML/CSS without images.\n\n\nAccessibility:\n\nMathML: Superior—semantic structure allows screen readers (e.g., NVDA with MathCAT, JAWS) to read equations meaningfully (e.g., \"E equals m times c squared\"). Essential for WCAG/ADA compliance.\nLaTeX: Poor native accessibility; screen readers treat it as plain text. MathJax can convert to MathML internally for better support, but raw LaTeX fails.\n\n\nPerformance & Compatibility:\n\nLaTeX: Faster authoring, but rendering depends on the library. Universal via JS, but increases page weight.\nMathML: Lightweight native rendering where supported; more robust for search engines/parsing (e.g., Google indexes MathML). Less portable outside web (LaTeX dominates PDFs/print).\n\n\nStorage/Interoperability:\n\nLaTeX: Compact for databases/files. Easy to convert to MathML (via tools like texmath or Pandoc).\nMathML: Better for web standards (XML parsable), but bulkier. Ideal for exchange between math tools.\n\n\n\nRecommendation\n\nUse LaTeX if your focus is easy input/authoring (e.g., users typing equations) and you're okay with a renderer like MathJax. It's more practical for most web projects today due to familiarity and tools. Store as LaTeX, render via JS, and convert to MathML for accessibility if needed.\nUse MathML if prioritizing native web standards, accessibility, or programmatic output (e.g., from editors). It's \"better\" for semantic web math and future-proofing (browser support is growing), but pair with LaTeX input for usability.\nHybrid Approach: Best for web—author in LaTeX, convert/output MathML for display/storage. Libraries like MathJax handle both seamlessly (input LaTeX, output rendered MathML). This gives LaTeX's simplicity with MathML's benefits.\n\nIf accessibility is key, always generate MathML (even from LaTeX source). Test in browsers: LaTeX+MathJax works everywhere; pure MathML shines in Firefox but needs fallbacks elsewhere.\n*/\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport {\n  type InputRule,\n  wrappingInputRule,\n} from '@kerebron/editor/plugins/input-rules';\n\nexport class NodeDefinitionList extends Node {\n  override name = 'dl';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'dt+|dd+',\n      group: 'block',\n      parseDOM: [{ tag: 'dl' }],\n      toDOM() {\n        return ['dl', 0];\n      },\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    return [\n      // wrappingInputRule(/^\\s*([-+*])\\s$/, type),\n    ];\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'toggleDefinitionList': () => editor.commandFactories.wrapInList(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {};\n  }\n}\n","import { NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeDefinitionTerm extends Node {\n  override name = 'dt';\n  requires = ['dl'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'inline*',\n      group: 'block',\n      parseDOM: [{ tag: 'dt' }],\n      defining: true,\n      toDOM() {\n        return ['dt', 0];\n      },\n    };\n  }\n}\n","import { NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeDefinitionDesc extends Node {\n  override name = 'dd';\n  requires = ['dl'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'inline*',\n      group: 'block',\n      parseDOM: [{ tag: 'dd' }],\n      defining: true,\n      toDOM() {\n        return ['dd', 0];\n      },\n    };\n  }\n}\n","import { Node as PmNode, NodeSpec, NodeType, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport {\n  CommandFactories,\n  CoreEditor,\n  NESTING_SELF_CLOSING,\n  Node,\n} from '@kerebron/editor';\nimport { Command } from '@kerebron/editor/commands';\nimport {\n  type InputRule,\n  replaceInlineNode,\n} from '@kerebron/editor/plugins/input-rules';\n\nexport function fixCharacters(text: string) {\n  return text\n    .replace(/’/g, \"'\")\n    .replace(/“/g, '\"')\n    .replace(/”/g, '\"')\n    // deno-lint-ignore no-control-regex\n    .replace(/\\x0b/g, ' ')\n    .replace(/\\u201d/g, '\"')\n    .replace(/\\u201c/g, '\"');\n}\n\ntype Factory = (oldNode: PmNode, schema: Schema) => PmNode;\n\nfunction replaceAllNodesOfType(\n  tr: Transaction,\n  doc: PmNode,\n  oldType: NodeType,\n  factory: Factory,\n) {\n  const replacements: Array<{ node: PmNode; pos: number }> = [];\n\n  doc.descendants((node, pos) => {\n    if (node.type === oldType) {\n      replacements.push({ node, pos });\n    }\n  });\n\n  for (let i = replacements.length - 1; i >= 0; i--) {\n    const { node, pos } = replacements[i];\n    const newNode = factory(node, tr.doc.type.schema);\n    tr = tr.replaceWith(pos, pos + node.nodeSize, newNode);\n  }\n\n  return tr;\n}\n\nexport class NodeInlineShortCode extends Node {\n  override name = 'shortcode_inline';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      group: 'inline',\n      selectable: true,\n      atom: true,\n      attrs: {\n        id: {\n          default: undefined,\n        },\n        content: {\n          default: '',\n        },\n        nesting: {\n          default: NESTING_SELF_CLOSING,\n        },\n        error: {\n          default: '',\n        },\n      },\n      parseDOM: [{\n        tag: 'span.kb-shortcode-inline',\n        getAttrs: (dom) => ({ content: dom.textContent || null }),\n      }],\n      toDOM(node) {\n        return [\n          'span',\n          { class: 'kb-shortcode-inline' },\n          node.attrs.content || '',\n        ];\n      },\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    return [\n      replaceInlineNode(\n        /\\{\\{[^}]+\\}\\}/g,\n        type,\n        (match: RegExpMatchArray) => {\n          const content = fixCharacters(\n            match[0].substring(2, match[0].length - 2),\n          );\n          return { content };\n        },\n      ),\n    ];\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'renderShortCode': (createReplacementNode: Factory): Command => {\n        return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n          let tr = state.tr;\n\n          tr = replaceAllNodesOfType(\n            tr,\n            state.doc,\n            type,\n            createReplacementNode,\n          );\n\n          if (tr.docChanged && dispatch) {\n            dispatch(tr);\n          }\n\n          return true;\n        };\n      },\n    };\n  }\n}\n","import { type NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nexport class NodeIframe extends Node {\n  override name = 'iframe';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      attrs: {\n        src: {},\n        class: { default: null },\n        alt: { default: null },\n        title: { default: null },\n      },\n      group: 'inline',\n      draggable: true,\n      parseDOM: [\n        {\n          tag: 'iframe[src]',\n          getAttrs(dom: HTMLElement) {\n            return {\n              src: dom.getAttribute('src'),\n              title: dom.getAttribute('title'),\n              alt: dom.getAttribute('alt'),\n            };\n          },\n        },\n      ],\n      toDOM(node) {\n        const { src, alt, title } = node.attrs;\n        return ['iframe', { src, alt, title, class: node.attrs.class }];\n      },\n    };\n  }\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\nimport { Node as PmNode } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\n\nimport {\n  type CoreEditor,\n  NESTING_CLOSING,\n  NESTING_OPENING,\n  Node,\n} from '@kerebron/editor';\nimport { type CommandFactories } from '@kerebron/editor/commands';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { CommandFactory } from '@kerebron/editor/commands';\n\nfunction collectCommentAnchors(doc: PmNode) {\n  const starts = new Map();\n  const ends = new Map();\n\n  doc.descendants((node, pos) => {\n    if (node.type.name === 'comment') {\n      if (node.attrs.nesting === NESTING_OPENING) {\n        starts.set(node.attrs.id, pos);\n      }\n      if (node.attrs.nesting === NESTING_CLOSING) {\n        ends.set(node.attrs.id, pos);\n      }\n    }\n  });\n\n  return { starts, ends };\n}\n\nfunction buildCommentRanges(doc: PmNode) {\n  const { starts, ends } = collectCommentAnchors(doc);\n  const ranges = [];\n\n  for (const [id, from] of starts) {\n    const to = ends.get(id);\n    if (!to || to <= from) continue;\n\n    ranges.push({\n      id,\n      from: from + 1, // skip start atom\n      to, // end atom position\n    });\n  }\n\n  return ranges;\n}\n\nfunction buildDecorations(doc: PmNode) {\n  const ranges = buildCommentRanges(doc);\n\n  return DecorationSet.create(\n    doc,\n    ranges.map(({ id, from, to }) =>\n      Decoration.inline(from, to, {\n        class: 'comment-highlight',\n        'data-comment-id': id,\n      })\n    ),\n  );\n}\n\nfunction commentsPlugin(): Plugin {\n  return new Plugin({\n    state: {\n      init(_, { doc }) {\n        return buildDecorations(doc);\n      },\n      apply(tr, oldDecos, oldState, newState) {\n        if (!tr.docChanged) return oldDecos;\n        return buildDecorations(newState.doc);\n      },\n    },\n    props: {\n      decorations(state) {\n        return this.getState(state);\n      },\n    },\n  });\n}\n\nconst addCommentBoundary: CommandFactory = (id) => {\n  return (state, dispatch) => {\n    const { schema, selection } = state;\n    const { from, to } = selection;\n\n    const commentType = schema.nodes.comment;\n    if (!commentType) return false;\n\n    const startNode = commentType.create({ id, nesting: NESTING_OPENING });\n    const endNode = commentType.create({ id, nesting: NESTING_CLOSING });\n\n    const tr = state.tr;\n\n    tr.insert(to, endNode);\n    tr.insert(from, startNode);\n\n    // Optional: restore selection\n    // tr = tr.setSelection(\n    //   TextSelection.create(tr.doc, from, to + startNode.nodeSize)\n    // );\n\n    if (dispatch) dispatch(tr);\n    return true;\n  };\n};\n\nexport class NodeCommentAnchor extends Node {\n  override name = 'comment';\n  requires = ['doc'];\n\n  options = {\n    keepMarks: true,\n  };\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      inline: true,\n      group: 'inline',\n      selectable: false,\n      atom: true,\n      attrs: {\n        id: {},\n        active: {\n          default: false,\n        },\n        nesting: {\n          default: NESTING_OPENING,\n        },\n      },\n      parseDOM: [\n        {\n          tag: 'span[data-comment-id]',\n          getAttrs(dom: HTMLElement) {\n            return {\n              id: dom.getAttribute('data-comment-id'),\n              nesting: parseInt(dom.getAttribute('data-nesting') || '1'),\n              active: dom.hasAttribute('data-active'),\n            };\n          },\n        },\n      ],\n      toDOM: (\n        node,\n      ) => ['span', {\n        'data-comment-id': node.attrs.id,\n        'data-active': node.attrs.active ? 'true' : undefined,\n        'data-nesting': node.attrs.nesting,\n      }],\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'addComment': (id, active) => addCommentBoundary(id, active),\n    };\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      commentsPlugin(),\n      // dropCursor(this.options),\n    ];\n  }\n}\n","import {\n  type Attrs,\n  Fragment,\n  Mark,\n  Node as PMNode,\n  NodeRange,\n  type NodeType,\n  ResolvedPos,\n  Slice,\n} from 'prosemirror-model';\nimport {\n  EditorState,\n  NodeSelection,\n  Selection,\n  Transaction,\n} from 'prosemirror-state';\nimport {\n  canJoin,\n  canSplit,\n  liftTarget,\n  ReplaceAroundStep,\n} from 'prosemirror-transform';\n\nimport type { Command, CommandFactory } from '@kerebron/editor/commands';\n\n/// Build a command that splits a non-empty textblock at the top level\n/// of a list item by also splitting that list item.\nexport function splitListItem(itemType: NodeType, itemAttrs?: Attrs): Command {\n  const cmd: Command = function (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n  ) {\n    const { $from, $to, node } = state.selection as NodeSelection;\n    if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\n      return false;\n    }\n    const grandParent = $from.node(-1);\n    if (grandParent.type != itemType) return false;\n    if (\n      $from.parent.content.size == 0 &&\n      $from.node(-1).childCount == $from.indexAfter(-1)\n    ) {\n      // In an empty block. If this is a nested list, the wrapping\n      // list item should be split. Otherwise, bail out and let next\n      // command handle lifting.\n      if (\n        $from.depth == 3 || $from.node(-3).type != itemType ||\n        $from.index(-2) != $from.node(-2).childCount - 1\n      ) return false;\n      if (dispatch) {\n        let wrap = Fragment.empty;\n        const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n        // Build a fragment containing empty versions of the structure\n        // from the outer list item to the parent node of the cursor\n        for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d--) {\n          wrap = Fragment.from($from.node(d).copy(wrap));\n        }\n        let depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount\n          ? 1\n          : $from.indexAfter(-2) < $from.node(-3).childCount\n          ? 2\n          : 3;\n        // Add a second list item with an empty default start node\n        wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n        let start = $from.before($from.depth - (depthBefore - 1));\n        let tr = state.tr.replace(\n          start,\n          $from.after(-depthAfter),\n          new Slice(wrap, 4 - depthBefore, 0),\n        );\n        let sel = -1;\n        tr.doc.nodesBetween(start, tr.doc.content.size, (node, pos) => {\n          if (sel > -1) return false;\n          if (node.isTextblock && node.content.size == 0) sel = pos + 1;\n        });\n        if (sel > -1) tr.setSelection(Selection.near(tr.doc.resolve(sel)));\n        dispatch(tr.scrollIntoView());\n      }\n      return true;\n    }\n    let nextType = $to.pos == $from.end()\n      ? grandParent.contentMatchAt(0).defaultType\n      : null;\n    let tr = state.tr.delete($from.pos, $to.pos);\n    let types = nextType\n      ? [itemAttrs ? { type: itemType, attrs: itemAttrs } : null, {\n        type: nextType,\n      }]\n      : undefined;\n    if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n    if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n    return true;\n  };\n\n  cmd.displayName = `splitListItem(${itemType.name})`;\n\n  return cmd;\n}\n\n/// Acts like [`splitListItem`](#schema-list.splitListItem), but\n/// without resetting the set of active marks at the cursor.\nfunction splitListItemKeepMarks(\n  itemType: NodeType,\n  itemAttrs?: Attrs,\n): Command {\n  let split = splitListItem(itemType, itemAttrs);\n  return function (state, dispatch) {\n    return split.apply(this, [\n      state,\n      dispatch && ((tr) => {\n        let marks = state.storedMarks ||\n          (state.selection.$to.parentOffset && state.selection.$from.marks());\n        if (marks) tr.ensureMarks(marks);\n        dispatch(tr);\n      }),\n    ]);\n  };\n}\n\n/// Create a command to lift the list item around the selection up into\n/// a wrapping list.\nexport function liftListItem(itemType: NodeType): Command {\n  return function (state: EditorState, dispatch?: (tr: Transaction) => void) {\n    let { $from, $to } = state.selection;\n    let range = $from.blockRange(\n      $to,\n      (node) => node.childCount > 0 && node.firstChild!.type == itemType,\n    );\n    if (!range) return false;\n    if (!dispatch) return true;\n    if ($from.node(range.depth - 1).type == itemType) { // Inside a parent list\n      return liftToOuterList(state, dispatch, itemType, range);\n    } // Outer list node\n    else {\n      return liftOutOfList(state, dispatch, range);\n    }\n  };\n}\n\nfunction liftToOuterList(\n  state: EditorState,\n  dispatch: (tr: Transaction) => void,\n  itemType: NodeType,\n  range: NodeRange,\n) {\n  let tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n  if (end < endOfList) {\n    // There are siblings after the lifted items, which must become\n    // children of the last item\n    tr.step(\n      new ReplaceAroundStep(\n        end - 1,\n        endOfList,\n        end,\n        endOfList,\n        new Slice(\n          Fragment.from(itemType.create(null, range.parent.copy())),\n          1,\n          0,\n        ),\n        1,\n        true,\n      ),\n    );\n    range = new NodeRange(\n      tr.doc.resolve(range.$from.pos),\n      tr.doc.resolve(endOfList),\n      range.depth,\n    );\n  }\n  const target = liftTarget(range);\n  if (target == null) return false;\n  tr.lift(range, target);\n  let $after = tr.doc.resolve(tr.mapping.map(end, -1) - 1);\n  if (\n    canJoin(tr.doc, $after.pos) &&\n    $after.nodeBefore!.type == $after.nodeAfter!.type\n  ) tr.join($after.pos);\n  dispatch(tr.scrollIntoView());\n  return true;\n}\n\nfunction liftOutOfList(\n  state: EditorState,\n  dispatch: (tr: Transaction) => void,\n  range: NodeRange,\n) {\n  let tr = state.tr, list = range.parent;\n  // Merge the list items into a single big item\n  for (\n    let pos = range.end, i = range.endIndex - 1, e = range.startIndex;\n    i > e;\n    i--\n  ) {\n    pos -= list.child(i).nodeSize;\n    tr.delete(pos - 1, pos + 1);\n  }\n  let $start = tr.doc.resolve(range.start), item = $start.nodeAfter!;\n  if (tr.mapping.map(range.end) != range.start + $start.nodeAfter!.nodeSize) {\n    return false;\n  }\n  let atStart = range.startIndex == 0,\n    atEnd = range.endIndex == list.childCount;\n  let parent = $start.node(-1), indexBefore = $start.index(-1);\n  if (\n    !parent.canReplace(\n      indexBefore + (atStart ? 0 : 1),\n      indexBefore + 1,\n      item.content.append(atEnd ? Fragment.empty : Fragment.from(list)),\n    )\n  ) {\n    return false;\n  }\n  let start = $start.pos, end = start + item.nodeSize;\n  // Strip off the surrounding list. At the sides where we're not at\n  // the end of the list, the existing list is closed. At sides where\n  // this is the end, it is overwritten to its end.\n  tr.step(\n    new ReplaceAroundStep(\n      start - (atStart ? 1 : 0),\n      end + (atEnd ? 1 : 0),\n      start + 1,\n      end - 1,\n      new Slice(\n        (atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n          .append(\n            atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)),\n          ),\n        atStart ? 0 : 1,\n        atEnd ? 0 : 1,\n      ),\n      atStart ? 0 : 1,\n    ),\n  );\n  dispatch(tr.scrollIntoView());\n  return true;\n}\n\n/// Create a command to sink the list item around the selection down\n/// into an inner list.\nexport function sinkListItem(itemType: NodeType): Command {\n  return function (state, dispatch) {\n    const { $from, $to } = state.selection;\n    const range = $from.blockRange(\n      $to,\n      (node) => node.childCount > 0 && node.firstChild!.type == itemType,\n    );\n    if (!range) return false;\n    const startIndex = range.startIndex;\n    if (startIndex == 0) return false;\n    const parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n    if (nodeBefore.type != itemType) return false;\n\n    if (dispatch) {\n      const nestedBefore = nodeBefore.lastChild &&\n        nodeBefore.lastChild.type == parent.type;\n      const inner = Fragment.from(nestedBefore ? itemType.create() : null);\n      const slice = new Slice(\n        Fragment.from(\n          itemType.create(null, Fragment.from(parent.type.create(null, inner))),\n        ),\n        nestedBefore ? 3 : 1,\n        0,\n      );\n      const before = range.start, after = range.end;\n      dispatch(\n        state.tr.step(\n          new ReplaceAroundStep(\n            before - (nestedBefore ? 3 : 1),\n            after,\n            before,\n            after,\n            slice,\n            1,\n            true,\n          ),\n        )\n          .scrollIntoView(),\n      );\n    }\n    return true;\n  };\n}\n\nconst isList = (name: string) => {\n  return name.endsWith('_list');\n};\n\nexport const clearNodes: CommandFactory = () => (state, dispatch) => {\n  const tr = state.tr;\n  const { selection } = tr;\n  const { ranges } = selection;\n\n  if (!dispatch) {\n    return true;\n  }\n\n  ranges.forEach(({ $from, $to }) => {\n    state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n      if (node.type.isText) {\n        return;\n      }\n\n      const { doc, mapping } = tr;\n      const $mappedFrom = doc.resolve(mapping.map(pos));\n      const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize));\n      const nodeRange = $mappedFrom.blockRange($mappedTo);\n\n      if (!nodeRange) {\n        return;\n      }\n\n      const targetLiftDepth = liftTarget(nodeRange);\n\n      if (node.type.isTextblock) {\n        const { defaultType } = $mappedFrom.parent.contentMatchAt(\n          $mappedFrom.index(),\n        );\n\n        tr.setNodeMarkup(nodeRange.start, defaultType);\n      }\n\n      if (targetLiftDepth || targetLiftDepth === 0) {\n        tr.lift(nodeRange, targetLiftDepth);\n      }\n    });\n  });\n\n  return true;\n};\n\nexport function findParentNodeClosestToPos(\n  $pos: ResolvedPos,\n  predicate: Predicate,\n):\n  | {\n    pos: number;\n    start: number;\n    depth: number;\n    node: PMNode;\n  }\n  | undefined {\n  for (let i = $pos.depth; i > 0; i -= 1) {\n    const node = $pos.node(i);\n\n    if (predicate(node)) {\n      return {\n        pos: i > 0 ? $pos.before(i) : 0,\n        start: $pos.start(i),\n        depth: i,\n        node,\n      };\n    }\n  }\n}\n\nexport type Predicate = (node: PMNode) => boolean;\n\nexport function findParentNode(predicate: Predicate) {\n  return (selection: Selection) =>\n    findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nconst joinListBackwards = (tr: Transaction, listType: NodeType): boolean => {\n  const list = findParentNode((node) => node.type === listType)(tr.selection);\n\n  if (!list) {\n    return true;\n  }\n\n  const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth);\n\n  if (before === undefined) {\n    return true;\n  }\n\n  const nodeBefore = tr.doc.nodeAt(before);\n  const canJoinBackwards = list.node.type === nodeBefore?.type &&\n    canJoin(tr.doc, list.pos);\n\n  if (!canJoinBackwards) {\n    return true;\n  }\n\n  tr.join(list.pos);\n\n  return true;\n};\n\nconst joinListForwards = (tr: Transaction, listType: NodeType): boolean => {\n  const list = findParentNode((node) => node.type === listType)(tr.selection);\n\n  if (!list) {\n    return true;\n  }\n\n  const after = tr.doc.resolve(list.start).after(list.depth);\n\n  if (after === undefined) {\n    return true;\n  }\n\n  const nodeAfter = tr.doc.nodeAt(after);\n  const canJoinForwards = list.node.type === nodeAfter?.type &&\n    canJoin(tr.doc, after);\n\n  if (!canJoinForwards) {\n    return true;\n  }\n\n  tr.join(after);\n\n  return true;\n};\n\nexport const toggleList: CommandFactory = (\n  listTypeOrName,\n  itemTypeOrName,\n  keepMarks,\n  attributes = {},\n): Command =>\n  function (\n    state,\n    dispatch,\n    view,\n  ): boolean {\n    if (!this) {\n      throw new Error('Call this with Function.apply');\n    }\n\n    const editor = this.editor;\n\n    const splittableMarks: string[] = Object.keys(state.schema.marks).filter(\n      (name) => name !== 'link',\n    );\n    const listType = state.schema.nodes[listTypeOrName];\n    const itemType = state.schema.nodes[itemTypeOrName];\n    const { selection, storedMarks } = state;\n    const { $from, $to } = selection;\n    const range = $from.blockRange($to);\n\n    const marks: readonly Mark[] = storedMarks ||\n      (selection.$to.parentOffset ? selection.$from.marks() : []);\n\n    if (!range) {\n      return false;\n    }\n\n    const parentList = findParentNode((node) => isList(node.type.name))(\n      selection,\n    );\n\n    const tr = state.tr;\n\n    if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n      // remove list\n      if (parentList.node.type === listType) {\n        return liftListItem(itemType).apply(this, [state, dispatch, view]);\n      }\n\n      // change list type\n      if (\n        isList(parentList.node.type.name) &&\n        listType.validContent(parentList.node.content) &&\n        dispatch\n      ) {\n        return editor.chain(tr)\n          .command(() => {\n            tr.setNodeMarkup(parentList.pos, listType);\n\n            return true;\n          })\n          .command(() => joinListBackwards(tr, listType))\n          .command(() => joinListForwards(tr, listType))\n          .command(() => dispatch(tr))\n          .run();\n      }\n    }\n    if (!keepMarks || !marks || !dispatch) {\n      return editor.chain(tr)\n        // try to convert node to default node if needed\n        .command(() => {\n          const canWrapInList = editor.can().wrapInList(listType, attributes)\n            .run();\n\n          if (canWrapInList) {\n            return true;\n          }\n\n          // return clearNodes().apply(this, [state, dispatch, view]);\n          return editor.chain(tr).lift().run();\n        })\n        .wrapInList(listType, attributes)\n        .command(() => joinListBackwards(tr, listType))\n        .command(() => joinListForwards(tr, listType))\n        .command(() => {\n          if (dispatch) dispatch(tr);\n          return true;\n        })\n        .run();\n    }\n\n    return (\n      editor.chain(tr)\n        // try to convert node to default node if needed\n        .command(() => {\n          const canWrapInList = editor.can().wrapInList(listType, attributes)\n            .run();\n\n          const filteredMarks = marks.filter((mark) =>\n            splittableMarks.includes(mark.type.name)\n          );\n\n          tr.ensureMarks(filteredMarks);\n\n          if (canWrapInList) {\n            return true;\n          }\n\n          if (parentList) {\n            tr.setSelection(NodeSelection.create(state.doc, parentList.pos));\n          }\n\n          return clearNodes().apply(this, [state, dispatch, view]);\n        })\n        .wrapInList(listType, attributes)\n        .command(() => joinListBackwards(tr, listType))\n        .command(() => joinListForwards(tr, listType))\n        .command(() => {\n          if (dispatch) dispatch(tr);\n          return true;\n        })\n        .run()\n    );\n  };\n","import { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  getHtmlAttributes,\n  setHtmlAttributes,\n} from '@kerebron/editor/utilities';\n\nimport {\n  type InputRule,\n  wrappingInputRule,\n} from '@kerebron/editor/plugins/input-rules';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { toggleList } from './commands.ts';\n\nexport class NodeOrderedList extends Node {\n  override name = 'ordered_list';\n  requires = ['doc'];\n\n  override attributes = {\n    type: {\n      default: '1',\n      fromDom(element: HTMLElement) {\n        return element.hasAttribute('type')\n          ? element.getAttribute('type')\n          : '1';\n      },\n    },\n    start: {\n      default: undefined,\n      fromDom(element: HTMLElement) {\n        return element.hasAttribute('start')\n          ? +element.getAttribute('start')!\n          : undefined;\n      },\n    },\n    id: {\n      default: undefined,\n    },\n    continue: {\n      default: undefined,\n    },\n    odtMarginLeft: {\n      default: undefined,\n    },\n  };\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'list_item+',\n      group: 'block list',\n      parseDOM: [\n        { tag: 'ol', getAttrs: (element) => setHtmlAttributes(this, element) },\n      ],\n      toDOM: (node) => ['ol', getHtmlAttributes(this, node), 0],\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    return [\n      /// Given a list node type, returns an input rule that turns a number\n      /// followed by a dot at the start of a textblock into an ordered list.\n      wrappingInputRule(\n        /^(\\d+)\\.\\s$/,\n        type,\n        (match) => ({ order: +match[1] }),\n        (match, node) => node.childCount + node.attrs.order == +match[1],\n      ),\n    ];\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const keepMarks = false;\n    return {\n      'toggleOrderedList': () => {\n        return toggleList('ordered_list', 'list_item', keepMarks);\n      },\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Shift-Ctrl-7': 'toggleOrderedList',\n    };\n  }\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport {\n  type InputRule,\n  wrappingInputRule,\n} from '@kerebron/editor/plugins/input-rules';\nimport { toggleList } from './commands.ts';\n\nexport class NodeBulletList extends Node {\n  override name = 'bullet_list';\n  requires = ['doc'];\n\n  override attributes = {\n    toc: {\n      default: undefined,\n    },\n    odtMarginLeft: {\n      default: undefined,\n    },\n  };\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'list_item+',\n      group: 'block list',\n      parseDOM: [{ tag: 'ul' }],\n      toDOM() {\n        return ['ul', 0];\n      },\n    };\n  }\n\n  override getInputRules(type: NodeType): InputRule[] {\n    /// Given a list node type, returns an input rule that turns a bullet\n    /// (dash, plush, or asterisk) at the start of a textblock into a\n    /// bullet list.\n    return [\n      wrappingInputRule(/^\\s*([-+*])\\s$/, type),\n    ];\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const keepMarks = false;\n    return {\n      'toggleBulletList': () => {\n        return toggleList('bullet_list', 'list_item', keepMarks);\n      },\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Shift-Ctrl-8': 'toggleBulletList',\n    };\n  }\n}\n","import { Node as PMNode, NodeSpec, type NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport type {\n  CommandFactories,\n  CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport {\n  getHtmlAttributes,\n  setHtmlAttributes,\n} from '@kerebron/editor/utilities';\nimport { liftListItem, sinkListItem, splitListItem } from './commands.ts';\n\nexport class NodeListItem extends Node {\n  override name = 'list_item';\n  requires = ['doc'];\n\n  override attributes = {\n    value: {\n      default: undefined,\n    },\n    type: {\n      default: undefined,\n      fromDom(element: HTMLElement) {\n        return element.hasAttribute('type')\n          ? element.getAttribute('type')\n          : undefined;\n      },\n      toDom(node: PMNode) {\n        return node.attrs.type;\n      },\n    },\n  };\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'paragraph block*',\n      defining: true,\n      parseDOM: [{\n        tag: 'li',\n        getAttrs: (element) => setHtmlAttributes(this, element),\n      }],\n      toDOM: (node) => {\n        return ['li', getHtmlAttributes(this, node), 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'splitListItem': () => splitListItem(type),\n      'liftListItem': () => liftListItem(type),\n      'sinkListItem': () => sinkListItem(type),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Enter': 'splitListItem',\n      'Tab': 'sinkListItem',\n      'Shift-Tab': 'liftListItem',\n    };\n  }\n}\n","import type { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { toggleList } from './commands.ts';\n\nexport class NodeTaskList extends Node {\n  override name = 'task_list';\n  requires = ['doc'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'task_item+',\n      group: 'block list',\n      parseDOM: [{ tag: `ul[data-type=\"${this.name}\"]` }],\n      toDOM: () => {\n        return ['ul', { 'data-type': this.name }, 0];\n      },\n    };\n  }\n\n  override getCommandFactories(): Partial<CommandFactories> {\n    return {\n      'toggleTaskList': () => {\n        return toggleList('task_list', 'task_item');\n      },\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Shift-Ctrl-9': 'toggleTaskList',\n    };\n  }\n}\n","import { Node } from 'prosemirror-model';\nimport { EditorView, NodeView, NodeViewConstructor } from 'prosemirror-view';\n\nimport { CoreEditor } from '@kerebron/editor';\n\nexport class NodeViewTaskItem implements NodeView {\n  public readonly dom: HTMLLIElement;\n  public readonly contentDOM: HTMLDivElement;\n  public readonly checkbox: HTMLInputElement;\n\n  private node: Node;\n  private readonly view: EditorView;\n  private readonly getPos: () => number | undefined;\n\n  config = {};\n\n  constructor(\n    private editor: CoreEditor,\n    ...args: Parameters<NodeViewConstructor>\n  ) {\n    this.node = args[0];\n    this.view = args[1];\n    this.getPos = args[2];\n\n    const listItem = document.createElement('li');\n    this.dom = listItem;\n\n    const checkboxWrapper = document.createElement('label');\n    checkboxWrapper.contentEditable = 'false';\n\n    const checkbox = document.createElement('input');\n    this.checkbox = checkbox;\n    checkbox.type = 'checkbox';\n    checkbox.checked = this.node.attrs.checked;\n    checkboxWrapper.append(checkbox);\n\n    const content = document.createElement('div');\n    this.contentDOM = content;\n\n    listItem.append(checkboxWrapper, content);\n    listItem.dataset.checked = this.node.attrs.checked;\n\n    checkbox.addEventListener('mousedown', (event) => event.preventDefault());\n    checkbox.addEventListener('change', (event) => {\n      const position = this.getPos();\n      if (typeof position !== 'number') {\n        return;\n      }\n      const isEditable = this.editor.view.editable;\n\n      const { checked } = event.target as any;\n\n      const tr = editor.state.tr;\n\n      const currentNode = tr.doc.nodeAt(position);\n      tr.setNodeMarkup(position, undefined, {\n        ...currentNode?.attrs,\n        checked,\n      });\n\n      editor.dispatchTransaction(tr);\n    });\n  }\n\n  static create = (\n    editor: CoreEditor,\n    ...args: Parameters<NodeViewConstructor>\n  ) => {\n    return new NodeViewTaskItem(editor, ...args);\n  };\n\n  update(updatedNode: Node) {\n    if (updatedNode.type.name !== this.node.type.name) {\n      return false;\n    }\n\n    this.dom.dataset.checked = updatedNode.attrs.checked;\n    this.checkbox.checked = updatedNode.attrs.checked;\n\n    return true;\n  }\n}\n","import { Node as PmNode, NodeSpec, type NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { wrappingInputRule } from '@kerebron/editor/plugins/input-rules';\nimport { liftListItem, sinkListItem, splitListItem } from './commands.ts';\nimport { NodeViewConstructor } from '@kerebron/editor/DummyEditorView';\nimport { NodeViewTaskItem } from './NodeViewTaskItem.ts';\n\nexport interface TaskItemOptions {\n  onReadOnlyChecked?: (node: PmNode, checked: boolean) => boolean;\n  nested: boolean;\n}\n\nexport class NodeTaskItem extends Node {\n  override name = 'task_item';\n  requires = ['doc'];\n\n  public constructor(\n    protected override config: Partial<TaskItemOptions> = { nested: true },\n  ) {\n    super(config);\n  }\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      attrs: {\n        checked: {\n          default: false,\n        },\n      },\n      content: this.config.nested ? 'paragraph block*' : 'paragraph+',\n      defining: true,\n      parseDOM: [{\n        tag: 'li[data-checked]',\n        getAttrs(node) {\n          return {\n            checked: node.getAttribute('data-checked') === 'true',\n          };\n        },\n      }],\n      toDOM: (node) => {\n        return [\n          'li',\n          {\n            'data-type': this.name,\n            'data-checked': node.attrs.checked,\n          },\n          [\n            'label',\n            [\n              'input',\n              {\n                type: 'checkbox',\n                checked: node.attrs.checked ? 'checked' : null,\n              },\n              ['span'],\n            ],\n            ['div', 0],\n          ],\n        ];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'splitListItem': () => splitListItem(type),\n      'liftListItem': () => liftListItem(type),\n      'sinkListItem': () => sinkListItem(type),\n    };\n  }\n\n  override getNodeView(editor: CoreEditor): NodeViewConstructor {\n    return (...args) => {\n      return NodeViewTaskItem.create(editor, ...args);\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Enter': 'splitListItem',\n      'Tab': 'sinkListItem',\n      'Shift-Tab': 'liftListItem',\n    };\n  }\n\n  override getInputRules(type: NodeType) {\n    const inputRegex = /^\\s*(\\[([( |x])?\\])\\s$/;\n\n    return [\n      wrappingInputRule(\n        inputRegex,\n        type,\n        (match) => ({\n          checked: match[match.length - 1] === 'x',\n        }),\n      ),\n    ];\n  }\n}\n","import { AnyExtensionOrReq, EditorKit } from '@kerebron/editor';\n\nimport { ExtensionSelection } from './ExtensionSelection.ts';\nimport { ExtensionBaseKeymap } from './ExtensionBaseKeymap.ts';\nimport { ExtensionDropcursor } from './ExtensionDropcursor.ts';\nimport { ExtensionGapcursor } from './ExtensionGapcursor.ts';\nimport { ExtensionTextAlign } from './ExtensionTextAlign.ts';\nimport { ExtensionUser } from './ExtensionUser.ts';\nimport { ExtensionRemoteSelection } from './remote-selection/ExtensionRemoteSelection.ts';\nimport { ExtensionPairing } from './pairing/ExtensionPairing.ts';\nimport { ExtensionHtml } from './media/ExtensionHtml.ts';\nimport { ExtensionMediaUpload } from './media/ExtensionMediaUpload.ts';\nimport { ExtensionPaste } from './media/ExtensionPaste.ts';\n\nimport { MarkLink } from './MarkLink.ts';\nimport { MarkStrong } from './MarkStrong.ts';\nimport { MarkItalic } from './MarkItalic.ts';\nimport { MarkUnderline } from './MarkUnderline.ts';\nimport { MarkStrike } from './MarkStrike.ts';\nimport { MarkCode } from './MarkCode.ts';\nimport { MarkChange } from './MarkChange.ts';\nimport { MarkBookmark } from './MarkBookmark.ts';\nimport { MarkTextColor } from './MarkTextColor.ts';\nimport { MarkHighlight } from './MarkHighlight.ts';\nimport { MarkSuperscript } from './MarkSuperscript.ts';\nimport { MarkSubscript } from './MarkSubscript.ts';\n\nimport { NodeDocument } from './NodeDocument.ts';\nimport { NodeText } from './NodeText.ts';\nimport { NodeCodeBlock } from './NodeCodeBlock.ts';\nimport { NodeBookmark } from './NodeBookmark.ts';\nimport { NodeParagraph } from './NodeParagraph.ts';\nimport { NodeHardBreak } from './NodeHardBreak.ts';\nimport { NodeSoftBreak } from './NodeSoftBreak.ts';\nimport { NodeHorizontalRule } from './NodeHorizontalRule.ts';\nimport { NodeImage } from './NodeImage.ts';\nimport { NodeVideo } from './NodeVideo.ts';\nimport { NodeBlockquote } from './NodeBlockquote.ts';\nimport { NodeAside } from './NodeAside.ts';\nimport { NodeHeading } from './NodeHeading.ts';\nimport { NodeMath } from './NodeMath.ts';\nimport { NodeDefinitionList } from './NodeDefinitionList.ts';\nimport { NodeDefinitionTerm } from './NodeDefinitionTerm.ts';\nimport { NodeDefinitionDesc } from './NodeDefinitionDesc.ts';\nimport { NodeInlineShortCode } from './NodeInlineShortCode.ts';\nimport { NodeIframe } from './NodeIframe.ts';\nimport { NodeCommentAnchor } from './NodeCommentAnchor.ts';\nimport { NodeOrderedList } from './lists/NodeOrderedList.ts';\nimport { NodeBulletList } from './lists/NodeBulletList.ts';\nimport { NodeListItem } from './lists/NodeListItem.ts';\nimport { NodeTaskList } from './lists/NodeTaskList.ts';\nimport { NodeTaskItem } from './lists/NodeTaskItem.ts';\n\nexport class BasicEditorKit implements EditorKit {\n  getExtensions(): AnyExtensionOrReq[] {\n    return [\n      new ExtensionBaseKeymap(),\n      new ExtensionDropcursor(),\n      new ExtensionGapcursor(),\n      new ExtensionHtml(),\n      new ExtensionMediaUpload(),\n      new ExtensionRemoteSelection(),\n      new ExtensionSelection(),\n      new ExtensionTextAlign(),\n      new ExtensionPairing(),\n      new ExtensionUser(),\n      new ExtensionPaste(),\n      new NodeDocument(),\n      new NodeText(),\n      new NodeParagraph(),\n      new NodeHardBreak(),\n      new NodeSoftBreak(),\n      new NodeCodeBlock(),\n      new NodeBookmark(),\n      new NodeHorizontalRule(),\n      new NodeOrderedList(),\n      new NodeBulletList(),\n      new NodeListItem(),\n      new NodeTaskList(),\n      new NodeTaskItem(),\n      new NodeDefinitionList(),\n      new NodeDefinitionTerm(),\n      new NodeDefinitionDesc(),\n      new NodeTaskList(),\n      new NodeTaskItem(),\n      new NodeImage(),\n      new NodeVideo(),\n      new NodeBlockquote(),\n      new NodeAside(),\n      new NodeHeading(),\n      new NodeMath(),\n      new NodeInlineShortCode(),\n      new NodeIframe(),\n      new NodeCommentAnchor(),\n      new MarkLink(),\n      new MarkItalic(),\n      new MarkStrong(),\n      new MarkUnderline(),\n      new MarkStrike(),\n      new MarkCode(),\n      new MarkChange(),\n      new MarkBookmark(),\n      new MarkTextColor(),\n      new MarkHighlight(),\n      new MarkSuperscript(),\n      new MarkSubscript(),\n    ];\n  }\n}\n","import { Extension } from '@kerebron/editor';\n\nimport { BasicEditorKit } from './BasicEditorKit.ts';\n\nconst kit = new BasicEditorKit();\n\nexport class ExtensionBasicEditor extends Extension {\n  name = 'basic-editor';\n  requires = kit.getExtensions();\n}\n","// Fork and TS port of https://code.haverbeke.berlin/marijn/rope-sequence/\n\nconst GOOD_LEAF_SIZE = 200;\n\n// :: class<T> A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nexport abstract class RopeSequence<T> {\n  abstract length: number;\n  abstract depth: number;\n  abstract flatten(): T[];\n\n  abstract leafAppend(other: RopeSequence<T>): RopeSequence<T> | undefined;\n  abstract leafPrepend(other: RopeSequence<T>): RopeSequence<T> | undefined;\n\n  // :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n  // Append an array or other rope to this one, returning a new rope.\n  append(other: RopeSequence<T> | T[]) {\n    if (!other.length) return this;\n    other = RopeSequence.from(other);\n\n    return (!this.length && other) ||\n      (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n      (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n      this.appendInner(other);\n  }\n\n  // :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n  // Prepend an array or other rope to this one, returning a new rope.\n  prepend(other: RopeSequence<T> | T[]) {\n    if (!other.length) return this;\n    return RopeSequence.from(other).append(this);\n  }\n\n  appendInner(other: RopeSequence<T>): RopeSequence<T> {\n    return new Append(this, other);\n  }\n\n  abstract sliceInner(from: number, to: number): RopeSequence<T>;\n\n  // :: (?number, ?number) → RopeSequence<T>\n  // Create a rope repesenting a sub-sequence of this rope.\n  slice(from = 0, to = this.length): RopeSequence<T> {\n    if (from >= to) return emptyRopeSequence();\n    return this.sliceInner(Math.max(0, from), Math.min(this.length, to));\n  }\n\n  abstract getInner(i: number): T | undefined;\n\n  // :: (number) → T\n  // Retrieve the element at the given position from this rope.\n  get(i: number): T | undefined {\n    if (i < 0 || i >= this.length) return undefined;\n    return this.getInner(i);\n  }\n\n  abstract forEachInner(\n    f: (item: T, i: number) => T | boolean,\n    from: number,\n    to: number,\n    start: number,\n  ): boolean;\n  abstract forEachInvertedInner(\n    f: (item: T, i: number) => T | boolean,\n    from: number,\n    to: number,\n    start: number,\n  ): boolean;\n\n  // :: ((element: T, index: number) → ?bool, ?number, ?number)\n  // Call the given function for each element between the given\n  // indices. This tends to be more efficient than looping over the\n  // indices and calling `get`, because it doesn't have to descend the\n  // tree for every element.\n  forEach(\n    f: (item: T, i: number) => T | boolean,\n    from = 0,\n    to = this.length,\n  ): void {\n    if (from <= to) {\n      this.forEachInner(f, from, to, 0);\n    } else {\n      this.forEachInvertedInner(f, from, to, 0);\n    }\n  }\n\n  // :: ((element: T, index: number) → U, ?number, ?number) → [U]\n  // Map the given functions over the elements of the rope, producing\n  // a flat array.\n  map(f: (item: T, i: number) => T, from = 0, to = this.length): T[] {\n    let result: T[] = [];\n    this.forEach(\n      (elt, i) => {\n        result.push(f(elt, i));\n        return elt;\n      },\n      from,\n      to,\n    );\n    return result;\n  }\n\n  // :: (?union<[T], RopeSequence<T>>) → RopeSequence<T>\n  // Create a rope representing the given array, or return the rope\n  // itself if a rope was given.\n  static from<T>(values: RopeSequence<T> | T[]): RopeSequence<T> {\n    if (values instanceof RopeSequence) return values;\n    return values && values.length ? new Leaf(values) : emptyRopeSequence();\n  }\n\n  // flatten:: () → [T]\n  // Return the content of this rope as an array.\n}\n\nclass Leaf<T> extends RopeSequence<T> {\n  values: T[];\n\n  constructor(values: T[]) {\n    super();\n    this.values = values;\n  }\n\n  flatten(): T[] {\n    return this.values;\n  }\n\n  sliceInner(from: number, to: number): RopeSequence<T> {\n    if (from == 0 && to == this.length) return this;\n    return new Leaf(this.values.slice(from, to));\n  }\n\n  getInner(i: number): T {\n    return this.values[i];\n  }\n\n  forEachInner(\n    f: (item: T, i: number) => T,\n    from: number,\n    to: number,\n    start: number,\n  ): boolean {\n    for (let i = from; i < to; i++) {\n      if (f(this.values[i], start + i) === false) return false;\n    }\n\n    return true;\n  }\n\n  forEachInvertedInner(\n    f: (item: T, i: number) => T,\n    from: number,\n    to: number,\n    start: number,\n  ): boolean {\n    for (let i = from - 1; i >= to; i--) {\n      if (f(this.values[i], start + i) === false) return false;\n    }\n\n    return true;\n  }\n\n  leafAppend(other: RopeSequence<T>): RopeSequence<T> | undefined {\n    if (this.length + other.length <= GOOD_LEAF_SIZE) {\n      return new Leaf(this.values.concat(other.flatten()));\n    }\n  }\n\n  leafPrepend(other: RopeSequence<T>): RopeSequence<T> | undefined {\n    if (this.length + other.length <= GOOD_LEAF_SIZE) {\n      return new Leaf(other.flatten().concat(this.values));\n    }\n  }\n\n  get length() {\n    return this.values.length;\n  }\n\n  get depth() {\n    return 0;\n  }\n}\n\nexport function emptyRopeSequence() {\n  return new Leaf([]);\n}\n\nclass Append<T> extends RopeSequence<T> {\n  left: RopeSequence<T>;\n  right: RopeSequence<T>;\n  depth: number;\n  length: number;\n\n  constructor(left: RopeSequence<T>, right: RopeSequence<T>) {\n    super();\n    this.left = left;\n    this.right = right;\n    this.length = left.length + right.length;\n    this.depth = Math.max(left.depth, right.depth) + 1;\n  }\n\n  flatten() {\n    return this.left.flatten().concat(this.right.flatten());\n  }\n\n  getInner(i: number): T | undefined {\n    return i < this.left.length\n      ? this.left.get(i)\n      : this.right.get(i - this.left.length);\n  }\n\n  forEachInner(\n    f: (item: T, i: number) => T,\n    from: number,\n    to: number,\n    start: number,\n  ): boolean {\n    let leftLen = this.left.length;\n    if (\n      from < leftLen &&\n      this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false\n    ) {\n      return false;\n    }\n    if (\n      to > leftLen &&\n      this.right.forEachInner(\n          f,\n          Math.max(from - leftLen, 0),\n          Math.min(this.length, to) - leftLen,\n          start + leftLen,\n        ) === false\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  forEachInvertedInner(\n    f: (item: T, i: number) => T,\n    from: number,\n    to: number,\n    start: number,\n  ): boolean {\n    let leftLen = this.left.length;\n    if (\n      from > leftLen &&\n      this.right.forEachInvertedInner(\n          f,\n          from - leftLen,\n          Math.max(to, leftLen) - leftLen,\n          start + leftLen,\n        ) === false\n    ) {\n      return false;\n    }\n    if (\n      to < leftLen &&\n      this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) ===\n        false\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  sliceInner(from: number, to: number) {\n    if (from == 0 && to == this.length) return this;\n    let leftLen = this.left.length;\n    if (to <= leftLen) return this.left.slice(from, to);\n    if (from >= leftLen) return this.right.slice(from - leftLen, to - leftLen);\n    return this.left.slice(from, leftLen).append(\n      this.right.slice(0, to - leftLen),\n    );\n  }\n\n  leafAppend(other: RopeSequence<T>) {\n    let inner = this.right.leafAppend(other);\n    if (inner) return new Append(this.left, inner);\n  }\n\n  leafPrepend(other: RopeSequence<T>) {\n    let inner = this.left.leafPrepend(other);\n    if (inner) return new Append(inner, this.right);\n  }\n\n  override appendInner(other: RopeSequence<T>): RopeSequence<T> {\n    if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1) {\n      return new Append(this.left, new Append(this.right, other));\n    }\n    return new Append(this, other);\n  }\n}\n","// Fork of https://code.haverbeke.berlin/prosemirror/prosemirror-history/\n// @TODO: https://code.haverbeke.berlin/prosemirror/prosemirror-history/src/branch/main/test/test-history.ts\n\nimport { emptyRopeSequence, RopeSequence } from './RopeSequence.ts';\nimport { Mapping, Step, StepMap, Transform } from 'prosemirror-transform';\nimport {\n  Command,\n  EditorState,\n  Plugin,\n  PluginKey,\n  SelectionBookmark,\n  Transaction,\n} from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n\n// Used to schedule history compression\nconst max_empty_items = 500;\n\nclass Branch {\n  constructor(\n    readonly items: RopeSequence<Item>,\n    readonly eventCount: number,\n  ) {}\n\n  // Pop the latest event off the branch's history and apply it\n  // to a document transform.\n  popEvent(state: EditorState, preserveItems: boolean) {\n    if (this.eventCount == 0) return null;\n\n    let end = this.items.length;\n    for (;; end--) {\n      let next = this.items.get(end - 1)!;\n      if (next.selection) {\n        --end;\n        break;\n      }\n    }\n\n    let remap: Mapping | undefined, mapFrom: number | undefined;\n    if (preserveItems) {\n      remap = this.remapping(end, this.items.length);\n      mapFrom = remap.maps.length;\n    }\n    let transform = state.tr;\n    let selection: SelectionBookmark | undefined, remaining: Branch | undefined;\n    let addAfter: Item[] = [], addBefore: Item[] = [];\n\n    this.items.forEach(\n      (item, i) => {\n        if (!item.step) {\n          if (!remap) {\n            remap = this.remapping(end, i + 1);\n            mapFrom = remap.maps.length;\n          }\n          mapFrom!--;\n          addBefore.push(item);\n          return item;\n        }\n\n        if (remap) {\n          addBefore.push(new Item(item.map));\n          let step = item.step.map(remap.slice(mapFrom)), map;\n\n          if (step && transform.maybeStep(step).doc) {\n            map = transform.mapping.maps[transform.mapping.maps.length - 1];\n            addAfter.push(\n              new Item(\n                map,\n                undefined,\n                undefined,\n                addAfter.length + addBefore.length,\n              ),\n            );\n          }\n          mapFrom!--;\n          if (map) remap.appendMap(map, mapFrom);\n        } else {\n          transform.maybeStep(item.step);\n        }\n\n        if (item.selection) {\n          selection = remap\n            ? item.selection.map(remap.slice(mapFrom))\n            : item.selection;\n          remaining = new Branch(\n            this.items.slice(0, end).append(\n              addBefore.reverse().concat(addAfter),\n            ),\n            this.eventCount - 1,\n          );\n          return false;\n        }\n\n        return item;\n      },\n      this.items.length,\n      0,\n    );\n\n    return { remaining: remaining!, transform, selection: selection! };\n  }\n\n  // Create a new branch with the given transform added.\n  addTransform(\n    transform: Transform,\n    selection: SelectionBookmark | undefined,\n    histOptions: Required<HistoryOptions>,\n    preserveItems: boolean,\n  ) {\n    let newItems = [], eventCount = this.eventCount;\n    let oldItems = this.items,\n      lastItem = !preserveItems && oldItems.length\n        ? oldItems.get(oldItems.length - 1)\n        : null;\n\n    for (let i = 0; i < transform.steps.length; i++) {\n      let step = transform.steps[i].invert(transform.docs[i]);\n      let item = new Item(transform.mapping.maps[i], step, selection), merged;\n      if (merged = lastItem && lastItem.merge(item)) {\n        item = merged;\n        if (i) newItems.pop();\n        else oldItems = oldItems.slice(0, oldItems.length - 1);\n      }\n      newItems.push(item);\n      if (selection) {\n        eventCount++;\n        selection = undefined;\n      }\n      if (!preserveItems) lastItem = item;\n    }\n    let overflow = eventCount - histOptions.depth;\n    if (overflow > DEPTH_OVERFLOW) {\n      oldItems = cutOffEvents(oldItems, overflow);\n      eventCount -= overflow;\n    }\n    return new Branch(oldItems.append(newItems), eventCount);\n  }\n\n  remapping(from: number, to: number): Mapping {\n    let maps = new Mapping();\n    this.items.forEach(\n      (item, i) => {\n        let mirrorPos =\n          item.mirrorOffset != null && i - item.mirrorOffset >= from\n            ? maps.maps.length - item.mirrorOffset\n            : undefined;\n        maps.appendMap(item.map, mirrorPos);\n        return item;\n      },\n      from,\n      to,\n    );\n    return maps;\n  }\n\n  addMaps(array: readonly StepMap[]) {\n    if (this.eventCount == 0) return this;\n    return new Branch(\n      this.items.append(array.map((map) => new Item(map))),\n      this.eventCount,\n    );\n  }\n\n  // When the collab module receives remote changes, the history has\n  // to know about those, so that it can adjust the steps that were\n  // rebased on top of the remote changes, and include the position\n  // maps for the remote changes in its array of items.\n  rebased(rebasedTransform: Transform, rebasedCount: number) {\n    if (!this.eventCount) return this;\n\n    let rebasedItems: Item[] = [],\n      start = Math.max(0, this.items.length - rebasedCount);\n\n    let mapping = rebasedTransform.mapping;\n    let newUntil = rebasedTransform.steps.length;\n    let eventCount = this.eventCount;\n    this.items.forEach((item) => {\n      if (item.selection) eventCount--;\n      return item;\n    }, start);\n\n    let iRebased = rebasedCount;\n    this.items.forEach((item) => {\n      let pos = mapping.getMirror(--iRebased);\n      if (pos == null) return false;\n      newUntil = Math.min(newUntil, pos);\n      let map = mapping.maps[pos];\n      if (item.step) {\n        let step = rebasedTransform.steps[pos].invert(\n          rebasedTransform.docs[pos],\n        );\n        let selection = item.selection &&\n          item.selection.map(mapping.slice(iRebased + 1, pos));\n        if (selection) eventCount++;\n        rebasedItems.push(new Item(map, step, selection));\n      } else {\n        rebasedItems.push(new Item(map));\n      }\n\n      return item;\n    }, start);\n\n    let newMaps = [];\n    for (let i = rebasedCount; i < newUntil; i++) {\n      newMaps.push(new Item(mapping.maps[i]));\n    }\n    let items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n    let branch = new Branch(items, eventCount);\n\n    if (branch.emptyItemCount() > max_empty_items) {\n      branch = branch.compress(this.items.length - rebasedItems.length);\n    }\n    return branch;\n  }\n\n  emptyItemCount() {\n    let count = 0;\n    this.items.forEach((item) => {\n      if (!item.step) count++;\n      return item;\n    });\n    return count;\n  }\n\n  // Compressing a branch means rewriting it to push the air (map-only\n  // items) out. During collaboration, these naturally accumulate\n  // because each remote change adds one. The `upto` argument is used\n  // to ensure that only the items below a given level are compressed,\n  // because `rebased` relies on a clean, untouched set of items in\n  // order to associate old items with rebased steps.\n  compress(upto = this.items.length) {\n    let remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n    let items: Item[] = [], events = 0;\n    this.items.forEach(\n      (item, i) => {\n        if (i >= upto) {\n          items.push(item);\n          if (item.selection) events++;\n        } else if (item.step) {\n          let step = item.step.map(remap.slice(mapFrom)),\n            map = step && step.getMap();\n          mapFrom--;\n          if (map) remap.appendMap(map, mapFrom);\n          if (step) {\n            let selection = item.selection &&\n              item.selection.map(remap.slice(mapFrom));\n            if (selection) events++;\n            let newItem = new Item(map!.invert(), step, selection),\n              merged,\n              last = items.length - 1;\n            if (merged = items.length && items[last].merge(newItem)) {\n              items[last] = merged;\n            } else {\n              items.push(newItem);\n            }\n          }\n        } else if (item.map) {\n          mapFrom--;\n        }\n\n        return item;\n      },\n      this.items.length,\n      0,\n    );\n    return new Branch(RopeSequence.from(items.reverse()), events);\n  }\n\n  static empty = new Branch(emptyRopeSequence(), 0);\n}\n\nfunction cutOffEvents(items: RopeSequence<Item>, n: number) {\n  let cutPoint: number | undefined;\n  items.forEach((item, i) => {\n    if (item.selection && (n-- == 0)) {\n      cutPoint = i;\n      return false;\n    }\n\n    return item;\n  });\n  return items.slice(cutPoint!);\n}\n\nclass Item {\n  constructor(\n    // The (forward) step map for this item.\n    readonly map: StepMap,\n    // The inverted step\n    readonly step?: Step,\n    // If this is non-null, this item is the start of a group, and\n    // this selection is the starting selection for the group (the one\n    // that was active before the first step was applied)\n    readonly selection?: SelectionBookmark,\n    // If this item is the inverse of a previous mapping on the stack,\n    // this points at the inverse's offset\n    readonly mirrorOffset?: number,\n  ) {}\n\n  merge(other: Item) {\n    if (this.step && other.step && !other.selection) {\n      let step = other.step.merge(this.step);\n      if (step) return new Item(step.getMap().invert(), step, this.selection);\n    }\n  }\n}\n\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nclass HistoryState {\n  constructor(\n    readonly done: Branch,\n    readonly undone: Branch,\n    readonly prevRanges: readonly number[] | null,\n    readonly prevTime: number,\n    readonly prevComposition: number,\n  ) {}\n}\n\nconst DEPTH_OVERFLOW = 20;\n\n// Record a transformation in undo history.\nfunction applyTransaction(\n  history: HistoryState,\n  state: EditorState,\n  tr: Transaction,\n  options: Required<HistoryOptions>,\n) {\n  let historyTr = tr.getMeta(historyKey), rebased;\n  if (historyTr) return historyTr.historyState;\n\n  if (tr.getMeta(closeHistoryKey)) {\n    history = new HistoryState(history.done, history.undone, null, 0, -1);\n  }\n\n  let appended = tr.getMeta('appendedTransaction');\n\n  if (tr.steps.length == 0) {\n    return history;\n  } else if (appended && appended.getMeta(historyKey)) {\n    if (appended.getMeta(historyKey).redo) {\n      return new HistoryState(\n        history.done.addTransform(\n          tr,\n          undefined,\n          options,\n          mustPreserveItems(state),\n        ),\n        history.undone,\n        rangesFor(tr.mapping.maps),\n        history.prevTime,\n        history.prevComposition,\n      );\n    } else {\n      return new HistoryState(\n        history.done,\n        history.undone.addTransform(\n          tr,\n          undefined,\n          options,\n          mustPreserveItems(state),\n        ),\n        null,\n        history.prevTime,\n        history.prevComposition,\n      );\n    }\n  } else if (\n    tr.getMeta('addToHistory') !== false &&\n    !(appended && appended.getMeta('addToHistory') === false)\n  ) {\n    // Group transforms that occur in quick succession into one event.\n    let composition = tr.getMeta('composition');\n    let newGroup = history.prevTime == 0 ||\n      (!appended && history.prevComposition != composition &&\n        (history.prevTime < (tr.time || 0) - options.newGroupDelay ||\n          !isAdjacentTo(tr, history.prevRanges!)));\n    let prevRanges = appended\n      ? mapRanges(history.prevRanges!, tr.mapping)\n      : rangesFor(tr.mapping.maps);\n    return new HistoryState(\n      history.done.addTransform(\n        tr,\n        newGroup ? state.selection.getBookmark() : undefined,\n        options,\n        mustPreserveItems(state),\n      ),\n      Branch.empty,\n      prevRanges,\n      tr.time,\n      composition == null ? history.prevComposition : composition,\n    );\n  } else if (rebased = tr.getMeta('rebased')) {\n    // Used by the collab module to tell the history that some of its\n    // content has been rebased.\n    return new HistoryState(\n      history.done.rebased(tr, rebased),\n      history.undone.rebased(tr, rebased),\n      mapRanges(history.prevRanges!, tr.mapping),\n      history.prevTime,\n      history.prevComposition,\n    );\n  } else {\n    return new HistoryState(\n      history.done.addMaps(tr.mapping.maps),\n      history.undone.addMaps(tr.mapping.maps),\n      mapRanges(history.prevRanges!, tr.mapping),\n      history.prevTime,\n      history.prevComposition,\n    );\n  }\n}\n\nfunction isAdjacentTo(transform: Transform, prevRanges: readonly number[]) {\n  if (!prevRanges) return false;\n  if (!transform.docChanged) return true;\n  let adjacent = false;\n  transform.mapping.maps[0].forEach((start, end) => {\n    for (let i = 0; i < prevRanges.length; i += 2) {\n      if (start <= prevRanges[i + 1] && end >= prevRanges[i]) {\n        adjacent = true;\n      }\n    }\n  });\n  return adjacent;\n}\n\nfunction rangesFor(maps: readonly StepMap[]) {\n  let result: number[] = [];\n  for (let i = maps.length - 1; i >= 0 && result.length == 0; i--) {\n    maps[i].forEach((_from, _to, from, to) => result.push(from, to));\n  }\n  return result;\n}\n\nfunction mapRanges(ranges: readonly number[], mapping: Mapping) {\n  if (!ranges) return null;\n  let result = [];\n  for (let i = 0; i < ranges.length; i += 2) {\n    let from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n    if (from <= to) result.push(from, to);\n  }\n  return result;\n}\n\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(\n  history: HistoryState,\n  state: EditorState,\n  redo: boolean,\n): Transaction | null {\n  let preserveItems = mustPreserveItems(state);\n  let histOptions = (historyKey.get(state)!.spec as any).config as Required<\n    HistoryOptions\n  >;\n  let pop = (redo ? history.undone : history.done).popEvent(\n    state,\n    preserveItems,\n  );\n  if (!pop) return null;\n\n  let selection = pop.selection!.resolve(pop.transform.doc);\n  let added = (redo ? history.done : history.undone).addTransform(\n    pop.transform,\n    state.selection.getBookmark(),\n    histOptions,\n    preserveItems,\n  );\n\n  let newHist = new HistoryState(\n    redo ? added : pop.remaining,\n    redo ? pop.remaining : added,\n    null,\n    0,\n    -1,\n  );\n  return pop.transform.setSelection(selection).setMeta(historyKey, {\n    redo,\n    historyState: newHist,\n  });\n}\n\nlet cachedPreserveItems = false,\n  cachedPreserveItemsPlugins: readonly Plugin[] | null = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state: EditorState) {\n  let plugins = state.plugins;\n  if (cachedPreserveItemsPlugins != plugins) {\n    cachedPreserveItems = false;\n    cachedPreserveItemsPlugins = plugins;\n    for (let i = 0; i < plugins.length; i++) {\n      if ((plugins[i].spec as any).historyPreserveItems) {\n        cachedPreserveItems = true;\n        break;\n      }\n    }\n  }\n  return cachedPreserveItems;\n}\n\n/// Set a flag on the given transaction that will prevent further steps\n/// from being appended to an existing history event (so that they\n/// require a separate undo command to undo).\nexport function closeHistory(tr: Transaction) {\n  return tr.setMeta(closeHistoryKey, true);\n}\n\nconst historyKey = new PluginKey('history');\nconst closeHistoryKey = new PluginKey('closeHistory');\n\ninterface HistoryOptions {\n  /// The amount of history events that are collected before the\n  /// oldest events are discarded. Defaults to 100.\n  depth?: number;\n\n  /// The delay between changes after which a new group should be\n  /// started. Defaults to 500 (milliseconds). Note that when changes\n  /// aren't adjacent, a new group is always started.\n  newGroupDelay?: number;\n}\n\n/// Returns a plugin that enables the undo history for an editor. The\n/// plugin will track undo and redo stacks, which can be used with the\n/// [`undo`](#history.undo) and [`redo`](#history.redo) commands.\n///\n/// You can set an `\"addToHistory\"` [metadata\n/// property](#state.Transaction.setMeta) of `false` on a transaction\n/// to prevent it from being rolled back by undo.\nexport function history(config: HistoryOptions = {}): Plugin {\n  config = {\n    depth: config.depth || 100,\n    newGroupDelay: config.newGroupDelay || 500,\n  };\n\n  return new Plugin({\n    key: historyKey,\n\n    state: {\n      init() {\n        return new HistoryState(Branch.empty, Branch.empty, null, 0, -1);\n      },\n      apply(tr, hist, state) {\n        return applyTransaction(\n          hist,\n          state,\n          tr,\n          config as Required<HistoryOptions>,\n        );\n      },\n    },\n\n    config,\n\n    props: {\n      handleDOMEvents: {\n        beforeinput(view, e: Event) {\n          let inputType = (e as InputEvent).inputType;\n          let command = inputType == 'historyUndo'\n            ? undo\n            : inputType == 'historyRedo'\n            ? redo\n            : null;\n          if (!command || !view.editable) return false;\n          e.preventDefault();\n          return command(view.state, view.dispatch);\n        },\n      },\n    },\n  });\n}\n\nfunction buildCommand(redo: boolean, scroll: boolean): Command {\n  return (state, dispatch) => {\n    let hist = historyKey.getState(state);\n    if (!hist || (redo ? hist.undone : hist.done).eventCount == 0) return false;\n    if (dispatch) {\n      let tr = histTransaction(hist, state, redo);\n      if (tr) dispatch(scroll ? tr.scrollIntoView() : tr);\n    }\n    return true;\n  };\n}\n\n/// A command function that undoes the last change, if any.\nexport const undo = buildCommand(false, true);\n\n/// A command function that redoes the last undone change, if any.\nexport const redo = buildCommand(true, true);\n\n/// A command function that undoes the last change. Don't scroll the\n/// selection into view.\nexport const undoNoScroll = buildCommand(false, false);\n\n/// A command function that redoes the last undone change. Don't\n/// scroll the selection into view.\nexport const redoNoScroll = buildCommand(true, false);\n\n/// The amount of undoable events available in a given state.\nexport function undoDepth(state: EditorState) {\n  let hist = historyKey.getState(state);\n  return hist ? hist.done.eventCount : 0;\n}\n\n/// The amount of redoable events available in a given editor state.\nexport function redoDepth(state: EditorState) {\n  let hist = historyKey.getState(state);\n  return hist ? hist.undone.eventCount : 0;\n}\n\n/// Returns true if the given transaction was generated by the history\n/// plugin.\nexport function isHistoryTransaction(tr: Transaction) {\n  return tr.getMeta(historyKey) != null;\n}\n","import { Plugin } from 'prosemirror-state';\n\nimport { type CoreEditor, Extension } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nimport { history, redo, undo } from './history.ts';\n\nexport class ExtensionHistory extends Extension {\n  name = 'history';\n\n  options = {\n    depth: 100,\n    newGroupDelay: 500,\n  };\n\n  override getCommandFactories(editor: CoreEditor): Partial<CommandFactories> {\n    return {\n      'undo': () => undo,\n      'redo': () => redo,\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    // https://stackoverflow.com/a/73619128\n    const mac = typeof navigator != 'undefined'\n      ? /Mac|iP(hone|[oa]d)/.test(navigator?.platform)\n      : false;\n\n    const shortcuts = {\n      'Mod-z': 'undo',\n      'Mod-y': 'redo',\n    };\n    if (!mac) {\n      shortcuts['Mod-y'] = 'redo';\n    }\n\n    return shortcuts;\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      history(this.options),\n    ];\n  }\n}\n","// https://github.com/markdown-it/markdown-it/blob/master/lib/token.mjs\n\ntype TupleArray = Array<[string, string]>;\n\nexport const NESTING_OPENING = 1;\nexport const NESTING_SELF_CLOSING = 0;\nexport const NESTING_CLOSING = -1;\n\ntype Nesting = -1 | 0 | 1;\n\nexport class Token {\n  attrs: TupleArray | null = null;\n  map: [number] | [number, number] | [number, number, number, number] | null =\n    null;\n  level: number = 0;\n  children: Array<Token> | null = null;\n  content: string = '';\n  markup: string = '';\n  info: string = '';\n  meta: any = null;\n  block = false;\n  hidden = false;\n\n  constructor(\n    public type: string,\n    public tag: string,\n    public nesting: Nesting,\n  ) {\n  }\n\n  attrIndex(name: string) {\n    if (!this.attrs) return -1;\n\n    const attrs = this.attrs;\n\n    for (let i = 0, len = attrs.length; i < len; i++) {\n      if (attrs[i][0] === name) return i;\n    }\n    return -1;\n  }\n\n  attrPush(attrData: [string, string]) {\n    if (this.attrs) {\n      this.attrs.push(attrData);\n    } else {\n      this.attrs = [attrData];\n    }\n  }\n\n  attrSet(name: string, value: string) {\n    const idx = this.attrIndex(name);\n    const attrData: [string, string] = [name, value];\n\n    if (idx < 0 || !this.attrs) {\n      this.attrPush(attrData);\n    } else {\n      this.attrs[idx] = attrData;\n    }\n  }\n\n  attrGet(name: string) {\n    const idx = this.attrIndex(name);\n    let value = null;\n    if (idx >= 0 && this.attrs) {\n      value = this.attrs[idx][1];\n    }\n    return value;\n  }\n\n  attrJoin(name: string, value: string) {\n    const idx = this.attrIndex(name);\n\n    if (idx < 0 || !this.attrs) {\n      this.attrPush([name, value]);\n    } else {\n      this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n    }\n  }\n}\n","const Brackets = {\n  left: ['(', '[', '{', '|', '‖', '⟨', '⌊', '⌈', '⌜'],\n  right: [')', ']', '}', '|', '‖', '⟩', '⌋', '⌉', '⌝'],\n  isPair: function(l, r){\n    const idx = this.left.indexOf(l);\n    return r === this.right[idx];\n  },\n  contains: function(it) {\n    return this.isLeft(it) || this.isRight(it);\n  },\n  isLeft: function(it) {\n    return this.left.indexOf(it) > -1\n  },\n  isRight: function(it) {\n    return this.right.indexOf(it) > -1;\n  },\n  parseLeft: function(it, stretchy = true) {\n    if(this.left.indexOf(it) < 0){ return it}\n    let r = '';\n    switch(it){\n      case '(':\n      case '[':\n      case '|': r = `\\\\left${it}`;\n        break;\n      case '‖': r = '\\\\left\\\\|';\n        break;\n      case '{': r = '\\\\left\\\\{';\n        break;\n      case '⟨': r = '\\\\left\\\\langle ';\n        break;\n      case '⌊': r = '\\\\left\\\\lfloor ';\n        break;\n      case '⌈': r = '\\\\left\\\\lceil ';\n        break;\n      case '⌜': r = '\\\\left\\\\ulcorner ';\n        break;\n    }\n    return (stretchy ? r : r.replace('\\\\left', ''));\n  },\n\n  parseRight: function(it, stretchy = true) {\n    if(this.right.indexOf(it) < 0){ return it}\n    let r = '';\n    switch(it){\n      case ')':\n      case ']':\n      case '|': r = `\\\\right${it}`;\n        break;\n      case '‖': r = '\\\\right\\\\|';\n        break;\n      case '}': r = '\\\\right\\\\}';\n        break;\n      case '⟩': r = ' \\\\right\\\\rangle';\n        break;\n      case '⌋': r = ' \\\\right\\\\rfloor';\n        break;\n      case '⌉': r = ' \\\\right\\\\rceil';\n        break;\n      case '⌝': r = ' \\\\right\\\\urcorner';\n        break;\n    }\n    return (stretchy ? r : r.replace('\\\\right', ''));\n  }\n};\n\n// @see https://en.wikibooks.org/wiki/LaTeX/Mathematics#List_of_mathematical_symbols\n// @see https://www.andy-roberts.net/res/writing/latex/symbols.pdf   (more completed)\n// @see http://www.rpi.edu/dept/arc/training/latex/LaTeX_symbols.pdf (wtf)\n// https://oeis.org/wiki/List_of_LaTeX_mathematical_symbols\n\n// accessed directly from keyboard\n// + - = ! / ( ) [ ] < > | ' : *\n\nconst MathSymbol = {\n  parseIdentifier: function(it) {\n    if(it.length === 0){ return '' }\n    if(it.length === 1){\n      const charCode = it.charCodeAt(0);\n      let index = this.greekLetter.decimals.indexOf(charCode);\n      if ( index > -1) {\n        return this.greekLetter.scripts[index] + ' ';\n      } else {\n        return it;\n      }\n    } else {\n      return this.parseMathFunction(it);\n    }\n  },\n\n  parseOperator: function(it) {\n    if(it.length === 0){ return ''}\n    if(it.length === 1){\n      const charCode = it.charCodeAt(0);\n      const opSymbols = [\n        this.bigCommand,\n        this.relation,\n        this.binaryOperation,\n        this.setAndLogic,\n        this.delimiter,\n        this.other\n      ];\n\n      const padSpaceBothSide = [false, true, true, false, false, false];\n\n      for(let i = 0; i < opSymbols.length; i++){\n        const opSymbol = opSymbols[i];\n        const index = opSymbol.decimals.indexOf(charCode);\n        if(index > -1) {\n          if(padSpaceBothSide[i]){\n            return [' ', opSymbol.scripts[index], ' '].join('');\n          }else {\n            return opSymbol.scripts[index] + ' ';\n          }\n        }\n      }\n      return it;\n    } else {\n      return this.parseMathFunction(it);\n    }\n  },\n\n  parseMathFunction: function (it) {\n    const marker = T.createMarker();\n    const replacements = [];\n    this.mathFunction.names.forEach((name, index) => {\n      const regExp = new RegExp(name, 'g');\n      if(it.match(regExp)){\n        replacements.push(this.mathFunction.scripts[index]);\n        it = it.replace(regExp, marker.next() + ' ');\n      }\n    });\n    return marker.replaceBack(it, replacements);\n  },\n\n  //FIXME COMPLETE ME\n  overScript: {\n    decimals: [9182],\n    templates: [\n      \"\\\\overbrace{@v}\",\n    ]\n  },\n\n  //FIXME COMPLETE ME\n  underScript: {\n    decimals: [9183],\n    templates: [\n      \"\\\\underbrace{@v}\"\n    ]\n  },\n\n  // sum, integral...\n  bigCommand: {\n    decimals: [8721, 8719, 8720, 10753, 10754, 10752, 8899, 8898, 10756, 10758, 8897, 8896, 8747, 8750, 8748, 8749, 10764, 8747],\n    scripts: [\n      \"\\\\sum\",\n      \"\\\\prod\",\n      \"\\\\coprod\",\n      \"\\\\bigoplus\",\n      \"\\\\bigotimes\",\n      \"\\\\bigodot\",\n      \"\\\\bigcup\",\n      \"\\\\bigcap\",\n      \"\\\\biguplus\",\n      \"\\\\bigsqcup\",\n      \"\\\\bigvee\",\n      \"\\\\bigwedge\",\n      \"\\\\int\",\n      \"\\\\oint\",\n      \"\\\\iint\",\n      \"\\\\iiint\",\n      \"\\\\iiiint\",\n      \"\\\\idotsint\",\n    ]\n  },\n\n  // mo\n  relation: {\n    decimals: [60, 62, 61, 8741, 8742, 8804, 8805, 8784, 8781, 8904, 8810, 8811, 8801, 8866, 8867, 8834, 8835, 8776, 8712, 8715, 8838, 8839, 8773, 8995, 8994, 8840, 8841, 8771, 8872, 8713, 8847, 8848, 126, 8764, 8869, 8739, 8849, 8850, 8733, 8826, 8827, 10927, 10928, 8800, 8738, 8737],\n    scripts: [\n      \"<\",\n      \">\",\n      \"=\",\n      \"\\\\parallel\",\n      \"\\\\nparallel\",\n      \"\\\\leq\",\n      \"\\\\geq\",\n      \"\\\\doteq\",\n      \"\\\\asymp\",\n      \"\\\\bowtie\",\n      \"\\\\ll\",\n      \"\\\\gg\",\n      \"\\\\equiv\",\n      \"\\\\vdash\",\n      \"\\\\dashv\",\n      \"\\\\subset\",\n      \"\\\\supset\",\n      \"\\\\approx\",\n      \"\\\\in\",\n      \"\\\\ni\",\n      \"\\\\subseteq\",\n      \"\\\\supseteq\",\n      \"\\\\cong\",\n      \"\\\\smile\",\n      \"\\\\frown\",\n      \"\\\\nsubseteq\",\n      \"\\\\nsupseteq\",\n      \"\\\\simeq\",\n      \"\\\\models\",\n      \"\\\\notin\",\n      \"\\\\sqsubset\",\n      \"\\\\sqsupset\",\n      \"\\\\sim\",\n      \"\\\\sim\",\n      \"\\\\perp\",\n      \"\\\\mid\",\n      \"\\\\sqsubseteq\",\n      \"\\\\sqsupseteq\",\n      \"\\\\propto\",\n      \"\\\\prec\",\n      \"\\\\succ\",\n      \"\\\\preceq\",\n      \"\\\\succeq\",\n      \"\\\\neq\",\n      \"\\\\sphericalangle\",\n      \"\\\\measuredangle\"\n        ]\n  },\n\n  // complete\n  binaryOperation: {\n    decimals: [43, 45, 177, 8745, 8900, 8853, 8723, 8746, 9651, 8854, 215, 8846, 9661, 8855, 247, 8851, 9667, 8856, 8727, 8852, 9657, 8857, 8902, 8744, 9711, 8728, 8224, 8743, 8729, 8726, 8225, 8901, 8768, 10815],\n    scripts: [\n      \"+\",\n      \"-\",\n      \"\\\\pm\",\n      \"\\\\cap\",\n      \"\\\\diamond\",\n      \"\\\\oplus\",\n      \"\\\\mp\",\n      \"\\\\cup\",\n      \"\\\\bigtriangleup\",\n      \"\\\\ominus\",\n      \"\\\\times\",\n      \"\\\\uplus\",\n      \"\\\\bigtriangledown\",\n      \"\\\\otimes\",\n      \"\\\\div\",\n      \"\\\\sqcap\",\n      \"\\\\triangleleft\",\n      \"\\\\oslash\",\n      \"\\\\ast\",\n      \"\\\\sqcup\",\n      \"\\\\triangleright\",\n      \"\\\\odot\",\n      \"\\\\star\",\n      \"\\\\vee\",\n      \"\\\\bigcirc\",\n      \"\\\\circ\",\n      \"\\\\dagger\",\n      \"\\\\wedge\",\n      \"\\\\bullet\",\n      \"\\\\setminus\",\n      \"\\\\ddagger\",\n      \"\\\\cdot\",\n      \"\\\\wr\",\n      \"\\\\amalg\"\n        ]\n  },\n\n  setAndLogic: {\n    decimals: [8707, 8594, 8594, 8708, 8592, 8592, 8704, 8614, 172, 10233, 8834, 8658, 10233, 8835, 8596, 8712, 10234, 8713, 8660, 8715, 8868, 8743, 8869, 8744, 8709, 8709],\n    scripts: [\n      \"\\\\exists\",\n      \"\\\\rightarrow\",\n      \"\\\\to\",\n      \"\\\\nexists\",\n      \"\\\\leftarrow\",\n      \"\\\\gets\",\n      \"\\\\forall\",\n      \"\\\\mapsto\",\n      \"\\\\neg\",\n      \"\\\\implies\",\n      \"\\\\subset\",\n      \"\\\\Rightarrow\",\n      \"\\\\implies\",\n      \"\\\\supset\",\n      \"\\\\leftrightarrow\",\n      \"\\\\in\",\n      \"\\\\iff\",\n      \"\\\\notin\",\n      \"\\\\Leftrightarrow\",\n      \"\\\\ni\",\n      \"\\\\top\",\n      \"\\\\land\",\n      \"\\\\bot\",\n      \"\\\\lor\",\n      \"\\\\emptyset\",\n      \"\\\\varnothing\"\n        ]\n  },\n\n  delimiter: {\n    decimals: [124, 8739, 8214, 47, 8726, 123, 125, 10216, 10217, 8593, 8657, 8968, 8969, 8595, 8659, 8970, 8971],\n    scripts: [\n      \"|\",\n      \"\\\\mid\",\n      \"\\\\|\",\n      \"/\",\n      \"\\\\backslash\",\n      \"\\\\{\",\n      \"\\\\}\",\n      \"\\\\langle\",\n      \"\\\\rangle\",\n      \"\\\\uparrow\",\n      \"\\\\Uparrow\",\n      \"\\\\lceil\",\n      \"\\\\rceil\",\n      \"\\\\downarrow\",\n      \"\\\\Downarrow\",\n      \"\\\\lfloor\",\n      \"\\\\rfloor\"\n    ]\n  },\n\n  greekLetter: {\n    decimals: [ 913, 945, 925, 957, 914, 946, 926, 958, 915, 947, 927, 959, 916, 948, 928, 960, 982, 917, 1013, 949, 929, 961, 1009, 918, 950, 931, 963, 962, 919, 951, 932, 964, 920, 952, 977, 933, 965, 921, 953, 934, 981, 966, 922, 954, 1008, 935, 967, 923, 955, 936, 968, 924, 956, 937, 969 ],\n    scripts: [\n      \"A\"         , \"\\\\alpha\"   ,\n      \"N\"         , \"\\\\nu\"      ,\n      \"B\"         , \"\\\\beta\"    ,\n      \"\\\\Xi\"      , \"\\\\xi\"      ,\n      \"\\\\Gamma\"   , \"\\\\gamma\"   ,\n      \"O\"         , \"o\"         ,\n      \"\\\\Delta\"   , \"\\\\delta\"   ,\n      \"\\\\Pi\"      , \"\\\\pi\"      , \"\\\\varpi\"      ,\n      \"E\"         , \"\\\\epsilon\" , \"\\\\varepsilon\" ,\n      \"P\"         , \"\\\\rho\"     , \"\\\\varrho\"     ,\n      \"Z\"         , \"\\\\zeta\"    ,\n      \"\\\\Sigma\"   , \"\\\\sigma\"   , \"\\\\varsigma\"   ,\n      \"H\"         , \"\\\\eta\"     ,\n      \"T\"         , \"\\\\tau\"     ,\n      \"\\\\Theta\"   , \"\\\\theta\"   , \"\\\\vartheta\"   ,\n      \"\\\\Upsilon\" , \"\\\\upsilon\" ,\n      \"I\"         , \"\\\\iota\"    ,\n      \"\\\\Phi\"     , \"\\\\phi\"     , \"\\\\varphi\"     ,\n      \"K\"         , \"\\\\kappa\"   , \"\\\\varkappa\"   ,\n      \"X\"         , \"\\\\chi\"     ,\n      \"\\\\Lambda\"  , \"\\\\lambda\"  ,\n      \"\\\\Psi\"     , \"\\\\psi\"     ,\n      \"M\"         , \"\\\\mu\"      ,\n      \"\\\\Omega\"   , \"\\\\omega\"\n        ]\n  },\n\n\n  other: {\n    decimals: [8706, 305, 8476, 8711, 8501, 240, 567, 8465, 9723, 8502, 8463, 8467, 8472, 8734, 8503],\n    scripts: [\n      \"\\\\partial\",\n      \"\\\\imath\",\n      \"\\\\Re\",\n      \"\\\\nabla\",\n      \"\\\\aleph\",\n      \"\\\\eth\",\n      \"\\\\jmath\",\n      \"\\\\Im\",\n      \"\\\\Box\",\n      \"\\\\beth\",\n      \"\\\\hbar\",\n      \"\\\\ell\",\n      \"\\\\wp\",\n      \"\\\\infty\",\n      \"\\\\gimel\"\n    ]\n  },\n\n  // complete\n  // Be careful, the order of these name matters (overlap situation).\n  mathFunction: {\n\n    names: [\n      \"arcsin\" , \"sinh\"   , \"sin\" , \"sec\" ,\n      \"arccos\" , \"cosh\"   , \"cos\" , \"csc\" ,\n      \"arctan\" , \"tanh\"   , \"tan\" ,\n      \"arccot\" , \"coth\"   , \"cot\" ,\n\n      \"limsup\" , \"liminf\" , \"exp\" , \"ker\" ,\n      \"deg\"    , \"gcd\"    , \"lg\"  , \"ln\"  ,\n      \"Pr\"     , \"sup\"    , \"det\" , \"hom\" ,\n      \"lim\"    , \"log\"    , \"arg\" , \"dim\" ,\n      \"inf\"    , \"max\"    , \"min\" ,\n    ],\n    scripts: [\n      \"\\\\arcsin\" , \"\\\\sinh\"   , \"\\\\sin\" , \"\\\\sec\" ,\n      \"\\\\arccos\" , \"\\\\cosh\"   , \"\\\\cos\" , \"\\\\csc\" ,\n      \"\\\\arctan\" , \"\\\\tanh\"   , \"\\\\tan\" ,\n      \"\\\\arccot\" , \"\\\\coth\"   , \"\\\\cot\" ,\n\n      \"\\\\limsup\" , \"\\\\liminf\" , \"\\\\exp\" , \"\\\\ker\" ,\n      \"\\\\deg\"    , \"\\\\gcd\"    , \"\\\\lg\"  , \"\\\\ln\"  ,\n      \"\\\\Pr\"     , \"\\\\sup\"    , \"\\\\det\" , \"\\\\hom\" ,\n      \"\\\\lim\"    , \"\\\\log\"    , \"\\\\arg\" , \"\\\\dim\" ,\n      \"\\\\inf\"    , \"\\\\max\"    , \"\\\\min\" ,\n    ]\n  }\n};\n\nconst T = {}; // Tool\nT.createMarker = function() {\n  return {\n    idx: -1,\n    reReplace: /@\\[\\[(\\d+)\\]\\]/mg,\n    next: function() {\n      return `@[[${++this.idx}]]`\n    },\n    replaceBack: function(str, replacements) {\n      return str.replace(this.reReplace, (match, p1) => {\n        const index = parseInt(p1);\n        return replacements[index];\n      });\n    }\n  }\n};\n\n/*\n * Set up window for Node.js\n */\n\nconst root = (typeof window !== 'undefined' ? window : {});\n\n/*\n * Parsing HTML strings\n */\n\nfunction canParseHTMLNatively () {\n  const Parser = root.DOMParser;\n  let canParse = false;\n\n  // Adapted from https://gist.github.com/1129031\n  // Firefox/Opera/IE throw errors on unsupported types\n  try {\n    // WebKit returns null on unsupported types\n    if (new Parser().parseFromString('', 'text/html')) {\n      canParse = true;\n    }\n  } catch (e) {}\n\n  return canParse\n}\n\nfunction createHTMLParser () {\n  const Parser = function () {};\n\n  {\n    if (shouldUseActiveX()) {\n      Parser.prototype.parseFromString = function (string) {\n        const doc = new window.ActiveXObject('htmlfile');\n        doc.designMode = 'on'; // disable on-page scripts\n        doc.open();\n        doc.write(string);\n        doc.close();\n        return doc\n      };\n    } else {\n      Parser.prototype.parseFromString = function (string) {\n        const doc = document.implementation.createHTMLDocument('');\n        doc.open();\n        doc.write(string);\n        doc.close();\n        return doc\n      };\n    }\n  }\n  return Parser\n}\n\nfunction shouldUseActiveX () {\n  let useActiveX = false;\n  try {\n    document.implementation.createHTMLDocument('').open();\n  } catch (e) {\n    if (window.ActiveXObject) useActiveX = true;\n  }\n  return useActiveX\n}\n\nvar HTMLParser = canParseHTMLNatively() ? root.DOMParser : createHTMLParser();\n\nconst NodeTool = {\n  parseMath: function(html) {\n    const parser = new HTMLParser();\n    const doc = parser.parseFromString(html, 'text/html');\n    return doc.querySelector('math');\n  },\n  getChildren: function(node) {\n    return node.children;\n  },\n  getNodeName: function(node) {\n    return node.tagName.toLowerCase();\n  },\n  getNodeText: function(node) {\n    return node.textContent;\n  },\n  getAttr: function(node, attrName, defaultValue) {\n    const value = node.getAttribute(attrName);\n    if ( value === null) {\n      return defaultValue;\n    } else {\n      return value;\n    }\n  },\n  getPrevNode: function(node) {\n    return node.previousElementSibling;\n  },\n  getNextNode: function(node) {\n    return node.nextElementSibling;\n  }\n};\n\nfunction convert(mathmlHtml){\n  const math = NodeTool.parseMath(mathmlHtml);\n  return toLatex(parse(math));\n}\n\nfunction toLatex(result) {\n  // binomial coefficients\n  result = result.replace(/\\\\left\\(\\\\DELETE_BRACKET_L/g, '');\n  result = result.replace(/\\\\DELETE_BRACKET_R\\\\right\\)/g, '');\n  result = result.replace(/\\\\DELETE_BRACKET_L/g, '');\n  result = result.replace(/\\\\DELETE_BRACKET_R/g, '');\n  return result;\n}\n\nfunction parse(node) {\n  const children = NodeTool.getChildren(node);\n  if (!children || children.length === 0) {\n    return parseLeaf(node);\n  } else {\n    return parseContainer(node, children);\n  }\n}\n\n// @see https://www.w3.org/TR/MathML3/chapter7.html\nfunction parseLeaf(node) {\n  let r = '';\n  const nodeName = NodeTool.getNodeName(node);\n  switch(nodeName){\n    case 'mi': r = parseElementMi(node);\n      break;\n    case 'mn': r = parseElementMn(node);\n      break;\n    case 'mo': r = parseOperator(node);\n      break;\n    case 'ms': r = parseElementMs(node);\n      break;\n    case 'mtext': r = parseElementMtext(node);\n      break;\n    case 'mglyph': r = parseElementMglyph(node);\n      break;\n    case 'mprescripts': r = '';\n      break;\n    case 'mspace': r = parseElementMspace();\n    case 'none': r = '\\\\:';\n    //TODO other usecase of 'none' ?\n      break;\n    default: r = escapeSpecialChars(NodeTool.getNodeText(node).trim());\n      break;\n  }\n  return r;\n}\n\n// operator token, mathematical operators\nfunction parseOperator(node) {\n  let it = NodeTool.getNodeText(node).trim();\n  it = MathSymbol.parseOperator(it);\n  return escapeSpecialChars(it);\n}\n\n// Math identifier\nfunction parseElementMi(node){\n  let it = NodeTool.getNodeText(node).trim();\n  it = MathSymbol.parseIdentifier(it);\n  return escapeSpecialChars(it);\n}\n\n// Math Number\nfunction parseElementMn(node){\n  let it = NodeTool.getNodeText(node).trim();\n  return escapeSpecialChars(it);\n}\n\n// Math String\nfunction parseElementMs(node){\n  const content = NodeTool.getNodeText(node).trimRight();\n  const it = escapeSpecialChars(content);\n  return ['\"', it, '\"'].join('');\n}\n\n// Math Text\nfunction parseElementMtext(node){\n  const content = NodeTool.getNodeText(node);\n  const it = escapeSpecialChars(content);\n  return `\\\\text{${it}}`;\n}\n\n// Math glyph (image)\nfunction parseElementMglyph(node){\n  const it = ['\"', NodeTool.getAttr(node, 'alt', ''), '\"'].join('');\n  return escapeSpecialChars(it);\n}\n\n// TODO need or not\nfunction parseElementMspace(node){\n  return '';\n}\n\nfunction escapeSpecialChars(text) {\n  const specialChars = /\\$|%|_|&|#|\\{|\\}/g;\n  text = text.replace(specialChars, char => `\\\\${ char }`);\n  return text;\n}\n\n\nfunction parseContainer(node, children) {\n  const render = getRender(node);\n  if(render){\n    return render(node, children);\n  } else {\n    throw new Error(`Couldn't get render function for container node: ${NodeTool.getNodeName(node)}`);\n  }\n}\n\nfunction renderChildren(children) {\n  const parts = [];\n  let lefts = [];\n  Array.prototype.forEach.call(children, (node) => {\n    if(NodeTool.getNodeName(node) === 'mo'){\n      const op = NodeTool.getNodeText(node).trim();\n      if(Brackets.contains(op)){\n        let stretchy = NodeTool.getAttr(node, 'stretchy', 'true');\n        stretchy = ['', 'true'].indexOf(stretchy) > -1;\n        // 操作符是括號\n        if(Brackets.isRight(op)){\n          const nearLeft = lefts[lefts.length - 1];\n          if(nearLeft){\n            if(Brackets.isPair(nearLeft, op)){\n              parts.push(Brackets.parseRight(op, stretchy));\n              lefts.pop();\n            } else {\n              // some brackets left side is same as right side.\n              if(Brackets.isLeft(op)) {\n                parts.push(Brackets.parseLeft(op, stretchy));\n                lefts.push(op);\n              } else {\n                console.error(\"bracket not match\");\n              }\n            }\n          }else {\n            // some brackets left side is same as right side.\n            if(Brackets.isLeft(op)) {\n              parts.push(Brackets.parseLeft(op, stretchy));\n              lefts.push(op);\n            }else {\n              console.error(\"bracket not match\");\n            }\n          }\n        } else {\n          parts.push(Brackets.parseLeft(op, stretchy));\n          lefts.push(op);\n        }\n      } else {\n        parts.push(parseOperator(node));\n      }\n    } else {\n      parts.push(parse(node));\n    }\n  });\n  // 這裏非常不嚴謹\n  if(lefts.length > 0){\n    for(let i=0; i < lefts.length; i++){\n      parts.push(\"\\\\right.\");\n    }\n  }\n  lefts = undefined;\n  return parts;\n}\n\n\nfunction getRender(node) {\n  let render = undefined;\n  const nodeName = NodeTool.getNodeName(node);\n  switch(nodeName){\n    case 'msub':\n      render = getRender_default(\"@1_{@2}\");\n      break;\n    case 'msup':\n      render = getRender_default(\"@1^{@2}\");\n      break;\n    case 'msubsup':\n      render = getRender_default(\"@1_{@2}^{@3}\");\n      break;\n    case 'mover':\n      render = renderMover;\n      break;\n    case 'munder':\n      render = renderMunder;\n      break;\n    case 'munderover':\n      render = getRender_default(\"@1\\\\limits_{@2}^{@3}\");\n      break;\n    case 'mmultiscripts':\n      render = renderMmultiscripts;\n      break;\n    case 'mroot':\n      render = getRender_default(\"\\\\sqrt[@2]{@1}\");\n      break;\n    case 'msqrt':\n      render = getRender_joinSeparator(\"\\\\sqrt{@content}\");\n      break;\n    case 'mtable':\n      render = renderTable;\n      break;\n    case 'mtr':\n      render = getRender_joinSeparator(\"@content \\\\\\\\ \", ' & ');\n      break;\n    case 'mtd':\n      render = getRender_joinSeparator(\"@content\");\n      break;\n    case 'mfrac':\n      render = renderMfrac;\n      break;\n    case 'mfenced':\n      render = renderMfenced;\n      break;\n    case 'mi':\n    case 'mn':\n    case 'mo':\n    case 'ms':\n    case 'mtext':\n      // they may contains <mglyph>\n      render = getRender_joinSeparator(\"@content\");\n      break;\n    case 'mphantom':\n      render = renderMphantom;\n      break;\n    default:\n      // math, mstyle, mrow\n      render = getRender_joinSeparator(\"@content\");\n      break;\n  }\n  return render;\n}\n\nfunction renderTable(node, children) {\n  const template = \"\\\\begin{matrix} @content \\\\end{matrix}\";\n  const render = getRender_joinSeparator(template);\n  return render(node, children);\n}\n\nfunction renderMfrac(node, children){\n  const [linethickness, bevelled] = [\n    NodeTool.getAttr(node, 'linethickness', 'medium'),\n    NodeTool.getAttr(node, 'bevelled', 'false')\n  ];\n\n  let render = null;\n  if(bevelled === 'true') {\n    render = getRender_default(\"{}^{@1}/_{@2}\");\n  } else if(['0', '0px'].indexOf(linethickness) > -1) {\n    const [prevNode, nextNode] = [\n      NodeTool.getPrevNode(node),\n      NodeTool.getNextNode(node)\n    ];\n    if((prevNode && NodeTool.getNodeText(prevNode).trim() === '(') &&\n       (nextNode && NodeTool.getNodeText(nextNode).trim() === ')')\n    ) {\n      render = getRender_default(\"\\\\DELETE_BRACKET_L\\\\binom{@1}{@2}\\\\DELETE_BRACKET_R\");\n    } else {\n      render = getRender_default(\"{}_{@2}^{@1}\");\n    }\n  } else {\n    render = getRender_default(\"\\\\frac{@1}{@2}\");\n  }\n  return render(node, children);\n}\n\nfunction renderMfenced(node, children){\n  const [open, close, separatorsStr] = [\n    NodeTool.getAttr(node, 'open', '('),\n    NodeTool.getAttr(node, 'close', ')'),\n    NodeTool.getAttr(node, 'separators', ',')\n  ];\n  const [left, right] = [\n    Brackets.parseLeft(open),\n    Brackets.parseRight(close)\n  ];\n\n  const separators = separatorsStr.split('').filter((c) => c.trim().length === 1);\n  const template = `${left}@content${right}`;\n  const render = getRender_joinSeparators(template, separators);\n  return render(node, children);\n}\n\nfunction renderMmultiscripts(node, children) {\n  if(children.length === 0) { return '' }\n  let sepIndex = -1;\n  let mprescriptsNode = null;\n  Array.prototype.forEach.call(children, (node) => {\n    if(NodeTool.getNodeName(node) === 'mprescripts'){\n      mprescriptsNode = node;\n    }\n  });\n  if(mprescriptsNode) {\n    sepIndex = Array.prototype.indexOf.call(children, mprescriptsNode);\n  }\n  const parts = renderChildren(children);\n\n  const splitArray = (arr, index) => {\n    return [arr.slice(0, index), arr.slice(index + 1, arr.length)]\n  };\n  const renderScripts = (items) => {\n    if(items.length > 0) {\n      const subs = [];\n      const sups = [];\n      items.forEach((item, index) => {\n        // one render as sub script, one as super script\n        if((index + 1) % 2 === 0){\n          sups.push(item);\n        } else {\n          subs.push(item);\n        }\n      });\n      return [\n        (subs.length > 0 ? `_{${subs.join(' ')}}` : ''),\n        (sups.length > 0 ? `^{${sups.join(' ')}}` : '')\n      ].join('');\n    } else {\n      return '';\n    }\n  };\n  const base = parts.shift();\n  let prevScripts = [];\n  let backScripts = [];\n  if(sepIndex === -1){\n    backScripts = parts;\n  } else {\n    [backScripts, prevScripts] = splitArray(parts, sepIndex - 1);\n  }\n  return [renderScripts(prevScripts), base, renderScripts(backScripts)].join('');\n}\n\nfunction renderMover(node, children){\n  const nodes = flattenNodeTreeByNodeName(node, 'mover');\n  let result = undefined;\n  for(let i = 0; i < nodes.length - 1; i++) {\n    if(!result){ result = parse(nodes[i]); }\n    const over = parse(nodes[i + 1]);\n    const template = getMatchValueByChar({\n      decimals: MathSymbol.overScript.decimals,\n      values: MathSymbol.overScript.templates,\n      judgeChar: over,\n      defaultValue: \"@1\\\\limits^{@2}\"\n    });\n    result = renderTemplate(template.replace(\"@v\", \"@1\"), [result, over]);\n  }\n  return result;\n}\n\nfunction renderMunder(node, children){\n  const nodes = flattenNodeTreeByNodeName(node, 'munder');\n  let result = undefined;\n  for(let i = 0; i < nodes.length - 1; i++) {\n    if(!result){ result = parse(nodes[i]); }\n    const under = parse(nodes[i + 1]);\n    const template = getMatchValueByChar({\n      decimals: MathSymbol.underScript.decimals,\n      values: MathSymbol.underScript.templates,\n      judgeChar: under,\n      defaultValue: \"@1\\\\limits_{@2}\"\n    });\n    result =  renderTemplate(template.replace(\"@v\", \"@1\"), [result, under]);\n  }\n  return result;\n}\n\nfunction flattenNodeTreeByNodeName(root, nodeName) {\n  let result = [];\n  const children = NodeTool.getChildren(root);\n  Array.prototype.forEach.call(children, (node) => {\n    if (NodeTool.getNodeName(node) === nodeName) {\n      result = result.concat(flattenNodeTreeByNodeName(node, nodeName));\n    } else {\n      result.push(node);\n    }\n  });\n  return result;\n}\n\n\nfunction getMatchValueByChar(params) {\n  const {decimals, values, judgeChar, defaultValue=null} = params;\n  if (judgeChar && judgeChar.length === 1) {\n    const index = decimals.indexOf(judgeChar.charCodeAt(0));\n    if (index > -1) {\n      return values[index];\n    }\n  }\n  return defaultValue;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mphantom\n// FIXME :)\nfunction renderMphantom(node, children) {\n    return '';\n}\n\n\n\nfunction getRender_default(template) {\n  return function(node, children) {\n    const parts = renderChildren(children);\n    return renderTemplate(template, parts)\n  }\n}\n\nfunction renderTemplate(template, values) {\n  return template.replace(/\\@\\d+/g, (m) => {\n    const idx = parseInt(m.substring(1, m.length)) - 1;\n    return values[idx];\n  });\n}\n\nfunction getRender_joinSeparator(template, separator = '') {\n  return function(node, children) {\n    const parts = renderChildren(children);\n    return template.replace(\"@content\", parts.join(separator));\n  }\n}\n\nfunction getRender_joinSeparators(template, separators) {\n  return function(node, children) {\n    const parts = renderChildren(children);\n    let content = '';\n    if(separators.length === 0){\n      content = parts.join('');\n    } else {\n      content =  parts.reduce((accumulator, part, index) => {\n        accumulator += part;\n        if(index < parts.length - 1){\n          accumulator += (separators[index] || separators[separators.length - 1]);\n        }\n        return accumulator;\n      }, '');\n    }\n    return template.replace(\"@content\", content);\n  }\n}\n\nvar mathml2latex = {convert: convert};\n\nexport { mathml2latex as default };\n","export function spaces(num: number) {\n  return ' '.repeat(num || 0);\n}\n\nexport function inchesToSpaces(value: string): number {\n  if (!value) {\n    return 0;\n  }\n  if (value.endsWith('in')) {\n    return Math.floor(parseFloat(value.substring(0, value.length - 2)) / 0.125);\n  }\n  return 0;\n}\n\nexport function inchesToMm(value: string): number {\n  if (!value) {\n    return 0;\n  }\n  if (value.endsWith('pt')) {\n    return parseFloat(value.substring(0, value.length - 2)) * 0.3528;\n  }\n  if (value.endsWith('in')) {\n    return parseFloat(value.substring(0, value.length - 2)) * 25.4;\n  }\n  if (value.endsWith('em')) {\n    return parseFloat(value.substring(0, value.length - 2)) / 0.125 * 25.4;\n  }\n  return 0;\n}\n\nexport function inchesToPixels(value: string): number {\n  if (!value) {\n    return 0;\n  }\n  return Math.floor(100 * inchesToMm(value));\n}\n\nexport function fixCharacters(text: string) {\n  return text\n    .replace(/’/g, \"'\")\n    .replace(/“/g, '\"')\n    .replace(/”/g, '\"')\n    // deno-lint-ignore no-control-regex\n    .replace(/\\x0b/g, ' ')\n    .replace(/\\u201d/g, '\"')\n    .replace(/\\u201c/g, '\"');\n}\n\nexport function numberString(num: number, symbol = '1') {\n  if (['a'].includes(symbol)) {\n    return String.fromCharCode('a'.charCodeAt(0) + num - 1) + '.  ';\n  }\n  if (['A'].includes(symbol)) {\n    return String.fromCharCode('A'.charCodeAt(0) + num - 1) + '.  ';\n  }\n  if (['I'].includes(symbol)) {\n    return `${romanize(num)}. `;\n  }\n  if (['i'].includes(symbol)) {\n    return `${romanize(num).toLowerCase()}. `;\n  }\n  if (['1'].includes(symbol)) {\n    return `${num}. `;\n  }\n\n  return `${num}. `;\n}\n\nexport function romanize(num: number): string {\n  const lookup: [string, number][] = [\n    ['M', 1000],\n    ['CM', 900],\n    ['D', 500],\n    ['CD', 400],\n    ['C', 100],\n    ['XC', 90],\n    ['L', 50],\n    ['XL', 40],\n    ['X', 10],\n    ['IX', 9],\n    ['V', 5],\n    ['IV', 4],\n    ['I', 1],\n  ];\n\n  let roman = '';\n  for (const [symbol, value] of lookup) {\n    while (num >= value) {\n      roman += symbol;\n      num -= value;\n    }\n  }\n  return roman;\n}\n","import MathMl2LaTeX from 'mathml2latex';\n\nimport type {\n  ContextStash,\n  SerializerContext,\n  TokenHandler,\n} from '@kerebron/extension-markdown/MarkdownSerializer';\n\nimport type { Token } from '../types.ts';\nimport { fixCharacters } from '../utils.ts';\n\nexport function escapeMarkdown(\n  token: Token,\n  current: SerializerContext,\n): Array<[string, Token]> {\n  const markdownChars = [\n    { char: '\\\\', escape: '\\\\\\\\' },\n    // { char: '*', escape: '\\\\*' },\n    // { char: '_', escape: '\\\\_' },\n    { char: '#', escape: '\\\\#' },\n    { char: '$', escape: '\\\\$' },\n    // { char: '[', escape: '\\\\[' },\n    // { char: ']', escape: '\\\\]' },\n    // { char: '(', escape: '\\\\(' },\n    // { char: ')', escape: '\\\\)' },\n    // { char: '`', escape: '\\\\`' },\n    // { char: '>', escape: '\\\\>' },\n    { char: '<', escape: '\\\\<' },\n    // { char: '.', escape: '\\\\.' },\n    // { char: '!', escape: '\\\\!' },\n    // { char: '|', escape: '\\\\|' },\n    // { char: '{', escape: '\\\\{' },\n    // { char: '}', escape: '\\\\}' },\n    { char: '…', escape: '...' },\n    { char: '©', escape: '(c)' },\n    { char: '®', escape: '(r)' },\n    { char: '™', escape: '(tm)' },\n    { char: '±', escape: '+-' },\n    { char: '—', escape: '---' },\n  ];\n\n  const escapeChars: string[] = (current.meta.escapeChars || '').split('');\n\n  const startPos = token.map && token.map.length > 0 ? token.map[0] : 0;\n  if (!startPos) {\n    let escapedText = fixCharacters(token.content);\n    for (const { char, escape } of markdownChars) {\n      if (escapeChars.includes(char)) {\n        escapedText = escapedText.replaceAll(char, escape);\n      }\n    }\n\n    return [[escapedText, token]];\n  }\n\n  const charArr = fixCharacters(token.content).split('');\n  const retVal: Array<[string, Token]> = [];\n\n  const markdownCharsMap: Record<string, string> = Object.fromEntries(\n    markdownChars.map((c) => [c.char, c.escape]),\n  );\n\n  let offset = 0;\n  let inStr = '';\n  let currentOutStr = '';\n\n  const flush = () => {\n    if (currentOutStr.length > 0) {\n      const tok = structuredClone(token);\n      tok.map = [startPos + offset];\n      retVal.push([\n        currentOutStr,\n        tok,\n      ]);\n      offset = inStr.length;\n    }\n    currentOutStr = '';\n  };\n\n  for (let idx = 0; idx < charArr.length; idx++) {\n    const char = charArr[idx];\n\n    inStr += char;\n    if (!escapeChars.includes(char)) {\n      currentOutStr += char;\n      continue;\n    }\n\n    if (markdownCharsMap[char]) {\n      flush();\n    }\n    currentOutStr += markdownCharsMap[char] || char;\n    if (markdownCharsMap[char]) {\n      flush();\n    }\n  }\n\n  flush();\n\n  return retVal;\n}\n\nfunction getLinkTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    'text': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.meta['link_text'] += token.content;\n        if (token.content && !ctx.current.meta['link_token_token']) {\n          ctx.current.meta['link_token_token'] = token;\n        }\n      },\n    ],\n\n    'link_close': [\n      (token: Token, ctx: ContextStash) => {\n        {\n          const lastStackToken: Token = ctx.current.meta['link_open_token'];\n          const href: string = lastStackToken.attrGet('href') || '';\n          const title: string = lastStackToken.attrGet('title') || '';\n          const origUrl: string = lastStackToken.attrGet('origUrl') || href;\n\n          let link_text = ctx.current.meta['link_text'];\n          if (origUrl === link_text) {\n            link_text = href;\n          }\n\n          let mdTemplate = lastStackToken.attrGet('mdTemplate');\n          if (mdTemplate) {\n            const basename = href.split('/').pop();\n            mdTemplate = mdTemplate.replaceAll('$href', href);\n            mdTemplate = mdTemplate.replaceAll('$basename', basename || '');\n            mdTemplate = mdTemplate.replaceAll(\n              '$label',\n              ctx.current.meta['link_text'],\n            );\n            mdTemplate = mdTemplate.replaceAll('$title', title || '');\n\n            ctx.current.log(mdTemplate, token);\n          } else {\n            if (!title && link_text === href) {\n              ctx.current.log(href, token);\n            } else if (!title && !href) {\n              ctx.current.log('[', token);\n              ctx.current.log(\n                link_text,\n                ctx.current.meta['link_token_token'],\n              );\n              ctx.current.log(`]${title}`, token);\n            } else {\n              ctx.current.log('[', token);\n              ctx.current.log(\n                link_text,\n                ctx.current.meta['link_token_token'],\n              );\n              if (title) {\n                ctx.current.log(`](${href} ${title})`, token);\n              } else {\n                ctx.current.log(`](${href})`, token);\n              }\n            }\n          }\n\n          ctx.unstash('getLinkTokensHandlers.link_close');\n        }\n      },\n    ],\n\n    default: [\n      (token: Token, ctx: ContextStash) => {\n        // Ignore other stuff\n        // TODO: images?\n      },\n    ],\n  };\n}\n\nexport function getInlineTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    'text': [\n      (token: Token, ctx: ContextStash) => {\n        if (token.meta === 'noEscText') {\n          ctx.current.log(token.content);\n        } else {\n          for (const pair of escapeMarkdown(token, ctx.current)) {\n            ctx.current.log(pair[0], pair[1]);\n          }\n        }\n      },\n    ],\n    'entity': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.content);\n      },\n    ],\n    'strong_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '**', token);\n      },\n    ],\n    'strong_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '**', token);\n      },\n    ],\n    'em_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '*', token);\n      },\n    ],\n    'em_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '*', token);\n      },\n    ],\n    'underline_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '_', token);\n      },\n    ],\n    'underline_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '_', token);\n      },\n    ],\n    'strike_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '~', token);\n      },\n    ],\n    'strike_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '~', token);\n      },\n    ],\n\n    'link_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getInlineTokensHandlers.link_open');\n\n        ctx.current.handlers = getLinkTokensHandlers();\n\n        ctx.current.meta['link_open_token'] = token;\n        ctx.current.meta['link_text'] = '';\n        ctx.current.meta['link_token_token'] = null;\n      },\n    ],\n\n    'code_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '`', token);\n      },\n    ],\n    'code_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.markup || '`', token);\n      },\n    ],\n\n    'code_inline': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('`' + token.content + '`', token);\n      },\n    ],\n\n    'math': [\n      (token: Token, ctx: ContextStash) => {\n        let content = token.content;\n        if (token.attrGet('lang') === 'mathml') {\n          const cleaned = content.replace(\n            /<annotation[\\s\\S]*?<\\/annotation>/g,\n            '',\n          );\n          content = MathMl2LaTeX.convert(cleaned);\n        }\n        ctx.current.log('$' + content + '$', token);\n      },\n    ],\n    'hardbreak': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(ctx.current.lineBreak + '\\n', token);\n      },\n    ],\n    'softbreak': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('\\n', token);\n      },\n    ],\n\n    'image': [\n      (token: Token, ctx: ContextStash) => {\n        {\n          const src = token.attrGet('src');\n          const altAttr = token.attrGet('alt');\n\n          let alt = altAttr || '';\n          if (token.children) {\n            for (const child of token.children) {\n              if (child.type === 'text') {\n                alt += child.content;\n              }\n            }\n          }\n\n          let mdTemplate = '![$alt]';\n          const title = token.attrGet('title');\n          if (src) {\n            if (title) {\n              mdTemplate += '($src $title)';\n            } else {\n              mdTemplate += '($src)';\n            }\n          }\n\n          mdTemplate = token.attrGet('mdTemplate') || mdTemplate;\n\n          mdTemplate = mdTemplate.replaceAll('$alt', alt);\n          mdTemplate = mdTemplate.replaceAll('$label', alt);\n          mdTemplate = mdTemplate.replaceAll('$src', src || '');\n          mdTemplate = mdTemplate.replaceAll('$title', title || '');\n\n          ctx.current.log(\n            mdTemplate,\n            token,\n          );\n        }\n      },\n    ],\n\n    'html_block': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.content, token);\n      },\n    ],\n\n    'footnote_ref': [\n      (token: Token, ctx: ContextStash) => {\n        if (token.meta.label) {\n          ctx.current.log(`[^${token.meta.label}]`, token);\n        } else {\n          ctx.current.log(`[^footnote_${token.meta.id}]`, token);\n        }\n      },\n    ],\n\n    'shortcode_inline': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('{{' + token.content + '}}', token);\n      },\n    ],\n\n    'bookmark': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(`<a id=\"${token.attrGet('id')}\"></a>`, token);\n      },\n    ],\n  };\n}\n\nfunction escapeHtml(text: string) {\n  return text; // TODO\n}\n\nexport function getHtmlInlineFormatTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  return {\n    'strong_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'strong';\n        ctx.current.log(`<${tag}>`, token);\n      },\n    ],\n    'strong_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'strong';\n        ctx.current.log(`</${tag}>`, token);\n      },\n    ],\n    'em_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'em';\n        ctx.current.log(`<${tag}>`, token);\n      },\n    ],\n    'em_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'em';\n        ctx.current.log(`</${tag}>`, token);\n      },\n    ],\n    'strike_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'strike';\n        ctx.current.log(`<${tag}>`, token);\n      },\n    ],\n    'strike_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'strike';\n        ctx.current.log(`</${tag}>`, token);\n      },\n    ],\n    'underline_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'u';\n        ctx.current.log(`<${tag}>`, token);\n      },\n    ],\n    'underline_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'u';\n        ctx.current.log(`</${tag}>`, token);\n      },\n    ],\n  };\n}\n\nexport function getHtmlInlineTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  return {\n    'in_html': [],\n    'text': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(escapeHtml(token.content), token);\n      },\n    ],\n    'entity': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.content, token);\n      },\n    ],\n    ...getHtmlInlineFormatTokensHandlers(),\n    'link_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getHtmlInlineTokensHandlers.link_open');\n\n        const href = token.attrGet('href') || '';\n        const titleValue = token.attrGet('title');\n\n        const title = titleValue ? ' \"' + titleValue + '\"' : '';\n\n        ctx.current.log(`<a href=\"${href}\">`, token);\n      },\n    ],\n\n    'link_close': [\n      (token: Token, ctx: ContextStash) => {\n        {\n          ctx.current.log('</a>', token);\n          ctx.unstash('getHtmlInlineTokensHandlers.link_close');\n        }\n      },\n    ],\n\n    'code_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'code';\n        ctx.current.log(`<${tag}>`, token);\n      },\n    ],\n    'code_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'code';\n        ctx.current.log(`<${tag}>`, token);\n      },\n    ],\n\n    // 'code_inline': [\n    //   (token: Token, ctx: ContextStash) => {\n    //     const tag = token.tag || 'code';\n    //     ctx.current.log(`<${tag}>`, token);\n    //     ctx.current.log(token.content || '', token);\n    //     ctx.current.log(`</${tag}>`, token);\n    //   },\n    // ],\n    'math': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(\n          '<math xmlns=\"http://www.w3.org/1998/Math/MathML\">',\n          token,\n        );\n        ctx.current.log(token.content, token);\n        ctx.current.log('</math>', token);\n      },\n    ],\n    'hardbreak': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'br';\n        ctx.current.log(`<${tag} />\\n`, token);\n      },\n    ],\n    'softbreak': [\n      (token: Token, ctx: ContextStash) => {\n        const tag = token.tag || 'wbr';\n        ctx.current.log(`<${tag} />\\n`, token);\n      },\n    ],\n\n    'image': [\n      (token: Token, ctx: ContextStash) => {\n        {\n          // const src = token.attrGet('src');\n          // const alt = token.attrGet('alt');\n          let alt = '';\n          if (token.children) {\n            for (const child of token.children) {\n              if (child.type === 'text') {\n                alt += child.content;\n              }\n            }\n          }\n          // const title = token.attrGet('title');\n\n          // ctx.current.log(`![${alt}]`, token);\n          // if (src) {\n          //   ctx.current.log(\n          //     `(${src}${title ? ' \"' + title + '\"' : ''})`, token\n          //   );\n          // }\n\n          // TODO\n\n          const tag = token.tag || 'img';\n          ctx.current.log(`<${tag} />`, token);\n        }\n      },\n    ],\n    'html_block': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.content, token);\n      },\n    ],\n\n    'footnote_ref': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n\n    'shortcode_inline': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('{{' + token.content + '}}', token);\n      },\n    ],\n\n    'bookmark': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(`<a id=\"${token.attrGet('id')}\"></a>`, token);\n      },\n    ],\n  };\n}\n","import MathMl2LaTeX from 'mathml2latex';\n\nimport { Token } from '../types.ts';\n\nimport type {\n  ContextStash,\n  TokenHandler,\n} from '@kerebron/extension-markdown/MarkdownSerializer';\nimport { getInlineTokensHandlers } from './inline_token_handlers.ts';\n\nexport function getHtmlBasicTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  return {\n    'frontmatter': [],\n    'heading_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(`<${token.tag}>`, token);\n      },\n    ],\n    'heading_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(`</${token.tag}>\\n`, token);\n      },\n    ],\n    'paragraph_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<p>', token);\n      },\n    ],\n    'paragraph_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</p>\\n', token);\n      },\n    ],\n\n    'fence': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<pre>' + token.content + '</pre>\\n', token);\n        // ctx.current.log('```' + token.info + '\\n' + token.content + '```\\n\\n', token);\n      },\n    ],\n\n    'code_block': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<pre>' + token.content + '</pre>\\n', token);\n        // ctx.current.log(\n        //   token.content\n        //     .split('\\n')\n        //     .map((t) => t ? ('    ' + t) : '')\n        //     .join('\\n') + '\\n', token\n        // );\n      },\n    ],\n\n    'hr': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<hr />\\n', token);\n      },\n    ],\n\n    'html_block': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.content, token);\n      },\n    ],\n  };\n}\n\nfunction getHeaderTokensHandlers(): Record<string, Array<TokenHandler>> {\n  const entriesBasic = Object.entries(getBasicTokensHandlers())\n    .filter((entry) => ['heading_close'].includes(entry[0]));\n\n  const entriesInline = Object.entries(getInlineTokensHandlers())\n    .filter((entry) => ['text', 'link_open', 'link_close'].includes(entry[0]));\n\n  return {\n    ...Object.fromEntries(entriesInline),\n    ...Object.fromEntries(entriesBasic),\n    'default': [],\n  };\n}\n\nexport function getBasicTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    'frontmatter': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(\n          token.content,\n          token,\n        );\n      },\n    ],\n    'heading_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getBasicTokensHandlers.heading_open');\n        ctx.current.handlers = getHeaderTokensHandlers();\n        if (token.markup === '---') {\n          return;\n        }\n        ctx.current.log('#'.repeat(+token.tag.substring(1)) + ' ', token);\n      },\n    ],\n    'heading_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (token.markup === '---') {\n          ctx.current.log('\\n' + token.markup + '\\n', token);\n        }\n        ctx.current.log('\\n', token);\n        ctx.unstash('getBasicTokensHandlers.heading_close');\n      },\n    ],\n    'paragraph_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('', token);\n        // Skip, as paragraphs are implied by newlines\n      },\n    ],\n    'paragraph_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n', token);\n        }\n      },\n    ],\n\n    'fence': [\n      (token: Token, ctx: ContextStash) => {\n        let content = token.content;\n        let lang = token.attrGet('lang') || '';\n\n        if (lang === 'mathml') {\n          lang = 'math';\n          const cleaned = content.replace(\n            /<annotation[\\s\\S]*?<\\/annotation>/g,\n            '',\n          );\n          content = MathMl2LaTeX.convert(cleaned);\n        }\n\n        if (!content.endsWith('\\n')) {\n          content += '\\n';\n        }\n\n        if (lang === 'latex') {\n          ctx.current.log(\n            '$$' + '\\n' + content + '$$\\n\\n',\n            token,\n          );\n        } else {\n          ctx.current.log(\n            '```' + lang + '\\n' + content + '```\\n\\n',\n            token,\n          );\n        }\n      },\n    ],\n\n    'code_block': [\n      (token: Token, ctx: ContextStash) => {\n        const indent = +(token.attrGet('indent') || 0);\n        let content = token.content;\n        let lang = token.attrGet('lang') || '';\n\n        if (indent === 0) {\n          if (lang === 'mathml') {\n            lang = 'math';\n            const cleaned = content.replace(\n              /<annotation[\\s\\S]*?<\\/annotation>/g,\n              '',\n            );\n            content = MathMl2LaTeX.convert(cleaned);\n          }\n\n          if (!content.endsWith('\\n')) {\n            content += '\\n';\n          }\n\n          if (lang === 'rawmd') {\n            ctx.current.log(content, token);\n          } else if (lang === 'latex') {\n            ctx.current.log(\n              '$$' + '\\n' + content + '$$\\n\\n',\n              token,\n            );\n          } else {\n            ctx.current.log(\n              '```' + lang + '\\n' + content + '```\\n',\n              token,\n            );\n          }\n          return;\n        }\n\n        ctx.current.log(\n          token.content\n            .split('\\n')\n            .map((t) => t ? (' '.repeat(indent) + t) : '')\n            .join('\\n'),\n          token,\n        );\n      },\n    ],\n\n    'hr': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log((token.markup || '___') + '\\n', token);\n      },\n    ],\n\n    'html_block': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log(token.content, token);\n      },\n    ],\n  };\n}\n","import type { Token } from '../types.ts';\n\nimport type {\n  ContextStash,\n  TokenHandler,\n} from '@kerebron/extension-markdown/MarkdownSerializer';\n\nexport function getFootnoteTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  return {\n    'footnote_block_open': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n    'footnote_block_close': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n\n    'footnote_open': [\n      (token: Token, ctx: ContextStash) => {\n        if (token.meta.label) {\n          ctx.current.log(`[^${token.meta.label}]: `, token);\n        } else {\n          ctx.current.log(`[^footnote_${token.meta.id}]: `, token);\n        }\n        ctx.stash('getFootnoteTokensHandlers.footnote_open');\n        ctx.current.footnoteCnt++;\n        ctx.current.itemRow = 0;\n      },\n    ],\n    'footnote_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getFootnoteTokensHandlers.footnote_close');\n      },\n    ],\n    'footnote_anchor': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n  };\n}\n","export class TokenSource<K> {\n  private currentPos: number;\n\n  constructor(private tokens: Array<K>) {\n    this.currentPos = 0;\n  }\n\n  get pos() {\n    return this.currentPos;\n  }\n\n  iterate(start: number, callback: (token: K, tokenNo: number) => void) {\n    for (\n      this.currentPos = start;\n      this.currentPos < this.tokens.length;\n      this.currentPos++\n    ) {\n      const token = this.tokens[this.currentPos];\n      callback(token, this.currentPos);\n    }\n  }\n\n  append(tokens: Array<K>) {\n    this.tokens.push(...tokens);\n    return this.tokens.length - tokens.length;\n  }\n\n  trim(pos: number) {\n    this.tokens.splice(pos);\n  }\n\n  rewind(tokenNo: number = -1) {\n    if (tokenNo < 0) {\n      throw new RangeError('Invalid rewind pos: ' + tokenNo);\n    }\n    this.currentPos = tokenNo;\n  }\n}\n","import type { Token } from '../types.ts';\n\nimport {\n  type ContextStash,\n  type TokenHandler,\n  writeIndented,\n} from '@kerebron/extension-markdown/MarkdownSerializer';\nimport {\n  getHtmlInlineFormatTokensHandlers,\n  getInlineTokensHandlers,\n} from './inline_token_handlers.ts';\nimport { TokenSource } from '../TokenSource.ts';\nimport { numberString } from '../utils.ts';\nimport { getTableTokensHandlers } from './table_token_handlers.ts';\nimport { getBasicTokensHandlers } from './basic_token_handlers.ts';\nimport { getFootnoteTokensHandlers } from './footnote_token_handlers.ts';\n\nfunction getLongDefinitionTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  return {\n    ...getInlineTokensHandlers(),\n\n    'hardbreak': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('\\n');\n        if (ctx.current.meta['para_hidden']) {\n          ctx.current.itemSymbol = '';\n        }\n        ctx.current.itemRow++;\n      },\n    ],\n\n    'code_block': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.current.itemRow === 0) {\n          ctx.current.itemRow++;\n        }\n\n        if (ctx.output.colPos > 0) {\n          ctx.current.log('\\n');\n        }\n        if (!ctx.output.endsWith('\\n\\n')) {\n          ctx.current.log('\\n');\n        }\n\n        ctx.stash('getLongDefinitionTokensHandlers.code_block');\n        ctx.current.log = (txt: string) => {\n          writeIndented(ctx.output, txt, ctx.current, token);\n        };\n\n        ctx.current.log(\n          token.content\n            .split('\\n')\n            .map((t) => t.trim() ? ('  ' + t) : '')\n            .join('\\n') + '\\n',\n        );\n\n        ctx.unstash('getLongDefinitionTokensHandlers.code_block');\n\n        ctx.current.itemRow++;\n      },\n    ],\n\n    'paragraph_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getLongDefinitionTokensHandlers.paragraph_open');\n        ctx.current.meta['para_hidden'] = token.hidden;\n      },\n    ],\n    'paragraph_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getLongDefinitionTokensHandlers.paragraph_close');\n\n        if (ctx.output.colPos !== 0) {\n          // ctx.current.log('\\n');\n        }\n        ctx.current.itemRow++;\n      },\n    ],\n\n    'dt_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.itemSymbol = '';\n        ctx.current.itemRow = 0;\n      },\n    ],\n    'dt_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'dd_open': [\n      (token: Token, ctx: ContextStash) => {\n        if (!ctx.output.endsWith('\\n\\n')) {\n          ctx.current.log('\\n');\n        }\n        ctx.current.itemSymbol = ':   ';\n        ctx.current.itemRow = 0;\n      },\n    ],\n    'dd_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n\n    'dl_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getLongDefinitionTokensHandlers.dl_open');\n        ctx.current.listPath.push('dl');\n        ctx.current.listType = 'dl';\n      },\n    ],\n    'dl_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getLongDefinitionTokensHandlers.dl_close');\n      },\n    ],\n  };\n}\n\nfunction getShortDefinitionTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  const rollbackList = (\n    token: Token,\n    ctx: ContextStash,\n    tokenSource: TokenSource<Token>,\n  ) => {\n    const rollbackPos = ctx.current.meta['def_rollback'];\n    if (!ctx.current.meta['def_token_start']) {\n      throw new Error('No def_token_start');\n    }\n    const outputPos = ctx.current.meta['def_output_pos'];\n    if (!ctx.current.meta['def_output_pos']) {\n      throw new Error('No def_output_pos');\n    }\n\n    tokenSource.rewind(ctx.current.meta['def_token_start']);\n\n    ctx.rollback(rollbackPos, 'rollbackList, ' + token.type);\n    ctx.output.rollback(outputPos);\n\n    ctx.stash('getShortDefinitionTokensHandlers.rollbackList');\n    ctx.current.listPath.push('dl');\n    ctx.current.listType = 'dl';\n    ctx.current.handlers = getLongDefinitionTokensHandlers();\n  };\n\n  return {\n    'dl_open': [\n      (token: Token, ctx: ContextStash, tokenSource: TokenSource<Token>) => {\n        const rollbackPos = ctx.stash(\n          'getShortDefinitionTokensHandlers.dl_open',\n        );\n        ctx.current.meta['def_rollback'] = rollbackPos;\n        ctx.current.meta['def_token_start'] = tokenSource.pos;\n        ctx.current.meta['def_output_pos'] = ctx.output.chunkPos;\n        ctx.current.listPath.push('dl');\n        ctx.current.listType = 'dl';\n        ctx.current.handlers = getShortDefinitionTokensHandlers();\n      },\n    ],\n\n    'dl_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getShortDefinitionTokensHandlers.dl_close');\n      },\n    ],\n\n    ...getInlineTokensHandlers(),\n\n    'hardbreak': [\n      rollbackList,\n    ],\n    'code_block': [\n      rollbackList,\n    ],\n\n    'paragraph_open': [\n      (token: Token, ctx: ContextStash) => {\n        // Skip, as paragraphs are implied by newlines\n      },\n    ],\n    'paragraph_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          // ctx.current.log('\\n');\n        }\n      },\n    ],\n\n    'dt_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.itemSymbol = '';\n        ctx.current.itemRow = 0;\n      },\n    ],\n    'dt_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'dd_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.itemSymbol = '  ~ ';\n        ctx.current.itemRow = 0;\n      },\n    ],\n    'dd_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n  };\n}\n\nfunction getHtmlListItemTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    ...getInlineTokensHandlers(),\n    ...getHtmlInlineFormatTokensHandlers(),\n    ...getTableTokensHandlers(),\n    ...getBasicTokensHandlers(),\n    ...getFootnoteTokensHandlers(),\n    ...getListsTokensHandlers(),\n  };\n}\n\nexport function getListsTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    'dl_open': getShortDefinitionTokensHandlers()['dl_open'],\n\n    'paragraph_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n', token);\n        }\n        ctx.current.itemRow++;\n      },\n    ],\n\n    'task_list_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getListsTokensHandlers.task_list_open');\n        ctx.current.listPath.push('tl');\n        ctx.current.listType = 'tl';\n        ctx.current.itemSymbol = '';\n        ctx.current.itemNumber = 0;\n      },\n    ],\n    'task_list_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getListsTokensHandlers.task_list_close');\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'task_item_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.itemRow = 0;\n        ctx.current.itemNumber++;\n\n        ctx.current.itemSymbol = token.attrGet('checked') ? 'x' : '';\n\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'task_item_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n\n    'bullet_list_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getListsTokensHandlers.bullet_list_open');\n        ctx.current.listPath.push('ul');\n        ctx.current.listType = 'ul';\n\n        ctx.current.itemSymbol = '';\n        ctx.current.itemNumber = 0;\n      },\n    ],\n    'bullet_list_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getListsTokensHandlers.bullet_list_close');\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'ordered_list_open': [\n      (token: Token, ctx: ContextStash) => {\n        {\n          ctx.stash('getListsTokensHandlers.ordered_list_open');\n          ctx.current.listPath.push('ol');\n          ctx.current.listType = 'ol';\n\n          ctx.current.itemSymbol = '';\n          const symbol = token.attrGet('symbol');\n          if (symbol) {\n            ctx.current.meta['list_symbol'] = symbol;\n          } else {\n            ctx.current.meta['list_symbol'] = '1';\n          }\n\n          const start = token.attrGet('start');\n          if (start) {\n            ctx.current.itemNumber = (+start || 1) - 1;\n          } else {\n            ctx.current.itemNumber = 0;\n          }\n        }\n      },\n    ],\n    'ordered_list_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getListsTokensHandlers.ordered_list_close');\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'list_item_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.itemRow = 0;\n        if (token.attrGet('type') !== 'none') {\n          ctx.current.itemNumber++;\n        }\n\n        ctx.current.itemSymbol = token.info || token.markup;\n        if (!ctx.current.itemSymbol) {\n          ctx.current.itemSymbol = numberString(\n            ctx.current.itemNumber,\n            ctx.current.meta['list_symbol'] || '1',\n          );\n        }\n\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n\n        if (ctx.current.meta['use_html_list_items']) {\n          ctx.stash('list_item_open');\n          ctx.current.handlers = {\n            ...ctx.current.handlers,\n            ...getHtmlInlineFormatTokensHandlers(),\n          };\n        }\n      },\n    ],\n    'list_item_close': [\n      (token: Token, ctx: ContextStash) => {\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n        if (ctx.current.meta['use_html_list_items']) {\n          ctx.unstash('/list_item_open');\n        }\n      },\n    ],\n\n    'blockquote_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getListsTokensHandlers.blockquote_open');\n        ctx.current.blockquoteCnt++;\n        if (ctx.output.colPos !== 0) {\n          ctx.current.log('\\n');\n        }\n      },\n    ],\n    'blockquote_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.unstash('getListsTokensHandlers.blockquote_close');\n      },\n    ],\n  };\n}\n\nexport function getHtmlListsTokensHandlers(): Record<\n  string,\n  Array<TokenHandler>\n> {\n  // 'dl_open': getShortDefinitionTokensHandlers()['dl_open'],\n  return {\n    'bullet_list_open': [\n      (token: Token, ctx: ContextStash) => {\n        if (token.attrGet('not_first_para')) {\n          ctx.current.log('<br />\\n', token);\n        }\n        ctx.current.log('<ul>', token);\n      },\n    ],\n    'bullet_list_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</ul>', token);\n      },\n    ],\n\n    'ordered_list_open': [\n      (token: Token, ctx: ContextStash) => {\n        {\n          if (token.attrGet('not_first_para')) {\n            ctx.current.log('<br />\\n', token);\n          }\n          ctx.current.listPath.push('ol');\n          ctx.current.listType = 'ol';\n\n          ctx.current.itemSymbol = '';\n          const symbol = token.attrGet('symbol');\n          if (symbol) {\n            ctx.current.meta['list_symbol'] = symbol;\n          } else {\n            ctx.current.meta['list_symbol'] = '1';\n          }\n\n          const start = token.attrGet('start');\n          if (start) {\n            ctx.current.itemNumber = (+start || 1) - 1;\n            ctx.current.log(`<ol start=\"${start}\">`, token);\n          } else {\n            ctx.current.itemNumber = 0;\n            ctx.current.log('<ol>', token);\n          }\n        }\n      },\n    ],\n    'ordered_list_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</ol>', token);\n      },\n    ],\n\n    'list_item_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.itemSymbol = token.info || token.markup;\n        if (!ctx.current.itemSymbol) { // TODO\n          ctx.current.itemSymbol = numberString(\n            ctx.current.itemNumber,\n            ctx.current.meta['list_symbol'] || '1',\n          );\n        }\n\n        ctx.current.log('<li>', token);\n\n        if (token.attrGet('type') !== 'none') {\n          ctx.current.itemNumber++;\n        }\n      },\n    ],\n    'list_item_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</li>', token);\n      },\n    ],\n  };\n}\n","import { Token } from '../types.ts';\n\nimport type {\n  ContextStash,\n  TokenHandler,\n} from '@kerebron/extension-markdown/MarkdownSerializer';\nimport { getHtmlInlineTokensHandlers } from './inline_token_handlers.ts';\nimport { TokenSource } from '../TokenSource.ts';\nimport { getHtmlBasicTokensHandlers } from './basic_token_handlers.ts';\nimport { getHtmlListsTokensHandlers } from './lists_token_handlers.ts';\n\nexport type TextAlign = 'left' | 'right';\n\nfunction getHtmlTableTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    ...getHtmlInlineTokensHandlers(),\n    ...getHtmlBasicTokensHandlers(),\n    // ...getHtmlFootnoteTokensHandlers(),\n    ...getHtmlListsTokensHandlers(),\n\n    'paragraph_open': [\n      (token: Token, ctx: ContextStash) => {\n        if (token.attrGet('not_first_para')) {\n          ctx.current.log('<br />\\n', token);\n        }\n      },\n    ],\n    'paragraph_close': [],\n\n    'table_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.stash('getHtmlTableTokensHandlers.table_open');\n        ctx.current.meta['html_mode'] = true;\n        ctx.current.log('<table>\\n', token);\n      },\n    ],\n    'table_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</table>\\n', token);\n        ctx.unstash('getHtmlTableTokensHandlers.table_close');\n      },\n    ],\n    'thead_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<thead>\\n', token);\n      },\n    ],\n    'thead_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</thead>\\n', token);\n      },\n    ],\n    'tr_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<tr>\\n', token);\n      },\n    ],\n    'tr_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</tr>\\n', token);\n      },\n    ],\n    'th_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<th>', token);\n      },\n    ],\n    'th_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</th>\\n', token);\n      },\n    ],\n    'tbody_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<tbody>\\n', token);\n      },\n    ],\n    'tbody_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</tbody>\\n', token);\n      },\n    ],\n    'td_open': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('<td>', token);\n      },\n    ],\n    'td_close': [\n      (token: Token, ctx: ContextStash) => {\n        ctx.current.log('</td>\\n', token);\n      },\n    ],\n  };\n}\n\ninterface TableCell {\n  value: [string, Token][];\n  align: 'left' | 'right';\n  startPos?: number;\n}\n\ninterface TableRow {\n  type: 'header' | 'body';\n  cells: Array<TableCell>;\n}\n\nclass TableBuilder {\n  private rows: Array<TableRow>;\n  public currentType: 'header' | 'body';\n\n  constructor() {\n    this.currentType = 'body';\n    this.rows = [];\n  }\n\n  appendRow() {\n    this.rows.push({\n      type: this.currentType,\n      cells: [],\n    });\n  }\n\n  changeRowType(type: 'header' | 'body') {\n    if (this.rows.length === 0) {\n      return;\n    }\n\n    this.rows[this.rows.length - 1].type = type;\n  }\n\n  appendCell(align: 'left' | 'right', token: Token) {\n    const lastRow = this.rows[this.rows.length - 1];\n    const startPos = token.map && token.map.length > 0 ? token.map[0] : 0;\n    lastRow.cells.push({\n      value: [],\n      startPos,\n      align,\n    });\n  }\n\n  appendText(content: string, token: Token) {\n    const lastRow = this.rows[this.rows.length - 1];\n    if (lastRow.cells.length > 0) {\n      lastRow.cells[lastRow.cells.length - 1].value.push([content, token]);\n    }\n  }\n\n  render(log: (txt: string, token?: Token) => void) {\n    let prevType = '';\n\n    let lastHeader: Array<TableCell> = [];\n\n    const columnsWidth: Array<number> = [];\n    for (let rowNo = 0; rowNo < this.rows.length; rowNo++) {\n      const row = this.rows[rowNo];\n      for (let cellNo = 0; cellNo < row.cells.length; cellNo++) {\n        while (columnsWidth.length <= cellNo) {\n          columnsWidth.push(1);\n        }\n        const headCell = lastHeader[cellNo];\n        const cell = row.cells[cellNo];\n        const textLen: number = cell.value.reduce(\n          (prev, current) => prev + current[0].length,\n          0,\n        );\n        if (columnsWidth[cellNo] < textLen + 1) {\n          columnsWidth[cellNo] = textLen + 1;\n        }\n      }\n    }\n\n    for (let rowNo = 0; rowNo < this.rows.length; rowNo++) {\n      const row = this.rows[rowNo];\n\n      if (prevType === 'header' && prevType !== row.type) {\n        log('|');\n        for (let cellNo = 0; cellNo < lastHeader.length; cellNo++) {\n          const cell = lastHeader[cellNo];\n          log(' ');\n\n          if (cell.align === 'right') {\n            log('-'.repeat(columnsWidth[cellNo] - 2));\n            log(': |');\n          } else {\n            log('-'.repeat(columnsWidth[cellNo] - 1));\n            log(' |');\n          }\n        }\n        log('\\n');\n      }\n\n      log('|');\n\n      for (let cellNo = 0; cellNo < row.cells.length; cellNo++) {\n        const cell = row.cells[cellNo];\n        const textLen: number = cell.value.reduce(\n          (prev, current) => prev + current[0].length,\n          0,\n        );\n\n        if (cell.align === 'right') {\n          if (textLen === 0 && cell.startPos) {\n            log(\n              ' '.repeat(columnsWidth[cellNo] - textLen),\n              { map: [cell.startPos + 2] } as Token,\n            );\n          } else {\n            log(' '.repeat(columnsWidth[cellNo] - textLen));\n          }\n        } else {\n          log(' '.repeat(1));\n        }\n        for (const pair of cell.value) {\n          log(pair[0], pair[1]);\n        }\n        if (textLen < columnsWidth[cellNo]) {\n          if (cell.align === 'right') {\n            log(' '.repeat(1));\n          } else {\n            if (textLen === 0 && cell.startPos) {\n              log(\n                ' '.repeat(columnsWidth[cellNo] - textLen),\n                { map: [cell.startPos + 2] } as Token,\n              );\n            } else {\n              log(' '.repeat(columnsWidth[cellNo] - textLen));\n            }\n          }\n        }\n        log('|');\n      }\n\n      log('\\n');\n\n      if (row.type === 'header') {\n        lastHeader = row.cells;\n      }\n      prevType = row.type;\n    }\n  }\n}\n\nexport interface RollbackData {\n  sourcePos: number;\n  outputPos: number;\n  ctxDepth: number;\n}\n\nfunction getMdTableTokensHandler(): Record<string, Array<TokenHandler>> {\n  const rollbackMdTable = (\n    token: Token,\n    ctx: ContextStash,\n    tokenSource: TokenSource<Token>,\n  ) => {\n    if (!ctx.current.meta['html_rollback']) {\n      throw new Error('No html_rollback');\n    }\n\n    const rollback: RollbackData = ctx.current.meta['html_rollback'];\n\n    tokenSource.rewind(rollback.sourcePos);\n    ctx.rollback(rollback.ctxDepth, 'rollbackMdTable, ' + token.type);\n    ctx.output.rollback(rollback.outputPos);\n\n    ctx.stash('getMdTableTokensHandler.rollbackTable');\n    ctx.current.meta['html_mode'] = true;\n    ctx.current.log('<table>\\n', token);\n    ctx.current.handlers = getHtmlTableTokensHandlers();\n  };\n\n  return {\n    'text': [\n      (token: Token, ctx: ContextStash) => {\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.appendText(token.content, token);\n      },\n    ],\n\n    'paragraph_open': [],\n    'paragraph_close': [\n      (token: Token, ctx: ContextStash, tokenSource: TokenSource<Token>) => {\n        ctx.current.meta['table_cell_para_count'] =\n          +ctx.current.meta['table_cell_para_count'] + 1;\n        if (ctx.current.meta['table_cell_para_count'] > 1) { // Only 1 line in markdown pipe table\n          rollbackMdTable(token, ctx, tokenSource);\n        }\n      },\n    ],\n\n    'default': [\n      rollbackMdTable,\n    ],\n\n    'table_open': [\n      (token: Token, ctx: ContextStash, tokenSource: TokenSource<Token>) => {\n        const rollbackDepth = ctx.stash('getMdTableTokensHandler.table_open');\n        if (!ctx.current.meta['html_rollback']) {\n          const rollback: RollbackData = {\n            sourcePos: tokenSource.pos,\n            outputPos: ctx.output.chunkPos,\n            ctxDepth: rollbackDepth,\n          };\n          ctx.current.meta['html_rollback'] = rollback;\n        }\n\n        ctx.current.metaObj['table_builder'] = new TableBuilder();\n        ctx.current.handlers = getMdTableTokensHandler();\n      },\n    ],\n\n    'table_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.render(ctx.current.log);\n        ctx.unstash('getMdTableTokensHandler.table_close');\n      },\n    ],\n    'thead_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.currentType = 'header';\n      },\n    ],\n    'thead_close': [\n      (token: Token, ctx: ContextStash) => {\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.currentType = 'body';\n      },\n    ],\n    'tr_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.appendRow();\n      },\n    ],\n    'tr_close': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n    'th_open': [\n      (token: Token, ctx: ContextStash) => {\n        // const style = token.attrGet('style');\n        // const align = style === 'text-align:right' ? 'right' : 'left';\n        const align = token.attrGet('align') || 'left';\n\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.appendCell(align as TextAlign, token);\n        tableBuilder.changeRowType('header');\n        ctx.current.meta['table_cell_para_count'] = 0;\n      },\n    ],\n    'th_close': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n    'tbody_open': [\n      (token: Token, ctx: ContextStash) => {\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.currentType = 'body';\n      },\n    ],\n    'tbody_close': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n    'td_open': [\n      (token: Token, ctx: ContextStash) => {\n        const align = token.attrGet('align') || 'left';\n\n        const tableBuilder: TableBuilder = ctx.current.metaObj['table_builder'];\n        tableBuilder.appendCell(align as TextAlign, token);\n        ctx.current.meta['table_cell_para_count'] = 0;\n      },\n    ],\n    'td_close': [\n      (token: Token, ctx: ContextStash) => {\n      },\n    ],\n  };\n}\n\nexport function getTableTokensHandlers(): Record<string, Array<TokenHandler>> {\n  return {\n    'table_open': getMdTableTokensHandler()['table_open'],\n  };\n}\n","import { NESTING_CLOSING, Token } from './types.ts';\n\nimport { getTableTokensHandlers } from './token_handlers/table_token_handlers.ts';\nimport { getBasicTokensHandlers } from './token_handlers/basic_token_handlers.ts';\nimport { getInlineTokensHandlers } from './token_handlers/inline_token_handlers.ts';\nimport { getFootnoteTokensHandlers } from './token_handlers/footnote_token_handlers.ts';\nimport { getListsTokensHandlers } from './token_handlers/lists_token_handlers.ts';\nimport { TokenSource } from './TokenSource.ts';\nimport { SmartOutput } from '@kerebron/editor/utilities';\n\nexport function writeIndented(\n  output: SmartOutput<Token>,\n  text: string,\n  currentCtx: SerializerContext,\n  token?: Token,\n) {\n  const lines = text\n    .split('\\n');\n\n  const typeIndent: Record<ListType, number> = {\n    ul: 2,\n    ol: 4,\n    dl: 2,\n    tl: 4,\n  };\n\n  if (currentCtx.meta['listMargins']) {\n    for (const [key, value] of Object.entries(currentCtx.meta['listMargins'])) {\n      if (\n        'number' === typeof value && value > 0 && typeIndent[key as ListType]\n      ) {\n        typeIndent[key as ListType] = value;\n      }\n    }\n  }\n\n  let offset = 0;\n  const startPos = token\n    ? (token.map && token.map.length > 0 ? token.map[0] : 0)\n    : 0;\n  for (let lineNo = 0; lineNo < lines.length; lineNo++) {\n    const line = lines[lineNo];\n\n    if (lineNo === lines.length - 1 && line.length === 0) {\n      continue;\n    }\n\n    let prefix = '';\n\n    if (output.colPos === 0) {\n      prefix += '> '.repeat(currentCtx.blockquoteCnt);\n    }\n    if (output.colPos === 0 && line.length > 0) {\n      prefix += '    '.repeat(currentCtx.footnoteCnt);\n\n      const indent = currentCtx.listPath\n        .slice(0, currentCtx.listPath.length - 1)\n        .map((type) => typeIndent[type])\n        .reduce((p, c) => p + c, 0);\n\n      switch (currentCtx.listType) {\n        case 'tl':\n          prefix += ' '.repeat(indent);\n          if (currentCtx.itemRow === 0) {\n            prefix += '- ';\n            if (currentCtx.itemSymbol) {\n              prefix += '[x] ';\n            } else {\n              prefix += '[ ] ';\n            }\n          } else {\n            prefix += '  ';\n          }\n          break;\n\n        case 'ul':\n          prefix += ' '.repeat(indent);\n          if (currentCtx.itemRow === 0) {\n            prefix += currentCtx.itemSymbol + ' ';\n          } else {\n            prefix += ' '.repeat(typeIndent[currentCtx.listType]);\n          }\n          break;\n\n        case 'ol':\n          prefix += ' '.repeat(indent);\n          if (currentCtx.itemRow === 0) {\n            prefix += currentCtx.itemSymbol;\n          } else {\n            prefix += ' '.repeat(4);\n          }\n          break;\n\n        case 'dl':\n          if (currentCtx.itemSymbol) {\n            if (currentCtx.itemRow === 0) {\n              prefix += `${currentCtx.itemSymbol}`;\n            } else {\n              prefix += ' '.repeat(currentCtx.itemSymbol.length);\n            }\n          }\n          break;\n      }\n    }\n\n    const tok = structuredClone(token);\n    if (startPos && tok) {\n      tok.map = [startPos + offset];\n    }\n\n    if (line.length > 0) {\n      if (\n        currentCtx.blockquoteCnt > 0 &&\n        output.colPos === currentCtx.blockquoteCnt * 2 - 1\n      ) {\n        prefix += ' ';\n      }\n    }\n\n    const isLastLine = lineNo >= lines.length - 1;\n\n    const regex = new RegExp(currentCtx.lineBreak + '$');\n    const hasBreak = line.match(new RegExp(currentCtx.lineBreak + '$'));\n    const rightTrimmed = line\n      .replace(regex, '')\n      .replace(/[ \\t\\u00A0]+$/g, '');\n    const leftTrimmed = line\n      .replace(regex, '')\n      .replace(/^[ \\t\\u00A0]+/g, '');\n\n    if (isLastLine) {\n      if (hasBreak) {\n        output.log(rightTrimmed ? prefix : prefix.trim());\n        output.log(rightTrimmed + (hasBreak ? '  ' : ''), tok);\n        offset += (rightTrimmed + (hasBreak ? '  ' : '')).length;\n      } else {\n        if (output.colPos === 0) {\n          output.log(leftTrimmed ? prefix : prefix.trim());\n          output.log(leftTrimmed, tok);\n          offset += leftTrimmed.length;\n        } else {\n          output.log(line ? prefix : prefix.trim());\n          output.log(line, tok);\n          offset += line.length;\n        }\n      }\n    } else {\n      output.log(rightTrimmed ? prefix : prefix.trim());\n      output.log(rightTrimmed + (hasBreak ? '  ' : ''), tok);\n      offset += (rightTrimmed + (hasBreak ? '  ' : '')).length;\n    }\n\n    if (!isLastLine) {\n      currentCtx.itemRow++;\n      const tok = structuredClone(token);\n      if (startPos && tok) {\n        tok.map = [startPos + offset];\n      }\n      output.log('\\n', tok);\n      offset++;\n    }\n  }\n}\n\ntype ListType = 'ul' | 'ol' | 'dl' | 'tl';\n\nexport interface SerializerContext {\n  lineBreak: string;\n  level: number;\n  meta: Record<string, any>;\n  metaObj: Record<string, any>;\n  blockquoteCnt: number;\n  footnoteCnt: number;\n  listPath: Array<ListType>;\n  listType?: ListType;\n  itemRow: number;\n  itemNumber: number;\n  itemSymbol: string;\n\n  handlers: Record<string, Array<TokenHandler>>;\n  log: (txt: string, token?: Token) => void;\n  debug: (...args: any[]) => void;\n}\n\nexport class ContextStash {\n  private ctxStash: Array<SerializerContext> = [];\n  private currentCtx: SerializerContext;\n  public readonly output: SmartOutput<Token>;\n\n  constructor(handlers: Record<string, Array<TokenHandler>>) {\n    this.output = new SmartOutput();\n    this.currentCtx = {\n      lineBreak: '\\r',\n      meta: {},\n      metaObj: {},\n      blockquoteCnt: 0,\n      footnoteCnt: 0,\n      itemRow: 0,\n      listPath: [],\n      itemNumber: 0,\n      itemSymbol: '',\n\n      handlers,\n      log: (txt: string, token?: Token) => this.output.log(txt, token),\n      debug: () => {},\n      level: 0,\n    };\n    this.stash('ContextStash.constructor()');\n  }\n\n  public stash(reason: string): number {\n    this.currentCtx.debug(\n      '  '.repeat(this.ctxStash.length) + 'stash: ' + reason,\n    );\n    this.ctxStash.push(this.currentCtx);\n    const funcs = {\n      log: this.currentCtx.log,\n      debug: this.currentCtx.debug,\n    };\n    const handlers = { ...this.currentCtx.handlers };\n    const metaObj = { ...this.currentCtx.metaObj };\n    this.currentCtx = {\n      ...structuredClone({\n        ...this.currentCtx,\n        log: undefined,\n        debug: undefined,\n        handlers: undefined,\n      }),\n      metaObj,\n      ...funcs,\n      handlers: handlers,\n      level: this.currentCtx.level + 1,\n    };\n\n    const rollbackPos = this.ctxStash.length - 1;\n    return rollbackPos;\n  }\n\n  public unstash(reason: string) {\n    const ctx = this.ctxStash.pop();\n    this.currentCtx.debug(\n      '  '.repeat(this.ctxStash.length) + 'unstash: ' + reason,\n    );\n    if (!ctx) {\n      throw new Error('Unstash failed');\n    }\n    this.currentCtx = ctx;\n  }\n\n  public rollback(rollbackPos: number, reason: string) {\n    const rollbackCtx = this.ctxStash[rollbackPos];\n    if (!rollbackCtx) {\n      throw new RangeError('Invalid rollbackPos: ' + rollbackPos);\n    }\n\n    this.currentCtx.debug('rollback ' + reason, rollbackPos);\n    this.ctxStash.splice(rollbackPos);\n    this.currentCtx = this.ctxStash[this.ctxStash.length - 1];\n  }\n\n  get current() {\n    return this.currentCtx;\n  }\n}\n\nexport function serializeInlineTokens(\n  ctx: ContextStash,\n  tokenSource: TokenSource<Token>,\n  tokens: Token[],\n) {\n  const appendPos = tokenSource.append(tokens);\n  const oldPos = tokenSource.pos;\n  tokenSource.rewind(appendPos);\n\n  try {\n    tokenSource.iterate(appendPos, (token, i) => {\n      const tokenHandlers: Array<TokenHandler> =\n        ctx.current.handlers[token.type] || ctx.current.handlers['default'];\n      if (!tokenHandlers) {\n        throw new Error(\n          `Unknown inline token: ${token.type} ` + JSON.stringify(token) +\n            `, available hadlers: ${Object.keys(ctx.current.handlers)}`,\n        );\n      }\n\n      for (const handler of tokenHandlers) {\n        if (handler(token, ctx, tokenSource)) {\n          break;\n        }\n      }\n\n      if (tokenSource.pos + 1 < appendPos) {\n        throw new RangeError('Rewinded before inline tokens');\n      }\n    });\n\n    tokenSource.rewind(oldPos);\n  } finally {\n    tokenSource.trim(appendPos);\n  }\n}\n\nexport type TokenHandler = (\n  token: Token,\n  ctx: ContextStash,\n  tokenSource: TokenSource<Token>,\n) => boolean | void;\n\nexport interface MarkdownSerializerConfig {\n  debug?: (...args: any[]) => void;\n  htmlListItems?: boolean;\n  listMargins?: Record<string, number>;\n}\n\nexport class MarkdownSerializer {\n  private ctx: ContextStash;\n\n  constructor(config: MarkdownSerializerConfig = {}) {\n    this.ctx = new ContextStash({\n      ...getInlineTokensHandlers(),\n      ...getTableTokensHandlers(),\n      ...getBasicTokensHandlers(),\n      ...getFootnoteTokensHandlers(),\n      ...getListsTokensHandlers(),\n    });\n\n    if (config.htmlListItems) {\n      this.ctx.current.meta['use_html_list_items'] = true;\n    }\n    if (config.listMargins) {\n      this.ctx.current.meta['listMargins'] = config.listMargins;\n    }\n    // this.ctx.current.meta['escapeChars'] = '…©®™±—';\n    this.ctx.current.meta['escapeChars'] = '';\n\n    if (config.debug) {\n      this.ctx.current.debug = config.debug;\n    }\n  }\n\n  private get endsWithEmptyLine() {\n    return this.ctx.output.endsWith('\\n\\n');\n  }\n\n  serialize(tokens: Token[]): SmartOutput<Token> {\n    const prevLevelTokenType: Record<number, Token> = {};\n\n    const tokenSource = new TokenSource(tokens);\n    tokenSource.iterate(0, (token, i) => {\n      if (!this.ctx.current.meta['html_mode']) {\n        if (token.level === 0) {\n          if (this.ctx.output.colPos !== 0) {\n            this.ctx.current.log('\\n');\n          }\n        }\n\n        if (!this.endsWithEmptyLine) {\n          if (token.nesting !== NESTING_CLOSING && token.level === 0) {\n            const prevTopToken = prevLevelTokenType[token.level];\n            const prevTopTokenType = prevTopToken?.type || '';\n\n            if (\n              prevTopTokenType &&\n              prevTopToken.attrGet('margin_after') &&\n              token.attrGet('margin_before')\n            ) {\n              const bothLists = prevTopToken.type.endsWith('_list_close') &&\n                token.type.endsWith('_list_open');\n              const bothBulletLists =\n                prevTopToken.type === 'bullet_list_close' &&\n                token.type === 'bullet_list_open';\n              const listNone = token.attrGet('first_level_type') === 'none';\n              const prevListNone =\n                prevTopToken?.attrGet('first_level_type') === 'none';\n\n              if (\n                (!listNone && !prevListNone && !bothBulletLists) || !bothLists\n              ) {\n                this.ctx.current.log('\\n');\n              }\n            }\n          } else if (\n            token.nesting !== NESTING_CLOSING && token.level === 1 &&\n            'dt_open' === token.type\n          ) {\n            const prevToken = prevLevelTokenType[token.level];\n            const prevTokenType = prevToken?.type || '';\n            if (\n              [\n                'dt_close',\n                'dd_close',\n              ].includes(prevTokenType)\n            ) {\n              this.ctx.current.log('\\n');\n            }\n          }\n        }\n      }\n\n      if (token.nesting !== NESTING_CLOSING && token.level > 0) {\n        const prevTopToken = prevLevelTokenType[token.level];\n        const prevTopTokenType = prevTopToken?.type || '';\n        if (\n          [\n            'paragraph_close',\n          ].includes(prevTopTokenType)\n        ) {\n          if (this.ctx.current.blockquoteCnt === token.level) {\n            writeIndented(this.ctx.output, '\\n', this.ctx.current, token);\n          }\n        }\n      }\n\n      const tokenHandlers: Array<TokenHandler> =\n        this.ctx.current.handlers[token.type] ||\n        this.ctx.current.handlers['default'];\n      if (token.type === 'inline') {\n        if (token.children) {\n          this.ctx.stash('serializeInlineTokens()');\n          this.ctx.current.log = (txt: string, token?: Token) => {\n            writeIndented(this.ctx.output, txt, this.ctx.current, token);\n          };\n\n          try {\n            serializeInlineTokens(this.ctx, tokenSource, token.children);\n            this.ctx.unstash('serializeInlineTokens()');\n          } catch (err: any) {\n            this.ctx.current.debug(err.message);\n            if (err.message === 'Rewinded before inline tokens') {\n              return;\n            }\n            throw err;\n          }\n        }\n      } else if (!tokenHandlers) {\n        this.ctx.current.debug(\n          'current.handlers',\n          Object.keys(this.ctx.current.handlers).sort(),\n        );\n        throw new Error(\n          `Unknown token: ${token.type} ` + JSON.stringify(token),\n        );\n      } else {\n        for (const handler of tokenHandlers) {\n          if (handler(token, this.ctx, tokenSource)) {\n            break;\n          }\n        }\n      }\n\n      prevLevelTokenType[token.level] = token;\n      if (token.nesting === NESTING_CLOSING) {\n        prevLevelTokenType[token.level + 1] = new Token('', '', token.nesting);\n      }\n    });\n\n    return this.ctx.output;\n  }\n}\n","import type { Attrs, Mark, Node, Schema } from 'prosemirror-model';\nimport { Token } from './types.ts';\n\nexport type MarkTokenizerSpec = {\n  open?: string | ((mark: Mark) => Promise<Token>);\n  close?: string | ((mark: Mark) => Promise<Token>);\n  mixable?: boolean;\n  expelEnclosingWhitespace?: boolean;\n  escape?: boolean;\n};\n\nexport type DocumentMarkdownTokenizerSpec = {\n  open?: string | ((node: Node, pos: number, idx: number) => Promise<Token>);\n  close?:\n    | string\n    | ((\n      node: Node,\n      pos: number,\n      idx: number,\n      openToken: Token,\n    ) => Promise<Token>);\n  selfClose?:\n    | string\n    | ((node: Node, pos: number, idx: number) => Promise<Token>);\n  margin?: 'before' | 'after' | 'both';\n};\n\nconst blankMark: MarkTokenizerSpec = { open: '', close: '', mixable: true };\nconst blankNode: DocumentMarkdownTokenizerSpec = { open: '', close: '' };\n\nfunction generateInlineTokens(input: Array<[string, number]>): Array<Token> {\n  const tokens: Array<Token> = [];\n\n  let currentPos = -1;\n  let currentText = '';\n\n  for (const [text, inlinePos] of input) {\n    if (true || currentPos !== inlinePos) {\n      if (currentText.length > 0) {\n        const token = new Token('text', '', 0);\n        token.meta = 'generateInline1';\n        token.map = [currentPos];\n        token.content = currentText;\n        tokens.push(token);\n      }\n\n      currentText = '';\n      currentPos = inlinePos;\n    }\n\n    currentText += text;\n  }\n\n  if (currentText.length > 0) {\n    const token = new Token('text', '', 0);\n    token.meta = 'generateInline2';\n    token.map = [currentPos];\n    token.content = currentText;\n    tokens.push(token);\n  }\n\n  return tokens;\n}\n\ninterface NullNode {\n  isText: false;\n  attrs: Attrs;\n  text: string;\n  marks: Mark[];\n}\n\nconst nullNode: NullNode = {\n  isText: false,\n  attrs: {},\n  text: '',\n  marks: [],\n};\n\nexport class DocumentMarkdownInlineTokenizer {\n  constructor(\n    readonly nodes: {\n      [node: string]: (\n        node: Node,\n        index: number,\n      ) => DocumentMarkdownTokenizerSpec;\n    },\n    readonly marks: { [mark: string]: MarkTokenizerSpec },\n    readonly options: { hardBreakNodeName: string },\n    readonly schema: Schema,\n  ) {\n  }\n\n  private getMark(name: string): MarkTokenizerSpec {\n    let info = this.marks[name];\n    if (!info) {\n      // if (this.options.strict !== false) {\n      //   throw new Error(\n      //     `Mark type \\`${name}\\` not supported by Markdown renderer`,\n      //   );\n      // }\n      return blankMark;\n    }\n    return info;\n  }\n\n  async renderInline(\n    parent: Node,\n    currentPos: number,\n    level: number,\n  ): Promise<Token[]> {\n    const active: Mark[] = [];\n    const trailing: Array<[string, number]> = [];\n\n    const inlineTokens: Array<Token> = [];\n\n    const progress = async (\n      node: Node | NullNode,\n      offset: number,\n      index: number,\n    ) => {\n      const inlinePos = currentPos + offset;\n      let marks = node ? node.marks : [];\n\n      // Remove marks from `hard_break` that are the last node inside\n      // that mark to prevent parser edge cases with new lines just\n      // before closing marks.\n      // TODO:\n      if ('type' in node && node.type.name === this.options.hardBreakNodeName) {\n        marks = marks.filter((m) => {\n          if (index + 1 == parent.childCount) return false;\n          let next = parent.child(index + 1);\n          return m.isInSet(next.marks) &&\n            (!next.isText || /\\S/.test(next.text!));\n        });\n      }\n\n      const leading: Array<[string, number]> = trailing.splice(\n        0,\n        trailing.length,\n      );\n      // If whitespace has to be expelled from the node, adjust\n      // leading and trailing accordingly.\n      if (\n        node?.isText && marks.some((mark) => {\n          let info = this.getMark(mark.type.name);\n          return info && info.expelEnclosingWhitespace && !mark.isInSet(active);\n        })\n      ) {\n        let [_, lead, rest] = /^(\\s*)(.*)$/m.exec(node.text!)!;\n        if (lead) {\n          leading.push([lead, inlinePos]);\n          if (rest) {\n            node = this.schema.text(rest, node.marks);\n          } else {\n            node = nullNode;\n          }\n          if (!node) marks = active;\n        }\n      }\n      if (\n        node && node.isText && marks.some((mark) => {\n          let info = this.getMark(mark.type.name);\n          return info && info.expelEnclosingWhitespace &&\n            (index == parent.childCount - 1 ||\n              !mark.isInSet(parent.child(index + 1).marks));\n        })\n      ) {\n        let [_, rest, trail] = /^(.*?)(\\s*)$/m.exec(node.text!)!;\n        if (trail) {\n          trailing.push([trail, inlinePos]);\n          if (rest) {\n            node = this.schema.text(rest, node.marks);\n          } else {\n            node = nullNode;\n          }\n          if (!node) marks = active;\n        }\n      }\n      let inner = marks.length ? marks[marks.length - 1] : null;\n      let noEsc = inner && this.getMark(inner.type.name).escape === false;\n      let len = marks.length - (noEsc ? 1 : 0);\n\n      // Try to reorder 'mixable' marks, such as em and strong, which\n      // in Markdown may be opened and closed in different order, so\n      // that order of the marks for the token matches the order in\n      // active.\n      outer: for (let i = 0; i < len; i++) {\n        let mark = marks[i];\n        if (!this.getMark(mark.type.name).mixable) break;\n        for (let j = 0; j < active.length; j++) {\n          let other = active[j];\n          if (!this.getMark(other.type.name).mixable) break;\n          if (mark.eq(other)) {\n            if (i > j) {\n              marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i))\n                .concat(marks.slice(i + 1, len));\n            } else if (j > i) {\n              marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(\n                mark,\n              ).concat(marks.slice(j, len));\n            }\n            continue outer;\n          }\n        }\n      }\n\n      // Find the prefix of the mark set that didn't change\n      let keep = 0;\n      while (\n        keep < Math.min(active.length, len) && marks[keep].eq(active[keep])\n      ) ++keep;\n\n      // Close the marks that need to be closed\n      while (keep < active.length) {\n        const x = active.pop()!;\n        await this.markString(x, false, inlineTokens);\n      }\n\n      // Output any previously expelled trailing whitespace outside the marks\n      inlineTokens.push(\n        ...generateInlineTokens(leading.splice(0, leading.length)),\n      );\n\n      // Open the marks that need to be opened\n      while (active.length < len) {\n        let add = marks[active.length];\n        active.push(add);\n        await this.markString(add, true, inlineTokens);\n      }\n\n      // Render the node. Special case code marks, since their content\n      // may not be escaped.\n      if (noEsc && node.isText) {\n        await this.markString(inner!, true, inlineTokens);\n        if (node.text) {\n          const token = new Token('text', '', 0);\n          token.meta = 'noEscText';\n          token.map = [inlinePos];\n          token.content = node.text;\n          inlineTokens.push(token);\n        }\n        await this.markString(inner!, false, inlineTokens);\n      } else {\n        const nodeSpec = 'type' in node && this.nodes[node.type.name]\n          ? this.nodes[node.type.name](node, currentPos)\n          : blankNode;\n\n        let tag = '';\n        if ('type' in node && node.type.spec.toDOM) {\n          const dom = node.type.spec.toDOM(node);\n          if (Array.isArray(dom) && dom.length > 0) {\n            tag = dom[0];\n          }\n        }\n\n        if (nodeSpec.selfClose) {\n          if (tag === 'wbr') {\n            const token = new Token('text', '', 0);\n            token.meta = 'wbr';\n            token.map = [currentPos];\n            token.content = '\\n';\n            inlineTokens.push(token);\n          } else if (typeof nodeSpec.selfClose === 'string') {\n            const token = new Token(nodeSpec.selfClose, tag, 0);\n            token.meta = 'nodeSpec.selfClose';\n            token.level = level;\n            token.map = [inlinePos];\n            inlineTokens.push(token);\n          } else if ('type' in node) {\n            const token = await nodeSpec.selfClose(node, inlinePos, index);\n            token.meta = '!nodeSpec.selfClose';\n            token.level = level;\n            token.map = [inlinePos];\n            inlineTokens.push(token);\n          }\n        }\n      }\n    };\n\n    let offset = 0;\n    for (let idx = 0; idx < parent.childCount; idx++) {\n      const child = parent.child(idx);\n      await progress(child, offset, idx);\n      offset += child.nodeSize;\n    }\n\n    // Close the marks that need to be closed\n    while (active.length > 0) {\n      const x = active.pop()!;\n      await this.markString(x, false, inlineTokens);\n    }\n\n    // Output any previously expelled trailing whitespace outside the marks\n    inlineTokens.push(\n      ...generateInlineTokens(trailing.splice(0, trailing.length)),\n    );\n\n    return inlineTokens;\n  }\n\n  async markString(mark: Mark, open: boolean, tokens: Token[]) {\n    let info = this.getMark(mark.type.name);\n    let value = open ? info.open : info.close;\n\n    if (!value) {\n      if (['highlight', 'textColor'].includes(mark.type.name)) {\n        return;\n      }\n      /** Skip unknown marks (like textColor, highlight) - they'll be lost in markdown but won't crash */\n      console.warn(\n        'Unsupported mark type for markdown: ' + mark.type.name +\n          ', available types: ' +\n          Object.keys(this.marks).join(', ') + '. Mark will be ignored.',\n      );\n      return;\n    }\n\n    const token = typeof value == 'string' ? value : value(mark);\n\n    let tag = '';\n    if (mark.type.spec.toDOM) {\n      const dom = mark.type.spec.toDOM(mark, true);\n      if (Array.isArray(dom) && dom.length > 0) {\n        tag = dom[0];\n      }\n    }\n\n    if (typeof value === 'string') {\n      const token = new Token(value, tag, open ? 1 : -1);\n      token.meta = 'markString';\n      tokens.push(token);\n    } else {\n      const token = await value(mark);\n      if (token) {\n        token.meta = token.meta || 'markString()';\n        tokens.push(token);\n      }\n    }\n  }\n}\n","import type { Node, Schema } from 'prosemirror-model';\nimport { Token } from './types.ts';\nimport {\n  DocumentMarkdownInlineTokenizer,\n  DocumentMarkdownTokenizerSpec,\n  MarkTokenizerSpec,\n} from './DocumentMarkdownInlineTokenizer.ts';\n\nconst blankNode: DocumentMarkdownTokenizerSpec = { open: '', close: '' };\n\nexport class DocumentMarkdownTokenizer {\n  private tokens: Array<Token> = [];\n  inlineTokenizer: DocumentMarkdownInlineTokenizer;\n\n  constructor(\n    readonly nodes: {\n      [node: string]: (\n        node: Node,\n        index: number,\n      ) => DocumentMarkdownTokenizerSpec;\n    },\n    readonly marks: { [mark: string]: MarkTokenizerSpec },\n    readonly schema: Schema,\n    readonly options: { hardBreakNodeName: string } = {\n      hardBreakNodeName: 'hard_break',\n    },\n  ) {\n    this.inlineTokenizer = new DocumentMarkdownInlineTokenizer(\n      nodes,\n      marks,\n      options,\n      schema,\n    );\n  }\n\n  async iterateNode(node: Node, currentPos: number, idx = 0, level = -1) {\n    const nodeSpec = this.nodes[node.type.name]\n      ? this.nodes[node.type.name](node, currentPos)\n      : blankNode;\n\n    let tag = '';\n    if (node.type.spec.toDOM) {\n      const dom = node.type.spec.toDOM(node);\n      if (Array.isArray(dom) && dom.length > 0) {\n        tag = dom[0];\n      }\n    }\n\n    if (nodeSpec.selfClose) {\n      let selfCloseToken;\n      if (typeof nodeSpec.selfClose === 'string') {\n        const token = new Token(nodeSpec.selfClose, tag, 0);\n        token.level = level;\n        token.map = [currentPos];\n        this.tokens.push(token);\n        selfCloseToken = token;\n      } else {\n        const token = await nodeSpec.selfClose(node, currentPos, idx);\n        token.level = level;\n        token.map = [currentPos];\n        this.tokens.push(token);\n        selfCloseToken = token;\n      }\n      if (['before', 'both'].includes(nodeSpec.margin || '')) {\n        selfCloseToken.attrSet('margin_before', '1');\n      }\n      if (['after', 'both'].includes(nodeSpec.margin || '')) {\n        selfCloseToken.attrSet('margin_after', '1');\n      }\n      return;\n    }\n\n    let openToken: Token | undefined = undefined;\n    if (nodeSpec.open) {\n      if (typeof nodeSpec.open === 'string') {\n        const token = new Token(nodeSpec.open, tag, 1);\n        token.level = level;\n        token.meta = 'nodeSpec.open';\n        token.map = [currentPos];\n        this.tokens.push(token);\n        openToken = token;\n      } else {\n        const token = await nodeSpec.open(node, currentPos, idx);\n        token.level = level;\n        token.meta = 'nodeSpec.open()';\n        token.map = [currentPos];\n        this.tokens.push(token);\n        openToken = token;\n      }\n      if (['before', 'both'].includes(nodeSpec.margin || '')) {\n        openToken.attrSet('margin_before', '1');\n      }\n    }\n\n    if (node.inlineContent) {\n      const token = new Token('inline', '', 0);\n      token.level = level + 1;\n      token.map = [currentPos];\n      this.tokens.push(token);\n\n      token.children = await this.inlineTokenizer.renderInline(\n        node,\n        currentPos + 1,\n        level + 1,\n      );\n    } else if (node.childCount > 0) {\n      let offset = 0;\n      for (let idx = 0; idx < node.childCount; idx++) {\n        const child = node.child(idx);\n        await this.iterateNode(child, currentPos + offset + 1, idx, level + 1);\n        offset += child.nodeSize;\n      }\n    }\n\n    if (nodeSpec.close) {\n      if (!openToken) {\n        throw new Error('No openToken');\n      }\n      let closeToken;\n      if (typeof nodeSpec.close === 'string') {\n        const token = new Token(nodeSpec.close, tag, -1);\n        token.meta = 'nodeSpec.close';\n        token.level = level;\n        // token.map = [currentPos];\n        this.tokens.push(token);\n        closeToken = token;\n      } else {\n        const token = await nodeSpec.close(node, currentPos, idx, openToken);\n        token.meta = 'nodeSpec.close()';\n        token.level = level;\n        // token.map = [currentPos];\n        this.tokens.push(token);\n        closeToken = token;\n      }\n      if (['after', 'both'].includes(nodeSpec.margin || '')) {\n        closeToken.attrSet('margin_after', '1');\n      }\n    }\n  }\n\n  async serialize(content: Node, options: {} = {}): Promise<Token[]> {\n    await this.iterateNode(content, -1, 0); // doc does not have index, so I put -1 for correct calculation\n    return this.tokens;\n  }\n}\n","import { Mark, Node, Schema } from 'prosemirror-model';\nimport {\n  NESTING_CLOSING,\n  NESTING_OPENING,\n  NESTING_SELF_CLOSING,\n  Token,\n} from './types.ts';\n\nimport {\n  type CoreEditor,\n  NodeAndPos,\n  nodeToTreeStringOutput,\n  RawTextResult,\n  SourceMap,\n} from '@kerebron/editor';\n\nimport { MarkdownSerializer } from './MarkdownSerializer.ts';\nimport { DocumentMarkdownTokenizer } from './DocumentMarkdownTokenizer.ts';\nimport { SmartOutput } from '@kerebron/editor/utilities';\nimport { MdConfig } from '@kerebron/extension-markdown';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\n// function convertDomToLowerCase(node: Node) {\n//   // If the node is an element, change its tag name and attributes\n//   if (node.nodeType === 1) { // Element node\n//     // Convert tag name to lowercase\n//     try {\n//       node.nodeName = node.nodeName.toLowerCase();\n//     } catch (ignore) {\n//       /* HACK FOR: Uncaught TypeError: setting getter-only property \"nodeName\" */\n//     }\n\n//     // Loop through attributes and convert them to lowercase\n//     for (let i = 0; i < node.attributes.length; i++) {\n//       const attr = node.attributes[i];\n//       node.setAttribute(attr.name.toLowerCase(), attr.value);\n//     }\n//   }\n\n//   // Recursively convert children nodes\n//   for (let i = 0; i < node.childNodes.length; i++) {\n//     convertDomToLowerCase(node.childNodes[i]);\n//   }\n// }\n\nexport interface MdContext {\n  meta: Record<string, any>;\n}\n\nclass MdStashContext {\n  private ctxStash: Array<MdContext> = [];\n  private currentCtx: MdContext;\n\n  constructor() {\n    this.currentCtx = {\n      meta: {},\n    };\n    this.stash();\n  }\n\n  public stash(): number {\n    this.ctxStash.push(this.currentCtx);\n    this.currentCtx = {\n      ...structuredClone({ ...this.currentCtx }),\n    };\n    return this.ctxStash.length - 1;\n  }\n\n  public unstash() {\n    const ctx = this.ctxStash.pop();\n    if (!ctx) {\n      throw new Error('Unstash failed');\n    }\n    this.currentCtx = ctx;\n  }\n\n  get current() {\n    return this.currentCtx;\n  }\n}\n\nexport async function pmToMdConverter(\n  document: Node,\n  config: MdConfig,\n  schema: Schema,\n  eventTarget: EventTarget,\n): Promise<Uint8Array> {\n  const result = await extPmToMdConverter(\n    document,\n    config,\n    schema,\n    eventTarget,\n  );\n  return new TextEncoder().encode(result.content);\n}\n\nexport interface MarkdownResult extends RawTextResult {\n  debugMap: Record<number, { targetRow: number; targetCol: number }>;\n  sourceMap?: SourceMap;\n}\n\nexport async function extPmToMdConverter(\n  origDocument: Node,\n  config: MdConfig,\n  schema: Schema,\n  eventTarget: EventTarget,\n): Promise<MarkdownResult> {\n  const ctx = new MdStashContext();\n\n  let filteredDoc: Node;\n\n  // TODO: refactor to Tokenizer\n  const defaultMarkdownTokenizer = new DocumentMarkdownTokenizer({\n    doc(node) {\n      return {\n        open: async (node, pos, idx) => {\n          const token = new Token(\n            'frontmatter',\n            'frontmatter',\n            NESTING_SELF_CLOSING,\n          );\n          if (node.attrs.meta) {\n            if (config.frontmatter) {\n              const frontmatter = config.frontmatter.stringify(node.attrs.meta);\n              token.content = frontmatter;\n            } else {\n              const frontmatter = '# No frontmatter service';\n              token.content = `---\\n${frontmatter}\\n---\\n`;\n            }\n          }\n          return token;\n        },\n      };\n    },\n    paragraph(node) {\n      return {\n        open: async (node, pos, idx) => {\n          const token = new Token('paragraph_open', 'p', NESTING_OPENING);\n          const $pos = filteredDoc.resolve(pos);\n          const parent = $pos.parent;\n          if (parent?.type.name === 'table_cell' && idx > 0) {\n            token.attrSet('not_first_para', '1');\n          }\n          return token;\n        },\n        close: async (node, pos, idx, openToken) => {\n          const token = new Token('paragraph_close', 'p', NESTING_CLOSING);\n\n          let singleChild: Node | undefined;\n          if (node.children.length === 1) {\n            if (node.children[0].type.name === 'shortcode_inline') {\n              singleChild = node.children[0];\n            }\n          }\n          if (singleChild) {\n            if (singleChild.attrs.nesting !== NESTING_CLOSING) {\n              openToken.attrSet('margin_before', '1');\n            }\n            if (singleChild.attrs.nesting !== NESTING_OPENING) {\n              token.attrSet('margin_after', '1');\n            }\n          } else {\n            openToken.attrSet('margin_before', '1');\n            token.attrSet('margin_after', '1');\n          }\n\n          return token;\n        },\n      };\n    },\n    hr(node) {\n      return {\n        selfClose: 'hr',\n        margin: 'both',\n      };\n    },\n\n    heading(node) {\n      return {\n        open: async (node) => {\n          if (!node.attrs.level) {\n            throw new Error('No heading level');\n          }\n          const token = new Token(\n            'heading_open',\n            'h' + node.attrs.level,\n            1,\n          );\n          return token;\n        },\n        ///////\n        close: 'heading_close',\n        margin: 'both',\n      };\n    },\n\n    blockquote(node) {\n      return {\n        open: 'blockquote_open',\n        close: 'blockquote_close',\n      };\n    },\n\n    math() {\n      return {\n        selfClose: async (node) => {\n          const token = new Token('math', 'math', 0);\n          token.content = node.attrs.content;\n          token.attrSet('lang', node.attrs.lang);\n          token.meta = 'noEscText';\n          return token;\n        },\n      };\n    },\n\n    task_list(node) {\n      return {\n        open: async (node) => {\n          ctx.stash();\n          ctx.current.meta['list_type'] = 'tl';\n          ctx.current.meta['list_type_symbol'] = '';\n          const token = new Token('task_list_open', 'ul', 1);\n          token.attrSet('symbol', '*');\n          return token;\n        },\n        close: async (node) => {\n          ctx.unstash();\n          return new Token('task_list_close', 'ul', -1);\n        },\n        margin: 'both',\n      };\n    },\n    bullet_list(node) {\n      return {\n        open: async (node, pos, idx) => {\n          ctx.stash();\n          ctx.current.meta['list_type'] = 'ul';\n          ctx.current.meta['list_type_symbol'] = '*';\n          const token = new Token('bullet_list_open', 'ul', 1);\n          token.attrSet('symbol', '*');\n\n          const firstChild = filteredDoc.nodeAt(pos + 1);\n          if (firstChild?.type.name === 'list_item') {\n            token.attrSet('first_level_type', firstChild.attrs.type);\n          }\n          const $pos = filteredDoc.resolve(pos);\n          const parent = $pos.parent;\n          const parent2 = $pos.node($pos.depth - 1);\n\n          if (parent?.type.name === 'table_cell' && idx > 0) {\n            token.attrSet('not_first_para', '1');\n          }\n          return token;\n        },\n        close: async (node, pos) => {\n          ctx.unstash();\n          const token = new Token('bullet_list_close', 'ul', -1);\n\n          const firstChild = filteredDoc.nodeAt(pos + 1);\n          if (firstChild?.type.name === 'list_item') {\n            token.attrSet('first_level_type', firstChild.attrs.type);\n          }\n          return token;\n        },\n        margin: 'both',\n      };\n    },\n    ordered_list(node) {\n      return {\n        open: async (node, pos, idx) => {\n          ctx.stash();\n          ctx.current.meta['list_type'] = 'ol';\n          ctx.current.meta['list_type_symbol'] = node.attrs['type'] ||\n            '1';\n          const token = new Token('ordered_list_open', 'ol', 1);\n          token.attrSet('symbol', node.attrs['type'] || '1');\n          token.attrSet('start', node.attrs['start']);\n\n          const firstChild = filteredDoc.nodeAt(pos + 1);\n          if (firstChild?.type.name === 'list_item') {\n            token.attrSet('first_level_type', firstChild.attrs.type);\n          }\n          const $pos = filteredDoc.resolve(pos);\n          const parent = $pos.parent;\n          if (parent?.type.name === 'table_cell' && idx > 0) {\n            token.attrSet('not_first_para', '1');\n          }\n          return token;\n        },\n        close: async (node, pos) => {\n          ctx.unstash();\n          const token = new Token('ordered_list_close', 'ol', -1);\n\n          const firstChild = filteredDoc.nodeAt(pos + 1);\n          if (firstChild?.type.name === 'list_item') {\n            token.attrSet('first_level_type', firstChild.attrs.type);\n          }\n          return token;\n        },\n        margin: 'both',\n      };\n    },\n    list_item(node) {\n      return {\n        open: async (node) => {\n          const token = new Token('list_item_open', 'li', 1);\n          if (node.attrs['value']) {\n            token.attrSet('value', node.attrs['value']);\n          }\n          if (node.attrs['type']) {\n            token.attrSet('type', node.attrs['type']);\n          }\n          if (ctx.current.meta['list_type'] === 'ul') {\n            token.markup = ctx.current.meta['list_type_symbol'] || '-';\n            if (['-', '+'].includes(node.attrs['type'])) {\n              token.markup = node.attrs['type'];\n            }\n          }\n          return token;\n        },\n        close: 'list_item_close',\n      };\n    },\n    task_item(node) {\n      return {\n        open: async (node) => {\n          const token = new Token('task_item_open', 'li', 1);\n          token.attrSet('checked', node.attrs.checked ? 'checked' : '');\n          return token;\n        },\n        close: 'task_item_close',\n      };\n    },\n\n    table(node) {\n      return {\n        open: 'table_open',\n        close: 'table_close',\n        margin: 'both',\n      };\n    },\n\n    table_row(node) {\n      return {\n        open: 'tr_open',\n        close: 'tr_close',\n      };\n    },\n\n    table_cell(node) {\n      return {\n        open: 'td_open',\n        close: 'td_close',\n      };\n    },\n\n    table_header(node) {\n      return {\n        open: 'th_open',\n        close: 'th_close',\n      };\n    },\n\n    br(node) {\n      return {\n        selfClose: 'hardbreak',\n      };\n    },\n\n    softbreak(node) {\n      return {\n        selfClose: 'softbreak',\n      };\n    },\n\n    text(node) {\n      return {\n        selfClose: (node: Node) => {\n          const token = new Token('text', '', 0);\n          token.content = node.text || '';\n          return Promise.resolve(token);\n        },\n      };\n    },\n\n    code_block(node) {\n      return {\n        selfClose: (node: Node) => {\n          const token = new Token('code_block', 'code', 0);\n          token.meta = 'noEscText';\n          token.attrSet('lang', node.attrs.lang);\n          token.content = node.textContent;\n          return Promise.resolve(token);\n        },\n        margin: 'both',\n      };\n    },\n\n    // html(state, node) {\n    //   const domSerializer = DOMSerializer.fromSchema(schema);\n    //   const element = domSerializer.serializeNode(node, {\n    //     document: globalThis.document,\n    //   });\n    //   convertDomToLowerCase(element);\n    //   const xmlSerializer = new XMLSerializer();\n    //   const html = xmlSerializer.serializeToString(element) + '\\n';\n    //   // state.write(html.replace(/\\sxmlns=\"[^\"]*\"/, ''));\n    //   state.write(html);\n    // },\n    //\n\n    image(node) {\n      return {\n        selfClose: (node: Node) => {\n          let src = node.attrs.src;\n          let alt = node.attrs.alt;\n          const token = new Token('image', 'img', 0);\n          token.attrSet('src', src);\n          token.attrSet('alt', alt);\n          token.attrSet('origUrl', node.attrs.origUrl);\n          if (node.attrs.title) {\n            token.attrSet('title', node.attrs.title);\n          }\n          token.attrSet('mdTemplate', node.attrs.mdTemplate);\n          return Promise.resolve(token);\n        },\n      };\n    },\n\n    shortcode_inline(node) {\n      return {\n        selfClose: (node: Node) => {\n          const token = new Token('shortcode_inline', 'shortcode_inline', 0);\n          token.content = node.attrs.content;\n          return Promise.resolve(token);\n        },\n      };\n    },\n    node_bookmark(node) {\n      return {\n        selfClose: (node: Node) => {\n          const token = new Token('bookmark', 'bookmark', NESTING_SELF_CLOSING);\n          token.content = node.attrs.content;\n          token.attrSet('id', node.attrs.id);\n          return Promise.resolve(token);\n        },\n      };\n    },\n  }, {\n    em: {\n      open: 'em_open',\n      close: 'em_close',\n      mixable: true,\n      expelEnclosingWhitespace: true,\n    },\n    underline: {\n      open: 'underline_open',\n      close: 'underline_close',\n      mixable: true,\n      expelEnclosingWhitespace: true,\n    },\n    strong: {\n      open: 'strong_open',\n      close: 'strong_close',\n      mixable: true,\n      expelEnclosingWhitespace: true,\n    },\n    strike: {\n      open: 'strike_open',\n      close: 'strike_close',\n      mixable: true,\n      expelEnclosingWhitespace: true,\n    },\n    math: {\n      open: 'math_inline_open',\n      close: 'math_inline_close',\n      // math_inline\n      // selfclose: async (node) => {\n      //   const token = new Token('math', 'math', 0);\n      //   token.attrSet('content', node.attrs.content);\n      //   if (node.attrs.type) {\n      //   }\n      //   return token;\n      // },\n    },\n\n    link: {\n      open: async (mark: Mark) => {\n        const token = new Token('link_open', 'a', 1);\n        token.attrSet('href', mark.attrs.href);\n        token.attrSet('origUrl', mark.attrs.origUrl);\n        token.attrSet('mdTemplate', mark.attrs.mdTemplate);\n        return token;\n      },\n      close: 'link_close',\n      mixable: true,\n    },\n    code: {\n      // selfclose: async (node) => {\n      //   const token = new Token('code_inline', 'code', 0);\n      //   token.content = 'TODO_INLINE_CODE';\n      //   // token.attrSet('content', node.attrs.content);\n      //   // if (node.attrs.type) {\n      //   // }\n      //   return token;\n      // },\n      // open: async (mark: Mark) => {\n      // },\n      // close: async (mark: Mark) => {\n      //   const token = new Token('code_inline', 'code', 0);\n      //   token.content = 'TODO_INLINE_CODE';\n      //   // token.attrSet('content', node.attrs.content);\n      //   // if (node.attrs.type) {\n      //   // }\n      //   return token;\n      // },\n      open: async (mark: Mark) => {\n        const token = new Token('code_open', 'code', 1);\n        token.markup = mark.attrs.type;\n        // token.attrSet('href', mark.attrs.href);\n        // token.attrSet('origUrl', mark.attrs.origUrl);\n        // token.attrSet('mdTemplate', mark.attrs.mdTemplate);\n        return token;\n      },\n      close: 'code_close',\n      escape: false,\n    },\n  }, schema);\n\n  const filterCommands = [...(config.hooks || [])];\n  let state = EditorState.create({ doc: origDocument });\n  const dispatch = (tr: Transaction) => {\n    state = state.apply(tr);\n  };\n\n  if (filterCommands.length > 0) {\n    for (const filter of filterCommands) {\n      await filter(\n        state,\n        (tr) => dispatch(tr),\n      );\n    }\n  }\n\n  filteredDoc = state.doc;\n\n  const tokens = await defaultMarkdownTokenizer.serialize(filteredDoc);\n\n  if (config.telemetry.enabled) {\n    config.telemetry.event('tokens', tokens);\n  }\n\n  const markdownSerializerConfig = {\n    debug: config.serializerDebug,\n    htmlListItems: config.htmlListItems,\n  };\n\n  const serializer = new MarkdownSerializer(markdownSerializerConfig);\n  const output = await serializer.serialize(tokens);\n\n  const event = new CustomEvent('md:output', {\n    detail: {\n      output,\n    },\n  });\n  eventTarget.dispatchEvent(event);\n\n  const debugMap: Record<\n    number,\n    { targetRow: number; targetCol: number }\n  > = {};\n\n  const rawTextMap: Array<\n    {\n      nodeIdx: number;\n      targetRow: number;\n      targetCol: number;\n      sourceCol?: number;\n      targetPos: number;\n    }\n  > = [];\n\n  let sourceMap: SourceMap | undefined;\n\n  if (config.sourceMap) {\n    // https://sourcemaps.info/spec.html\n    // https://evanw.github.io/source-map-visualization/\n    // https://github.com/evanw/source-map-visualization/blob/gh-pages/code.js\n\n    const debugOutput = new SmartOutput<NodeAndPos>();\n    nodeToTreeStringOutput(debugOutput, origDocument);\n\n    debugOutput.getSourceMap(\n      (\n        targetRow: number,\n        targetCol: number,\n        pos: number,\n        item?: NodeAndPos,\n      ) => {\n        if (!item) {\n          return;\n        }\n        debugMap[item.pos] = {\n          targetRow,\n          targetCol,\n        };\n      },\n    );\n\n    sourceMap = output.getSourceMap(\n      (\n        targetRow: number,\n        targetCol: number,\n        targetPos: number,\n        item?: Token,\n      ) => {\n        if (item?.map) {\n          const pos = item.map[0];\n          const sourceCol = item.map[2];\n\n          rawTextMap.push({\n            nodeIdx: pos,\n            targetPos,\n            targetRow,\n            targetCol,\n            sourceCol,\n          });\n\n          if (debugMap[pos]) {\n            return {\n              sourceNo: 0,\n              sourceRowPos: debugMap[pos].targetRow,\n              sourceColPos: debugMap[pos].targetCol,\n            };\n          }\n        }\n      },\n    );\n\n    sourceMap.file = 'target.md';\n    sourceMap.sources = ['debug.txt'];\n    sourceMap.sourcesContent = [debugOutput.toString()];\n  }\n\n  if (config.telemetry.enabled) {\n    config.telemetry.event('sourcemap', {\n      sourceMap,\n      debugMap,\n      rawTextMap,\n    });\n  }\n\n  return {\n    content: output.toString(),\n    sourceMap,\n    debugMap,\n    rawTextMap,\n  };\n}\n","import { MdConfig } from '@kerebron/extension-markdown';\nimport {\n  Attrs,\n  Mark,\n  MarkType,\n  Node,\n  NodeType,\n  Schema,\n} from 'prosemirror-model';\n\nimport { Telemetry } from '@kerebron/editor/Telemetry';\n\nimport type { Token } from './types.ts';\n\nfunction maybeMerge(a: Node, b: Node): Node | undefined {\n  if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n    return (a as any).withText(a.text! + b.text!);\n  }\n}\n\n// Object used to track the context of a running parse.\nexport class MarkdownParseState {\n  stack: {\n    type: NodeType;\n    attrs: Attrs | null;\n    content: Node[];\n    marks: readonly Mark[];\n  }[];\n\n  constructor(\n    readonly schema: Schema,\n    readonly tokenHandlers: {\n      [token: string]: (\n        stat: MarkdownParseState,\n        token: Token,\n        tokens: Token[],\n        i: number,\n      ) => void;\n    },\n  ) {\n    this.stack = [{\n      type: schema.topNodeType,\n      attrs: null,\n      content: [],\n      marks: Mark.none,\n    }];\n  }\n\n  top() {\n    return this.stack[this.stack.length - 1];\n  }\n\n  push(elt: Node) {\n    if (this.stack.length) this.top().content.push(elt);\n  }\n\n  // Adds the given text to the current position in the document,\n  // using the current marks as styling.\n  addText(text: string) {\n    if (!text) return;\n    let top = this.top(), nodes = top.content, last = nodes[nodes.length - 1];\n    let node = this.schema.text(text, top.marks), merged;\n    if (last && (merged = maybeMerge(last, node))) {\n      nodes[nodes.length - 1] = merged;\n    } else nodes.push(node);\n  }\n\n  // Adds the given mark to the set of active marks.\n  openMark(mark: Mark) {\n    let top = this.top();\n    top.marks = mark.addToSet(top.marks);\n  }\n\n  // Removes the given mark from the set of active marks.\n  closeMark(mark: MarkType) {\n    let top = this.top();\n    top.marks = mark.removeFromSet(top.marks);\n  }\n\n  parseTokens(toks: Token[]) {\n    for (let i = 0; i < toks.length; i++) {\n      let tok = toks[i];\n      let handler = this.tokenHandlers[tok.type];\n      if (!handler) {\n        const lineNo = (4 === tok.map?.length) ? tok.map[0] + 1 : -1;\n        throw new Error(\n          'Token type `' + tok.type +\n            '` not supported by Markdown parser, content: ' + tok.content,\n          {\n            cause: {\n              lineNo,\n              tokenHandlers: Object.keys(this.tokenHandlers),\n            },\n          },\n        );\n      }\n      handler(this, tok, toks, i);\n    }\n  }\n\n  // Add a node at the current position.\n  addNode(type: NodeType, attrs: Attrs | null, content?: readonly Node[]) {\n    let top = this.top();\n    let node = type.createAndFill(attrs, content, top ? top.marks : []);\n    if (!node) return null;\n    this.push(node);\n    return node;\n  }\n\n  // Wrap subsequent content in a node of the given type.\n  openNode(type: NodeType, attrs: Attrs | null) {\n    this.stack.push({\n      type: type,\n      attrs: attrs,\n      content: [],\n      marks: Mark.none,\n    });\n  }\n\n  // Close and return the node that is currently on top of the stack.\n  closeNode() {\n    let info = this.stack.pop()!;\n    return this.addNode(info.type, info.attrs, info.content);\n  }\n\n  importNodes(nodes: readonly Node[]) {\n    for (const node of nodes) {\n      this.push(node);\n    }\n  }\n}\n\nfunction attrs(spec: ParseSpec, token: Token, tokens: Token[], i: number) {\n  if (spec.getAttrs) return spec.getAttrs(token, tokens, i);\n  // For backwards compatibility when `attrs` is a Function\n  else if (spec.attrs instanceof Function) return spec.attrs(token);\n  else return spec.attrs;\n}\n\n// Code content is represented as a single token with a `content`\n// property in Markdown-it.\nfunction noCloseToken(spec: ParseSpec, type: string) {\n  return spec.noCloseToken || type == 'code_block' ||\n    type == 'fence';\n}\n\nfunction withoutTrailingNewline(str: string) {\n  return str[str.length - 1] == '\\n' ? str.slice(0, str.length - 1) : str;\n}\n\nfunction noOp() {}\n\nfunction tokenHandlers(schema: Schema, tokens: { [token: string]: ParseSpec }) {\n  let handlers: {\n    [token: string]: (\n      stat: MarkdownParseState,\n      token: Token,\n      tokens: Token[],\n      i: number,\n    ) => void;\n  } = Object.create(null);\n  for (let type in tokens) {\n    let spec = tokens[type];\n    if (spec.block) {\n      let nodeType = schema.nodes[spec.block];\n      if (noCloseToken(spec, type)) {\n        handlers[type] = (state, tok, tokens, i) => {\n          state.openNode(nodeType, attrs(spec, tok, tokens, i));\n          state.addText(withoutTrailingNewline(tok.content));\n          state.closeNode();\n        };\n      } else {\n        handlers[type + '_open'] = (state, tok, tokens, i) =>\n          state.openNode(nodeType, attrs(spec, tok, tokens, i));\n        handlers[type + '_close'] = (state) => state.closeNode();\n      }\n    } else if (spec.node) {\n      let nodeType = schema.nodes[spec.node];\n      handlers[type] = (state, tok, tokens, i) =>\n        state.addNode(nodeType, attrs(spec, tok, tokens, i));\n    } else if (spec.mark) {\n      let markType = schema.marks[spec.mark];\n      if (noCloseToken(spec, type)) {\n        handlers[type] = (state, tok, tokens, i) => {\n          state.openMark(markType.create(attrs(spec, tok, tokens, i)));\n          state.addText(withoutTrailingNewline(tok.content));\n          state.closeMark(markType);\n        };\n      } else {\n        handlers[type + '_open'] = (state, tok, tokens, i) =>\n          state.openMark(markType.create(attrs(spec, tok, tokens, i)));\n        handlers[type + '_close'] = (state) => state.closeMark(markType);\n      }\n    } else if (spec.custom) {\n      const custom = spec.custom;\n      handlers[type] = (state, tok, tokens, i) => {\n        custom(state, tok, tokens, i);\n      };\n    } else if (spec.ignore) {\n      if (noCloseToken(spec, type)) {\n        handlers[type] = noOp;\n      } else {\n        handlers[type + '_open'] = noOp;\n        handlers[type + '_close'] = noOp;\n      }\n    } else {\n      throw new RangeError('Unrecognized parsing spec ' + JSON.stringify(spec));\n    }\n  }\n\n  handlers.text = (state, tok) => state.addText(tok.content);\n  handlers.inline = (state, tok) => state.parseTokens(tok.children!);\n  handlers.softbreak = handlers.softbreak || ((state) => state.addText(' '));\n\n  return handlers;\n}\n\n/// Object type used to specify how Markdown tokens should be parsed.\nexport interface ParseSpec {\n  /// This token maps to a single node, whose type can be looked up\n  /// in the schema under the given name. Exactly one of `node`,\n  /// `block`, or `mark` must be set.\n  node?: string;\n\n  /// This token (unless `noCloseToken` is true) comes in `_open`\n  /// and `_close` variants (which are appended to the base token\n  /// name provides a the object property), and wraps a block of\n  /// content. The block should be wrapped in a node of the type\n  /// named to by the property's value. If the token does not have\n  /// `_open` or `_close`, use the `noCloseToken` option.\n  block?: string;\n\n  /// This token (again, unless `noCloseToken` is true) also comes\n  /// in `_open` and `_close` variants, but should add a mark\n  /// (named by the value) to its content, rather than wrapping it\n  /// in a node.\n  mark?: string;\n\n  custom?: (\n    stat: MarkdownParseState,\n    token: Token,\n    tokens: Token[],\n    i: number,\n  ) => void;\n\n  /// Attributes for the node or mark. When `getAttrs` is provided,\n  /// it takes precedence.\n  attrs?: Attrs | null;\n\n  /// A function used to compute the attributes for the node or mark\n  /// that takes a [markdown-it\n  /// token](https://markdown-it.github.io/markdown-it/#Token) and\n  /// returns an attribute object.\n  getAttrs?: (\n    token: Token,\n    tokenStream: Token[],\n    index: number,\n  ) => Attrs | null;\n\n  /// Indicates that the [markdown-it\n  /// token](https://markdown-it.github.io/markdown-it/#Token) has\n  /// no `_open` or `_close` for the nodes. This defaults to `true`\n  /// for `code_block` and `fence`.\n  noCloseToken?: boolean;\n\n  /// When true, ignore content for the matched token.\n  ignore?: boolean;\n}\n\n/// A configuration of a Markdown parser. Such a parser uses\n/// [markdown-it](https://github.com/markdown-it/markdown-it) to\n/// tokenize a file, and then runs the custom rules it is given over\n/// the tokens to create a ProseMirror document tree.\nexport class MarkdownParser {\n  /// @internal\n  tokenHandlers: {\n    [token: string]: (\n      stat: MarkdownParseState,\n      token: Token,\n      tokens: Token[],\n      i: number,\n    ) => void;\n  };\n  tokenizer: { parse: (source: string) => Array<Token> };\n  telemetry: Telemetry;\n\n  /// Create a parser with the given configuration. You can configure\n  /// the markdown-it parser to parse the dialect you want, and provide\n  /// a description of the ProseMirror entities those tokens map to in\n  /// the `tokens` object, which maps token names to descriptions of\n  /// what to do with them. Such a description is an object, and may\n  /// have the following properties:\n  constructor(\n    /// The parser's document schema.\n    readonly schema: Schema,\n    readonly config: MdConfig,\n    /// The value of the `tokens` object used to construct this\n    /// parser. Can be useful to copy and modify to base other parsers\n    /// on.\n    readonly tokens: { [name: string]: ParseSpec },\n  ) {\n    this.tokenHandlers = tokenHandlers(schema, tokens);\n    if (!this.config.tokenizer) {\n      throw new Error('!config.tokenizer');\n    }\n    this.tokenizer = this.config.tokenizer;\n    this.telemetry = this.config.telemetry;\n  }\n\n  /// Parse a string as [CommonMark](http://commonmark.org/) markup,\n  /// and create a ProseMirror document as prescribed by this parser's\n  /// rules.\n  parse(text: string) {\n    const state = new MarkdownParseState(this.schema, this.tokenHandlers);\n\n    const tokens = this.tokenizer.parse(text);\n\n    if (this.telemetry.enabled) {\n      this.telemetry.event('tokens', tokens);\n    }\n\n    state.parseTokens(tokens);\n\n    let doc;\n    do {\n      doc = state.closeNode();\n    } while (state.stack.length);\n\n    return doc || this.schema.topNodeType.createAndFill()!;\n  }\n}\n","import { Node, Schema } from 'prosemirror-model';\nimport { DOMParser } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { MdConfig } from '@kerebron/extension-markdown';\nimport {\n  decodeEntity,\n  elementFromString,\n} from '@kerebron/extension-basic-editor/ExtensionHtml';\n\nimport type { Token } from './types.ts';\n\nimport { MarkdownParser, type MarkdownParseState } from './MarkdownParser.ts';\n\nfunction listIsTight(tokens: readonly Token[], i: number) {\n  while (++i < tokens.length) {\n    if (tokens[i].type != 'list_item_open') return tokens[i].hidden;\n  }\n  return false;\n}\n\nexport async function mdToPmConverter(\n  buffer: Uint8Array,\n  config: MdConfig,\n  schema: Schema,\n): Promise<Node> {\n  const content = new TextDecoder().decode(buffer);\n  return mdToPmConverterText(content, config, schema);\n}\n\nexport async function mdToPmConverterText(\n  content: string,\n  config: MdConfig,\n  schema: Schema,\n): Promise<Node> {\n  if (!config.tokenizer) {\n    throw new Error('No config.tokenizer');\n  }\n\n  const defaultMarkdownParser = new MarkdownParser(\n    schema,\n    config,\n    {\n      frontmatter: {\n        custom: (\n          state: MarkdownParseState,\n          token: Token,\n        ) => {\n          const topNode = state.stack[0];\n          if (topNode?.type.name === 'doc') {\n            if (config.frontmatter) {\n              const meta = config.frontmatter.parse(token.content) || undefined;\n              topNode.attrs = { ...topNode.attrs, meta };\n            }\n          }\n        },\n      },\n      blockquote: { block: 'blockquote' },\n      paragraph: { block: 'paragraph' },\n      task_item: { block: 'task_item' },\n      task_list: {\n        block: 'task_list',\n      },\n      list_item: {\n        block: 'list_item',\n        getAttrs: (tok) => ({ type: tok.markup }),\n      },\n      bullet_list: {\n        block: 'bullet_list',\n        getAttrs: (_, tokens, i) => ({ tight: listIsTight(tokens, i) }),\n      },\n      ordered_list: {\n        block: 'ordered_list',\n        getAttrs: (tok, tokens, i) => ({\n          start: +tok.attrGet('start')! || 1,\n          tight: listIsTight(tokens, i),\n        }),\n      },\n      dl: {\n        block: 'dl',\n      },\n      dt: {\n        block: 'dt',\n      },\n      dd: {\n        block: 'dd',\n      },\n      heading: {\n        block: 'heading',\n        getAttrs: (tok) => ({ level: +tok.tag.slice(1) }),\n      },\n      code_block: {\n        block: 'code_block',\n        getAttrs: (tok) => ({ lang: tok.attrGet('lang') || undefined }),\n        noCloseToken: true,\n      },\n      fence: {\n        block: 'code_block',\n        getAttrs: (tok) => ({ lang: tok.attrGet('lang') || undefined }),\n        noCloseToken: true,\n      },\n      hr: {\n        custom: (\n          state: MarkdownParseState,\n          token: Token,\n          tokens: Token[],\n          i: number,\n        ) => {\n          state.openNode(schema.nodes['paragraph'], {});\n          state.addNode(schema.nodes['hr'], {});\n          state.closeNode();\n        },\n      },\n      image: {\n        node: 'image',\n        getAttrs: (tok) => {\n          const firstChild = tok.children ? tok.children[0] : undefined;\n          return {\n            src: tok.attrGet('src'),\n            title: tok.attrGet('title') || null,\n            alt: firstChild?.content || null,\n          };\n        },\n      },\n      entity: {\n        custom: (\n          state: MarkdownParseState,\n          token: Token,\n          tokens: Token[],\n          i: number,\n        ) => {\n          state.addText(decodeEntity(token.content));\n        },\n      },\n      hardbreak: { node: 'br' },\n      softbreak: { node: 'softbreak' },\n      em: { mark: 'em' },\n      underline: { mark: 'underline' },\n      strong: { mark: 'strong' },\n      strike: { mark: 'strike' },\n      link: {\n        mark: 'link',\n        getAttrs: (tok) => ({\n          href: tok.attrGet('href'),\n          title: tok.attrGet('title') || null,\n        }),\n      },\n      code: { mark: 'code' },\n      math: {\n        custom: (\n          state: MarkdownParseState,\n          token: Token,\n          tokens: Token[],\n          i: number,\n        ) => {\n          state.openNode(schema.nodes['math'], {\n            content: token.content,\n            lang: token.attrGet('lang'),\n          });\n          state.closeNode();\n        },\n      },\n      html_inline: {\n        custom: (\n          state: MarkdownParseState,\n          token: Token,\n          tokens: Token[],\n          i: number,\n        ) => {\n          const parser = DOMParser.fromSchema(schema);\n          const div = elementFromString(token.content);\n\n          const slice = parser.parseSlice(div);\n          if (state.stack.find((s) => s.type.name === 'paragraph')) {\n            state.importNodes(slice.content.content);\n          } else {\n            state.openNode(schema.nodes['paragraph'], {});\n            state.importNodes(slice.content.content);\n            state.closeNode();\n          }\n        },\n      },\n      html_block: {\n        custom: (\n          state: MarkdownParseState,\n          token: Token,\n          tokens: Token[],\n          i: number,\n        ) => {\n          const parser = DOMParser.fromSchema(schema);\n          const div = elementFromString(token.content);\n\n          const hasBlock = [...div.children].some((el) =>\n            /^(P|DIV|TABLE|UL|OL|LI|BLOCKQUOTE|H[1-6])$/.test(el.tagName)\n          );\n\n          if (hasBlock) {\n            const parsed = parser.parse(div);\n            state.importNodes(parsed.content.content);\n          } else {\n            const slice = parser.parseSlice(div);\n            if (state.stack.find((s) => s.type.name === 'paragraph')) {\n              state.importNodes(slice.content.content);\n            } else {\n              state.openNode(schema.nodes['paragraph'], {});\n              state.importNodes(slice.content.content);\n              state.closeNode();\n            }\n          }\n        },\n      },\n      footnote_ref: {\n        block: 'code_block',\n      },\n      table: {\n        block: 'table',\n      },\n      tr: {\n        block: 'table_row',\n      },\n      td: {\n        block: 'table_cell',\n      },\n      th: {\n        block: 'table_header',\n      },\n      thead: {\n        ignore: true,\n      },\n    },\n  );\n\n  const origDocument = defaultMarkdownParser.parse(content);\n\n  if (config.telemetry.enabled) {\n    config.telemetry.event('origDocument', origDocument);\n  }\n\n  const filterCommands = [...(config.hooks || [])];\n  let state = EditorState.create({ doc: origDocument });\n  const dispatch = (tr: Transaction) => {\n    state = state.apply(tr);\n  };\n\n  if (filterCommands.length > 0) {\n    for (const filter of filterCommands) {\n      await filter(\n        state,\n        (tr) => dispatch(tr),\n      );\n    }\n  }\n\n  if (config.telemetry.enabled) {\n    config.telemetry.event('filteredDocument', state.doc);\n  }\n\n  return state.doc;\n}\n","import { ContentMapper } from '@kerebron/workspace';\nimport { EditorState } from 'prosemirror-state';\nimport { extPmToMdConverter } from './pmToMdConverter.ts';\nimport type { MarkdownResult, MdConfig } from './ExtensionMarkdown.ts';\n\ninterface RawTextPosItem {\n  nodeIdx: number;\n  maxNodeIdx: number;\n  targetPos: number;\n  targetRow: number;\n  targetCol: number;\n}\n\nexport class MarkdownContentMapper implements ContentMapper {\n  private readonly rawTextArr: RawTextPosItem[];\n\n  constructor(\n    docNodeSize: number,\n    private result: MarkdownResult,\n  ) {\n    this.rawTextArr = [];\n    for (const item of result.rawTextMap) {\n      if (item.nodeIdx >= 0) {\n        this.rawTextArr.push({\n          nodeIdx: item.nodeIdx,\n          maxNodeIdx: item.nodeIdx,\n          targetPos: item.targetPos,\n          targetRow: item.targetRow,\n          targetCol: item.targetCol,\n        });\n      }\n    }\n    this.rawTextArr.sort((b, a) => b.nodeIdx - a.nodeIdx);\n    for (let i = 0; i < this.rawTextArr.length; i++) {\n      const next = i + 1;\n      if (next < this.rawTextArr.length) {\n        this.rawTextArr[i].maxNodeIdx = this.rawTextArr[next].nodeIdx - 1;\n      } else {\n        this.rawTextArr[i].maxNodeIdx = docNodeSize;\n      }\n    }\n  }\n\n  getTextContent(): string {\n    return this.result.content;\n  }\n\n  toRawTextPos(pos: number): number {\n    for (let i = 0; i < this.rawTextArr.length; i++) {\n      const item = this.rawTextArr[i];\n      if (pos >= item.nodeIdx && pos <= item.maxNodeIdx) {\n        return item.targetPos + pos - item.nodeIdx;\n      }\n    }\n    return -1;\n  }\n\n  toRawTextLineCol(pos: number): [number, number] {\n    for (let i = 0; i < this.rawTextArr.length; i++) {\n      const item = this.rawTextArr[i];\n      if (pos >= item.nodeIdx && pos <= item.maxNodeIdx) {\n        return [item.targetRow, item.targetCol + pos - item.nodeIdx];\n      }\n    }\n    return [0, 0];\n  }\n\n  fromLineChar(line: number, character: number) {\n    for (let i = 0; i < this.rawTextArr.length; i++) {\n      const item = this.rawTextArr[i];\n      const len = item.maxNodeIdx - item.nodeIdx + 1;\n\n      if (item.targetRow === line) {\n        if (character >= item.targetCol && character < item.targetCol + len) {\n          const offset = character - item.targetCol;\n          return item.nodeIdx + offset;\n        }\n\n        const nextItem = this.rawTextArr[i + 1];\n        const isLastInRow = !nextItem || nextItem.targetRow > item.targetRow;\n        if (isLastInRow && character >= item.targetCol + len) {\n          return item.maxNodeIdx;\n        }\n      }\n    }\n    return -1;\n  }\n\n  static async create(\n    state: EditorState,\n    config: MdConfig,\n  ): Promise<MarkdownContentMapper> {\n    const result = await extPmToMdConverter(\n      state.doc,\n      config,\n      state.schema,\n      new EventTarget(),\n    );\n    return new MarkdownContentMapper(state.doc.nodeSize, result);\n  }\n}\n","import { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nexport const addEmptyLines: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  const tr = state.tr;\n\n  const hardbreakType = state.schema.nodes.br;\n  const softbreakType = state.schema.nodes.softbreak;\n\n  function walk(\n    nodes: readonly Node[],\n    parent: Node,\n    pos = 0,\n    depth = 0,\n  ) {\n    let offset = 0;\n    let occurredNotSoftBreak = false;\n\n    for (let index = 0; index < nodes.length; index++) {\n      const child = nodes[index];\n\n      if (['image', 'node_bookmark'].includes(child.type.name)) {\n        if (index > 0) {\n          const prevNode = nodes[index - 1];\n\n          if (prevNode.type === softbreakType) {\n          } else if (prevNode.type === hardbreakType) {\n            tr.setNodeMarkup(\n              tr.mapping.map(pos + offset - prevNode.nodeSize),\n              softbreakType,\n            );\n          } else {\n            const wbr = softbreakType.createAndFill();\n            if (wbr) {\n              tr.insert(\n                tr.mapping.map(pos + offset),\n                wbr,\n              );\n            }\n          }\n        }\n      }\n      if ('softbreak' === child.type.name) {\n        const prevNode = nodes[index - 1];\n        const nextNode = nodes[index + 1];\n\n        if (prevNode?.type.name === 'softbreak') {\n          tr.delete(\n            tr.mapping.map(pos + offset),\n            tr.mapping.map(pos + offset + child.nodeSize),\n          );\n        }\n        if (prevNode?.textContent?.endsWith(' ')) {\n          tr.delete(\n            tr.mapping.map(pos + offset),\n            tr.mapping.map(pos + offset + child.nodeSize),\n          );\n        }\n        if (!occurredNotSoftBreak) {\n          tr.delete(\n            tr.mapping.map(pos + offset),\n            tr.mapping.map(pos + offset + child.nodeSize),\n          );\n        }\n      } else {\n        occurredNotSoftBreak = true;\n      }\n\n      walk(child.children, child, pos + offset + 1, depth + 1);\n\n      offset += child.nodeSize;\n    }\n  }\n\n  walk(doc.children, doc);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Command } from 'prosemirror-state';\n\n// Related tests:\n// test ./header-link.md\n// test ./project-overview.md\n// test ./list-indent.md\n// test ./strong-headers.md\nexport const fixIdLinks: Command = (state, dispatch): boolean => {\n  let tr = state.tr;\n\n  const markType = state.schema.marks.link;\n\n  state.doc.descendants((node, pos) => {\n    node.marks.forEach((mark) => {\n      if (mark.type === markType && mark.attrs.href.startsWith('#')) {\n        const innerTxt = node.text || node.textBetween(0, node.content.size);\n        const escapedText = innerTxt.toLowerCase().replace(/[^\\w]+/g, ' ')\n          .trim().replaceAll(' ', '-');\n\n        if (escapedText) {\n          tr = tr\n            .removeMark(pos, pos + node.nodeSize, markType)\n            .addMark(\n              pos,\n              pos + node.nodeSize,\n              markType.create({ ...mark.attrs, href: '#' + escapedText }),\n            );\n        }\n      }\n    });\n  });\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nexport const fixShortCodes: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  let tr = state.tr;\n\n  const hardbreakType = state.schema.nodes.br;\n  const softbreakType = state.schema.nodes.softbreak;\n\n  if (!hardbreakType) {\n    throw new Error('No hardbreak type in schema');\n  }\n  if (!softbreakType) {\n    throw new Error('No softbreak type in schema');\n  }\n\n  function walk(\n    parent: Node,\n    pos = 0,\n    depth = 0,\n  ) {\n    parent.forEach((child, offset, index) => {\n      if ('shortcode_inline' === child.type.name) {\n        if (index > 1) {\n          const prevNode = parent.child(index - 1);\n          if (prevNode.type === hardbreakType) {\n            tr = tr.setNodeMarkup(\n              pos + offset - prevNode.nodeSize,\n              softbreakType,\n            );\n          }\n        }\n        if (index < parent.childCount - 1) {\n          const nextNode = parent.child(index + 1);\n          if (nextNode.type === hardbreakType) {\n            tr = tr.setNodeMarkup(pos + offset + child.nodeSize, softbreakType);\n          }\n        }\n      }\n      walk(child, pos + offset + 1, depth + 1);\n    });\n  }\n\n  walk(doc);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.steps.length > 0;\n};\n","import { Command } from 'prosemirror-state';\n\nexport const removeEmptyTags: Command = (state, dispatch): boolean => {\n  const paragraphType = state.schema.nodes.paragraph;\n  const tr = state.tr;\n\n  state.doc.descendants((node, pos) => {\n    if (['paragraph'].includes(node.type.name)) {\n      const onlyEmptyTexts = node.children.every((child) =>\n        child.isText && child.textContent === ''\n      );\n\n      if (node.childCount === 0 || onlyEmptyTexts) {\n        tr.deleteRange(\n          tr.mapping.map(pos),\n          tr.mapping.map(pos + node.nodeSize),\n        );\n      }\n    } else if (['heading'].includes(node.type.name)) {\n      const onlyHasBookmark = node.children.find((child) =>\n        child.type.name === 'node_bookmark'\n      );\n      const onlyEmptyTexts = node.children.every((child) =>\n        child.isText && child.textContent === '' ||\n        child.type.name === 'node_bookmark'\n      );\n\n      if (onlyHasBookmark && onlyEmptyTexts) {\n        tr.setNodeMarkup(tr.mapping.map(pos), paragraphType);\n      } else {\n        if (node.childCount === 0 || onlyEmptyTexts) {\n          tr.deleteRange(\n            tr.mapping.map(pos),\n            tr.mapping.map(pos + node.nodeSize),\n          );\n        }\n      }\n    }\n  });\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Command, EditorState } from 'prosemirror-state';\nimport { NESTING_CLOSING, NESTING_OPENING, NodeAndPos } from '@kerebron/editor';\n\nexport const removeSuggest: Command = (state: EditorState, dispatch) => {\n  const pairs: Record<string, [NodeAndPos?, NodeAndPos?]> = {};\n\n  const tr = state.tr;\n  const doc = state.doc;\n  const type = 'comment';\n\n  doc.descendants((node, pos) => {\n    if (node.type.name === type && node.attrs.id) {\n      const id = node.attrs.id;\n      if (!pairs[id]) {\n        pairs[id] = [];\n      }\n      if (node.attrs.nesting === NESTING_OPENING) {\n        pairs[id][0] = { node, pos };\n      }\n      if (node.attrs.nesting === NESTING_CLOSING) {\n        pairs[id][1] = { node, pos };\n      }\n    }\n  });\n\n  for (const id in pairs) {\n    const open = pairs[id][0];\n    const close = pairs[id][1];\n\n    if (open && close) {\n      const from = open.pos;\n      const to = close.pos + close.node.nodeSize;\n      tr.replace(tr.mapping.map(from), tr.mapping.map(to));\n    }\n  }\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Mark, Node } from 'prosemirror-model';\n\nimport { AsyncCommandFactory } from '@kerebron/editor/commands';\nimport { UrlRewriter } from '@kerebron/editor';\n\nexport const rewriteUrls: AsyncCommandFactory =\n  (getUrlRewriter?: () => UrlRewriter | undefined) =>\n  async (state, dispatch): Promise<boolean> => {\n    const urlRewriter = getUrlRewriter?.();\n    if (!urlRewriter) {\n      return false;\n    }\n    const tr = state.tr;\n\n    const linkType = state.schema.marks.link;\n    const imageType = state.schema.nodes.image;\n\n    const linkMarks: Array<[Mark, number, number]> = [];\n    const imageNodes: Array<[Node, number]> = [];\n\n    state.doc.descendants((node, pos) => {\n      node.marks.forEach((mark) => {\n        if (mark.type === linkType) {\n          linkMarks.push([mark, pos, pos + node.nodeSize]);\n        }\n      });\n      if (node.type === imageType) {\n        imageNodes.push([node, pos]);\n      }\n    });\n\n    for (const [mark, start, end] of linkMarks) {\n      const origUrl = mark.attrs.href;\n      const meta: Record<string, string> = {};\n      const src = await urlRewriter(origUrl, {\n        type: 'A',\n        dest: 'md',\n        setMeta: (key, value) => {\n          meta[key] = value;\n        },\n      });\n      if (src !== origUrl || meta['mdTemplate']) {\n        const mdTemplate = meta['mdTemplate'];\n        tr.removeMark(tr.mapping.map(start), tr.mapping.map(end), mark);\n        const newMark = state.schema.mark('link', {\n          ...mark.attrs,\n          href: src,\n          origUrl,\n          mdTemplate,\n        });\n        tr.addMark(tr.mapping.map(start), tr.mapping.map(end), newMark);\n      }\n    }\n\n    for (const [node, pos] of imageNodes) {\n      const origUrl = node.attrs.src;\n      const meta: Record<string, string> = {};\n      const src = await urlRewriter(origUrl, {\n        type: 'IMG',\n        dest: 'md',\n        setMeta: (key, value) => {\n          meta[key] = value;\n        },\n      });\n      if (src !== origUrl || meta['mdTemplate']) {\n        const mdTemplate = meta['mdTemplate'];\n        tr.setNodeMarkup(tr.mapping.map(pos), null, {\n          ...node.attrs,\n          src,\n          origUrl,\n          mdTemplate,\n        });\n      }\n    }\n\n    if (dispatch) {\n      dispatch(tr);\n    }\n\n    return tr.docChanged;\n  };\n","import { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\n// Related tests:\n// test ./confluence.md\n// test ./example-document.md\nexport const trimLines: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  const schema = state.schema;\n  const tr = state.tr;\n\n  const hardbreakType = state.schema.nodes.br;\n  const softbreakType = state.schema.nodes.softbreak;\n  const paragraphType = state.schema.nodes.paragraph;\n\n  function walk(\n    nodes: readonly Node[],\n    parent: Node,\n    pos = 0,\n    depth = 0,\n  ) {\n    let offset = 0;\n\n    if (parent.type.name === 'code_block' && parent.textContent.trim()) {\n      return;\n    }\n\n    function trimBeforeIndex(index: number, offset: number) {\n      let to = pos + offset; // - child.nodeSize;\n      for (let prev = index - 1; prev >= 0; prev--) {\n        const prevNode = nodes[prev];\n        if (prevNode?.type.name !== 'text') {\n          break;\n        }\n\n        const text = prevNode.text || '';\n        const rtrimed = text.replace(/[ \\t\\u00A0]+$/, '');\n        if (rtrimed !== text) {\n          const from = to - prevNode.nodeSize;\n          if (rtrimed.length > 0) {\n            tr.replaceRangeWith(\n              tr.mapping.map(from),\n              tr.mapping.map(to),\n              schema.text(rtrimed),\n            );\n          } else {\n            tr.replace(tr.mapping.map(from), tr.mapping.map(to));\n          }\n        } else {\n          break;\n        }\n        to -= prevNode.nodeSize;\n        break;\n      }\n    }\n\n    let textWasOutputed = false;\n    for (let index = 0; index < nodes.length; index++) {\n      const child = nodes[index];\n\n      if (child.isText) {\n        let text = child.text || '';\n        if (\n          text.match(/^([ \\t\\u00A0]+)/) && !textWasOutputed &&\n          paragraphType !== parent.type\n        ) {\n          text = text.replace(/^[ \\t\\u00A0]+/, '');\n          const from = pos + offset;\n          const to = from + child.nodeSize;\n\n          if (text) {\n            tr.replaceRangeWith(\n              tr.mapping.map(from),\n              tr.mapping.map(to),\n              schema.text(text),\n            );\n          } else {\n            tr.replace(tr.mapping.map(from), tr.mapping.map(to));\n          }\n        }\n\n        if (text) {\n          textWasOutputed = true;\n        }\n      }\n      if (hardbreakType === child.type) {\n        trimBeforeIndex(index, offset);\n        if (\n          index + 1 < nodes.length &&\n          (nodes[index + 1].type === hardbreakType ||\n            nodes[index + 1].type === softbreakType)\n        ) {\n          tr.setNodeMarkup(tr.mapping.map(pos + offset), softbreakType);\n        }\n      }\n\n      walk(child.children, child, pos + offset + 1, depth + 1);\n\n      offset += child.nodeSize;\n    }\n\n    trimBeforeIndex(nodes.length, offset);\n  }\n\n  walk(doc.children, doc);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Fragment, Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nexport const insertToc: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  let tr = state.tr;\n\n  const hardbreakType = state.schema.nodes.br;\n  const softbreakType = state.schema.nodes.softbreak;\n\n  if (!hardbreakType) {\n    throw new Error('No hardbreak type in schema');\n  }\n  if (!softbreakType) {\n    throw new Error('No softbreak type in schema');\n  }\n\n  doc.forEach((child, offset, index) => {\n    if ('bullet_list' === child.type.name) {\n      if (child.attrs.toc) {\n        const copy = child.copy(\n          Fragment.from(child.content),\n        );\n        tr.insert(0, copy);\n      }\n    }\n  });\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.steps.length > 0;\n};\n","import { Fragment, Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nexport const addEnterAfterImage: Command = (state, dispatch): boolean => {\n  const tr = state.tr;\n\n  const imageType = state.schema.nodes.image;\n\n  const hardbreakType = state.schema.nodes.br;\n  const softbreakType = state.schema.nodes.softbreak;\n\n  function walk(\n    parent: Node,\n    pos = 0,\n    depth = 0,\n  ) {\n    parent.forEach((child, offset, index) => {\n      if (child.type !== imageType) {\n        return;\n      }\n\n      const nextNode = parent.nodeAt(index + 1);\n      if (\n        nextNode?.type === hardbreakType && nextNode?.type === softbreakType\n      ) {\n        return;\n      }\n\n      const from = pos + offset + child.nodeSize;\n      tr.insert(\n        tr.mapping.map(from),\n        Fragment.from([\n          state.schema.node('softbreak'),\n          state.schema.node('softbreak'),\n        ]),\n      );\n\n      walk(child, pos + offset + 1, depth + 1);\n    });\n  }\n\n  walk(state.doc);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\n// Related tests:\n// test ./block-macro.md\nexport const fixParaEnding: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  const tr = state.tr;\n\n  const hardbreakType = state.schema.nodes.br;\n  const paragraphType = state.schema.nodes.paragraph;\n\n  function walk(\n    nodes: readonly Node[],\n    parent: Node,\n    pos = 0,\n    depth = 0,\n  ) {\n    if (parent.type === paragraphType) {\n      let offset = parent.content.size;\n      for (let index = nodes.length - 1; index >= 0; index--) {\n        const child = nodes[index];\n        if (child.type !== hardbreakType) {\n          break;\n        }\n        offset -= child.nodeSize;\n\n        const from = pos + offset;\n        const to = from + child.nodeSize;\n        tr.replace(tr.mapping.map(from), tr.mapping.map(to));\n      }\n      return;\n    }\n\n    let offset = 0;\n    for (let index = 0; index < nodes.length; index++) {\n      const child = nodes[index];\n\n      walk(child.children, child, pos + offset + 1, depth + 1);\n\n      offset += child.nodeSize;\n    }\n  }\n\n  walk(doc.children, doc);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { UrlRewriter } from '@kerebron/editor';\nimport { AsyncCommand, Command } from '@kerebron/editor/commands';\n\nimport { addEmptyLines } from './addEmptyLines.ts';\nimport { fixIdLinks } from './fixIdLinkts.ts';\nimport { fixShortCodes } from './fixShortCodes.ts';\nimport { removeEmptyTags } from './removeEmptyTags.ts';\nimport { removeMarkedContent } from './removeMarkedContent.ts';\nimport { removeSuggest } from './removeSuggest.ts';\nimport { rewriteUrls } from './rewriteUrls.ts';\nimport { trimLines } from './trimLines.ts';\nimport { insertToc } from './insertToc.ts';\nimport { addEnterAfterImage } from './addEnterAfterImage.ts';\nimport { fixParaEnding } from './fixParaEnding.ts';\n\nexport interface PreProcessConfig {\n  getUrlRewriter?: () => UrlRewriter | undefined;\n}\n\nexport function getDefaultsPreProcessFilters(\n  config: PreProcessConfig,\n): Array<Command | AsyncCommand> {\n  return [\n    insertToc,\n    // removeMarkedContent,\n    fixShortCodes,\n    removeSuggest,\n    removeEmptyTags,\n    fixIdLinks,\n    fixParaEnding,\n    trimLines,\n    addEnterAfterImage,\n    addEmptyLines,\n    rewriteUrls(config.getUrlRewriter),\n  ];\n}\n","import { EditorState, Plugin, PluginKey, Transaction } from 'prosemirror-state';\n\nimport { CoreEditor } from '@kerebron/editor';\nimport { type UrlRewriter } from '@kerebron/editor';\nimport { debounce } from '@kerebron/editor/utilities';\nimport { Workspace } from '@kerebron/workspace';\n\nimport { ExtensionMarkdown, HookArray, HookMap } from './ExtensionMarkdown.ts';\nimport { MarkdownContentMapper } from './MarkdownContentMapper.ts';\nimport { getDefaultsPreProcessFilters } from './pm2md/preProcess.ts';\nimport { rewriteUrls } from './pm2md/rewriteUrls.ts';\n\ninterface MarkdownMeta {\n  setMarkdownHooks?: {\n    type: string;\n    hooks: HookArray;\n  };\n  setFromMarkdownUrlRewriter?: {\n    urlRewriter: UrlRewriter;\n  };\n  setToMarkdownUrlRewriter?: {\n    urlRewriter: UrlRewriter;\n  };\n}\n\nclass MarkdownPluginState {\n  capturing = true;\n  workspace: Workspace;\n  hooks: HookMap = {};\n\n  urlFromRewriter?: UrlRewriter;\n  urlToRewriter?: UrlRewriter;\n\n  constructor(\n    private editor: CoreEditor,\n    private extensionMarkdown: ExtensionMarkdown,\n  ) {\n    this.workspace = editor.ci.resolve('workspace')!;\n    this.performSnapshot = debounce(\n      this.performSnapshot.bind(this),\n      800,\n    ) as typeof this.performSnapshot;\n  }\n\n  async performSnapshot() {\n    const editor = this.editor;\n\n    const version = editor.version;\n\n    const uri = this.editor.config.uri;\n    if (!uri) {\n      return;\n    }\n\n    const ctx: {\n      version: number;\n      state: EditorState;\n      materialized?: MarkdownContentMapper;\n    } = {\n      version,\n      state: this.editor.state,\n      materialized: undefined,\n    };\n    const getContentMapper = async () => {\n      if (ctx.materialized) {\n        return ctx.materialized;\n      }\n      ctx.materialized = await MarkdownContentMapper.create(\n        ctx.state,\n        { ...this.extensionMarkdown.config, sourceMap: true },\n      );\n      return ctx.materialized;\n    };\n\n    if (this.workspace.getFile(uri)) {\n      this.workspace.modifyFile({\n        uri,\n        lang: 'markdown',\n        version,\n        getContentMapper,\n      });\n    } else {\n      this.workspace.openFile({\n        uri,\n        lang: 'markdown',\n        version,\n        getContentMapper,\n      });\n    }\n  }\n\n  handleCommands(\n    pluginMeta: MarkdownMeta | undefined,\n    transaction: Transaction,\n  ) {\n    if (!pluginMeta) {\n      return false;\n    }\n\n    if (pluginMeta.setMarkdownHooks) {\n      const { type, hooks } = pluginMeta.setMarkdownHooks;\n      this.hooks[type] = hooks;\n      return true;\n    }\n    if (pluginMeta.setFromMarkdownUrlRewriter) {\n      const { urlRewriter } = pluginMeta.setFromMarkdownUrlRewriter;\n      this.urlFromRewriter = urlRewriter;\n      return true;\n    }\n    if (pluginMeta.setToMarkdownUrlRewriter) {\n      const { urlRewriter } = pluginMeta.setToMarkdownUrlRewriter;\n      this.urlToRewriter = urlRewriter;\n      return true;\n    }\n  }\n}\n\nexport const MarkdownPluginKey = new PluginKey<MarkdownPluginState>('markdown');\n\nexport function createMarkdownPlugin(\n  extensionMarkdown: ExtensionMarkdown,\n  editor: CoreEditor,\n): Plugin {\n  return new Plugin<MarkdownPluginState>({\n    key: MarkdownPluginKey,\n    state: {\n      init(_config, state) {\n        const pluginState = new MarkdownPluginState(editor, extensionMarkdown);\n        if (state.schema.topNodeType.name === 'doc') {\n          pluginState.hooks['pm2md.pre'] = getDefaultsPreProcessFilters({\n            getUrlRewriter: () => pluginState.urlToRewriter,\n          });\n        } else {\n          pluginState.hooks['pm2md.pre'] = [];\n        }\n        pluginState.hooks['md2pm.post'] = [\n          rewriteUrls(() => pluginState.urlFromRewriter),\n        ];\n\n        return pluginState;\n      },\n      apply(tr, value, _oldState, _editorState) {\n        const oldClonedState: EditorState | undefined = tr.getMeta('cloned');\n        if (oldClonedState) {\n          const oldClonedPluginState = MarkdownPluginKey.getState(\n            oldClonedState,\n          );\n          if (oldClonedPluginState) {\n            return oldClonedPluginState;\n          }\n        }\n\n        const pluginMeta: MarkdownMeta | undefined = tr.getMeta(\n          MarkdownPluginKey,\n        );\n        if (value.handleCommands(pluginMeta, tr)) {\n          return value;\n        }\n\n        if (tr.docChanged && value.capturing) {\n          value.performSnapshot();\n        }\n        return value;\n      },\n    },\n    view() {\n      return {\n        destroy() {\n          const uri = editor.config.uri;\n          if (!uri) {\n            return;\n          }\n          const workspace: Workspace = editor.ci.resolve('workspace')!;\n          workspace.closeFile(uri);\n        },\n      };\n    },\n  });\n}\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/edit.ts\nvar Edit = class {\n  static {\n    __name(this, \"Edit\");\n  }\n  /** The start position of the change. */\n  startPosition;\n  /** The end position of the change before the edit. */\n  oldEndPosition;\n  /** The end position of the change after the edit. */\n  newEndPosition;\n  /** The start index of the change. */\n  startIndex;\n  /** The end index of the change before the edit. */\n  oldEndIndex;\n  /** The end index of the change after the edit. */\n  newEndIndex;\n  constructor({\n    startIndex,\n    oldEndIndex,\n    newEndIndex,\n    startPosition,\n    oldEndPosition,\n    newEndPosition\n  }) {\n    this.startIndex = startIndex >>> 0;\n    this.oldEndIndex = oldEndIndex >>> 0;\n    this.newEndIndex = newEndIndex >>> 0;\n    this.startPosition = startPosition;\n    this.oldEndPosition = oldEndPosition;\n    this.newEndPosition = newEndPosition;\n  }\n  /**\n   * Edit a point and index to keep it in-sync with source code that has been edited.\n   *\n   * This function updates a single point's byte offset and row/column position\n   * based on an edit operation. This is useful for editing points without\n   * requiring a tree or node instance.\n   */\n  editPoint(point, index) {\n    let newIndex = index;\n    const newPoint = { ...point };\n    if (index >= this.oldEndIndex) {\n      newIndex = this.newEndIndex + (index - this.oldEndIndex);\n      const originalRow = point.row;\n      newPoint.row = this.newEndPosition.row + (point.row - this.oldEndPosition.row);\n      newPoint.column = originalRow === this.oldEndPosition.row ? this.newEndPosition.column + (point.column - this.oldEndPosition.column) : point.column;\n    } else if (index > this.startIndex) {\n      newIndex = this.newEndIndex;\n      newPoint.row = this.newEndPosition.row;\n      newPoint.column = this.newEndPosition.column;\n    }\n    return { point: newPoint, index: newIndex };\n  }\n  /**\n   * Edit a range to keep it in-sync with source code that has been edited.\n   *\n   * This function updates a range's start and end positions based on an edit\n   * operation. This is useful for editing ranges without requiring a tree\n   * or node instance.\n   */\n  editRange(range) {\n    const newRange = {\n      startIndex: range.startIndex,\n      startPosition: { ...range.startPosition },\n      endIndex: range.endIndex,\n      endPosition: { ...range.endPosition }\n    };\n    if (range.endIndex >= this.oldEndIndex) {\n      if (range.endIndex !== Number.MAX_SAFE_INTEGER) {\n        newRange.endIndex = this.newEndIndex + (range.endIndex - this.oldEndIndex);\n        newRange.endPosition = {\n          row: this.newEndPosition.row + (range.endPosition.row - this.oldEndPosition.row),\n          column: range.endPosition.row === this.oldEndPosition.row ? this.newEndPosition.column + (range.endPosition.column - this.oldEndPosition.column) : range.endPosition.column\n        };\n        if (newRange.endIndex < this.newEndIndex) {\n          newRange.endIndex = Number.MAX_SAFE_INTEGER;\n          newRange.endPosition = { row: Number.MAX_SAFE_INTEGER, column: Number.MAX_SAFE_INTEGER };\n        }\n      }\n    } else if (range.endIndex > this.startIndex) {\n      newRange.endIndex = this.startIndex;\n      newRange.endPosition = { ...this.startPosition };\n    }\n    if (range.startIndex >= this.oldEndIndex) {\n      newRange.startIndex = this.newEndIndex + (range.startIndex - this.oldEndIndex);\n      newRange.startPosition = {\n        row: this.newEndPosition.row + (range.startPosition.row - this.oldEndPosition.row),\n        column: range.startPosition.row === this.oldEndPosition.row ? this.newEndPosition.column + (range.startPosition.column - this.oldEndPosition.column) : range.startPosition.column\n      };\n      if (newRange.startIndex < this.newEndIndex) {\n        newRange.startIndex = Number.MAX_SAFE_INTEGER;\n        newRange.startPosition = { row: Number.MAX_SAFE_INTEGER, column: Number.MAX_SAFE_INTEGER };\n      }\n    } else if (range.startIndex > this.startIndex) {\n      newRange.startIndex = this.startIndex;\n      newRange.startPosition = { ...this.startPosition };\n    }\n    return newRange;\n  }\n};\n\n// src/constants.ts\nvar SIZE_OF_SHORT = 2;\nvar SIZE_OF_INT = 4;\nvar SIZE_OF_CURSOR = 4 * SIZE_OF_INT;\nvar SIZE_OF_NODE = 5 * SIZE_OF_INT;\nvar SIZE_OF_POINT = 2 * SIZE_OF_INT;\nvar SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT;\nvar ZERO_POINT = { row: 0, column: 0 };\nvar INTERNAL = /* @__PURE__ */ Symbol(\"INTERNAL\");\nfunction assertInternal(x) {\n  if (x !== INTERNAL) throw new Error(\"Illegal constructor\");\n}\n__name(assertInternal, \"assertInternal\");\nfunction isPoint(point) {\n  return !!point && typeof point.row === \"number\" && typeof point.column === \"number\";\n}\n__name(isPoint, \"isPoint\");\nfunction setModule(module2) {\n  C = module2;\n}\n__name(setModule, \"setModule\");\nvar C;\n\n// src/lookahead_iterator.ts\nvar LookaheadIterator = class {\n  static {\n    __name(this, \"LookaheadIterator\");\n  }\n  /** @internal */\n  [0] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  language;\n  /** @internal */\n  constructor(internal, address, language) {\n    assertInternal(internal);\n    this[0] = address;\n    this.language = language;\n  }\n  /** Get the current symbol of the lookahead iterator. */\n  get currentTypeId() {\n    return C._ts_lookahead_iterator_current_symbol(this[0]);\n  }\n  /** Get the current symbol name of the lookahead iterator. */\n  get currentType() {\n    return this.language.types[this.currentTypeId] || \"ERROR\";\n  }\n  /** Delete the lookahead iterator, freeing its resources. */\n  delete() {\n    C._ts_lookahead_iterator_delete(this[0]);\n    this[0] = 0;\n  }\n  /**\n   * Reset the lookahead iterator.\n   *\n   * This returns `true` if the language was set successfully and `false`\n   * otherwise.\n   */\n  reset(language, stateId) {\n    if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) {\n      this.language = language;\n      return true;\n    }\n    return false;\n  }\n  /**\n   * Reset the lookahead iterator to another state.\n   *\n   * This returns `true` if the iterator was reset to the given state and\n   * `false` otherwise.\n   */\n  resetState(stateId) {\n    return Boolean(C._ts_lookahead_iterator_reset_state(this[0], stateId));\n  }\n  /**\n   * Returns an iterator that iterates over the symbols of the lookahead iterator.\n   *\n   * The iterator will yield the current symbol name as a string for each step\n   * until there are no more symbols to iterate over.\n   */\n  [Symbol.iterator]() {\n    return {\n      next: /* @__PURE__ */ __name(() => {\n        if (C._ts_lookahead_iterator_next(this[0])) {\n          return { done: false, value: this.currentType };\n        }\n        return { done: true, value: \"\" };\n      }, \"next\")\n    };\n  }\n};\n\n// src/tree.ts\nfunction getText(tree, startIndex, endIndex, startPosition) {\n  const length = endIndex - startIndex;\n  let result = tree.textCallback(startIndex, startPosition);\n  if (result) {\n    startIndex += result.length;\n    while (startIndex < endIndex) {\n      const string = tree.textCallback(startIndex, startPosition);\n      if (string && string.length > 0) {\n        startIndex += string.length;\n        result += string;\n      } else {\n        break;\n      }\n    }\n    if (startIndex > endIndex) {\n      result = result.slice(0, length);\n    }\n  }\n  return result ?? \"\";\n}\n__name(getText, \"getText\");\nvar Tree = class _Tree {\n  static {\n    __name(this, \"Tree\");\n  }\n  /** @internal */\n  [0] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  textCallback;\n  /** The language that was used to parse the syntax tree. */\n  language;\n  /** @internal */\n  constructor(internal, address, language, textCallback) {\n    assertInternal(internal);\n    this[0] = address;\n    this.language = language;\n    this.textCallback = textCallback;\n  }\n  /** Create a shallow copy of the syntax tree. This is very fast. */\n  copy() {\n    const address = C._ts_tree_copy(this[0]);\n    return new _Tree(INTERNAL, address, this.language, this.textCallback);\n  }\n  /** Delete the syntax tree, freeing its resources. */\n  delete() {\n    C._ts_tree_delete(this[0]);\n    this[0] = 0;\n  }\n  /** Get the root node of the syntax tree. */\n  get rootNode() {\n    C._ts_tree_root_node_wasm(this[0]);\n    return unmarshalNode(this);\n  }\n  /**\n   * Get the root node of the syntax tree, but with its position shifted\n   * forward by the given offset.\n   */\n  rootNodeWithOffset(offsetBytes, offsetExtent) {\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    C.setValue(address, offsetBytes, \"i32\");\n    marshalPoint(address + SIZE_OF_INT, offsetExtent);\n    C._ts_tree_root_node_with_offset_wasm(this[0]);\n    return unmarshalNode(this);\n  }\n  /**\n   * Edit the syntax tree to keep it in sync with source code that has been\n   * edited.\n   *\n   * You must describe the edit both in terms of byte offsets and in terms of\n   * row/column coordinates.\n   */\n  edit(edit) {\n    marshalEdit(edit);\n    C._ts_tree_edit_wasm(this[0]);\n  }\n  /** Create a new {@link TreeCursor} starting from the root of the tree. */\n  walk() {\n    return this.rootNode.walk();\n  }\n  /**\n   * Compare this old edited syntax tree to a new syntax tree representing\n   * the same document, returning a sequence of ranges whose syntactic\n   * structure has changed.\n   *\n   * For this to work correctly, this syntax tree must have been edited such\n   * that its ranges match up to the new tree. Generally, you'll want to\n   * call this method right after calling one of the [`Parser::parse`]\n   * functions. Call it on the old tree that was passed to parse, and\n   * pass the new tree that was returned from `parse`.\n   */\n  getChangedRanges(other) {\n    if (!(other instanceof _Tree)) {\n      throw new TypeError(\"Argument must be a Tree\");\n    }\n    C._ts_tree_get_changed_ranges_wasm(this[0], other[0]);\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(count);\n    if (count > 0) {\n      let address = buffer;\n      for (let i2 = 0; i2 < count; i2++) {\n        result[i2] = unmarshalRange(address);\n        address += SIZE_OF_RANGE;\n      }\n      C._free(buffer);\n    }\n    return result;\n  }\n  /** Get the included ranges that were used to parse the syntax tree. */\n  getIncludedRanges() {\n    C._ts_tree_included_ranges_wasm(this[0]);\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(count);\n    if (count > 0) {\n      let address = buffer;\n      for (let i2 = 0; i2 < count; i2++) {\n        result[i2] = unmarshalRange(address);\n        address += SIZE_OF_RANGE;\n      }\n      C._free(buffer);\n    }\n    return result;\n  }\n};\n\n// src/tree_cursor.ts\nvar TreeCursor = class _TreeCursor {\n  static {\n    __name(this, \"TreeCursor\");\n  }\n  /** @internal */\n  // @ts-expect-error: never read\n  [0] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  // @ts-expect-error: never read\n  [1] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  // @ts-expect-error: never read\n  [2] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  // @ts-expect-error: never read\n  [3] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  tree;\n  /** @internal */\n  constructor(internal, tree) {\n    assertInternal(internal);\n    this.tree = tree;\n    unmarshalTreeCursor(this);\n  }\n  /** Creates a deep copy of the tree cursor. This allocates new memory. */\n  copy() {\n    const copy = new _TreeCursor(INTERNAL, this.tree);\n    C._ts_tree_cursor_copy_wasm(this.tree[0]);\n    unmarshalTreeCursor(copy);\n    return copy;\n  }\n  /** Delete the tree cursor, freeing its resources. */\n  delete() {\n    marshalTreeCursor(this);\n    C._ts_tree_cursor_delete_wasm(this.tree[0]);\n    this[0] = this[1] = this[2] = 0;\n  }\n  /** Get the tree cursor's current {@link Node}. */\n  get currentNode() {\n    marshalTreeCursor(this);\n    C._ts_tree_cursor_current_node_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get the numerical field id of this tree cursor's current node.\n   *\n   * See also {@link TreeCursor#currentFieldName}.\n   */\n  get currentFieldId() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]);\n  }\n  /** Get the field name of this tree cursor's current node. */\n  get currentFieldName() {\n    return this.tree.language.fields[this.currentFieldId];\n  }\n  /**\n   * Get the depth of the cursor's current node relative to the original\n   * node that the cursor was constructed with.\n   */\n  get currentDepth() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_depth_wasm(this.tree[0]);\n  }\n  /**\n   * Get the index of the cursor's current node out of all of the\n   * descendants of the original node that the cursor was constructed with.\n   */\n  get currentDescendantIndex() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]);\n  }\n  /** Get the type of the cursor's current node. */\n  get nodeType() {\n    return this.tree.language.types[this.nodeTypeId] || \"ERROR\";\n  }\n  /** Get the type id of the cursor's current node. */\n  get nodeTypeId() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]);\n  }\n  /** Get the state id of the cursor's current node. */\n  get nodeStateId() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]);\n  }\n  /** Get the id of the cursor's current node. */\n  get nodeId() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]);\n  }\n  /**\n   * Check if the cursor's current node is *named*.\n   *\n   * Named nodes correspond to named rules in the grammar, whereas\n   * *anonymous* nodes correspond to string literals in the grammar.\n   */\n  get nodeIsNamed() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1;\n  }\n  /**\n   * Check if the cursor's current node is *missing*.\n   *\n   * Missing nodes are inserted by the parser in order to recover from\n   * certain kinds of syntax errors.\n   */\n  get nodeIsMissing() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1;\n  }\n  /** Get the string content of the cursor's current node. */\n  get nodeText() {\n    marshalTreeCursor(this);\n    const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]);\n    const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]);\n    C._ts_tree_cursor_start_position_wasm(this.tree[0]);\n    const startPosition = unmarshalPoint(TRANSFER_BUFFER);\n    return getText(this.tree, startIndex, endIndex, startPosition);\n  }\n  /** Get the start position of the cursor's current node. */\n  get startPosition() {\n    marshalTreeCursor(this);\n    C._ts_tree_cursor_start_position_wasm(this.tree[0]);\n    return unmarshalPoint(TRANSFER_BUFFER);\n  }\n  /** Get the end position of the cursor's current node. */\n  get endPosition() {\n    marshalTreeCursor(this);\n    C._ts_tree_cursor_end_position_wasm(this.tree[0]);\n    return unmarshalPoint(TRANSFER_BUFFER);\n  }\n  /** Get the start index of the cursor's current node. */\n  get startIndex() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_start_index_wasm(this.tree[0]);\n  }\n  /** Get the end index of the cursor's current node. */\n  get endIndex() {\n    marshalTreeCursor(this);\n    return C._ts_tree_cursor_end_index_wasm(this.tree[0]);\n  }\n  /**\n   * Move this cursor to the first child of its current node.\n   *\n   * This returns `true` if the cursor successfully moved, and returns\n   * `false` if there were no children.\n   */\n  gotoFirstChild() {\n    marshalTreeCursor(this);\n    const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Move this cursor to the last child of its current node.\n   *\n   * This returns `true` if the cursor successfully moved, and returns\n   * `false` if there were no children.\n   *\n   * Note that this function may be slower than\n   * {@link TreeCursor#gotoFirstChild} because it needs to\n   * iterate through all the children to compute the child's position.\n   */\n  gotoLastChild() {\n    marshalTreeCursor(this);\n    const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Move this cursor to the parent of its current node.\n   *\n   * This returns `true` if the cursor successfully moved, and returns\n   * `false` if there was no parent node (the cursor was already on the\n   * root node).\n   *\n   * Note that the node the cursor was constructed with is considered the root\n   * of the cursor, and the cursor cannot walk outside this node.\n   */\n  gotoParent() {\n    marshalTreeCursor(this);\n    const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Move this cursor to the next sibling of its current node.\n   *\n   * This returns `true` if the cursor successfully moved, and returns\n   * `false` if there was no next sibling node.\n   *\n   * Note that the node the cursor was constructed with is considered the root\n   * of the cursor, and the cursor cannot walk outside this node.\n   */\n  gotoNextSibling() {\n    marshalTreeCursor(this);\n    const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Move this cursor to the previous sibling of its current node.\n   *\n   * This returns `true` if the cursor successfully moved, and returns\n   * `false` if there was no previous sibling node.\n   *\n   * Note that this function may be slower than\n   * {@link TreeCursor#gotoNextSibling} due to how node\n   * positions are stored. In the worst case, this will need to iterate\n   * through all the children up to the previous sibling node to recalculate\n   * its position. Also note that the node the cursor was constructed with is\n   * considered the root of the cursor, and the cursor cannot walk outside this node.\n   */\n  gotoPreviousSibling() {\n    marshalTreeCursor(this);\n    const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Move the cursor to the node that is the nth descendant of\n   * the original node that the cursor was constructed with, where\n   * zero represents the original node itself.\n   */\n  gotoDescendant(goalDescendantIndex) {\n    marshalTreeCursor(this);\n    C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantIndex);\n    unmarshalTreeCursor(this);\n  }\n  /**\n   * Move this cursor to the first child of its current node that contains or\n   * starts after the given byte offset.\n   *\n   * This returns `true` if the cursor successfully moved to a child node, and returns\n   * `false` if no such child was found.\n   */\n  gotoFirstChildForIndex(goalIndex) {\n    marshalTreeCursor(this);\n    C.setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, \"i32\");\n    const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Move this cursor to the first child of its current node that contains or\n   * starts after the given byte offset.\n   *\n   * This returns the index of the child node if one was found, and returns\n   * `null` if no such child was found.\n   */\n  gotoFirstChildForPosition(goalPosition) {\n    marshalTreeCursor(this);\n    marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition);\n    const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n    return result === 1;\n  }\n  /**\n   * Re-initialize this tree cursor to start at the original node that the\n   * cursor was constructed with.\n   */\n  reset(node) {\n    marshalNode(node);\n    marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE);\n    C._ts_tree_cursor_reset_wasm(this.tree[0]);\n    unmarshalTreeCursor(this);\n  }\n  /**\n   * Re-initialize a tree cursor to the same position as another cursor.\n   *\n   * Unlike {@link TreeCursor#reset}, this will not lose parent\n   * information and allows reusing already created cursors.\n   */\n  resetTo(cursor) {\n    marshalTreeCursor(this, TRANSFER_BUFFER);\n    marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR);\n    C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]);\n    unmarshalTreeCursor(this);\n  }\n};\n\n// src/node.ts\nvar Node = class {\n  static {\n    __name(this, \"Node\");\n  }\n  /** @internal */\n  // @ts-expect-error: never read\n  [0] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  _children;\n  /** @internal */\n  _namedChildren;\n  /** @internal */\n  constructor(internal, {\n    id,\n    tree,\n    startIndex,\n    startPosition,\n    other\n  }) {\n    assertInternal(internal);\n    this[0] = other;\n    this.id = id;\n    this.tree = tree;\n    this.startIndex = startIndex;\n    this.startPosition = startPosition;\n  }\n  /**\n   * The numeric id for this node that is unique.\n   *\n   * Within a given syntax tree, no two nodes have the same id. However:\n   *\n   * * If a new tree is created based on an older tree, and a node from the old tree is reused in\n   *   the process, then that node will have the same id in both trees.\n   *\n   * * A node not marked as having changes does not guarantee it was reused.\n   *\n   * * If a node is marked as having changed in the old tree, it will not be reused.\n   */\n  id;\n  /** The byte index where this node starts. */\n  startIndex;\n  /** The position where this node starts. */\n  startPosition;\n  /** The tree that this node belongs to. */\n  tree;\n  /** Get this node's type as a numerical id. */\n  get typeId() {\n    marshalNode(this);\n    return C._ts_node_symbol_wasm(this.tree[0]);\n  }\n  /**\n   * Get the node's type as a numerical id as it appears in the grammar,\n   * ignoring aliases.\n   */\n  get grammarId() {\n    marshalNode(this);\n    return C._ts_node_grammar_symbol_wasm(this.tree[0]);\n  }\n  /** Get this node's type as a string. */\n  get type() {\n    return this.tree.language.types[this.typeId] || \"ERROR\";\n  }\n  /**\n   * Get this node's symbol name as it appears in the grammar, ignoring\n   * aliases as a string.\n   */\n  get grammarType() {\n    return this.tree.language.types[this.grammarId] || \"ERROR\";\n  }\n  /**\n   * Check if this node is *named*.\n   *\n   * Named nodes correspond to named rules in the grammar, whereas\n   * *anonymous* nodes correspond to string literals in the grammar.\n   */\n  get isNamed() {\n    marshalNode(this);\n    return C._ts_node_is_named_wasm(this.tree[0]) === 1;\n  }\n  /**\n   * Check if this node is *extra*.\n   *\n   * Extra nodes represent things like comments, which are not required\n   * by the grammar, but can appear anywhere.\n   */\n  get isExtra() {\n    marshalNode(this);\n    return C._ts_node_is_extra_wasm(this.tree[0]) === 1;\n  }\n  /**\n   * Check if this node represents a syntax error.\n   *\n   * Syntax errors represent parts of the code that could not be incorporated\n   * into a valid syntax tree.\n   */\n  get isError() {\n    marshalNode(this);\n    return C._ts_node_is_error_wasm(this.tree[0]) === 1;\n  }\n  /**\n   * Check if this node is *missing*.\n   *\n   * Missing nodes are inserted by the parser in order to recover from\n   * certain kinds of syntax errors.\n   */\n  get isMissing() {\n    marshalNode(this);\n    return C._ts_node_is_missing_wasm(this.tree[0]) === 1;\n  }\n  /** Check if this node has been edited. */\n  get hasChanges() {\n    marshalNode(this);\n    return C._ts_node_has_changes_wasm(this.tree[0]) === 1;\n  }\n  /**\n   * Check if this node represents a syntax error or contains any syntax\n   * errors anywhere within it.\n   */\n  get hasError() {\n    marshalNode(this);\n    return C._ts_node_has_error_wasm(this.tree[0]) === 1;\n  }\n  /** Get the byte index where this node ends. */\n  get endIndex() {\n    marshalNode(this);\n    return C._ts_node_end_index_wasm(this.tree[0]);\n  }\n  /** Get the position where this node ends. */\n  get endPosition() {\n    marshalNode(this);\n    C._ts_node_end_point_wasm(this.tree[0]);\n    return unmarshalPoint(TRANSFER_BUFFER);\n  }\n  /** Get the string content of this node. */\n  get text() {\n    return getText(this.tree, this.startIndex, this.endIndex, this.startPosition);\n  }\n  /** Get this node's parse state. */\n  get parseState() {\n    marshalNode(this);\n    return C._ts_node_parse_state_wasm(this.tree[0]);\n  }\n  /** Get the parse state after this node. */\n  get nextParseState() {\n    marshalNode(this);\n    return C._ts_node_next_parse_state_wasm(this.tree[0]);\n  }\n  /** Check if this node is equal to another node. */\n  equals(other) {\n    return this.tree === other.tree && this.id === other.id;\n  }\n  /**\n   * Get the node's child at the given index, where zero represents the first child.\n   *\n   * This method is fairly fast, but its cost is technically log(n), so if\n   * you might be iterating over a long list of children, you should use\n   * {@link Node#children} instead.\n   */\n  child(index) {\n    marshalNode(this);\n    C._ts_node_child_wasm(this.tree[0], index);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get this node's *named* child at the given index.\n   *\n   * See also {@link Node#isNamed}.\n   * This method is fairly fast, but its cost is technically log(n), so if\n   * you might be iterating over a long list of children, you should use\n   * {@link Node#namedChildren} instead.\n   */\n  namedChild(index) {\n    marshalNode(this);\n    C._ts_node_named_child_wasm(this.tree[0], index);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get this node's child with the given numerical field id.\n   *\n   * See also {@link Node#childForFieldName}. You can\n   * convert a field name to an id using {@link Language#fieldIdForName}.\n   */\n  childForFieldId(fieldId) {\n    marshalNode(this);\n    C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get the first child with the given field name.\n   *\n   * If multiple children may have the same field name, access them using\n   * {@link Node#childrenForFieldName}.\n   */\n  childForFieldName(fieldName) {\n    const fieldId = this.tree.language.fields.indexOf(fieldName);\n    if (fieldId !== -1) return this.childForFieldId(fieldId);\n    return null;\n  }\n  /** Get the field name of this node's child at the given index. */\n  fieldNameForChild(index) {\n    marshalNode(this);\n    const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index);\n    if (!address) return null;\n    return C.AsciiToString(address);\n  }\n  /** Get the field name of this node's named child at the given index. */\n  fieldNameForNamedChild(index) {\n    marshalNode(this);\n    const address = C._ts_node_field_name_for_named_child_wasm(this.tree[0], index);\n    if (!address) return null;\n    return C.AsciiToString(address);\n  }\n  /**\n   * Get an array of this node's children with a given field name.\n   *\n   * See also {@link Node#children}.\n   */\n  childrenForFieldName(fieldName) {\n    const fieldId = this.tree.language.fields.indexOf(fieldName);\n    if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId);\n    return [];\n  }\n  /**\n    * Get an array of this node's children with a given field id.\n    *\n    * See also {@link Node#childrenForFieldName}.\n    */\n  childrenForFieldId(fieldId) {\n    marshalNode(this);\n    C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId);\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(count);\n    if (count > 0) {\n      let address = buffer;\n      for (let i2 = 0; i2 < count; i2++) {\n        result[i2] = unmarshalNode(this.tree, address);\n        address += SIZE_OF_NODE;\n      }\n      C._free(buffer);\n    }\n    return result;\n  }\n  /** Get the node's first child that contains or starts after the given byte offset. */\n  firstChildForIndex(index) {\n    marshalNode(this);\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    C.setValue(address, index, \"i32\");\n    C._ts_node_first_child_for_byte_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get the node's first named child that contains or starts after the given byte offset. */\n  firstNamedChildForIndex(index) {\n    marshalNode(this);\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    C.setValue(address, index, \"i32\");\n    C._ts_node_first_named_child_for_byte_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get this node's number of children. */\n  get childCount() {\n    marshalNode(this);\n    return C._ts_node_child_count_wasm(this.tree[0]);\n  }\n  /**\n   * Get this node's number of *named* children.\n   *\n   * See also {@link Node#isNamed}.\n   */\n  get namedChildCount() {\n    marshalNode(this);\n    return C._ts_node_named_child_count_wasm(this.tree[0]);\n  }\n  /** Get this node's first child. */\n  get firstChild() {\n    return this.child(0);\n  }\n  /**\n   * Get this node's first named child.\n   *\n   * See also {@link Node#isNamed}.\n   */\n  get firstNamedChild() {\n    return this.namedChild(0);\n  }\n  /** Get this node's last child. */\n  get lastChild() {\n    return this.child(this.childCount - 1);\n  }\n  /**\n   * Get this node's last named child.\n   *\n   * See also {@link Node#isNamed}.\n   */\n  get lastNamedChild() {\n    return this.namedChild(this.namedChildCount - 1);\n  }\n  /**\n   * Iterate over this node's children.\n   *\n   * If you're walking the tree recursively, you may want to use the\n   * {@link TreeCursor} APIs directly instead.\n   */\n  get children() {\n    if (!this._children) {\n      marshalNode(this);\n      C._ts_node_children_wasm(this.tree[0]);\n      const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n      const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n      this._children = new Array(count);\n      if (count > 0) {\n        let address = buffer;\n        for (let i2 = 0; i2 < count; i2++) {\n          this._children[i2] = unmarshalNode(this.tree, address);\n          address += SIZE_OF_NODE;\n        }\n        C._free(buffer);\n      }\n    }\n    return this._children;\n  }\n  /**\n   * Iterate over this node's named children.\n   *\n   * See also {@link Node#children}.\n   */\n  get namedChildren() {\n    if (!this._namedChildren) {\n      marshalNode(this);\n      C._ts_node_named_children_wasm(this.tree[0]);\n      const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n      const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n      this._namedChildren = new Array(count);\n      if (count > 0) {\n        let address = buffer;\n        for (let i2 = 0; i2 < count; i2++) {\n          this._namedChildren[i2] = unmarshalNode(this.tree, address);\n          address += SIZE_OF_NODE;\n        }\n        C._free(buffer);\n      }\n    }\n    return this._namedChildren;\n  }\n  /**\n   * Get the descendants of this node that are the given type, or in the given types array.\n   *\n   * The types array should contain node type strings, which can be retrieved from {@link Language#types}.\n   *\n   * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range.\n   */\n  descendantsOfType(types, startPosition = ZERO_POINT, endPosition = ZERO_POINT) {\n    if (!Array.isArray(types)) types = [types];\n    const symbols = [];\n    const typesBySymbol = this.tree.language.types;\n    for (const node_type of types) {\n      if (node_type == \"ERROR\") {\n        symbols.push(65535);\n      }\n    }\n    for (let i2 = 0, n = typesBySymbol.length; i2 < n; i2++) {\n      if (types.includes(typesBySymbol[i2])) {\n        symbols.push(i2);\n      }\n    }\n    const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length);\n    for (let i2 = 0, n = symbols.length; i2 < n; i2++) {\n      C.setValue(symbolsAddress + i2 * SIZE_OF_INT, symbols[i2], \"i32\");\n    }\n    marshalNode(this);\n    C._ts_node_descendants_of_type_wasm(\n      this.tree[0],\n      symbolsAddress,\n      symbols.length,\n      startPosition.row,\n      startPosition.column,\n      endPosition.row,\n      endPosition.column\n    );\n    const descendantCount = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const descendantAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(descendantCount);\n    if (descendantCount > 0) {\n      let address = descendantAddress;\n      for (let i2 = 0; i2 < descendantCount; i2++) {\n        result[i2] = unmarshalNode(this.tree, address);\n        address += SIZE_OF_NODE;\n      }\n    }\n    C._free(descendantAddress);\n    C._free(symbolsAddress);\n    return result;\n  }\n  /** Get this node's next sibling. */\n  get nextSibling() {\n    marshalNode(this);\n    C._ts_node_next_sibling_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get this node's previous sibling. */\n  get previousSibling() {\n    marshalNode(this);\n    C._ts_node_prev_sibling_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get this node's next *named* sibling.\n   *\n   * See also {@link Node#isNamed}.\n   */\n  get nextNamedSibling() {\n    marshalNode(this);\n    C._ts_node_next_named_sibling_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get this node's previous *named* sibling.\n   *\n   * See also {@link Node#isNamed}.\n   */\n  get previousNamedSibling() {\n    marshalNode(this);\n    C._ts_node_prev_named_sibling_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get the node's number of descendants, including one for the node itself. */\n  get descendantCount() {\n    marshalNode(this);\n    return C._ts_node_descendant_count_wasm(this.tree[0]);\n  }\n  /**\n   * Get this node's immediate parent.\n   * Prefer {@link Node#childWithDescendant} for iterating over this node's ancestors.\n   */\n  get parent() {\n    marshalNode(this);\n    C._ts_node_parent_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Get the node that contains `descendant`.\n   *\n   * Note that this can return `descendant` itself.\n   */\n  childWithDescendant(descendant) {\n    marshalNode(this);\n    marshalNode(descendant, 1);\n    C._ts_node_child_with_descendant_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get the smallest node within this node that spans the given byte range. */\n  descendantForIndex(start2, end = start2) {\n    if (typeof start2 !== \"number\" || typeof end !== \"number\") {\n      throw new Error(\"Arguments must be numbers\");\n    }\n    marshalNode(this);\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    C.setValue(address, start2, \"i32\");\n    C.setValue(address + SIZE_OF_INT, end, \"i32\");\n    C._ts_node_descendant_for_index_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get the smallest named node within this node that spans the given byte range. */\n  namedDescendantForIndex(start2, end = start2) {\n    if (typeof start2 !== \"number\" || typeof end !== \"number\") {\n      throw new Error(\"Arguments must be numbers\");\n    }\n    marshalNode(this);\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    C.setValue(address, start2, \"i32\");\n    C.setValue(address + SIZE_OF_INT, end, \"i32\");\n    C._ts_node_named_descendant_for_index_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get the smallest node within this node that spans the given point range. */\n  descendantForPosition(start2, end = start2) {\n    if (!isPoint(start2) || !isPoint(end)) {\n      throw new Error(\"Arguments must be {row, column} objects\");\n    }\n    marshalNode(this);\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    marshalPoint(address, start2);\n    marshalPoint(address + SIZE_OF_POINT, end);\n    C._ts_node_descendant_for_position_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /** Get the smallest named node within this node that spans the given point range. */\n  namedDescendantForPosition(start2, end = start2) {\n    if (!isPoint(start2) || !isPoint(end)) {\n      throw new Error(\"Arguments must be {row, column} objects\");\n    }\n    marshalNode(this);\n    const address = TRANSFER_BUFFER + SIZE_OF_NODE;\n    marshalPoint(address, start2);\n    marshalPoint(address + SIZE_OF_POINT, end);\n    C._ts_node_named_descendant_for_position_wasm(this.tree[0]);\n    return unmarshalNode(this.tree);\n  }\n  /**\n   * Create a new {@link TreeCursor} starting from this node.\n   *\n   * Note that the given node is considered the root of the cursor,\n   * and the cursor cannot walk outside this node.\n   */\n  walk() {\n    marshalNode(this);\n    C._ts_tree_cursor_new_wasm(this.tree[0]);\n    return new TreeCursor(INTERNAL, this.tree);\n  }\n  /**\n   * Edit this node to keep it in-sync with source code that has been edited.\n   *\n   * This function is only rarely needed. When you edit a syntax tree with\n   * the {@link Tree#edit} method, all of the nodes that you retrieve from\n   * the tree afterward will already reflect the edit. You only need to\n   * use {@link Node#edit} when you have a specific {@link Node} instance that\n   * you want to keep and continue to use after an edit.\n   */\n  edit(edit) {\n    if (this.startIndex >= edit.oldEndIndex) {\n      this.startIndex = edit.newEndIndex + (this.startIndex - edit.oldEndIndex);\n      let subbedPointRow;\n      let subbedPointColumn;\n      if (this.startPosition.row > edit.oldEndPosition.row) {\n        subbedPointRow = this.startPosition.row - edit.oldEndPosition.row;\n        subbedPointColumn = this.startPosition.column;\n      } else {\n        subbedPointRow = 0;\n        subbedPointColumn = this.startPosition.column;\n        if (this.startPosition.column >= edit.oldEndPosition.column) {\n          subbedPointColumn = this.startPosition.column - edit.oldEndPosition.column;\n        }\n      }\n      if (subbedPointRow > 0) {\n        this.startPosition.row += subbedPointRow;\n        this.startPosition.column = subbedPointColumn;\n      } else {\n        this.startPosition.column += subbedPointColumn;\n      }\n    } else if (this.startIndex > edit.startIndex) {\n      this.startIndex = edit.newEndIndex;\n      this.startPosition.row = edit.newEndPosition.row;\n      this.startPosition.column = edit.newEndPosition.column;\n    }\n  }\n  /** Get the S-expression representation of this node. */\n  toString() {\n    marshalNode(this);\n    const address = C._ts_node_to_string_wasm(this.tree[0]);\n    const result = C.AsciiToString(address);\n    C._free(address);\n    return result;\n  }\n};\n\n// src/marshal.ts\nfunction unmarshalCaptures(query, tree, address, patternIndex, result) {\n  for (let i2 = 0, n = result.length; i2 < n; i2++) {\n    const captureIndex = C.getValue(address, \"i32\");\n    address += SIZE_OF_INT;\n    const node = unmarshalNode(tree, address);\n    address += SIZE_OF_NODE;\n    result[i2] = { patternIndex, name: query.captureNames[captureIndex], node };\n  }\n  return address;\n}\n__name(unmarshalCaptures, \"unmarshalCaptures\");\nfunction marshalNode(node, index = 0) {\n  let address = TRANSFER_BUFFER + index * SIZE_OF_NODE;\n  C.setValue(address, node.id, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, node.startIndex, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, node.startPosition.row, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, node.startPosition.column, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, node[0], \"i32\");\n}\n__name(marshalNode, \"marshalNode\");\nfunction unmarshalNode(tree, address = TRANSFER_BUFFER) {\n  const id = C.getValue(address, \"i32\");\n  address += SIZE_OF_INT;\n  if (id === 0) return null;\n  const index = C.getValue(address, \"i32\");\n  address += SIZE_OF_INT;\n  const row = C.getValue(address, \"i32\");\n  address += SIZE_OF_INT;\n  const column = C.getValue(address, \"i32\");\n  address += SIZE_OF_INT;\n  const other = C.getValue(address, \"i32\");\n  const result = new Node(INTERNAL, {\n    id,\n    tree,\n    startIndex: index,\n    startPosition: { row, column },\n    other\n  });\n  return result;\n}\n__name(unmarshalNode, \"unmarshalNode\");\nfunction marshalTreeCursor(cursor, address = TRANSFER_BUFFER) {\n  C.setValue(address + 0 * SIZE_OF_INT, cursor[0], \"i32\");\n  C.setValue(address + 1 * SIZE_OF_INT, cursor[1], \"i32\");\n  C.setValue(address + 2 * SIZE_OF_INT, cursor[2], \"i32\");\n  C.setValue(address + 3 * SIZE_OF_INT, cursor[3], \"i32\");\n}\n__name(marshalTreeCursor, \"marshalTreeCursor\");\nfunction unmarshalTreeCursor(cursor) {\n  cursor[0] = C.getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, \"i32\");\n  cursor[1] = C.getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, \"i32\");\n  cursor[2] = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n  cursor[3] = C.getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, \"i32\");\n}\n__name(unmarshalTreeCursor, \"unmarshalTreeCursor\");\nfunction marshalPoint(address, point) {\n  C.setValue(address, point.row, \"i32\");\n  C.setValue(address + SIZE_OF_INT, point.column, \"i32\");\n}\n__name(marshalPoint, \"marshalPoint\");\nfunction unmarshalPoint(address) {\n  const result = {\n    row: C.getValue(address, \"i32\") >>> 0,\n    column: C.getValue(address + SIZE_OF_INT, \"i32\") >>> 0\n  };\n  return result;\n}\n__name(unmarshalPoint, \"unmarshalPoint\");\nfunction marshalRange(address, range) {\n  marshalPoint(address, range.startPosition);\n  address += SIZE_OF_POINT;\n  marshalPoint(address, range.endPosition);\n  address += SIZE_OF_POINT;\n  C.setValue(address, range.startIndex, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, range.endIndex, \"i32\");\n  address += SIZE_OF_INT;\n}\n__name(marshalRange, \"marshalRange\");\nfunction unmarshalRange(address) {\n  const result = {};\n  result.startPosition = unmarshalPoint(address);\n  address += SIZE_OF_POINT;\n  result.endPosition = unmarshalPoint(address);\n  address += SIZE_OF_POINT;\n  result.startIndex = C.getValue(address, \"i32\") >>> 0;\n  address += SIZE_OF_INT;\n  result.endIndex = C.getValue(address, \"i32\") >>> 0;\n  return result;\n}\n__name(unmarshalRange, \"unmarshalRange\");\nfunction marshalEdit(edit, address = TRANSFER_BUFFER) {\n  marshalPoint(address, edit.startPosition);\n  address += SIZE_OF_POINT;\n  marshalPoint(address, edit.oldEndPosition);\n  address += SIZE_OF_POINT;\n  marshalPoint(address, edit.newEndPosition);\n  address += SIZE_OF_POINT;\n  C.setValue(address, edit.startIndex, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, edit.oldEndIndex, \"i32\");\n  address += SIZE_OF_INT;\n  C.setValue(address, edit.newEndIndex, \"i32\");\n  address += SIZE_OF_INT;\n}\n__name(marshalEdit, \"marshalEdit\");\nfunction unmarshalLanguageMetadata(address) {\n  const major_version = C.getValue(address, \"i32\");\n  const minor_version = C.getValue(address += SIZE_OF_INT, \"i32\");\n  const patch_version = C.getValue(address += SIZE_OF_INT, \"i32\");\n  return { major_version, minor_version, patch_version };\n}\n__name(unmarshalLanguageMetadata, \"unmarshalLanguageMetadata\");\n\n// src/language.ts\nvar LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\\w+$/;\nvar Language = class _Language {\n  static {\n    __name(this, \"Language\");\n  }\n  /** @internal */\n  [0] = 0;\n  // Internal handle for Wasm\n  /**\n   * A list of all node types in the language. The index of each type in this\n   * array is its node type id.\n   */\n  types;\n  /**\n   * A list of all field names in the language. The index of each field name in\n   * this array is its field id.\n   */\n  fields;\n  /** @internal */\n  constructor(internal, address) {\n    assertInternal(internal);\n    this[0] = address;\n    this.types = new Array(C._ts_language_symbol_count(this[0]));\n    for (let i2 = 0, n = this.types.length; i2 < n; i2++) {\n      if (C._ts_language_symbol_type(this[0], i2) < 2) {\n        this.types[i2] = C.UTF8ToString(C._ts_language_symbol_name(this[0], i2));\n      }\n    }\n    this.fields = new Array(C._ts_language_field_count(this[0]) + 1);\n    for (let i2 = 0, n = this.fields.length; i2 < n; i2++) {\n      const fieldName = C._ts_language_field_name_for_id(this[0], i2);\n      if (fieldName !== 0) {\n        this.fields[i2] = C.UTF8ToString(fieldName);\n      } else {\n        this.fields[i2] = null;\n      }\n    }\n  }\n  /**\n   * Gets the name of the language.\n   */\n  get name() {\n    const ptr = C._ts_language_name(this[0]);\n    if (ptr === 0) return null;\n    return C.UTF8ToString(ptr);\n  }\n  /**\n   * Gets the ABI version of the language.\n   */\n  get abiVersion() {\n    return C._ts_language_abi_version(this[0]);\n  }\n  /**\n  * Get the metadata for this language. This information is generated by the\n  * CLI, and relies on the language author providing the correct metadata in\n  * the language's `tree-sitter.json` file.\n  */\n  get metadata() {\n    C._ts_language_metadata_wasm(this[0]);\n    const length = C.getValue(TRANSFER_BUFFER, \"i32\");\n    if (length === 0) return null;\n    return unmarshalLanguageMetadata(TRANSFER_BUFFER + SIZE_OF_INT);\n  }\n  /**\n   * Gets the number of fields in the language.\n   */\n  get fieldCount() {\n    return this.fields.length - 1;\n  }\n  /**\n   * Gets the number of states in the language.\n   */\n  get stateCount() {\n    return C._ts_language_state_count(this[0]);\n  }\n  /**\n   * Get the field id for a field name.\n   */\n  fieldIdForName(fieldName) {\n    const result = this.fields.indexOf(fieldName);\n    return result !== -1 ? result : null;\n  }\n  /**\n   * Get the field name for a field id.\n   */\n  fieldNameForId(fieldId) {\n    return this.fields[fieldId] ?? null;\n  }\n  /**\n   * Get the node type id for a node type name.\n   */\n  idForNodeType(type, named) {\n    const typeLength = C.lengthBytesUTF8(type);\n    const typeAddress = C._malloc(typeLength + 1);\n    C.stringToUTF8(type, typeAddress, typeLength + 1);\n    const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named ? 1 : 0);\n    C._free(typeAddress);\n    return result || null;\n  }\n  /**\n   * Gets the number of node types in the language.\n   */\n  get nodeTypeCount() {\n    return C._ts_language_symbol_count(this[0]);\n  }\n  /**\n   * Get the node type name for a node type id.\n   */\n  nodeTypeForId(typeId) {\n    const name2 = C._ts_language_symbol_name(this[0], typeId);\n    return name2 ? C.UTF8ToString(name2) : null;\n  }\n  /**\n   * Check if a node type is named.\n   *\n   * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/2-basic-parsing.html#named-vs-anonymous-nodes}\n   */\n  nodeTypeIsNamed(typeId) {\n    return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false;\n  }\n  /**\n   * Check if a node type is visible.\n   */\n  nodeTypeIsVisible(typeId) {\n    return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false;\n  }\n  /**\n   * Get the supertypes ids of this language.\n   *\n   * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.html?highlight=supertype#supertype-nodes}\n   */\n  get supertypes() {\n    C._ts_language_supertypes_wasm(this[0]);\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(count);\n    if (count > 0) {\n      let address = buffer;\n      for (let i2 = 0; i2 < count; i2++) {\n        result[i2] = C.getValue(address, \"i16\");\n        address += SIZE_OF_SHORT;\n      }\n    }\n    return result;\n  }\n  /**\n   * Get the subtype ids for a given supertype node id.\n   */\n  subtypes(supertype) {\n    C._ts_language_subtypes_wasm(this[0], supertype);\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(count);\n    if (count > 0) {\n      let address = buffer;\n      for (let i2 = 0; i2 < count; i2++) {\n        result[i2] = C.getValue(address, \"i16\");\n        address += SIZE_OF_SHORT;\n      }\n    }\n    return result;\n  }\n  /**\n   * Get the next state id for a given state id and node type id.\n   */\n  nextState(stateId, typeId) {\n    return C._ts_language_next_state(this[0], stateId, typeId);\n  }\n  /**\n   * Create a new lookahead iterator for this language and parse state.\n   *\n   * This returns `null` if state is invalid for this language.\n   *\n   * Iterating {@link LookaheadIterator} will yield valid symbols in the given\n   * parse state. Newly created lookahead iterators will return the `ERROR`\n   * symbol from {@link LookaheadIterator#currentType}.\n   *\n   * Lookahead iterators can be useful for generating suggestions and improving\n   * syntax error diagnostics. To get symbols valid in an `ERROR` node, use the\n   * lookahead iterator on its first leaf node state. For `MISSING` nodes, a\n   * lookahead iterator created on the previous non-extra leaf node may be\n   * appropriate.\n   */\n  lookaheadIterator(stateId) {\n    const address = C._ts_lookahead_iterator_new(this[0], stateId);\n    if (address) return new LookaheadIterator(INTERNAL, address, this);\n    return null;\n  }\n  /**\n   * Load a language from a WebAssembly module.\n   * The module can be provided as a path to a file or as a buffer.\n   */\n  static async load(input) {\n    let binary2;\n    if (input instanceof Uint8Array) {\n      binary2 = input;\n    } else if (globalThis.process?.versions.node) {\n      const fs2 = await import(\"fs/promises\");\n      binary2 = await fs2.readFile(input);\n    } else {\n      const response = await fetch(input);\n      if (!response.ok) {\n        const body2 = await response.text();\n        throw new Error(`Language.load failed with status ${response.status}.\n\n${body2}`);\n      }\n      const retryResp = response.clone();\n      try {\n        binary2 = await WebAssembly.compileStreaming(response);\n      } catch (reason) {\n        console.error(\"wasm streaming compile failed:\", reason);\n        console.error(\"falling back to ArrayBuffer instantiation\");\n        binary2 = new Uint8Array(await retryResp.arrayBuffer());\n      }\n    }\n    const mod = await C.loadWebAssemblyModule(binary2, { loadAsync: true });\n    const symbolNames = Object.keys(mod);\n    const functionName = symbolNames.find((key) => LANGUAGE_FUNCTION_REGEX.test(key) && !key.includes(\"external_scanner_\"));\n    if (!functionName) {\n      console.log(`Couldn't find language function in Wasm file. Symbols:\n${JSON.stringify(symbolNames, null, 2)}`);\n      throw new Error(\"Language.load failed: no language function found in Wasm file\");\n    }\n    const languageAddress = mod[functionName]();\n    return new _Language(INTERNAL, languageAddress);\n  }\n};\n\n// lib/web-tree-sitter.mjs\nasync function Module2(moduleArg = {}) {\n  var moduleRtn;\n  var Module = moduleArg;\n  var ENVIRONMENT_IS_WEB = typeof window == \"object\";\n  var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != \"undefined\";\n  var ENVIRONMENT_IS_NODE = typeof process == \"object\" && process.versions?.node && process.type != \"renderer\";\n  if (ENVIRONMENT_IS_NODE) {\n    const { createRequire } = await import(\"module\");\n    var require = createRequire(import.meta.url);\n  }\n  Module.currentQueryProgressCallback = null;\n  Module.currentProgressCallback = null;\n  Module.currentLogCallback = null;\n  Module.currentParseCallback = null;\n  var arguments_ = [];\n  var thisProgram = \"./this.program\";\n  var quit_ = /* @__PURE__ */ __name((status, toThrow) => {\n    throw toThrow;\n  }, \"quit_\");\n  var _scriptName = import.meta.url;\n  var scriptDirectory = \"\";\n  function locateFile(path) {\n    if (Module[\"locateFile\"]) {\n      return Module[\"locateFile\"](path, scriptDirectory);\n    }\n    return scriptDirectory + path;\n  }\n  __name(locateFile, \"locateFile\");\n  var readAsync, readBinary;\n  if (ENVIRONMENT_IS_NODE) {\n    var fs = require(\"fs\");\n    if (_scriptName.startsWith(\"file:\")) {\n      scriptDirectory = require(\"path\").dirname(require(\"url\").fileURLToPath(_scriptName)) + \"/\";\n    }\n    readBinary = /* @__PURE__ */ __name((filename) => {\n      filename = isFileURI(filename) ? new URL(filename) : filename;\n      var ret = fs.readFileSync(filename);\n      return ret;\n    }, \"readBinary\");\n    readAsync = /* @__PURE__ */ __name(async (filename, binary2 = true) => {\n      filename = isFileURI(filename) ? new URL(filename) : filename;\n      var ret = fs.readFileSync(filename, binary2 ? void 0 : \"utf8\");\n      return ret;\n    }, \"readAsync\");\n    if (process.argv.length > 1) {\n      thisProgram = process.argv[1].replace(/\\\\/g, \"/\");\n    }\n    arguments_ = process.argv.slice(2);\n    quit_ = /* @__PURE__ */ __name((status, toThrow) => {\n      process.exitCode = status;\n      throw toThrow;\n    }, \"quit_\");\n  } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n    try {\n      scriptDirectory = new URL(\".\", _scriptName).href;\n    } catch {\n    }\n    {\n      if (ENVIRONMENT_IS_WORKER) {\n        readBinary = /* @__PURE__ */ __name((url) => {\n          var xhr = new XMLHttpRequest();\n          xhr.open(\"GET\", url, false);\n          xhr.responseType = \"arraybuffer\";\n          xhr.send(null);\n          return new Uint8Array(\n            /** @type{!ArrayBuffer} */\n            xhr.response\n          );\n        }, \"readBinary\");\n      }\n      readAsync = /* @__PURE__ */ __name(async (url) => {\n        if (isFileURI(url)) {\n          return new Promise((resolve, reject) => {\n            var xhr = new XMLHttpRequest();\n            xhr.open(\"GET\", url, true);\n            xhr.responseType = \"arraybuffer\";\n            xhr.onload = () => {\n              if (xhr.status == 200 || xhr.status == 0 && xhr.response) {\n                resolve(xhr.response);\n                return;\n              }\n              reject(xhr.status);\n            };\n            xhr.onerror = reject;\n            xhr.send(null);\n          });\n        }\n        var response = await fetch(url, {\n          credentials: \"same-origin\"\n        });\n        if (response.ok) {\n          return response.arrayBuffer();\n        }\n        throw new Error(response.status + \" : \" + response.url);\n      }, \"readAsync\");\n    }\n  } else {\n  }\n  var out = console.log.bind(console);\n  var err = console.error.bind(console);\n  var dynamicLibraries = [];\n  var wasmBinary;\n  var ABORT = false;\n  var EXITSTATUS;\n  var isFileURI = /* @__PURE__ */ __name((filename) => filename.startsWith(\"file://\"), \"isFileURI\");\n  var readyPromiseResolve, readyPromiseReject;\n  var wasmMemory;\n  var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n  var HEAP64, HEAPU64;\n  var HEAP_DATA_VIEW;\n  var runtimeInitialized = false;\n  function updateMemoryViews() {\n    var b = wasmMemory.buffer;\n    Module[\"HEAP8\"] = HEAP8 = new Int8Array(b);\n    Module[\"HEAP16\"] = HEAP16 = new Int16Array(b);\n    Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(b);\n    Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(b);\n    Module[\"HEAP32\"] = HEAP32 = new Int32Array(b);\n    Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(b);\n    Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(b);\n    Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(b);\n    Module[\"HEAP64\"] = HEAP64 = new BigInt64Array(b);\n    Module[\"HEAPU64\"] = HEAPU64 = new BigUint64Array(b);\n    Module[\"HEAP_DATA_VIEW\"] = HEAP_DATA_VIEW = new DataView(b);\n    LE_HEAP_UPDATE();\n  }\n  __name(updateMemoryViews, \"updateMemoryViews\");\n  function initMemory() {\n    if (Module[\"wasmMemory\"]) {\n      wasmMemory = Module[\"wasmMemory\"];\n    } else {\n      var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 33554432;\n      wasmMemory = new WebAssembly.Memory({\n        \"initial\": INITIAL_MEMORY / 65536,\n        // In theory we should not need to emit the maximum if we want \"unlimited\"\n        // or 4GB of memory, but VMs error on that atm, see\n        // https://github.com/emscripten-core/emscripten/issues/14130\n        // And in the pthreads case we definitely need to emit a maximum. So\n        // always emit one.\n        \"maximum\": 32768\n      });\n    }\n    updateMemoryViews();\n  }\n  __name(initMemory, \"initMemory\");\n  var __RELOC_FUNCS__ = [];\n  function preRun() {\n    if (Module[\"preRun\"]) {\n      if (typeof Module[\"preRun\"] == \"function\") Module[\"preRun\"] = [Module[\"preRun\"]];\n      while (Module[\"preRun\"].length) {\n        addOnPreRun(Module[\"preRun\"].shift());\n      }\n    }\n    callRuntimeCallbacks(onPreRuns);\n  }\n  __name(preRun, \"preRun\");\n  function initRuntime() {\n    runtimeInitialized = true;\n    callRuntimeCallbacks(__RELOC_FUNCS__);\n    wasmExports[\"__wasm_call_ctors\"]();\n    callRuntimeCallbacks(onPostCtors);\n  }\n  __name(initRuntime, \"initRuntime\");\n  function preMain() {\n  }\n  __name(preMain, \"preMain\");\n  function postRun() {\n    if (Module[\"postRun\"]) {\n      if (typeof Module[\"postRun\"] == \"function\") Module[\"postRun\"] = [Module[\"postRun\"]];\n      while (Module[\"postRun\"].length) {\n        addOnPostRun(Module[\"postRun\"].shift());\n      }\n    }\n    callRuntimeCallbacks(onPostRuns);\n  }\n  __name(postRun, \"postRun\");\n  function abort(what) {\n    Module[\"onAbort\"]?.(what);\n    what = \"Aborted(\" + what + \")\";\n    err(what);\n    ABORT = true;\n    what += \". Build with -sASSERTIONS for more info.\";\n    var e = new WebAssembly.RuntimeError(what);\n    readyPromiseReject?.(e);\n    throw e;\n  }\n  __name(abort, \"abort\");\n  var wasmBinaryFile;\n  function findWasmBinary() {\n    if (Module[\"locateFile\"]) {\n      return locateFile(\"web-tree-sitter.wasm\");\n    }\n    return new URL(\"web-tree-sitter.wasm\", import.meta.url).href;\n  }\n  __name(findWasmBinary, \"findWasmBinary\");\n  function getBinarySync(file) {\n    if (file == wasmBinaryFile && wasmBinary) {\n      return new Uint8Array(wasmBinary);\n    }\n    if (readBinary) {\n      return readBinary(file);\n    }\n    throw \"both async and sync fetching of the wasm failed\";\n  }\n  __name(getBinarySync, \"getBinarySync\");\n  async function getWasmBinary(binaryFile) {\n    if (!wasmBinary) {\n      try {\n        var response = await readAsync(binaryFile);\n        return new Uint8Array(response);\n      } catch {\n      }\n    }\n    return getBinarySync(binaryFile);\n  }\n  __name(getWasmBinary, \"getWasmBinary\");\n  async function instantiateArrayBuffer(binaryFile, imports) {\n    try {\n      var binary2 = await getWasmBinary(binaryFile);\n      var instance2 = await WebAssembly.instantiate(binary2, imports);\n      return instance2;\n    } catch (reason) {\n      err(`failed to asynchronously prepare wasm: ${reason}`);\n      abort(reason);\n    }\n  }\n  __name(instantiateArrayBuffer, \"instantiateArrayBuffer\");\n  async function instantiateAsync(binary2, binaryFile, imports) {\n    if (!binary2 && !isFileURI(binaryFile) && !ENVIRONMENT_IS_NODE) {\n      try {\n        var response = fetch(binaryFile, {\n          credentials: \"same-origin\"\n        });\n        var instantiationResult = await WebAssembly.instantiateStreaming(response, imports);\n        return instantiationResult;\n      } catch (reason) {\n        err(`wasm streaming compile failed: ${reason}`);\n        err(\"falling back to ArrayBuffer instantiation\");\n      }\n    }\n    return instantiateArrayBuffer(binaryFile, imports);\n  }\n  __name(instantiateAsync, \"instantiateAsync\");\n  function getWasmImports() {\n    return {\n      \"env\": wasmImports,\n      \"wasi_snapshot_preview1\": wasmImports,\n      \"GOT.mem\": new Proxy(wasmImports, GOTHandler),\n      \"GOT.func\": new Proxy(wasmImports, GOTHandler)\n    };\n  }\n  __name(getWasmImports, \"getWasmImports\");\n  async function createWasm() {\n    function receiveInstance(instance2, module2) {\n      wasmExports = instance2.exports;\n      wasmExports = relocateExports(wasmExports, 1024);\n      var metadata2 = getDylinkMetadata(module2);\n      if (metadata2.neededDynlibs) {\n        dynamicLibraries = metadata2.neededDynlibs.concat(dynamicLibraries);\n      }\n      mergeLibSymbols(wasmExports, \"main\");\n      LDSO.init();\n      loadDylibs();\n      __RELOC_FUNCS__.push(wasmExports[\"__wasm_apply_data_relocs\"]);\n      assignWasmExports(wasmExports);\n      return wasmExports;\n    }\n    __name(receiveInstance, \"receiveInstance\");\n    function receiveInstantiationResult(result2) {\n      return receiveInstance(result2[\"instance\"], result2[\"module\"]);\n    }\n    __name(receiveInstantiationResult, \"receiveInstantiationResult\");\n    var info2 = getWasmImports();\n    if (Module[\"instantiateWasm\"]) {\n      return new Promise((resolve, reject) => {\n        Module[\"instantiateWasm\"](info2, (mod, inst) => {\n          resolve(receiveInstance(mod, inst));\n        });\n      });\n    }\n    wasmBinaryFile ??= findWasmBinary();\n    var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info2);\n    var exports = receiveInstantiationResult(result);\n    return exports;\n  }\n  __name(createWasm, \"createWasm\");\n  class ExitStatus {\n    static {\n      __name(this, \"ExitStatus\");\n    }\n    name = \"ExitStatus\";\n    constructor(status) {\n      this.message = `Program terminated with exit(${status})`;\n      this.status = status;\n    }\n  }\n  var GOT = {};\n  var currentModuleWeakSymbols = /* @__PURE__ */ new Set([]);\n  var GOTHandler = {\n    get(obj, symName) {\n      var rtn = GOT[symName];\n      if (!rtn) {\n        rtn = GOT[symName] = new WebAssembly.Global({\n          \"value\": \"i32\",\n          \"mutable\": true\n        });\n      }\n      if (!currentModuleWeakSymbols.has(symName)) {\n        rtn.required = true;\n      }\n      return rtn;\n    }\n  };\n  var LE_ATOMICS_NATIVE_BYTE_ORDER = [];\n  var LE_HEAP_LOAD_F32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getFloat32(byteOffset, true), \"LE_HEAP_LOAD_F32\");\n  var LE_HEAP_LOAD_F64 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getFloat64(byteOffset, true), \"LE_HEAP_LOAD_F64\");\n  var LE_HEAP_LOAD_I16 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getInt16(byteOffset, true), \"LE_HEAP_LOAD_I16\");\n  var LE_HEAP_LOAD_I32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getInt32(byteOffset, true), \"LE_HEAP_LOAD_I32\");\n  var LE_HEAP_LOAD_I64 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getBigInt64(byteOffset, true), \"LE_HEAP_LOAD_I64\");\n  var LE_HEAP_LOAD_U32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getUint32(byteOffset, true), \"LE_HEAP_LOAD_U32\");\n  var LE_HEAP_STORE_F32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setFloat32(byteOffset, value, true), \"LE_HEAP_STORE_F32\");\n  var LE_HEAP_STORE_F64 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setFloat64(byteOffset, value, true), \"LE_HEAP_STORE_F64\");\n  var LE_HEAP_STORE_I16 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setInt16(byteOffset, value, true), \"LE_HEAP_STORE_I16\");\n  var LE_HEAP_STORE_I32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setInt32(byteOffset, value, true), \"LE_HEAP_STORE_I32\");\n  var LE_HEAP_STORE_I64 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setBigInt64(byteOffset, value, true), \"LE_HEAP_STORE_I64\");\n  var LE_HEAP_STORE_U32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setUint32(byteOffset, value, true), \"LE_HEAP_STORE_U32\");\n  var callRuntimeCallbacks = /* @__PURE__ */ __name((callbacks) => {\n    while (callbacks.length > 0) {\n      callbacks.shift()(Module);\n    }\n  }, \"callRuntimeCallbacks\");\n  var onPostRuns = [];\n  var addOnPostRun = /* @__PURE__ */ __name((cb) => onPostRuns.push(cb), \"addOnPostRun\");\n  var onPreRuns = [];\n  var addOnPreRun = /* @__PURE__ */ __name((cb) => onPreRuns.push(cb), \"addOnPreRun\");\n  var UTF8Decoder = typeof TextDecoder != \"undefined\" ? new TextDecoder() : void 0;\n  var findStringEnd = /* @__PURE__ */ __name((heapOrArray, idx, maxBytesToRead, ignoreNul) => {\n    var maxIdx = idx + maxBytesToRead;\n    if (ignoreNul) return maxIdx;\n    while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx;\n    return idx;\n  }, \"findStringEnd\");\n  var UTF8ArrayToString = /* @__PURE__ */ __name((heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => {\n    var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul);\n    if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n      return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n    }\n    var str = \"\";\n    while (idx < endPtr) {\n      var u0 = heapOrArray[idx++];\n      if (!(u0 & 128)) {\n        str += String.fromCharCode(u0);\n        continue;\n      }\n      var u1 = heapOrArray[idx++] & 63;\n      if ((u0 & 224) == 192) {\n        str += String.fromCharCode((u0 & 31) << 6 | u1);\n        continue;\n      }\n      var u2 = heapOrArray[idx++] & 63;\n      if ((u0 & 240) == 224) {\n        u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n      } else {\n        u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63;\n      }\n      if (u0 < 65536) {\n        str += String.fromCharCode(u0);\n      } else {\n        var ch = u0 - 65536;\n        str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n      }\n    }\n    return str;\n  }, \"UTF8ArrayToString\");\n  var getDylinkMetadata = /* @__PURE__ */ __name((binary2) => {\n    var offset = 0;\n    var end = 0;\n    function getU8() {\n      return binary2[offset++];\n    }\n    __name(getU8, \"getU8\");\n    function getLEB() {\n      var ret = 0;\n      var mul = 1;\n      while (1) {\n        var byte = binary2[offset++];\n        ret += (byte & 127) * mul;\n        mul *= 128;\n        if (!(byte & 128)) break;\n      }\n      return ret;\n    }\n    __name(getLEB, \"getLEB\");\n    function getString() {\n      var len = getLEB();\n      offset += len;\n      return UTF8ArrayToString(binary2, offset - len, len);\n    }\n    __name(getString, \"getString\");\n    function getStringList() {\n      var count2 = getLEB();\n      var rtn = [];\n      while (count2--) rtn.push(getString());\n      return rtn;\n    }\n    __name(getStringList, \"getStringList\");\n    function failIf(condition, message) {\n      if (condition) throw new Error(message);\n    }\n    __name(failIf, \"failIf\");\n    if (binary2 instanceof WebAssembly.Module) {\n      var dylinkSection = WebAssembly.Module.customSections(binary2, \"dylink.0\");\n      failIf(dylinkSection.length === 0, \"need dylink section\");\n      binary2 = new Uint8Array(dylinkSection[0]);\n      end = binary2.length;\n    } else {\n      var int32View = new Uint32Array(new Uint8Array(binary2.subarray(0, 24)).buffer);\n      var magicNumberFound = int32View[0] == 1836278016 || int32View[0] == 6386541;\n      failIf(!magicNumberFound, \"need to see wasm magic number\");\n      failIf(binary2[8] !== 0, \"need the dylink section to be first\");\n      offset = 9;\n      var section_size = getLEB();\n      end = offset + section_size;\n      var name2 = getString();\n      failIf(name2 !== \"dylink.0\");\n    }\n    var customSection = {\n      neededDynlibs: [],\n      tlsExports: /* @__PURE__ */ new Set(),\n      weakImports: /* @__PURE__ */ new Set(),\n      runtimePaths: []\n    };\n    var WASM_DYLINK_MEM_INFO = 1;\n    var WASM_DYLINK_NEEDED = 2;\n    var WASM_DYLINK_EXPORT_INFO = 3;\n    var WASM_DYLINK_IMPORT_INFO = 4;\n    var WASM_DYLINK_RUNTIME_PATH = 5;\n    var WASM_SYMBOL_TLS = 256;\n    var WASM_SYMBOL_BINDING_MASK = 3;\n    var WASM_SYMBOL_BINDING_WEAK = 1;\n    while (offset < end) {\n      var subsectionType = getU8();\n      var subsectionSize = getLEB();\n      if (subsectionType === WASM_DYLINK_MEM_INFO) {\n        customSection.memorySize = getLEB();\n        customSection.memoryAlign = getLEB();\n        customSection.tableSize = getLEB();\n        customSection.tableAlign = getLEB();\n      } else if (subsectionType === WASM_DYLINK_NEEDED) {\n        customSection.neededDynlibs = getStringList();\n      } else if (subsectionType === WASM_DYLINK_EXPORT_INFO) {\n        var count = getLEB();\n        while (count--) {\n          var symname = getString();\n          var flags2 = getLEB();\n          if (flags2 & WASM_SYMBOL_TLS) {\n            customSection.tlsExports.add(symname);\n          }\n        }\n      } else if (subsectionType === WASM_DYLINK_IMPORT_INFO) {\n        var count = getLEB();\n        while (count--) {\n          var modname = getString();\n          var symname = getString();\n          var flags2 = getLEB();\n          if ((flags2 & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) {\n            customSection.weakImports.add(symname);\n          }\n        }\n      } else if (subsectionType === WASM_DYLINK_RUNTIME_PATH) {\n        customSection.runtimePaths = getStringList();\n      } else {\n        offset += subsectionSize;\n      }\n    }\n    return customSection;\n  }, \"getDylinkMetadata\");\n  function getValue(ptr, type = \"i8\") {\n    if (type.endsWith(\"*\")) type = \"*\";\n    switch (type) {\n      case \"i1\":\n        return HEAP8[ptr];\n      case \"i8\":\n        return HEAP8[ptr];\n      case \"i16\":\n        return LE_HEAP_LOAD_I16((ptr >> 1) * 2);\n      case \"i32\":\n        return LE_HEAP_LOAD_I32((ptr >> 2) * 4);\n      case \"i64\":\n        return LE_HEAP_LOAD_I64((ptr >> 3) * 8);\n      case \"float\":\n        return LE_HEAP_LOAD_F32((ptr >> 2) * 4);\n      case \"double\":\n        return LE_HEAP_LOAD_F64((ptr >> 3) * 8);\n      case \"*\":\n        return LE_HEAP_LOAD_U32((ptr >> 2) * 4);\n      default:\n        abort(`invalid type for getValue: ${type}`);\n    }\n  }\n  __name(getValue, \"getValue\");\n  var newDSO = /* @__PURE__ */ __name((name2, handle2, syms) => {\n    var dso = {\n      refcount: Infinity,\n      name: name2,\n      exports: syms,\n      global: true\n    };\n    LDSO.loadedLibsByName[name2] = dso;\n    if (handle2 != void 0) {\n      LDSO.loadedLibsByHandle[handle2] = dso;\n    }\n    return dso;\n  }, \"newDSO\");\n  var LDSO = {\n    loadedLibsByName: {},\n    loadedLibsByHandle: {},\n    init() {\n      newDSO(\"__main__\", 0, wasmImports);\n    }\n  };\n  var ___heap_base = 78240;\n  var alignMemory = /* @__PURE__ */ __name((size, alignment) => Math.ceil(size / alignment) * alignment, \"alignMemory\");\n  var getMemory = /* @__PURE__ */ __name((size) => {\n    if (runtimeInitialized) {\n      return _calloc(size, 1);\n    }\n    var ret = ___heap_base;\n    var end = ret + alignMemory(size, 16);\n    ___heap_base = end;\n    GOT[\"__heap_base\"].value = end;\n    return ret;\n  }, \"getMemory\");\n  var isInternalSym = /* @__PURE__ */ __name((symName) => [\"__cpp_exception\", \"__c_longjmp\", \"__wasm_apply_data_relocs\", \"__dso_handle\", \"__tls_size\", \"__tls_align\", \"__set_stack_limits\", \"_emscripten_tls_init\", \"__wasm_init_tls\", \"__wasm_call_ctors\", \"__start_em_asm\", \"__stop_em_asm\", \"__start_em_js\", \"__stop_em_js\"].includes(symName) || symName.startsWith(\"__em_js__\"), \"isInternalSym\");\n  var uleb128EncodeWithLen = /* @__PURE__ */ __name((arr) => {\n    const n = arr.length;\n    return [n % 128 | 128, n >> 7, ...arr];\n  }, \"uleb128EncodeWithLen\");\n  var wasmTypeCodes = {\n    \"i\": 127,\n    // i32\n    \"p\": 127,\n    // i32\n    \"j\": 126,\n    // i64\n    \"f\": 125,\n    // f32\n    \"d\": 124,\n    // f64\n    \"e\": 111\n  };\n  var generateTypePack = /* @__PURE__ */ __name((types) => uleb128EncodeWithLen(Array.from(types, (type) => {\n    var code = wasmTypeCodes[type];\n    return code;\n  })), \"generateTypePack\");\n  var convertJsFunctionToWasm = /* @__PURE__ */ __name((func2, sig) => {\n    var bytes = Uint8Array.of(\n      0,\n      97,\n      115,\n      109,\n      // magic (\"\\0asm\")\n      1,\n      0,\n      0,\n      0,\n      // version: 1\n      1,\n      ...uleb128EncodeWithLen([\n        1,\n        // count: 1\n        96,\n        // param types\n        ...generateTypePack(sig.slice(1)),\n        // return types (for now only supporting [] if `void` and single [T] otherwise)\n        ...generateTypePack(sig[0] === \"v\" ? \"\" : sig[0])\n      ]),\n      // The rest of the module is static\n      2,\n      7,\n      // import section\n      // (import \"e\" \"f\" (func 0 (type 0)))\n      1,\n      1,\n      101,\n      1,\n      102,\n      0,\n      0,\n      7,\n      5,\n      // export section\n      // (export \"f\" (func 0 (type 0)))\n      1,\n      1,\n      102,\n      0,\n      0\n    );\n    var module2 = new WebAssembly.Module(bytes);\n    var instance2 = new WebAssembly.Instance(module2, {\n      \"e\": {\n        \"f\": func2\n      }\n    });\n    var wrappedFunc = instance2.exports[\"f\"];\n    return wrappedFunc;\n  }, \"convertJsFunctionToWasm\");\n  var wasmTableMirror = [];\n  var wasmTable = new WebAssembly.Table({\n    \"initial\": 31,\n    \"element\": \"anyfunc\"\n  });\n  var getWasmTableEntry = /* @__PURE__ */ __name((funcPtr) => {\n    var func2 = wasmTableMirror[funcPtr];\n    if (!func2) {\n      wasmTableMirror[funcPtr] = func2 = wasmTable.get(funcPtr);\n    }\n    return func2;\n  }, \"getWasmTableEntry\");\n  var updateTableMap = /* @__PURE__ */ __name((offset, count) => {\n    if (functionsInTableMap) {\n      for (var i2 = offset; i2 < offset + count; i2++) {\n        var item = getWasmTableEntry(i2);\n        if (item) {\n          functionsInTableMap.set(item, i2);\n        }\n      }\n    }\n  }, \"updateTableMap\");\n  var functionsInTableMap;\n  var getFunctionAddress = /* @__PURE__ */ __name((func2) => {\n    if (!functionsInTableMap) {\n      functionsInTableMap = /* @__PURE__ */ new WeakMap();\n      updateTableMap(0, wasmTable.length);\n    }\n    return functionsInTableMap.get(func2) || 0;\n  }, \"getFunctionAddress\");\n  var freeTableIndexes = [];\n  var getEmptyTableSlot = /* @__PURE__ */ __name(() => {\n    if (freeTableIndexes.length) {\n      return freeTableIndexes.pop();\n    }\n    return wasmTable[\"grow\"](1);\n  }, \"getEmptyTableSlot\");\n  var setWasmTableEntry = /* @__PURE__ */ __name((idx, func2) => {\n    wasmTable.set(idx, func2);\n    wasmTableMirror[idx] = wasmTable.get(idx);\n  }, \"setWasmTableEntry\");\n  var addFunction = /* @__PURE__ */ __name((func2, sig) => {\n    var rtn = getFunctionAddress(func2);\n    if (rtn) {\n      return rtn;\n    }\n    var ret = getEmptyTableSlot();\n    try {\n      setWasmTableEntry(ret, func2);\n    } catch (err2) {\n      if (!(err2 instanceof TypeError)) {\n        throw err2;\n      }\n      var wrapped = convertJsFunctionToWasm(func2, sig);\n      setWasmTableEntry(ret, wrapped);\n    }\n    functionsInTableMap.set(func2, ret);\n    return ret;\n  }, \"addFunction\");\n  var updateGOT = /* @__PURE__ */ __name((exports, replace) => {\n    for (var symName in exports) {\n      if (isInternalSym(symName)) {\n        continue;\n      }\n      var value = exports[symName];\n      GOT[symName] ||= new WebAssembly.Global({\n        \"value\": \"i32\",\n        \"mutable\": true\n      });\n      if (replace || GOT[symName].value == 0) {\n        if (typeof value == \"function\") {\n          GOT[symName].value = addFunction(value);\n        } else if (typeof value == \"number\") {\n          GOT[symName].value = value;\n        } else {\n          err(`unhandled export type for '${symName}': ${typeof value}`);\n        }\n      }\n    }\n  }, \"updateGOT\");\n  var relocateExports = /* @__PURE__ */ __name((exports, memoryBase2, replace) => {\n    var relocated = {};\n    for (var e in exports) {\n      var value = exports[e];\n      if (typeof value == \"object\") {\n        value = value.value;\n      }\n      if (typeof value == \"number\") {\n        value += memoryBase2;\n      }\n      relocated[e] = value;\n    }\n    updateGOT(relocated, replace);\n    return relocated;\n  }, \"relocateExports\");\n  var isSymbolDefined = /* @__PURE__ */ __name((symName) => {\n    var existing = wasmImports[symName];\n    if (!existing || existing.stub) {\n      return false;\n    }\n    return true;\n  }, \"isSymbolDefined\");\n  var dynCall = /* @__PURE__ */ __name((sig, ptr, args2 = [], promising = false) => {\n    var func2 = getWasmTableEntry(ptr);\n    var rtn = func2(...args2);\n    function convert(rtn2) {\n      return rtn2;\n    }\n    __name(convert, \"convert\");\n    return convert(rtn);\n  }, \"dynCall\");\n  var stackSave = /* @__PURE__ */ __name(() => _emscripten_stack_get_current(), \"stackSave\");\n  var stackRestore = /* @__PURE__ */ __name((val) => __emscripten_stack_restore(val), \"stackRestore\");\n  var createInvokeFunction = /* @__PURE__ */ __name((sig) => (ptr, ...args2) => {\n    var sp = stackSave();\n    try {\n      return dynCall(sig, ptr, args2);\n    } catch (e) {\n      stackRestore(sp);\n      if (e !== e + 0) throw e;\n      _setThrew(1, 0);\n      if (sig[0] == \"j\") return 0n;\n    }\n  }, \"createInvokeFunction\");\n  var resolveGlobalSymbol = /* @__PURE__ */ __name((symName, direct = false) => {\n    var sym;\n    if (isSymbolDefined(symName)) {\n      sym = wasmImports[symName];\n    } else if (symName.startsWith(\"invoke_\")) {\n      sym = wasmImports[symName] = createInvokeFunction(symName.split(\"_\")[1]);\n    }\n    return {\n      sym,\n      name: symName\n    };\n  }, \"resolveGlobalSymbol\");\n  var onPostCtors = [];\n  var addOnPostCtor = /* @__PURE__ */ __name((cb) => onPostCtors.push(cb), \"addOnPostCtor\");\n  var UTF8ToString = /* @__PURE__ */ __name((ptr, maxBytesToRead, ignoreNul) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : \"\", \"UTF8ToString\");\n  var loadWebAssemblyModule = /* @__PURE__ */ __name((binary, flags, libName, localScope, handle) => {\n    var metadata = getDylinkMetadata(binary);\n    function loadModule() {\n      var memAlign = Math.pow(2, metadata.memoryAlign);\n      var memoryBase = metadata.memorySize ? alignMemory(getMemory(metadata.memorySize + memAlign), memAlign) : 0;\n      var tableBase = metadata.tableSize ? wasmTable.length : 0;\n      if (handle) {\n        HEAP8[handle + 8] = 1;\n        LE_HEAP_STORE_U32((handle + 12 >> 2) * 4, memoryBase);\n        LE_HEAP_STORE_I32((handle + 16 >> 2) * 4, metadata.memorySize);\n        LE_HEAP_STORE_U32((handle + 20 >> 2) * 4, tableBase);\n        LE_HEAP_STORE_I32((handle + 24 >> 2) * 4, metadata.tableSize);\n      }\n      if (metadata.tableSize) {\n        wasmTable.grow(metadata.tableSize);\n      }\n      var moduleExports;\n      function resolveSymbol(sym) {\n        var resolved = resolveGlobalSymbol(sym).sym;\n        if (!resolved && localScope) {\n          resolved = localScope[sym];\n        }\n        if (!resolved) {\n          resolved = moduleExports[sym];\n        }\n        return resolved;\n      }\n      __name(resolveSymbol, \"resolveSymbol\");\n      var proxyHandler = {\n        get(stubs, prop) {\n          switch (prop) {\n            case \"__memory_base\":\n              return memoryBase;\n            case \"__table_base\":\n              return tableBase;\n          }\n          if (prop in wasmImports && !wasmImports[prop].stub) {\n            var res = wasmImports[prop];\n            return res;\n          }\n          if (!(prop in stubs)) {\n            var resolved;\n            stubs[prop] = (...args2) => {\n              resolved ||= resolveSymbol(prop);\n              return resolved(...args2);\n            };\n          }\n          return stubs[prop];\n        }\n      };\n      var proxy = new Proxy({}, proxyHandler);\n      currentModuleWeakSymbols = metadata.weakImports;\n      var info = {\n        \"GOT.mem\": new Proxy({}, GOTHandler),\n        \"GOT.func\": new Proxy({}, GOTHandler),\n        \"env\": proxy,\n        \"wasi_snapshot_preview1\": proxy\n      };\n      function postInstantiation(module, instance) {\n        updateTableMap(tableBase, metadata.tableSize);\n        moduleExports = relocateExports(instance.exports, memoryBase);\n        if (!flags.allowUndefined) {\n          reportUndefinedSymbols();\n        }\n        function addEmAsm(addr, body) {\n          var args = [];\n          var arity = 0;\n          for (; arity < 16; arity++) {\n            if (body.indexOf(\"$\" + arity) != -1) {\n              args.push(\"$\" + arity);\n            } else {\n              break;\n            }\n          }\n          args = args.join(\",\");\n          var func = `(${args}) => { ${body} };`;\n          ASM_CONSTS[start] = eval(func);\n        }\n        __name(addEmAsm, \"addEmAsm\");\n        if (\"__start_em_asm\" in moduleExports) {\n          var start = moduleExports[\"__start_em_asm\"];\n          var stop = moduleExports[\"__stop_em_asm\"];\n          while (start < stop) {\n            var jsString = UTF8ToString(start);\n            addEmAsm(start, jsString);\n            start = HEAPU8.indexOf(0, start) + 1;\n          }\n        }\n        function addEmJs(name, cSig, body) {\n          var jsArgs = [];\n          cSig = cSig.slice(1, -1);\n          if (cSig != \"void\") {\n            cSig = cSig.split(\",\");\n            for (var i in cSig) {\n              var jsArg = cSig[i].split(\" \").pop();\n              jsArgs.push(jsArg.replace(\"*\", \"\"));\n            }\n          }\n          var func = `(${jsArgs}) => ${body};`;\n          moduleExports[name] = eval(func);\n        }\n        __name(addEmJs, \"addEmJs\");\n        for (var name in moduleExports) {\n          if (name.startsWith(\"__em_js__\")) {\n            var start = moduleExports[name];\n            var jsString = UTF8ToString(start);\n            var parts = jsString.split(\"<::>\");\n            addEmJs(name.replace(\"__em_js__\", \"\"), parts[0], parts[1]);\n            delete moduleExports[name];\n          }\n        }\n        var applyRelocs = moduleExports[\"__wasm_apply_data_relocs\"];\n        if (applyRelocs) {\n          if (runtimeInitialized) {\n            applyRelocs();\n          } else {\n            __RELOC_FUNCS__.push(applyRelocs);\n          }\n        }\n        var init = moduleExports[\"__wasm_call_ctors\"];\n        if (init) {\n          if (runtimeInitialized) {\n            init();\n          } else {\n            addOnPostCtor(init);\n          }\n        }\n        return moduleExports;\n      }\n      __name(postInstantiation, \"postInstantiation\");\n      if (flags.loadAsync) {\n        return (async () => {\n          var instance2;\n          if (binary instanceof WebAssembly.Module) {\n            instance2 = new WebAssembly.Instance(binary, info);\n          } else {\n            ({ module: binary, instance: instance2 } = await WebAssembly.instantiate(binary, info));\n          }\n          return postInstantiation(binary, instance2);\n        })();\n      }\n      var module = binary instanceof WebAssembly.Module ? binary : new WebAssembly.Module(binary);\n      var instance = new WebAssembly.Instance(module, info);\n      return postInstantiation(module, instance);\n    }\n    __name(loadModule, \"loadModule\");\n    flags = {\n      ...flags,\n      rpath: {\n        parentLibPath: libName,\n        paths: metadata.runtimePaths\n      }\n    };\n    if (flags.loadAsync) {\n      return metadata.neededDynlibs.reduce((chain, dynNeeded) => chain.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule);\n    }\n    metadata.neededDynlibs.forEach((needed) => loadDynamicLibrary(needed, flags, localScope));\n    return loadModule();\n  }, \"loadWebAssemblyModule\");\n  var mergeLibSymbols = /* @__PURE__ */ __name((exports, libName2) => {\n    for (var [sym, exp] of Object.entries(exports)) {\n      const setImport = /* @__PURE__ */ __name((target) => {\n        if (!isSymbolDefined(target)) {\n          wasmImports[target] = exp;\n        }\n      }, \"setImport\");\n      setImport(sym);\n      const main_alias = \"__main_argc_argv\";\n      if (sym == \"main\") {\n        setImport(main_alias);\n      }\n      if (sym == main_alias) {\n        setImport(\"main\");\n      }\n    }\n  }, \"mergeLibSymbols\");\n  var asyncLoad = /* @__PURE__ */ __name(async (url) => {\n    var arrayBuffer = await readAsync(url);\n    return new Uint8Array(arrayBuffer);\n  }, \"asyncLoad\");\n  function loadDynamicLibrary(libName2, flags2 = {\n    global: true,\n    nodelete: true\n  }, localScope2, handle2) {\n    var dso = LDSO.loadedLibsByName[libName2];\n    if (dso) {\n      if (!flags2.global) {\n        if (localScope2) {\n          Object.assign(localScope2, dso.exports);\n        }\n      } else if (!dso.global) {\n        dso.global = true;\n        mergeLibSymbols(dso.exports, libName2);\n      }\n      if (flags2.nodelete && dso.refcount !== Infinity) {\n        dso.refcount = Infinity;\n      }\n      dso.refcount++;\n      if (handle2) {\n        LDSO.loadedLibsByHandle[handle2] = dso;\n      }\n      return flags2.loadAsync ? Promise.resolve(true) : true;\n    }\n    dso = newDSO(libName2, handle2, \"loading\");\n    dso.refcount = flags2.nodelete ? Infinity : 1;\n    dso.global = flags2.global;\n    function loadLibData() {\n      if (handle2) {\n        var data = LE_HEAP_LOAD_U32((handle2 + 28 >> 2) * 4);\n        var dataSize = LE_HEAP_LOAD_U32((handle2 + 32 >> 2) * 4);\n        if (data && dataSize) {\n          var libData = HEAP8.slice(data, data + dataSize);\n          return flags2.loadAsync ? Promise.resolve(libData) : libData;\n        }\n      }\n      var libFile = locateFile(libName2);\n      if (flags2.loadAsync) {\n        return asyncLoad(libFile);\n      }\n      if (!readBinary) {\n        throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`);\n      }\n      return readBinary(libFile);\n    }\n    __name(loadLibData, \"loadLibData\");\n    function getExports() {\n      if (flags2.loadAsync) {\n        return loadLibData().then((libData) => loadWebAssemblyModule(libData, flags2, libName2, localScope2, handle2));\n      }\n      return loadWebAssemblyModule(loadLibData(), flags2, libName2, localScope2, handle2);\n    }\n    __name(getExports, \"getExports\");\n    function moduleLoaded(exports) {\n      if (dso.global) {\n        mergeLibSymbols(exports, libName2);\n      } else if (localScope2) {\n        Object.assign(localScope2, exports);\n      }\n      dso.exports = exports;\n    }\n    __name(moduleLoaded, \"moduleLoaded\");\n    if (flags2.loadAsync) {\n      return getExports().then((exports) => {\n        moduleLoaded(exports);\n        return true;\n      });\n    }\n    moduleLoaded(getExports());\n    return true;\n  }\n  __name(loadDynamicLibrary, \"loadDynamicLibrary\");\n  var reportUndefinedSymbols = /* @__PURE__ */ __name(() => {\n    for (var [symName, entry] of Object.entries(GOT)) {\n      if (entry.value == 0) {\n        var value = resolveGlobalSymbol(symName, true).sym;\n        if (!value && !entry.required) {\n          continue;\n        }\n        if (typeof value == \"function\") {\n          entry.value = addFunction(value, value.sig);\n        } else if (typeof value == \"number\") {\n          entry.value = value;\n        } else {\n          throw new Error(`bad export type for '${symName}': ${typeof value}`);\n        }\n      }\n    }\n  }, \"reportUndefinedSymbols\");\n  var runDependencies = 0;\n  var dependenciesFulfilled = null;\n  var removeRunDependency = /* @__PURE__ */ __name((id) => {\n    runDependencies--;\n    Module[\"monitorRunDependencies\"]?.(runDependencies);\n    if (runDependencies == 0) {\n      if (dependenciesFulfilled) {\n        var callback = dependenciesFulfilled;\n        dependenciesFulfilled = null;\n        callback();\n      }\n    }\n  }, \"removeRunDependency\");\n  var addRunDependency = /* @__PURE__ */ __name((id) => {\n    runDependencies++;\n    Module[\"monitorRunDependencies\"]?.(runDependencies);\n  }, \"addRunDependency\");\n  var loadDylibs = /* @__PURE__ */ __name(async () => {\n    if (!dynamicLibraries.length) {\n      reportUndefinedSymbols();\n      return;\n    }\n    addRunDependency(\"loadDylibs\");\n    for (var lib of dynamicLibraries) {\n      await loadDynamicLibrary(lib, {\n        loadAsync: true,\n        global: true,\n        nodelete: true,\n        allowUndefined: true\n      });\n    }\n    reportUndefinedSymbols();\n    removeRunDependency(\"loadDylibs\");\n  }, \"loadDylibs\");\n  var noExitRuntime = true;\n  function setValue(ptr, value, type = \"i8\") {\n    if (type.endsWith(\"*\")) type = \"*\";\n    switch (type) {\n      case \"i1\":\n        HEAP8[ptr] = value;\n        break;\n      case \"i8\":\n        HEAP8[ptr] = value;\n        break;\n      case \"i16\":\n        LE_HEAP_STORE_I16((ptr >> 1) * 2, value);\n        break;\n      case \"i32\":\n        LE_HEAP_STORE_I32((ptr >> 2) * 4, value);\n        break;\n      case \"i64\":\n        LE_HEAP_STORE_I64((ptr >> 3) * 8, BigInt(value));\n        break;\n      case \"float\":\n        LE_HEAP_STORE_F32((ptr >> 2) * 4, value);\n        break;\n      case \"double\":\n        LE_HEAP_STORE_F64((ptr >> 3) * 8, value);\n        break;\n      case \"*\":\n        LE_HEAP_STORE_U32((ptr >> 2) * 4, value);\n        break;\n      default:\n        abort(`invalid type for setValue: ${type}`);\n    }\n  }\n  __name(setValue, \"setValue\");\n  var ___memory_base = new WebAssembly.Global({\n    \"value\": \"i32\",\n    \"mutable\": false\n  }, 1024);\n  var ___stack_high = 78240;\n  var ___stack_low = 12704;\n  var ___stack_pointer = new WebAssembly.Global({\n    \"value\": \"i32\",\n    \"mutable\": true\n  }, 78240);\n  var ___table_base = new WebAssembly.Global({\n    \"value\": \"i32\",\n    \"mutable\": false\n  }, 1);\n  var __abort_js = /* @__PURE__ */ __name(() => abort(\"\"), \"__abort_js\");\n  __abort_js.sig = \"v\";\n  var getHeapMax = /* @__PURE__ */ __name(() => (\n    // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate\n    // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side\n    // for any code that deals with heap sizes, which would require special\n    // casing all heap size related code to treat 0 specially.\n    2147483648\n  ), \"getHeapMax\");\n  var growMemory = /* @__PURE__ */ __name((size) => {\n    var oldHeapSize = wasmMemory.buffer.byteLength;\n    var pages = (size - oldHeapSize + 65535) / 65536 | 0;\n    try {\n      wasmMemory.grow(pages);\n      updateMemoryViews();\n      return 1;\n    } catch (e) {\n    }\n  }, \"growMemory\");\n  var _emscripten_resize_heap = /* @__PURE__ */ __name((requestedSize) => {\n    var oldSize = HEAPU8.length;\n    requestedSize >>>= 0;\n    var maxHeapSize = getHeapMax();\n    if (requestedSize > maxHeapSize) {\n      return false;\n    }\n    for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n      var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n      overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n      var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536));\n      var replacement = growMemory(newSize);\n      if (replacement) {\n        return true;\n      }\n    }\n    return false;\n  }, \"_emscripten_resize_heap\");\n  _emscripten_resize_heap.sig = \"ip\";\n  var _fd_close = /* @__PURE__ */ __name((fd) => 52, \"_fd_close\");\n  _fd_close.sig = \"ii\";\n  var INT53_MAX = 9007199254740992;\n  var INT53_MIN = -9007199254740992;\n  var bigintToI53Checked = /* @__PURE__ */ __name((num) => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num), \"bigintToI53Checked\");\n  function _fd_seek(fd, offset, whence, newOffset) {\n    offset = bigintToI53Checked(offset);\n    return 70;\n  }\n  __name(_fd_seek, \"_fd_seek\");\n  _fd_seek.sig = \"iijip\";\n  var printCharBuffers = [null, [], []];\n  var printChar = /* @__PURE__ */ __name((stream, curr) => {\n    var buffer = printCharBuffers[stream];\n    if (curr === 0 || curr === 10) {\n      (stream === 1 ? out : err)(UTF8ArrayToString(buffer));\n      buffer.length = 0;\n    } else {\n      buffer.push(curr);\n    }\n  }, \"printChar\");\n  var _fd_write = /* @__PURE__ */ __name((fd, iov, iovcnt, pnum) => {\n    var num = 0;\n    for (var i2 = 0; i2 < iovcnt; i2++) {\n      var ptr = LE_HEAP_LOAD_U32((iov >> 2) * 4);\n      var len = LE_HEAP_LOAD_U32((iov + 4 >> 2) * 4);\n      iov += 8;\n      for (var j = 0; j < len; j++) {\n        printChar(fd, HEAPU8[ptr + j]);\n      }\n      num += len;\n    }\n    LE_HEAP_STORE_U32((pnum >> 2) * 4, num);\n    return 0;\n  }, \"_fd_write\");\n  _fd_write.sig = \"iippp\";\n  function _tree_sitter_log_callback(isLexMessage, messageAddress) {\n    if (Module.currentLogCallback) {\n      const message = UTF8ToString(messageAddress);\n      Module.currentLogCallback(message, isLexMessage !== 0);\n    }\n  }\n  __name(_tree_sitter_log_callback, \"_tree_sitter_log_callback\");\n  function _tree_sitter_parse_callback(inputBufferAddress, index, row, column, lengthAddress) {\n    const INPUT_BUFFER_SIZE = 10 * 1024;\n    const string = Module.currentParseCallback(index, {\n      row,\n      column\n    });\n    if (typeof string === \"string\") {\n      setValue(lengthAddress, string.length, \"i32\");\n      stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE);\n    } else {\n      setValue(lengthAddress, 0, \"i32\");\n    }\n  }\n  __name(_tree_sitter_parse_callback, \"_tree_sitter_parse_callback\");\n  function _tree_sitter_progress_callback(currentOffset, hasError) {\n    if (Module.currentProgressCallback) {\n      return Module.currentProgressCallback({\n        currentOffset,\n        hasError\n      });\n    }\n    return false;\n  }\n  __name(_tree_sitter_progress_callback, \"_tree_sitter_progress_callback\");\n  function _tree_sitter_query_progress_callback(currentOffset) {\n    if (Module.currentQueryProgressCallback) {\n      return Module.currentQueryProgressCallback({\n        currentOffset\n      });\n    }\n    return false;\n  }\n  __name(_tree_sitter_query_progress_callback, \"_tree_sitter_query_progress_callback\");\n  var runtimeKeepaliveCounter = 0;\n  var keepRuntimeAlive = /* @__PURE__ */ __name(() => noExitRuntime || runtimeKeepaliveCounter > 0, \"keepRuntimeAlive\");\n  var _proc_exit = /* @__PURE__ */ __name((code) => {\n    EXITSTATUS = code;\n    if (!keepRuntimeAlive()) {\n      Module[\"onExit\"]?.(code);\n      ABORT = true;\n    }\n    quit_(code, new ExitStatus(code));\n  }, \"_proc_exit\");\n  _proc_exit.sig = \"vi\";\n  var exitJS = /* @__PURE__ */ __name((status, implicit) => {\n    EXITSTATUS = status;\n    _proc_exit(status);\n  }, \"exitJS\");\n  var handleException = /* @__PURE__ */ __name((e) => {\n    if (e instanceof ExitStatus || e == \"unwind\") {\n      return EXITSTATUS;\n    }\n    quit_(1, e);\n  }, \"handleException\");\n  var lengthBytesUTF8 = /* @__PURE__ */ __name((str) => {\n    var len = 0;\n    for (var i2 = 0; i2 < str.length; ++i2) {\n      var c = str.charCodeAt(i2);\n      if (c <= 127) {\n        len++;\n      } else if (c <= 2047) {\n        len += 2;\n      } else if (c >= 55296 && c <= 57343) {\n        len += 4;\n        ++i2;\n      } else {\n        len += 3;\n      }\n    }\n    return len;\n  }, \"lengthBytesUTF8\");\n  var stringToUTF8Array = /* @__PURE__ */ __name((str, heap, outIdx, maxBytesToWrite) => {\n    if (!(maxBytesToWrite > 0)) return 0;\n    var startIdx = outIdx;\n    var endIdx = outIdx + maxBytesToWrite - 1;\n    for (var i2 = 0; i2 < str.length; ++i2) {\n      var u = str.codePointAt(i2);\n      if (u <= 127) {\n        if (outIdx >= endIdx) break;\n        heap[outIdx++] = u;\n      } else if (u <= 2047) {\n        if (outIdx + 1 >= endIdx) break;\n        heap[outIdx++] = 192 | u >> 6;\n        heap[outIdx++] = 128 | u & 63;\n      } else if (u <= 65535) {\n        if (outIdx + 2 >= endIdx) break;\n        heap[outIdx++] = 224 | u >> 12;\n        heap[outIdx++] = 128 | u >> 6 & 63;\n        heap[outIdx++] = 128 | u & 63;\n      } else {\n        if (outIdx + 3 >= endIdx) break;\n        heap[outIdx++] = 240 | u >> 18;\n        heap[outIdx++] = 128 | u >> 12 & 63;\n        heap[outIdx++] = 128 | u >> 6 & 63;\n        heap[outIdx++] = 128 | u & 63;\n        i2++;\n      }\n    }\n    heap[outIdx] = 0;\n    return outIdx - startIdx;\n  }, \"stringToUTF8Array\");\n  var stringToUTF8 = /* @__PURE__ */ __name((str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite), \"stringToUTF8\");\n  var stackAlloc = /* @__PURE__ */ __name((sz) => __emscripten_stack_alloc(sz), \"stackAlloc\");\n  var stringToUTF8OnStack = /* @__PURE__ */ __name((str) => {\n    var size = lengthBytesUTF8(str) + 1;\n    var ret = stackAlloc(size);\n    stringToUTF8(str, ret, size);\n    return ret;\n  }, \"stringToUTF8OnStack\");\n  var AsciiToString = /* @__PURE__ */ __name((ptr) => {\n    var str = \"\";\n    while (1) {\n      var ch = HEAPU8[ptr++];\n      if (!ch) return str;\n      str += String.fromCharCode(ch);\n    }\n  }, \"AsciiToString\");\n  var stringToUTF16 = /* @__PURE__ */ __name((str, outPtr, maxBytesToWrite) => {\n    maxBytesToWrite ??= 2147483647;\n    if (maxBytesToWrite < 2) return 0;\n    maxBytesToWrite -= 2;\n    var startPtr = outPtr;\n    var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;\n    for (var i2 = 0; i2 < numCharsToWrite; ++i2) {\n      var codeUnit = str.charCodeAt(i2);\n      LE_HEAP_STORE_I16((outPtr >> 1) * 2, codeUnit);\n      outPtr += 2;\n    }\n    LE_HEAP_STORE_I16((outPtr >> 1) * 2, 0);\n    return outPtr - startPtr;\n  }, \"stringToUTF16\");\n  LE_ATOMICS_NATIVE_BYTE_ORDER = new Int8Array(new Int16Array([1]).buffer)[0] === 1 ? [\n    /* little endian */\n    ((x) => x),\n    ((x) => x),\n    void 0,\n    ((x) => x)\n  ] : [\n    /* big endian */\n    ((x) => x),\n    ((x) => ((x & 65280) << 8 | (x & 255) << 24) >> 16),\n    void 0,\n    ((x) => x >> 24 & 255 | x >> 8 & 65280 | (x & 65280) << 8 | (x & 255) << 24)\n  ];\n  function LE_HEAP_UPDATE() {\n    HEAPU16.unsigned = ((x) => x & 65535);\n    HEAPU32.unsigned = ((x) => x >>> 0);\n  }\n  __name(LE_HEAP_UPDATE, \"LE_HEAP_UPDATE\");\n  {\n    initMemory();\n    if (Module[\"noExitRuntime\"]) noExitRuntime = Module[\"noExitRuntime\"];\n    if (Module[\"print\"]) out = Module[\"print\"];\n    if (Module[\"printErr\"]) err = Module[\"printErr\"];\n    if (Module[\"dynamicLibraries\"]) dynamicLibraries = Module[\"dynamicLibraries\"];\n    if (Module[\"wasmBinary\"]) wasmBinary = Module[\"wasmBinary\"];\n    if (Module[\"arguments\"]) arguments_ = Module[\"arguments\"];\n    if (Module[\"thisProgram\"]) thisProgram = Module[\"thisProgram\"];\n    if (Module[\"preInit\"]) {\n      if (typeof Module[\"preInit\"] == \"function\") Module[\"preInit\"] = [Module[\"preInit\"]];\n      while (Module[\"preInit\"].length > 0) {\n        Module[\"preInit\"].shift()();\n      }\n    }\n  }\n  Module[\"setValue\"] = setValue;\n  Module[\"getValue\"] = getValue;\n  Module[\"UTF8ToString\"] = UTF8ToString;\n  Module[\"stringToUTF8\"] = stringToUTF8;\n  Module[\"lengthBytesUTF8\"] = lengthBytesUTF8;\n  Module[\"AsciiToString\"] = AsciiToString;\n  Module[\"stringToUTF16\"] = stringToUTF16;\n  Module[\"loadWebAssemblyModule\"] = loadWebAssemblyModule;\n  Module[\"LE_HEAP_STORE_I64\"] = LE_HEAP_STORE_I64;\n  var ASM_CONSTS = {};\n  var _malloc, _calloc, _realloc, _free, _ts_range_edit, _memcmp, _ts_language_symbol_count, _ts_language_state_count, _ts_language_abi_version, _ts_language_name, _ts_language_field_count, _ts_language_next_state, _ts_language_symbol_name, _ts_language_symbol_for_name, _strncmp, _ts_language_symbol_type, _ts_language_field_name_for_id, _ts_lookahead_iterator_new, _ts_lookahead_iterator_delete, _ts_lookahead_iterator_reset_state, _ts_lookahead_iterator_reset, _ts_lookahead_iterator_next, _ts_lookahead_iterator_current_symbol, _ts_point_edit, _ts_parser_delete, _ts_parser_reset, _ts_parser_set_language, _ts_parser_set_included_ranges, _ts_query_new, _ts_query_delete, _iswspace, _iswalnum, _ts_query_pattern_count, _ts_query_capture_count, _ts_query_string_count, _ts_query_capture_name_for_id, _ts_query_capture_quantifier_for_id, _ts_query_string_value_for_id, _ts_query_predicates_for_pattern, _ts_query_start_byte_for_pattern, _ts_query_end_byte_for_pattern, _ts_query_is_pattern_rooted, _ts_query_is_pattern_non_local, _ts_query_is_pattern_guaranteed_at_step, _ts_query_disable_capture, _ts_query_disable_pattern, _ts_tree_copy, _ts_tree_delete, _ts_init, _ts_parser_new_wasm, _ts_parser_enable_logger_wasm, _ts_parser_parse_wasm, _ts_parser_included_ranges_wasm, _ts_language_type_is_named_wasm, _ts_language_type_is_visible_wasm, _ts_language_metadata_wasm, _ts_language_supertypes_wasm, _ts_language_subtypes_wasm, _ts_tree_root_node_wasm, _ts_tree_root_node_with_offset_wasm, _ts_tree_edit_wasm, _ts_tree_included_ranges_wasm, _ts_tree_get_changed_ranges_wasm, _ts_tree_cursor_new_wasm, _ts_tree_cursor_copy_wasm, _ts_tree_cursor_delete_wasm, _ts_tree_cursor_reset_wasm, _ts_tree_cursor_reset_to_wasm, _ts_tree_cursor_goto_first_child_wasm, _ts_tree_cursor_goto_last_child_wasm, _ts_tree_cursor_goto_first_child_for_index_wasm, _ts_tree_cursor_goto_first_child_for_position_wasm, _ts_tree_cursor_goto_next_sibling_wasm, _ts_tree_cursor_goto_previous_sibling_wasm, _ts_tree_cursor_goto_descendant_wasm, _ts_tree_cursor_goto_parent_wasm, _ts_tree_cursor_current_node_type_id_wasm, _ts_tree_cursor_current_node_state_id_wasm, _ts_tree_cursor_current_node_is_named_wasm, _ts_tree_cursor_current_node_is_missing_wasm, _ts_tree_cursor_current_node_id_wasm, _ts_tree_cursor_start_position_wasm, _ts_tree_cursor_end_position_wasm, _ts_tree_cursor_start_index_wasm, _ts_tree_cursor_end_index_wasm, _ts_tree_cursor_current_field_id_wasm, _ts_tree_cursor_current_depth_wasm, _ts_tree_cursor_current_descendant_index_wasm, _ts_tree_cursor_current_node_wasm, _ts_node_symbol_wasm, _ts_node_field_name_for_child_wasm, _ts_node_field_name_for_named_child_wasm, _ts_node_children_by_field_id_wasm, _ts_node_first_child_for_byte_wasm, _ts_node_first_named_child_for_byte_wasm, _ts_node_grammar_symbol_wasm, _ts_node_child_count_wasm, _ts_node_named_child_count_wasm, _ts_node_child_wasm, _ts_node_named_child_wasm, _ts_node_child_by_field_id_wasm, _ts_node_next_sibling_wasm, _ts_node_prev_sibling_wasm, _ts_node_next_named_sibling_wasm, _ts_node_prev_named_sibling_wasm, _ts_node_descendant_count_wasm, _ts_node_parent_wasm, _ts_node_child_with_descendant_wasm, _ts_node_descendant_for_index_wasm, _ts_node_named_descendant_for_index_wasm, _ts_node_descendant_for_position_wasm, _ts_node_named_descendant_for_position_wasm, _ts_node_start_point_wasm, _ts_node_end_point_wasm, _ts_node_start_index_wasm, _ts_node_end_index_wasm, _ts_node_to_string_wasm, _ts_node_children_wasm, _ts_node_named_children_wasm, _ts_node_descendants_of_type_wasm, _ts_node_is_named_wasm, _ts_node_has_changes_wasm, _ts_node_has_error_wasm, _ts_node_is_error_wasm, _ts_node_is_missing_wasm, _ts_node_is_extra_wasm, _ts_node_parse_state_wasm, _ts_node_next_parse_state_wasm, _ts_query_matches_wasm, _ts_query_captures_wasm, _memset, _memcpy, _memmove, _iswalpha, _iswblank, _iswdigit, _iswlower, _iswupper, _iswxdigit, _memchr, _strlen, _strcmp, _strncat, _strncpy, _towlower, _towupper, _setThrew, __emscripten_stack_restore, __emscripten_stack_alloc, _emscripten_stack_get_current, ___wasm_apply_data_relocs;\n  function assignWasmExports(wasmExports2) {\n    Module[\"_malloc\"] = _malloc = wasmExports2[\"malloc\"];\n    Module[\"_calloc\"] = _calloc = wasmExports2[\"calloc\"];\n    Module[\"_realloc\"] = _realloc = wasmExports2[\"realloc\"];\n    Module[\"_free\"] = _free = wasmExports2[\"free\"];\n    Module[\"_ts_range_edit\"] = _ts_range_edit = wasmExports2[\"ts_range_edit\"];\n    Module[\"_memcmp\"] = _memcmp = wasmExports2[\"memcmp\"];\n    Module[\"_ts_language_symbol_count\"] = _ts_language_symbol_count = wasmExports2[\"ts_language_symbol_count\"];\n    Module[\"_ts_language_state_count\"] = _ts_language_state_count = wasmExports2[\"ts_language_state_count\"];\n    Module[\"_ts_language_abi_version\"] = _ts_language_abi_version = wasmExports2[\"ts_language_abi_version\"];\n    Module[\"_ts_language_name\"] = _ts_language_name = wasmExports2[\"ts_language_name\"];\n    Module[\"_ts_language_field_count\"] = _ts_language_field_count = wasmExports2[\"ts_language_field_count\"];\n    Module[\"_ts_language_next_state\"] = _ts_language_next_state = wasmExports2[\"ts_language_next_state\"];\n    Module[\"_ts_language_symbol_name\"] = _ts_language_symbol_name = wasmExports2[\"ts_language_symbol_name\"];\n    Module[\"_ts_language_symbol_for_name\"] = _ts_language_symbol_for_name = wasmExports2[\"ts_language_symbol_for_name\"];\n    Module[\"_strncmp\"] = _strncmp = wasmExports2[\"strncmp\"];\n    Module[\"_ts_language_symbol_type\"] = _ts_language_symbol_type = wasmExports2[\"ts_language_symbol_type\"];\n    Module[\"_ts_language_field_name_for_id\"] = _ts_language_field_name_for_id = wasmExports2[\"ts_language_field_name_for_id\"];\n    Module[\"_ts_lookahead_iterator_new\"] = _ts_lookahead_iterator_new = wasmExports2[\"ts_lookahead_iterator_new\"];\n    Module[\"_ts_lookahead_iterator_delete\"] = _ts_lookahead_iterator_delete = wasmExports2[\"ts_lookahead_iterator_delete\"];\n    Module[\"_ts_lookahead_iterator_reset_state\"] = _ts_lookahead_iterator_reset_state = wasmExports2[\"ts_lookahead_iterator_reset_state\"];\n    Module[\"_ts_lookahead_iterator_reset\"] = _ts_lookahead_iterator_reset = wasmExports2[\"ts_lookahead_iterator_reset\"];\n    Module[\"_ts_lookahead_iterator_next\"] = _ts_lookahead_iterator_next = wasmExports2[\"ts_lookahead_iterator_next\"];\n    Module[\"_ts_lookahead_iterator_current_symbol\"] = _ts_lookahead_iterator_current_symbol = wasmExports2[\"ts_lookahead_iterator_current_symbol\"];\n    Module[\"_ts_point_edit\"] = _ts_point_edit = wasmExports2[\"ts_point_edit\"];\n    Module[\"_ts_parser_delete\"] = _ts_parser_delete = wasmExports2[\"ts_parser_delete\"];\n    Module[\"_ts_parser_reset\"] = _ts_parser_reset = wasmExports2[\"ts_parser_reset\"];\n    Module[\"_ts_parser_set_language\"] = _ts_parser_set_language = wasmExports2[\"ts_parser_set_language\"];\n    Module[\"_ts_parser_set_included_ranges\"] = _ts_parser_set_included_ranges = wasmExports2[\"ts_parser_set_included_ranges\"];\n    Module[\"_ts_query_new\"] = _ts_query_new = wasmExports2[\"ts_query_new\"];\n    Module[\"_ts_query_delete\"] = _ts_query_delete = wasmExports2[\"ts_query_delete\"];\n    Module[\"_iswspace\"] = _iswspace = wasmExports2[\"iswspace\"];\n    Module[\"_iswalnum\"] = _iswalnum = wasmExports2[\"iswalnum\"];\n    Module[\"_ts_query_pattern_count\"] = _ts_query_pattern_count = wasmExports2[\"ts_query_pattern_count\"];\n    Module[\"_ts_query_capture_count\"] = _ts_query_capture_count = wasmExports2[\"ts_query_capture_count\"];\n    Module[\"_ts_query_string_count\"] = _ts_query_string_count = wasmExports2[\"ts_query_string_count\"];\n    Module[\"_ts_query_capture_name_for_id\"] = _ts_query_capture_name_for_id = wasmExports2[\"ts_query_capture_name_for_id\"];\n    Module[\"_ts_query_capture_quantifier_for_id\"] = _ts_query_capture_quantifier_for_id = wasmExports2[\"ts_query_capture_quantifier_for_id\"];\n    Module[\"_ts_query_string_value_for_id\"] = _ts_query_string_value_for_id = wasmExports2[\"ts_query_string_value_for_id\"];\n    Module[\"_ts_query_predicates_for_pattern\"] = _ts_query_predicates_for_pattern = wasmExports2[\"ts_query_predicates_for_pattern\"];\n    Module[\"_ts_query_start_byte_for_pattern\"] = _ts_query_start_byte_for_pattern = wasmExports2[\"ts_query_start_byte_for_pattern\"];\n    Module[\"_ts_query_end_byte_for_pattern\"] = _ts_query_end_byte_for_pattern = wasmExports2[\"ts_query_end_byte_for_pattern\"];\n    Module[\"_ts_query_is_pattern_rooted\"] = _ts_query_is_pattern_rooted = wasmExports2[\"ts_query_is_pattern_rooted\"];\n    Module[\"_ts_query_is_pattern_non_local\"] = _ts_query_is_pattern_non_local = wasmExports2[\"ts_query_is_pattern_non_local\"];\n    Module[\"_ts_query_is_pattern_guaranteed_at_step\"] = _ts_query_is_pattern_guaranteed_at_step = wasmExports2[\"ts_query_is_pattern_guaranteed_at_step\"];\n    Module[\"_ts_query_disable_capture\"] = _ts_query_disable_capture = wasmExports2[\"ts_query_disable_capture\"];\n    Module[\"_ts_query_disable_pattern\"] = _ts_query_disable_pattern = wasmExports2[\"ts_query_disable_pattern\"];\n    Module[\"_ts_tree_copy\"] = _ts_tree_copy = wasmExports2[\"ts_tree_copy\"];\n    Module[\"_ts_tree_delete\"] = _ts_tree_delete = wasmExports2[\"ts_tree_delete\"];\n    Module[\"_ts_init\"] = _ts_init = wasmExports2[\"ts_init\"];\n    Module[\"_ts_parser_new_wasm\"] = _ts_parser_new_wasm = wasmExports2[\"ts_parser_new_wasm\"];\n    Module[\"_ts_parser_enable_logger_wasm\"] = _ts_parser_enable_logger_wasm = wasmExports2[\"ts_parser_enable_logger_wasm\"];\n    Module[\"_ts_parser_parse_wasm\"] = _ts_parser_parse_wasm = wasmExports2[\"ts_parser_parse_wasm\"];\n    Module[\"_ts_parser_included_ranges_wasm\"] = _ts_parser_included_ranges_wasm = wasmExports2[\"ts_parser_included_ranges_wasm\"];\n    Module[\"_ts_language_type_is_named_wasm\"] = _ts_language_type_is_named_wasm = wasmExports2[\"ts_language_type_is_named_wasm\"];\n    Module[\"_ts_language_type_is_visible_wasm\"] = _ts_language_type_is_visible_wasm = wasmExports2[\"ts_language_type_is_visible_wasm\"];\n    Module[\"_ts_language_metadata_wasm\"] = _ts_language_metadata_wasm = wasmExports2[\"ts_language_metadata_wasm\"];\n    Module[\"_ts_language_supertypes_wasm\"] = _ts_language_supertypes_wasm = wasmExports2[\"ts_language_supertypes_wasm\"];\n    Module[\"_ts_language_subtypes_wasm\"] = _ts_language_subtypes_wasm = wasmExports2[\"ts_language_subtypes_wasm\"];\n    Module[\"_ts_tree_root_node_wasm\"] = _ts_tree_root_node_wasm = wasmExports2[\"ts_tree_root_node_wasm\"];\n    Module[\"_ts_tree_root_node_with_offset_wasm\"] = _ts_tree_root_node_with_offset_wasm = wasmExports2[\"ts_tree_root_node_with_offset_wasm\"];\n    Module[\"_ts_tree_edit_wasm\"] = _ts_tree_edit_wasm = wasmExports2[\"ts_tree_edit_wasm\"];\n    Module[\"_ts_tree_included_ranges_wasm\"] = _ts_tree_included_ranges_wasm = wasmExports2[\"ts_tree_included_ranges_wasm\"];\n    Module[\"_ts_tree_get_changed_ranges_wasm\"] = _ts_tree_get_changed_ranges_wasm = wasmExports2[\"ts_tree_get_changed_ranges_wasm\"];\n    Module[\"_ts_tree_cursor_new_wasm\"] = _ts_tree_cursor_new_wasm = wasmExports2[\"ts_tree_cursor_new_wasm\"];\n    Module[\"_ts_tree_cursor_copy_wasm\"] = _ts_tree_cursor_copy_wasm = wasmExports2[\"ts_tree_cursor_copy_wasm\"];\n    Module[\"_ts_tree_cursor_delete_wasm\"] = _ts_tree_cursor_delete_wasm = wasmExports2[\"ts_tree_cursor_delete_wasm\"];\n    Module[\"_ts_tree_cursor_reset_wasm\"] = _ts_tree_cursor_reset_wasm = wasmExports2[\"ts_tree_cursor_reset_wasm\"];\n    Module[\"_ts_tree_cursor_reset_to_wasm\"] = _ts_tree_cursor_reset_to_wasm = wasmExports2[\"ts_tree_cursor_reset_to_wasm\"];\n    Module[\"_ts_tree_cursor_goto_first_child_wasm\"] = _ts_tree_cursor_goto_first_child_wasm = wasmExports2[\"ts_tree_cursor_goto_first_child_wasm\"];\n    Module[\"_ts_tree_cursor_goto_last_child_wasm\"] = _ts_tree_cursor_goto_last_child_wasm = wasmExports2[\"ts_tree_cursor_goto_last_child_wasm\"];\n    Module[\"_ts_tree_cursor_goto_first_child_for_index_wasm\"] = _ts_tree_cursor_goto_first_child_for_index_wasm = wasmExports2[\"ts_tree_cursor_goto_first_child_for_index_wasm\"];\n    Module[\"_ts_tree_cursor_goto_first_child_for_position_wasm\"] = _ts_tree_cursor_goto_first_child_for_position_wasm = wasmExports2[\"ts_tree_cursor_goto_first_child_for_position_wasm\"];\n    Module[\"_ts_tree_cursor_goto_next_sibling_wasm\"] = _ts_tree_cursor_goto_next_sibling_wasm = wasmExports2[\"ts_tree_cursor_goto_next_sibling_wasm\"];\n    Module[\"_ts_tree_cursor_goto_previous_sibling_wasm\"] = _ts_tree_cursor_goto_previous_sibling_wasm = wasmExports2[\"ts_tree_cursor_goto_previous_sibling_wasm\"];\n    Module[\"_ts_tree_cursor_goto_descendant_wasm\"] = _ts_tree_cursor_goto_descendant_wasm = wasmExports2[\"ts_tree_cursor_goto_descendant_wasm\"];\n    Module[\"_ts_tree_cursor_goto_parent_wasm\"] = _ts_tree_cursor_goto_parent_wasm = wasmExports2[\"ts_tree_cursor_goto_parent_wasm\"];\n    Module[\"_ts_tree_cursor_current_node_type_id_wasm\"] = _ts_tree_cursor_current_node_type_id_wasm = wasmExports2[\"ts_tree_cursor_current_node_type_id_wasm\"];\n    Module[\"_ts_tree_cursor_current_node_state_id_wasm\"] = _ts_tree_cursor_current_node_state_id_wasm = wasmExports2[\"ts_tree_cursor_current_node_state_id_wasm\"];\n    Module[\"_ts_tree_cursor_current_node_is_named_wasm\"] = _ts_tree_cursor_current_node_is_named_wasm = wasmExports2[\"ts_tree_cursor_current_node_is_named_wasm\"];\n    Module[\"_ts_tree_cursor_current_node_is_missing_wasm\"] = _ts_tree_cursor_current_node_is_missing_wasm = wasmExports2[\"ts_tree_cursor_current_node_is_missing_wasm\"];\n    Module[\"_ts_tree_cursor_current_node_id_wasm\"] = _ts_tree_cursor_current_node_id_wasm = wasmExports2[\"ts_tree_cursor_current_node_id_wasm\"];\n    Module[\"_ts_tree_cursor_start_position_wasm\"] = _ts_tree_cursor_start_position_wasm = wasmExports2[\"ts_tree_cursor_start_position_wasm\"];\n    Module[\"_ts_tree_cursor_end_position_wasm\"] = _ts_tree_cursor_end_position_wasm = wasmExports2[\"ts_tree_cursor_end_position_wasm\"];\n    Module[\"_ts_tree_cursor_start_index_wasm\"] = _ts_tree_cursor_start_index_wasm = wasmExports2[\"ts_tree_cursor_start_index_wasm\"];\n    Module[\"_ts_tree_cursor_end_index_wasm\"] = _ts_tree_cursor_end_index_wasm = wasmExports2[\"ts_tree_cursor_end_index_wasm\"];\n    Module[\"_ts_tree_cursor_current_field_id_wasm\"] = _ts_tree_cursor_current_field_id_wasm = wasmExports2[\"ts_tree_cursor_current_field_id_wasm\"];\n    Module[\"_ts_tree_cursor_current_depth_wasm\"] = _ts_tree_cursor_current_depth_wasm = wasmExports2[\"ts_tree_cursor_current_depth_wasm\"];\n    Module[\"_ts_tree_cursor_current_descendant_index_wasm\"] = _ts_tree_cursor_current_descendant_index_wasm = wasmExports2[\"ts_tree_cursor_current_descendant_index_wasm\"];\n    Module[\"_ts_tree_cursor_current_node_wasm\"] = _ts_tree_cursor_current_node_wasm = wasmExports2[\"ts_tree_cursor_current_node_wasm\"];\n    Module[\"_ts_node_symbol_wasm\"] = _ts_node_symbol_wasm = wasmExports2[\"ts_node_symbol_wasm\"];\n    Module[\"_ts_node_field_name_for_child_wasm\"] = _ts_node_field_name_for_child_wasm = wasmExports2[\"ts_node_field_name_for_child_wasm\"];\n    Module[\"_ts_node_field_name_for_named_child_wasm\"] = _ts_node_field_name_for_named_child_wasm = wasmExports2[\"ts_node_field_name_for_named_child_wasm\"];\n    Module[\"_ts_node_children_by_field_id_wasm\"] = _ts_node_children_by_field_id_wasm = wasmExports2[\"ts_node_children_by_field_id_wasm\"];\n    Module[\"_ts_node_first_child_for_byte_wasm\"] = _ts_node_first_child_for_byte_wasm = wasmExports2[\"ts_node_first_child_for_byte_wasm\"];\n    Module[\"_ts_node_first_named_child_for_byte_wasm\"] = _ts_node_first_named_child_for_byte_wasm = wasmExports2[\"ts_node_first_named_child_for_byte_wasm\"];\n    Module[\"_ts_node_grammar_symbol_wasm\"] = _ts_node_grammar_symbol_wasm = wasmExports2[\"ts_node_grammar_symbol_wasm\"];\n    Module[\"_ts_node_child_count_wasm\"] = _ts_node_child_count_wasm = wasmExports2[\"ts_node_child_count_wasm\"];\n    Module[\"_ts_node_named_child_count_wasm\"] = _ts_node_named_child_count_wasm = wasmExports2[\"ts_node_named_child_count_wasm\"];\n    Module[\"_ts_node_child_wasm\"] = _ts_node_child_wasm = wasmExports2[\"ts_node_child_wasm\"];\n    Module[\"_ts_node_named_child_wasm\"] = _ts_node_named_child_wasm = wasmExports2[\"ts_node_named_child_wasm\"];\n    Module[\"_ts_node_child_by_field_id_wasm\"] = _ts_node_child_by_field_id_wasm = wasmExports2[\"ts_node_child_by_field_id_wasm\"];\n    Module[\"_ts_node_next_sibling_wasm\"] = _ts_node_next_sibling_wasm = wasmExports2[\"ts_node_next_sibling_wasm\"];\n    Module[\"_ts_node_prev_sibling_wasm\"] = _ts_node_prev_sibling_wasm = wasmExports2[\"ts_node_prev_sibling_wasm\"];\n    Module[\"_ts_node_next_named_sibling_wasm\"] = _ts_node_next_named_sibling_wasm = wasmExports2[\"ts_node_next_named_sibling_wasm\"];\n    Module[\"_ts_node_prev_named_sibling_wasm\"] = _ts_node_prev_named_sibling_wasm = wasmExports2[\"ts_node_prev_named_sibling_wasm\"];\n    Module[\"_ts_node_descendant_count_wasm\"] = _ts_node_descendant_count_wasm = wasmExports2[\"ts_node_descendant_count_wasm\"];\n    Module[\"_ts_node_parent_wasm\"] = _ts_node_parent_wasm = wasmExports2[\"ts_node_parent_wasm\"];\n    Module[\"_ts_node_child_with_descendant_wasm\"] = _ts_node_child_with_descendant_wasm = wasmExports2[\"ts_node_child_with_descendant_wasm\"];\n    Module[\"_ts_node_descendant_for_index_wasm\"] = _ts_node_descendant_for_index_wasm = wasmExports2[\"ts_node_descendant_for_index_wasm\"];\n    Module[\"_ts_node_named_descendant_for_index_wasm\"] = _ts_node_named_descendant_for_index_wasm = wasmExports2[\"ts_node_named_descendant_for_index_wasm\"];\n    Module[\"_ts_node_descendant_for_position_wasm\"] = _ts_node_descendant_for_position_wasm = wasmExports2[\"ts_node_descendant_for_position_wasm\"];\n    Module[\"_ts_node_named_descendant_for_position_wasm\"] = _ts_node_named_descendant_for_position_wasm = wasmExports2[\"ts_node_named_descendant_for_position_wasm\"];\n    Module[\"_ts_node_start_point_wasm\"] = _ts_node_start_point_wasm = wasmExports2[\"ts_node_start_point_wasm\"];\n    Module[\"_ts_node_end_point_wasm\"] = _ts_node_end_point_wasm = wasmExports2[\"ts_node_end_point_wasm\"];\n    Module[\"_ts_node_start_index_wasm\"] = _ts_node_start_index_wasm = wasmExports2[\"ts_node_start_index_wasm\"];\n    Module[\"_ts_node_end_index_wasm\"] = _ts_node_end_index_wasm = wasmExports2[\"ts_node_end_index_wasm\"];\n    Module[\"_ts_node_to_string_wasm\"] = _ts_node_to_string_wasm = wasmExports2[\"ts_node_to_string_wasm\"];\n    Module[\"_ts_node_children_wasm\"] = _ts_node_children_wasm = wasmExports2[\"ts_node_children_wasm\"];\n    Module[\"_ts_node_named_children_wasm\"] = _ts_node_named_children_wasm = wasmExports2[\"ts_node_named_children_wasm\"];\n    Module[\"_ts_node_descendants_of_type_wasm\"] = _ts_node_descendants_of_type_wasm = wasmExports2[\"ts_node_descendants_of_type_wasm\"];\n    Module[\"_ts_node_is_named_wasm\"] = _ts_node_is_named_wasm = wasmExports2[\"ts_node_is_named_wasm\"];\n    Module[\"_ts_node_has_changes_wasm\"] = _ts_node_has_changes_wasm = wasmExports2[\"ts_node_has_changes_wasm\"];\n    Module[\"_ts_node_has_error_wasm\"] = _ts_node_has_error_wasm = wasmExports2[\"ts_node_has_error_wasm\"];\n    Module[\"_ts_node_is_error_wasm\"] = _ts_node_is_error_wasm = wasmExports2[\"ts_node_is_error_wasm\"];\n    Module[\"_ts_node_is_missing_wasm\"] = _ts_node_is_missing_wasm = wasmExports2[\"ts_node_is_missing_wasm\"];\n    Module[\"_ts_node_is_extra_wasm\"] = _ts_node_is_extra_wasm = wasmExports2[\"ts_node_is_extra_wasm\"];\n    Module[\"_ts_node_parse_state_wasm\"] = _ts_node_parse_state_wasm = wasmExports2[\"ts_node_parse_state_wasm\"];\n    Module[\"_ts_node_next_parse_state_wasm\"] = _ts_node_next_parse_state_wasm = wasmExports2[\"ts_node_next_parse_state_wasm\"];\n    Module[\"_ts_query_matches_wasm\"] = _ts_query_matches_wasm = wasmExports2[\"ts_query_matches_wasm\"];\n    Module[\"_ts_query_captures_wasm\"] = _ts_query_captures_wasm = wasmExports2[\"ts_query_captures_wasm\"];\n    Module[\"_memset\"] = _memset = wasmExports2[\"memset\"];\n    Module[\"_memcpy\"] = _memcpy = wasmExports2[\"memcpy\"];\n    Module[\"_memmove\"] = _memmove = wasmExports2[\"memmove\"];\n    Module[\"_iswalpha\"] = _iswalpha = wasmExports2[\"iswalpha\"];\n    Module[\"_iswblank\"] = _iswblank = wasmExports2[\"iswblank\"];\n    Module[\"_iswdigit\"] = _iswdigit = wasmExports2[\"iswdigit\"];\n    Module[\"_iswlower\"] = _iswlower = wasmExports2[\"iswlower\"];\n    Module[\"_iswupper\"] = _iswupper = wasmExports2[\"iswupper\"];\n    Module[\"_iswxdigit\"] = _iswxdigit = wasmExports2[\"iswxdigit\"];\n    Module[\"_memchr\"] = _memchr = wasmExports2[\"memchr\"];\n    Module[\"_strlen\"] = _strlen = wasmExports2[\"strlen\"];\n    Module[\"_strcmp\"] = _strcmp = wasmExports2[\"strcmp\"];\n    Module[\"_strncat\"] = _strncat = wasmExports2[\"strncat\"];\n    Module[\"_strncpy\"] = _strncpy = wasmExports2[\"strncpy\"];\n    Module[\"_towlower\"] = _towlower = wasmExports2[\"towlower\"];\n    Module[\"_towupper\"] = _towupper = wasmExports2[\"towupper\"];\n    _setThrew = wasmExports2[\"setThrew\"];\n    __emscripten_stack_restore = wasmExports2[\"_emscripten_stack_restore\"];\n    __emscripten_stack_alloc = wasmExports2[\"_emscripten_stack_alloc\"];\n    _emscripten_stack_get_current = wasmExports2[\"emscripten_stack_get_current\"];\n    ___wasm_apply_data_relocs = wasmExports2[\"__wasm_apply_data_relocs\"];\n  }\n  __name(assignWasmExports, \"assignWasmExports\");\n  var wasmImports = {\n    /** @export */\n    __heap_base: ___heap_base,\n    /** @export */\n    __indirect_function_table: wasmTable,\n    /** @export */\n    __memory_base: ___memory_base,\n    /** @export */\n    __stack_high: ___stack_high,\n    /** @export */\n    __stack_low: ___stack_low,\n    /** @export */\n    __stack_pointer: ___stack_pointer,\n    /** @export */\n    __table_base: ___table_base,\n    /** @export */\n    _abort_js: __abort_js,\n    /** @export */\n    emscripten_resize_heap: _emscripten_resize_heap,\n    /** @export */\n    fd_close: _fd_close,\n    /** @export */\n    fd_seek: _fd_seek,\n    /** @export */\n    fd_write: _fd_write,\n    /** @export */\n    memory: wasmMemory,\n    /** @export */\n    tree_sitter_log_callback: _tree_sitter_log_callback,\n    /** @export */\n    tree_sitter_parse_callback: _tree_sitter_parse_callback,\n    /** @export */\n    tree_sitter_progress_callback: _tree_sitter_progress_callback,\n    /** @export */\n    tree_sitter_query_progress_callback: _tree_sitter_query_progress_callback\n  };\n  function callMain(args2 = []) {\n    var entryFunction = resolveGlobalSymbol(\"main\").sym;\n    if (!entryFunction) return;\n    args2.unshift(thisProgram);\n    var argc = args2.length;\n    var argv = stackAlloc((argc + 1) * 4);\n    var argv_ptr = argv;\n    args2.forEach((arg) => {\n      LE_HEAP_STORE_U32((argv_ptr >> 2) * 4, stringToUTF8OnStack(arg));\n      argv_ptr += 4;\n    });\n    LE_HEAP_STORE_U32((argv_ptr >> 2) * 4, 0);\n    try {\n      var ret = entryFunction(argc, argv);\n      exitJS(\n        ret,\n        /* implicit = */\n        true\n      );\n      return ret;\n    } catch (e) {\n      return handleException(e);\n    }\n  }\n  __name(callMain, \"callMain\");\n  function run(args2 = arguments_) {\n    if (runDependencies > 0) {\n      dependenciesFulfilled = run;\n      return;\n    }\n    preRun();\n    if (runDependencies > 0) {\n      dependenciesFulfilled = run;\n      return;\n    }\n    function doRun() {\n      Module[\"calledRun\"] = true;\n      if (ABORT) return;\n      initRuntime();\n      preMain();\n      readyPromiseResolve?.(Module);\n      Module[\"onRuntimeInitialized\"]?.();\n      var noInitialRun = Module[\"noInitialRun\"] || false;\n      if (!noInitialRun) callMain(args2);\n      postRun();\n    }\n    __name(doRun, \"doRun\");\n    if (Module[\"setStatus\"]) {\n      Module[\"setStatus\"](\"Running...\");\n      setTimeout(() => {\n        setTimeout(() => Module[\"setStatus\"](\"\"), 1);\n        doRun();\n      }, 1);\n    } else {\n      doRun();\n    }\n  }\n  __name(run, \"run\");\n  var wasmExports;\n  wasmExports = await createWasm();\n  run();\n  if (runtimeInitialized) {\n    moduleRtn = Module;\n  } else {\n    moduleRtn = new Promise((resolve, reject) => {\n      readyPromiseResolve = resolve;\n      readyPromiseReject = reject;\n    });\n  }\n  return moduleRtn;\n}\n__name(Module2, \"Module\");\nvar web_tree_sitter_default = Module2;\n\n// src/bindings.ts\nvar Module3 = null;\nasync function initializeBinding(moduleOptions) {\n  return Module3 ??= await web_tree_sitter_default(moduleOptions);\n}\n__name(initializeBinding, \"initializeBinding\");\nfunction checkModule() {\n  return !!Module3;\n}\n__name(checkModule, \"checkModule\");\n\n// src/parser.ts\nvar TRANSFER_BUFFER;\nvar LANGUAGE_VERSION;\nvar MIN_COMPATIBLE_VERSION;\nvar Parser = class {\n  static {\n    __name(this, \"Parser\");\n  }\n  /** @internal */\n  [0] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  [1] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  logCallback = null;\n  /** The parser's current language. */\n  language = null;\n  /**\n   * This must always be called before creating a Parser.\n   *\n   * You can optionally pass in options to configure the Wasm module, the most common\n   * one being `locateFile` to help the module find the `.wasm` file.\n   */\n  static async init(moduleOptions) {\n    setModule(await initializeBinding(moduleOptions));\n    TRANSFER_BUFFER = C._ts_init();\n    LANGUAGE_VERSION = C.getValue(TRANSFER_BUFFER, \"i32\");\n    MIN_COMPATIBLE_VERSION = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n  }\n  /**\n   * Create a new parser.\n   */\n  constructor() {\n    this.initialize();\n  }\n  /** @internal */\n  initialize() {\n    if (!checkModule()) {\n      throw new Error(\"cannot construct a Parser before calling `init()`\");\n    }\n    C._ts_parser_new_wasm();\n    this[0] = C.getValue(TRANSFER_BUFFER, \"i32\");\n    this[1] = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n  }\n  /** Delete the parser, freeing its resources. */\n  delete() {\n    C._ts_parser_delete(this[0]);\n    C._free(this[1]);\n    this[0] = 0;\n    this[1] = 0;\n  }\n  /**\n   * Set the language that the parser should use for parsing.\n   *\n   * If the language was not successfully assigned, an error will be thrown.\n   * This happens if the language was generated with an incompatible\n   * version of the Tree-sitter CLI. Check the language's version using\n   * {@link Language#version} and compare it to this library's\n   * {@link LANGUAGE_VERSION} and {@link MIN_COMPATIBLE_VERSION} constants.\n   */\n  setLanguage(language) {\n    let address;\n    if (!language) {\n      address = 0;\n      this.language = null;\n    } else if (language.constructor === Language) {\n      address = language[0];\n      const version = C._ts_language_abi_version(address);\n      if (version < MIN_COMPATIBLE_VERSION || LANGUAGE_VERSION < version) {\n        throw new Error(\n          `Incompatible language version ${version}. Compatibility range ${MIN_COMPATIBLE_VERSION} through ${LANGUAGE_VERSION}.`\n        );\n      }\n      this.language = language;\n    } else {\n      throw new Error(\"Argument must be a Language\");\n    }\n    C._ts_parser_set_language(this[0], address);\n    return this;\n  }\n  /**\n   * Parse a slice of UTF8 text.\n   *\n   * @param {string | ParseCallback} callback - The UTF8-encoded text to parse or a callback function.\n   *\n   * @param {Tree | null} [oldTree] - A previous syntax tree parsed from the same document. If the text of the\n   *   document has changed since `oldTree` was created, then you must edit `oldTree` to match\n   *   the new text using {@link Tree#edit}.\n   *\n   * @param {ParseOptions} [options] - Options for parsing the text.\n   *  This can be used to set the included ranges, or a progress callback.\n   *\n   * @returns {Tree | null} A {@link Tree} if parsing succeeded, or `null` if:\n   *  - The parser has not yet had a language assigned with {@link Parser#setLanguage}.\n   *  - The progress callback returned true.\n   */\n  parse(callback, oldTree, options) {\n    if (typeof callback === \"string\") {\n      C.currentParseCallback = (index) => callback.slice(index);\n    } else if (typeof callback === \"function\") {\n      C.currentParseCallback = callback;\n    } else {\n      throw new Error(\"Argument must be a string or a function\");\n    }\n    if (options?.progressCallback) {\n      C.currentProgressCallback = options.progressCallback;\n    } else {\n      C.currentProgressCallback = null;\n    }\n    if (this.logCallback) {\n      C.currentLogCallback = this.logCallback;\n      C._ts_parser_enable_logger_wasm(this[0], 1);\n    } else {\n      C.currentLogCallback = null;\n      C._ts_parser_enable_logger_wasm(this[0], 0);\n    }\n    let rangeCount = 0;\n    let rangeAddress = 0;\n    if (options?.includedRanges) {\n      rangeCount = options.includedRanges.length;\n      rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE);\n      let address = rangeAddress;\n      for (let i2 = 0; i2 < rangeCount; i2++) {\n        marshalRange(address, options.includedRanges[i2]);\n        address += SIZE_OF_RANGE;\n      }\n    }\n    const treeAddress = C._ts_parser_parse_wasm(\n      this[0],\n      this[1],\n      oldTree ? oldTree[0] : 0,\n      rangeAddress,\n      rangeCount\n    );\n    if (!treeAddress) {\n      C.currentParseCallback = null;\n      C.currentLogCallback = null;\n      C.currentProgressCallback = null;\n      return null;\n    }\n    if (!this.language) {\n      throw new Error(\"Parser must have a language to parse\");\n    }\n    const result = new Tree(INTERNAL, treeAddress, this.language, C.currentParseCallback);\n    C.currentParseCallback = null;\n    C.currentLogCallback = null;\n    C.currentProgressCallback = null;\n    return result;\n  }\n  /**\n   * Instruct the parser to start the next parse from the beginning.\n   *\n   * If the parser previously failed because of a callback, \n   * then by default, it will resume where it left off on the\n   * next call to {@link Parser#parse} or other parsing functions.\n   * If you don't want to resume, and instead intend to use this parser to\n   * parse some other document, you must call `reset` first.\n   */\n  reset() {\n    C._ts_parser_reset(this[0]);\n  }\n  /** Get the ranges of text that the parser will include when parsing. */\n  getIncludedRanges() {\n    C._ts_parser_included_ranges_wasm(this[0]);\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const result = new Array(count);\n    if (count > 0) {\n      let address = buffer;\n      for (let i2 = 0; i2 < count; i2++) {\n        result[i2] = unmarshalRange(address);\n        address += SIZE_OF_RANGE;\n      }\n      C._free(buffer);\n    }\n    return result;\n  }\n  /** Set the logging callback that a parser should use during parsing. */\n  setLogger(callback) {\n    if (!callback) {\n      this.logCallback = null;\n    } else if (typeof callback !== \"function\") {\n      throw new Error(\"Logger callback must be a function\");\n    } else {\n      this.logCallback = callback;\n    }\n    return this;\n  }\n  /** Get the parser's current logger. */\n  getLogger() {\n    return this.logCallback;\n  }\n};\n\n// src/query.ts\nvar PREDICATE_STEP_TYPE_CAPTURE = 1;\nvar PREDICATE_STEP_TYPE_STRING = 2;\nvar QUERY_WORD_REGEX = /[\\w-]+/g;\nvar CaptureQuantifier = {\n  Zero: 0,\n  ZeroOrOne: 1,\n  ZeroOrMore: 2,\n  One: 3,\n  OneOrMore: 4\n};\nvar isCaptureStep = /* @__PURE__ */ __name((step) => step.type === \"capture\", \"isCaptureStep\");\nvar isStringStep = /* @__PURE__ */ __name((step) => step.type === \"string\", \"isStringStep\");\nvar QueryErrorKind = {\n  Syntax: 1,\n  NodeName: 2,\n  FieldName: 3,\n  CaptureName: 4,\n  PatternStructure: 5\n};\nvar QueryError = class _QueryError extends Error {\n  constructor(kind, info2, index, length) {\n    super(_QueryError.formatMessage(kind, info2));\n    this.kind = kind;\n    this.info = info2;\n    this.index = index;\n    this.length = length;\n    this.name = \"QueryError\";\n  }\n  static {\n    __name(this, \"QueryError\");\n  }\n  /** Formats an error message based on the error kind and info */\n  static formatMessage(kind, info2) {\n    switch (kind) {\n      case QueryErrorKind.NodeName:\n        return `Bad node name '${info2.word}'`;\n      case QueryErrorKind.FieldName:\n        return `Bad field name '${info2.word}'`;\n      case QueryErrorKind.CaptureName:\n        return `Bad capture name @${info2.word}`;\n      case QueryErrorKind.PatternStructure:\n        return `Bad pattern structure at offset ${info2.suffix}`;\n      case QueryErrorKind.Syntax:\n        return `Bad syntax at offset ${info2.suffix}`;\n    }\n  }\n};\nfunction parseAnyPredicate(steps, index, operator, textPredicates) {\n  if (steps.length !== 3) {\n    throw new Error(\n      `Wrong number of arguments to \\`#${operator}\\` predicate. Expected 2, got ${steps.length - 1}`\n    );\n  }\n  if (!isCaptureStep(steps[1])) {\n    throw new Error(\n      `First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\"`\n    );\n  }\n  const isPositive = operator === \"eq?\" || operator === \"any-eq?\";\n  const matchAll = !operator.startsWith(\"any-\");\n  if (isCaptureStep(steps[2])) {\n    const captureName1 = steps[1].name;\n    const captureName2 = steps[2].name;\n    textPredicates[index].push((captures) => {\n      const nodes1 = [];\n      const nodes2 = [];\n      for (const c of captures) {\n        if (c.name === captureName1) nodes1.push(c.node);\n        if (c.name === captureName2) nodes2.push(c.node);\n      }\n      const compare = /* @__PURE__ */ __name((n1, n2, positive) => {\n        return positive ? n1.text === n2.text : n1.text !== n2.text;\n      }, \"compare\");\n      return matchAll ? nodes1.every((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))) : nodes1.some((n1) => nodes2.some((n2) => compare(n1, n2, isPositive)));\n    });\n  } else {\n    const captureName = steps[1].name;\n    const stringValue = steps[2].value;\n    const matches = /* @__PURE__ */ __name((n) => n.text === stringValue, \"matches\");\n    const doesNotMatch = /* @__PURE__ */ __name((n) => n.text !== stringValue, \"doesNotMatch\");\n    textPredicates[index].push((captures) => {\n      const nodes = [];\n      for (const c of captures) {\n        if (c.name === captureName) nodes.push(c.node);\n      }\n      const test = isPositive ? matches : doesNotMatch;\n      return matchAll ? nodes.every(test) : nodes.some(test);\n    });\n  }\n}\n__name(parseAnyPredicate, \"parseAnyPredicate\");\nfunction parseMatchPredicate(steps, index, operator, textPredicates) {\n  if (steps.length !== 3) {\n    throw new Error(\n      `Wrong number of arguments to \\`#${operator}\\` predicate. Expected 2, got ${steps.length - 1}.`\n    );\n  }\n  if (steps[1].type !== \"capture\") {\n    throw new Error(\n      `First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\".`\n    );\n  }\n  if (steps[2].type !== \"string\") {\n    throw new Error(\n      `Second argument of \\`#${operator}\\` predicate must be a string. Got @${steps[2].name}.`\n    );\n  }\n  const isPositive = operator === \"match?\" || operator === \"any-match?\";\n  const matchAll = !operator.startsWith(\"any-\");\n  const captureName = steps[1].name;\n  const regex = new RegExp(steps[2].value);\n  textPredicates[index].push((captures) => {\n    const nodes = [];\n    for (const c of captures) {\n      if (c.name === captureName) nodes.push(c.node.text);\n    }\n    const test = /* @__PURE__ */ __name((text, positive) => {\n      return positive ? regex.test(text) : !regex.test(text);\n    }, \"test\");\n    if (nodes.length === 0) return !isPositive;\n    return matchAll ? nodes.every((text) => test(text, isPositive)) : nodes.some((text) => test(text, isPositive));\n  });\n}\n__name(parseMatchPredicate, \"parseMatchPredicate\");\nfunction parseAnyOfPredicate(steps, index, operator, textPredicates) {\n  if (steps.length < 2) {\n    throw new Error(\n      `Wrong number of arguments to \\`#${operator}\\` predicate. Expected at least 1. Got ${steps.length - 1}.`\n    );\n  }\n  if (steps[1].type !== \"capture\") {\n    throw new Error(\n      `First argument of \\`#${operator}\\` predicate must be a capture. Got \"${steps[1].value}\".`\n    );\n  }\n  const isPositive = operator === \"any-of?\";\n  const captureName = steps[1].name;\n  const stringSteps = steps.slice(2);\n  if (!stringSteps.every(isStringStep)) {\n    throw new Error(\n      `Arguments to \\`#${operator}\\` predicate must be strings.\".`\n    );\n  }\n  const values = stringSteps.map((s) => s.value);\n  textPredicates[index].push((captures) => {\n    const nodes = [];\n    for (const c of captures) {\n      if (c.name === captureName) nodes.push(c.node.text);\n    }\n    if (nodes.length === 0) return !isPositive;\n    return nodes.every((text) => values.includes(text)) === isPositive;\n  });\n}\n__name(parseAnyOfPredicate, \"parseAnyOfPredicate\");\nfunction parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties) {\n  if (steps.length < 2 || steps.length > 3) {\n    throw new Error(\n      `Wrong number of arguments to \\`#${operator}\\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`\n    );\n  }\n  if (!steps.every(isStringStep)) {\n    throw new Error(\n      `Arguments to \\`#${operator}\\` predicate must be strings.\".`\n    );\n  }\n  const properties = operator === \"is?\" ? assertedProperties : refutedProperties;\n  if (!properties[index]) properties[index] = {};\n  properties[index][steps[1].value] = steps[2]?.value ?? null;\n}\n__name(parseIsPredicate, \"parseIsPredicate\");\nfunction parseSetDirective(steps, index, setProperties) {\n  if (steps.length < 2 || steps.length > 3) {\n    throw new Error(`Wrong number of arguments to \\`#set!\\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`);\n  }\n  if (!steps.every(isStringStep)) {\n    throw new Error(`Arguments to \\`#set!\\` predicate must be strings.\".`);\n  }\n  if (!setProperties[index]) setProperties[index] = {};\n  setProperties[index][steps[1].value] = steps[2]?.value ?? null;\n}\n__name(parseSetDirective, \"parseSetDirective\");\nfunction parsePattern(index, stepType, stepValueId, captureNames, stringValues, steps, textPredicates, predicates, setProperties, assertedProperties, refutedProperties) {\n  if (stepType === PREDICATE_STEP_TYPE_CAPTURE) {\n    const name2 = captureNames[stepValueId];\n    steps.push({ type: \"capture\", name: name2 });\n  } else if (stepType === PREDICATE_STEP_TYPE_STRING) {\n    steps.push({ type: \"string\", value: stringValues[stepValueId] });\n  } else if (steps.length > 0) {\n    if (steps[0].type !== \"string\") {\n      throw new Error(\"Predicates must begin with a literal value\");\n    }\n    const operator = steps[0].value;\n    switch (operator) {\n      case \"any-not-eq?\":\n      case \"not-eq?\":\n      case \"any-eq?\":\n      case \"eq?\":\n        parseAnyPredicate(steps, index, operator, textPredicates);\n        break;\n      case \"any-not-match?\":\n      case \"not-match?\":\n      case \"any-match?\":\n      case \"match?\":\n        parseMatchPredicate(steps, index, operator, textPredicates);\n        break;\n      case \"not-any-of?\":\n      case \"any-of?\":\n        parseAnyOfPredicate(steps, index, operator, textPredicates);\n        break;\n      case \"is?\":\n      case \"is-not?\":\n        parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties);\n        break;\n      case \"set!\":\n        parseSetDirective(steps, index, setProperties);\n        break;\n      default:\n        predicates[index].push({ operator, operands: steps.slice(1) });\n    }\n    steps.length = 0;\n  }\n}\n__name(parsePattern, \"parsePattern\");\nvar Query = class {\n  static {\n    __name(this, \"Query\");\n  }\n  /** @internal */\n  [0] = 0;\n  // Internal handle for Wasm\n  /** @internal */\n  exceededMatchLimit;\n  /** @internal */\n  textPredicates;\n  /** The names of the captures used in the query. */\n  captureNames;\n  /** The quantifiers of the captures used in the query. */\n  captureQuantifiers;\n  /**\n   * The other user-defined predicates associated with the given index.\n   *\n   * This includes predicates with operators other than:\n   * - `match?`\n   * - `eq?` and `not-eq?`\n   * - `any-of?` and `not-any-of?`\n   * - `is?` and `is-not?`\n   * - `set!`\n   */\n  predicates;\n  /** The properties for predicates with the operator `set!`. */\n  setProperties;\n  /** The properties for predicates with the operator `is?`. */\n  assertedProperties;\n  /** The properties for predicates with the operator `is-not?`. */\n  refutedProperties;\n  /** The maximum number of in-progress matches for this cursor. */\n  matchLimit;\n  /**\n   * Create a new query from a string containing one or more S-expression\n   * patterns.\n   *\n   * The query is associated with a particular language, and can only be run\n   * on syntax nodes parsed with that language. References to Queries can be\n   * shared between multiple threads.\n   *\n   * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries}\n   */\n  constructor(language, source) {\n    const sourceLength = C.lengthBytesUTF8(source);\n    const sourceAddress = C._malloc(sourceLength + 1);\n    C.stringToUTF8(source, sourceAddress, sourceLength + 1);\n    const address = C._ts_query_new(\n      language[0],\n      sourceAddress,\n      sourceLength,\n      TRANSFER_BUFFER,\n      TRANSFER_BUFFER + SIZE_OF_INT\n    );\n    if (!address) {\n      const errorId = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n      const errorByte = C.getValue(TRANSFER_BUFFER, \"i32\");\n      const errorIndex = C.UTF8ToString(sourceAddress, errorByte).length;\n      const suffix = source.slice(errorIndex, errorIndex + 100).split(\"\\n\")[0];\n      const word = suffix.match(QUERY_WORD_REGEX)?.[0] ?? \"\";\n      C._free(sourceAddress);\n      switch (errorId) {\n        case QueryErrorKind.Syntax:\n          throw new QueryError(QueryErrorKind.Syntax, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0);\n        case QueryErrorKind.NodeName:\n          throw new QueryError(errorId, { word }, errorIndex, word.length);\n        case QueryErrorKind.FieldName:\n          throw new QueryError(errorId, { word }, errorIndex, word.length);\n        case QueryErrorKind.CaptureName:\n          throw new QueryError(errorId, { word }, errorIndex, word.length);\n        case QueryErrorKind.PatternStructure:\n          throw new QueryError(errorId, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0);\n      }\n    }\n    const stringCount = C._ts_query_string_count(address);\n    const captureCount = C._ts_query_capture_count(address);\n    const patternCount = C._ts_query_pattern_count(address);\n    const captureNames = new Array(captureCount);\n    const captureQuantifiers = new Array(patternCount);\n    const stringValues = new Array(stringCount);\n    for (let i2 = 0; i2 < captureCount; i2++) {\n      const nameAddress = C._ts_query_capture_name_for_id(\n        address,\n        i2,\n        TRANSFER_BUFFER\n      );\n      const nameLength = C.getValue(TRANSFER_BUFFER, \"i32\");\n      captureNames[i2] = C.UTF8ToString(nameAddress, nameLength);\n    }\n    for (let i2 = 0; i2 < patternCount; i2++) {\n      const captureQuantifiersArray = new Array(captureCount);\n      for (let j = 0; j < captureCount; j++) {\n        const quantifier = C._ts_query_capture_quantifier_for_id(address, i2, j);\n        captureQuantifiersArray[j] = quantifier;\n      }\n      captureQuantifiers[i2] = captureQuantifiersArray;\n    }\n    for (let i2 = 0; i2 < stringCount; i2++) {\n      const valueAddress = C._ts_query_string_value_for_id(\n        address,\n        i2,\n        TRANSFER_BUFFER\n      );\n      const nameLength = C.getValue(TRANSFER_BUFFER, \"i32\");\n      stringValues[i2] = C.UTF8ToString(valueAddress, nameLength);\n    }\n    const setProperties = new Array(patternCount);\n    const assertedProperties = new Array(patternCount);\n    const refutedProperties = new Array(patternCount);\n    const predicates = new Array(patternCount);\n    const textPredicates = new Array(patternCount);\n    for (let i2 = 0; i2 < patternCount; i2++) {\n      const predicatesAddress = C._ts_query_predicates_for_pattern(address, i2, TRANSFER_BUFFER);\n      const stepCount = C.getValue(TRANSFER_BUFFER, \"i32\");\n      predicates[i2] = [];\n      textPredicates[i2] = [];\n      const steps = new Array();\n      let stepAddress = predicatesAddress;\n      for (let j = 0; j < stepCount; j++) {\n        const stepType = C.getValue(stepAddress, \"i32\");\n        stepAddress += SIZE_OF_INT;\n        const stepValueId = C.getValue(stepAddress, \"i32\");\n        stepAddress += SIZE_OF_INT;\n        parsePattern(\n          i2,\n          stepType,\n          stepValueId,\n          captureNames,\n          stringValues,\n          steps,\n          textPredicates,\n          predicates,\n          setProperties,\n          assertedProperties,\n          refutedProperties\n        );\n      }\n      Object.freeze(textPredicates[i2]);\n      Object.freeze(predicates[i2]);\n      Object.freeze(setProperties[i2]);\n      Object.freeze(assertedProperties[i2]);\n      Object.freeze(refutedProperties[i2]);\n    }\n    C._free(sourceAddress);\n    this[0] = address;\n    this.captureNames = captureNames;\n    this.captureQuantifiers = captureQuantifiers;\n    this.textPredicates = textPredicates;\n    this.predicates = predicates;\n    this.setProperties = setProperties;\n    this.assertedProperties = assertedProperties;\n    this.refutedProperties = refutedProperties;\n    this.exceededMatchLimit = false;\n  }\n  /** Delete the query, freeing its resources. */\n  delete() {\n    C._ts_query_delete(this[0]);\n    this[0] = 0;\n  }\n  /**\n   * Iterate over all of the matches in the order that they were found.\n   *\n   * Each match contains the index of the pattern that matched, and a list of\n   * captures. Because multiple patterns can match the same set of nodes,\n   * one match may contain captures that appear *before* some of the\n   * captures from a previous match.\n   *\n   * @param {Node} node - The node to execute the query on.\n   *\n   * @param {QueryOptions} options - Options for query execution.\n   */\n  matches(node, options = {}) {\n    const startPosition = options.startPosition ?? ZERO_POINT;\n    const endPosition = options.endPosition ?? ZERO_POINT;\n    const startIndex = options.startIndex ?? 0;\n    const endIndex = options.endIndex ?? 0;\n    const startContainingPosition = options.startContainingPosition ?? ZERO_POINT;\n    const endContainingPosition = options.endContainingPosition ?? ZERO_POINT;\n    const startContainingIndex = options.startContainingIndex ?? 0;\n    const endContainingIndex = options.endContainingIndex ?? 0;\n    const matchLimit = options.matchLimit ?? 4294967295;\n    const maxStartDepth = options.maxStartDepth ?? 4294967295;\n    const progressCallback = options.progressCallback;\n    if (typeof matchLimit !== \"number\") {\n      throw new Error(\"Arguments must be numbers\");\n    }\n    this.matchLimit = matchLimit;\n    if (endIndex !== 0 && startIndex > endIndex) {\n      throw new Error(\"`startIndex` cannot be greater than `endIndex`\");\n    }\n    if (endPosition !== ZERO_POINT && (startPosition.row > endPosition.row || startPosition.row === endPosition.row && startPosition.column > endPosition.column)) {\n      throw new Error(\"`startPosition` cannot be greater than `endPosition`\");\n    }\n    if (endContainingIndex !== 0 && startContainingIndex > endContainingIndex) {\n      throw new Error(\"`startContainingIndex` cannot be greater than `endContainingIndex`\");\n    }\n    if (endContainingPosition !== ZERO_POINT && (startContainingPosition.row > endContainingPosition.row || startContainingPosition.row === endContainingPosition.row && startContainingPosition.column > endContainingPosition.column)) {\n      throw new Error(\"`startContainingPosition` cannot be greater than `endContainingPosition`\");\n    }\n    if (progressCallback) {\n      C.currentQueryProgressCallback = progressCallback;\n    }\n    marshalNode(node);\n    C._ts_query_matches_wasm(\n      this[0],\n      node.tree[0],\n      startPosition.row,\n      startPosition.column,\n      endPosition.row,\n      endPosition.column,\n      startIndex,\n      endIndex,\n      startContainingPosition.row,\n      startContainingPosition.column,\n      endContainingPosition.row,\n      endContainingPosition.column,\n      startContainingIndex,\n      endContainingIndex,\n      matchLimit,\n      maxStartDepth\n    );\n    const rawCount = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n    const result = new Array(rawCount);\n    this.exceededMatchLimit = Boolean(didExceedMatchLimit);\n    let filteredCount = 0;\n    let address = startAddress;\n    for (let i2 = 0; i2 < rawCount; i2++) {\n      const patternIndex = C.getValue(address, \"i32\");\n      address += SIZE_OF_INT;\n      const captureCount = C.getValue(address, \"i32\");\n      address += SIZE_OF_INT;\n      const captures = new Array(captureCount);\n      address = unmarshalCaptures(this, node.tree, address, patternIndex, captures);\n      if (this.textPredicates[patternIndex].every((p) => p(captures))) {\n        result[filteredCount] = { patternIndex, captures };\n        const setProperties = this.setProperties[patternIndex];\n        result[filteredCount].setProperties = setProperties;\n        const assertedProperties = this.assertedProperties[patternIndex];\n        result[filteredCount].assertedProperties = assertedProperties;\n        const refutedProperties = this.refutedProperties[patternIndex];\n        result[filteredCount].refutedProperties = refutedProperties;\n        filteredCount++;\n      }\n    }\n    result.length = filteredCount;\n    C._free(startAddress);\n    C.currentQueryProgressCallback = null;\n    return result;\n  }\n  /**\n   * Iterate over all of the individual captures in the order that they\n   * appear.\n   *\n   * This is useful if you don't care about which pattern matched, and just\n   * want a single, ordered sequence of captures.\n   *\n   * @param {Node} node - The node to execute the query on.\n   *\n   * @param {QueryOptions} options - Options for query execution.\n   */\n  captures(node, options = {}) {\n    const startPosition = options.startPosition ?? ZERO_POINT;\n    const endPosition = options.endPosition ?? ZERO_POINT;\n    const startIndex = options.startIndex ?? 0;\n    const endIndex = options.endIndex ?? 0;\n    const startContainingPosition = options.startContainingPosition ?? ZERO_POINT;\n    const endContainingPosition = options.endContainingPosition ?? ZERO_POINT;\n    const startContainingIndex = options.startContainingIndex ?? 0;\n    const endContainingIndex = options.endContainingIndex ?? 0;\n    const matchLimit = options.matchLimit ?? 4294967295;\n    const maxStartDepth = options.maxStartDepth ?? 4294967295;\n    const progressCallback = options.progressCallback;\n    if (typeof matchLimit !== \"number\") {\n      throw new Error(\"Arguments must be numbers\");\n    }\n    this.matchLimit = matchLimit;\n    if (endIndex !== 0 && startIndex > endIndex) {\n      throw new Error(\"`startIndex` cannot be greater than `endIndex`\");\n    }\n    if (endPosition !== ZERO_POINT && (startPosition.row > endPosition.row || startPosition.row === endPosition.row && startPosition.column > endPosition.column)) {\n      throw new Error(\"`startPosition` cannot be greater than `endPosition`\");\n    }\n    if (endContainingIndex !== 0 && startContainingIndex > endContainingIndex) {\n      throw new Error(\"`startContainingIndex` cannot be greater than `endContainingIndex`\");\n    }\n    if (endContainingPosition !== ZERO_POINT && (startContainingPosition.row > endContainingPosition.row || startContainingPosition.row === endContainingPosition.row && startContainingPosition.column > endContainingPosition.column)) {\n      throw new Error(\"`startContainingPosition` cannot be greater than `endContainingPosition`\");\n    }\n    if (progressCallback) {\n      C.currentQueryProgressCallback = progressCallback;\n    }\n    marshalNode(node);\n    C._ts_query_captures_wasm(\n      this[0],\n      node.tree[0],\n      startPosition.row,\n      startPosition.column,\n      endPosition.row,\n      endPosition.column,\n      startIndex,\n      endIndex,\n      startContainingPosition.row,\n      startContainingPosition.column,\n      endContainingPosition.row,\n      endContainingPosition.column,\n      startContainingIndex,\n      endContainingIndex,\n      matchLimit,\n      maxStartDepth\n    );\n    const count = C.getValue(TRANSFER_BUFFER, \"i32\");\n    const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, \"i32\");\n    const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, \"i32\");\n    const result = new Array();\n    this.exceededMatchLimit = Boolean(didExceedMatchLimit);\n    const captures = new Array();\n    let address = startAddress;\n    for (let i2 = 0; i2 < count; i2++) {\n      const patternIndex = C.getValue(address, \"i32\");\n      address += SIZE_OF_INT;\n      const captureCount = C.getValue(address, \"i32\");\n      address += SIZE_OF_INT;\n      const captureIndex = C.getValue(address, \"i32\");\n      address += SIZE_OF_INT;\n      captures.length = captureCount;\n      address = unmarshalCaptures(this, node.tree, address, patternIndex, captures);\n      if (this.textPredicates[patternIndex].every((p) => p(captures))) {\n        const capture = captures[captureIndex];\n        const setProperties = this.setProperties[patternIndex];\n        capture.setProperties = setProperties;\n        const assertedProperties = this.assertedProperties[patternIndex];\n        capture.assertedProperties = assertedProperties;\n        const refutedProperties = this.refutedProperties[patternIndex];\n        capture.refutedProperties = refutedProperties;\n        result.push(capture);\n      }\n    }\n    C._free(startAddress);\n    C.currentQueryProgressCallback = null;\n    return result;\n  }\n  /** Get the predicates for a given pattern. */\n  predicatesForPattern(patternIndex) {\n    return this.predicates[patternIndex];\n  }\n  /**\n   * Disable a certain capture within a query.\n   *\n   * This prevents the capture from being returned in matches, and also\n   * avoids any resource usage associated with recording the capture.\n   */\n  disableCapture(captureName) {\n    const captureNameLength = C.lengthBytesUTF8(captureName);\n    const captureNameAddress = C._malloc(captureNameLength + 1);\n    C.stringToUTF8(captureName, captureNameAddress, captureNameLength + 1);\n    C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength);\n    C._free(captureNameAddress);\n  }\n  /**\n   * Disable a certain pattern within a query.\n   *\n   * This prevents the pattern from matching, and also avoids any resource\n   * usage associated with the pattern. This throws an error if the pattern\n   * index is out of bounds.\n   */\n  disablePattern(patternIndex) {\n    if (patternIndex >= this.predicates.length) {\n      throw new Error(\n        `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}`\n      );\n    }\n    C._ts_query_disable_pattern(this[0], patternIndex);\n  }\n  /**\n   * Check if, on its last execution, this cursor exceeded its maximum number\n   * of in-progress matches.\n   */\n  didExceedMatchLimit() {\n    return this.exceededMatchLimit;\n  }\n  /** Get the byte offset where the given pattern starts in the query's source. */\n  startIndexForPattern(patternIndex) {\n    if (patternIndex >= this.predicates.length) {\n      throw new Error(\n        `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}`\n      );\n    }\n    return C._ts_query_start_byte_for_pattern(this[0], patternIndex);\n  }\n  /** Get the byte offset where the given pattern ends in the query's source. */\n  endIndexForPattern(patternIndex) {\n    if (patternIndex >= this.predicates.length) {\n      throw new Error(\n        `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}`\n      );\n    }\n    return C._ts_query_end_byte_for_pattern(this[0], patternIndex);\n  }\n  /** Get the number of patterns in the query. */\n  patternCount() {\n    return C._ts_query_pattern_count(this[0]);\n  }\n  /** Get the index for a given capture name. */\n  captureIndexForName(captureName) {\n    return this.captureNames.indexOf(captureName);\n  }\n  /** Check if a given pattern within a query has a single root node. */\n  isPatternRooted(patternIndex) {\n    return C._ts_query_is_pattern_rooted(this[0], patternIndex) === 1;\n  }\n  /** Check if a given pattern within a query has a single root node. */\n  isPatternNonLocal(patternIndex) {\n    return C._ts_query_is_pattern_non_local(this[0], patternIndex) === 1;\n  }\n  /**\n   * Check if a given step in a query is 'definite'.\n   *\n   * A query step is 'definite' if its parent pattern will be guaranteed to\n   * match successfully once it reaches the step.\n   */\n  isPatternGuaranteedAtStep(byteIndex) {\n    return C._ts_query_is_pattern_guaranteed_at_step(this[0], byteIndex) === 1;\n  }\n};\nexport {\n  CaptureQuantifier,\n  Edit,\n  LANGUAGE_VERSION,\n  Language,\n  LookaheadIterator,\n  MIN_COMPATIBLE_VERSION,\n  Node,\n  Parser,\n  Query,\n  Tree,\n  TreeCursor\n};\n//# sourceMappingURL=web-tree-sitter.js.map\n","/** Error codes returned from tree-sitter query parsing */\nexport const QueryErrorKind = {\n  Syntax: 1,\n  NodeName: 2,\n  FieldName: 3,\n  CaptureName: 4,\n  PatternStructure: 5,\n} as const;\n\n/** An error that occurred while parsing a query string. */\nexport type QueryErrorKind = typeof QueryErrorKind[keyof typeof QueryErrorKind];\n\n/** Information about a {@link QueryError}. */\nexport interface QueryErrorInfo {\n  [QueryErrorKind.NodeName]: { word: string };\n  [QueryErrorKind.FieldName]: { word: string };\n  [QueryErrorKind.CaptureName]: { word: string };\n  [QueryErrorKind.PatternStructure]: { suffix: string };\n  [QueryErrorKind.Syntax]: { suffix: string };\n}\n\nexport class QueryError extends Error {\n  constructor(\n    public kind: QueryErrorKind,\n    public info: QueryErrorInfo[typeof kind],\n    public index: number,\n    public length: number,\n  ) {\n    super(QueryError.formatMessage(kind, info));\n    this.name = 'QueryError';\n  }\n\n  /** Formats an error message based on the error kind and info */\n  private static formatMessage(\n    kind: QueryErrorKind,\n    info: QueryErrorInfo[QueryErrorKind],\n  ): string {\n    switch (kind) {\n      case QueryErrorKind.NodeName:\n        return `Bad node name '${(info as QueryErrorInfo[2]).word}'`;\n      case QueryErrorKind.FieldName:\n        return `Bad field name '${(info as QueryErrorInfo[3]).word}'`;\n      case QueryErrorKind.CaptureName:\n        return `Bad capture name @${(info as QueryErrorInfo[4]).word}`;\n      case QueryErrorKind.PatternStructure:\n        return `Bad pattern structure at offset ${\n          (info as QueryErrorInfo[5]).suffix\n        }`;\n      case QueryErrorKind.Syntax:\n        return `Bad syntax at offset ${(info as QueryErrorInfo[1]).suffix}`;\n    }\n  }\n}\n\nexport interface QueryOptions {\n  matchLimit?: number;\n}\n","import { Node, Query, Tree } from 'web-tree-sitter';\nimport { QueryError, QueryOptions } from './Query.ts';\n\nexport interface TreeSitterNode {\n  id: number;\n  tree: Tree;\n  startIndex: number;\n  endIndex: number;\n  startPosition: { row: number; column: number };\n  endPosition: { row: number; column: number };\n  type: string;\n  typeId: number;\n  text: string;\n  children: TreeSitterNode[];\n  parent: TreeSitterNode | null;\n}\n\nexport interface TreeSitterNodeExt extends TreeSitterNode {\n  treeText: string;\n  toJSON: () => any;\n}\n\ninterface Position {\n  row: number;\n  column: number;\n}\n\ntype GetReferencePoint = () => {\n  index: number;\n  position: Position;\n};\n\ninterface SoftNodeParams {\n  tree: Tree;\n  treeText: string;\n  startIndex: number;\n  startPosition: Position;\n  endIndex: number;\n  endPosition: Position;\n}\n\nclass SoftNode {\n  readonly startIndex: number;\n  readonly startPosition: Position;\n  readonly endIndex: number;\n  readonly endPosition: Position;\n  tree: Tree;\n  treeText: string;\n\n  constructor(params: SoftNodeParams) {\n    this.tree = params.tree;\n    this.treeText = params.treeText;\n    this.startIndex = params.startIndex;\n    this.startPosition = params.startPosition;\n    this.endIndex = params.endIndex;\n    this.endPosition = params.endPosition;\n  }\n}\n\ninterface WhitespaceNodeParams extends SoftNodeParams {\n  parent: TreeSitterNodeExt | null;\n  text: string;\n}\n\nclass WhitespaceNode extends SoftNode implements TreeSitterNodeExt {\n  type = 'whitespace';\n  typeId = -1;\n  id: number;\n  parent: TreeSitterNodeExt | null;\n  text: string;\n  children: TreeSitterNodeExt[] = [];\n\n  constructor(params: WhitespaceNodeParams) {\n    super(params);\n    this.parent = params.parent;\n    this.text = params.text;\n    this.id = -1;\n  }\n\n  toJSON() {\n    return {\n      type: this.type,\n      typeId: this.typeId,\n      text: this.text,\n    };\n  }\n}\n\ninterface SoftTextNodeParams extends SoftNodeParams {\n  parent: TreeSitterNode | null;\n  text: string;\n}\n\nclass SoftTextNode extends SoftNode implements TreeSitterNodeExt {\n  type = 'text';\n  typeId = -2;\n  id: number;\n  parent: TreeSitterNode | null;\n  text: string;\n  children: TreeSitterNodeExt[] = [];\n\n  constructor(params: SoftTextNodeParams) {\n    super(params);\n    this.parent = params.parent;\n    this.text = params.text;\n    this.id = -1;\n  }\n\n  toJSON() {\n    return {\n      type: this.type,\n      typeId: this.typeId,\n      text: this.text,\n    };\n  }\n}\n\ntype ExtendedNodeMapper = (\n  nodes: TreeSitterNodeExt[],\n  parent: TreeSitterNodeExt,\n) => TreeSitterNodeExt[];\n\ninterface Offsets {\n  startIndex: number;\n  startPosition: { row: number; column: number };\n}\n\nexport class ExtendedNode implements TreeSitterNodeExt {\n  tree: Tree;\n  type: string;\n  typeId: number;\n  // text: string;\n  _children: TreeSitterNode[];\n  parent: TreeSitterNode | null;\n  id: number;\n\n  mappers: Array<ExtendedNodeMapper> = [];\n\n  constructor(\n    private node: TreeSitterNode,\n    public readonly treeText: string,\n    private readonly offsets?: Offsets,\n  ) {\n    this.id = node.id;\n    this.tree = node.tree;\n    this.treeText = treeText;\n    this.type = node.type;\n    this.typeId = node.typeId;\n    this.parent = node.parent;\n    this._children = node.children;\n  }\n\n  get startIndex() {\n    return this.node.startIndex + (this.offsets?.startIndex || 0);\n  }\n\n  get endIndex() {\n    return this.node.endIndex + (this.offsets?.startIndex || 0);\n  }\n\n  get startPosition() {\n    return incrementPositionByOffset(\n      this.node.startPosition,\n      this.offsets?.startPosition,\n    );\n  }\n\n  get endPosition() {\n    return incrementPositionByOffset(\n      this.node.endPosition,\n      this.offsets?.startPosition,\n    );\n  }\n\n  get text(): string {\n    return this.treeText.substring(this.startIndex, this.endIndex);\n  }\n\n  get children(): TreeSitterNodeExt[] {\n    let c: TreeSitterNodeExt[] = childrenWithSoftNodes(\n      this,\n      this._children,\n      this.offsets,\n    );\n\n    for (const mapper of this.mappers) {\n      c = mapper(c, this);\n    }\n\n    return c;\n  }\n\n  toJSON() {\n    const children = this.children.map((i) => i.toJSON());\n\n    return {\n      type: this.type,\n      text: this.text,\n      startIndex: this.startIndex,\n      endIndex: this.endIndex,\n      children,\n    };\n  }\n\n  query(queryString: string, options: QueryOptions) {\n    const { matchLimit } = options || {};\n    let query;\n    try {\n      query = new Query(this.tree.language, queryString);\n    } catch (error) {\n      if (error instanceof QueryError) {\n        error.message = `${error.message} in the following query: ${\n          JSON.stringify(queryString)\n        }`;\n      }\n      throw error;\n    }\n    const result = query.matches(this as any, {\n      startPosition: this.startPosition,\n      endPosition: this.endPosition,\n      matchLimit,\n    });\n    // without this soft nodes will be missing\n    for (const eachResult of result) {\n      for (const eachCapture of eachResult.captures) {\n        const extNode = new ExtendedNode(\n          eachCapture.node as any,\n          this.treeText,\n        );\n        extNode.mappers = this.mappers;\n        eachCapture.node = extNode as any;\n      }\n    }\n    return result;\n  }\n}\n\nfunction incrementPositionByOffset(pos: Position, offsets?: Position) {\n  const row = offsets?.row || 0;\n  const column = offsets?.column || 0;\n\n  if (row === 0) {\n    return {\n      row: pos.row,\n      column: pos.column + column,\n    };\n  } else {\n    return {\n      row: pos.row + row,\n      column: pos.column,\n    };\n  }\n}\n\nfunction incrementPositionByText(pos: Position, text: string): Position {\n  const rows = text.split('\\n');\n  const lastLine = rows.pop() || '';\n\n  return incrementPositionByOffset(pos, {\n    row: rows.length,\n    column: lastLine.length,\n  });\n}\n\nexport const childrenWithSoftNodes = (\n  parentNode: ExtendedNode,\n  children: TreeSitterNode[],\n  offsets?: Offsets,\n): ExtendedNode[] => {\n  if (children.length === 0) {\n    return [];\n  }\n\n  interface CopiedChild {\n    startIndex: number;\n    endIndex: number;\n    endPosition: { row: number; column: number };\n    node: TreeSitterNode;\n  }\n\n  const newChildren = [];\n  const childrenCopy: Array<CopiedChild> = [...children].map((c) => {\n    return {\n      startIndex: c.startIndex + (offsets?.startIndex || 0),\n      endIndex: c.endIndex + (offsets?.startIndex || 0),\n      startPosition: incrementPositionByOffset(\n        c.startPosition,\n        offsets?.startPosition,\n      ),\n      endPosition: incrementPositionByOffset(\n        c.endPosition,\n        offsets?.startPosition,\n      ),\n      node: c,\n    };\n  });\n  const firstChild: CopiedChild = childrenCopy.shift()!;\n  // console.log('firstChild', toJSON(firstChild), toJSON(node));\n\n  const handleGaps = (\n    gapText: string,\n    index: number,\n    position: Position,\n  ) => {\n    let startIndex = index; // - (offsets?.startIndex || 0);\n    let startPosition = position;\n    const chunks = gapText.split(/(?<!\\s)(?=\\s+)/g);\n    // let colOffset = startPosition.column;\n    // let rowOffset = startPosition.row;\n\n    for (const text of chunks) {\n      if (text.length == 0) {\n        continue;\n      }\n      const endIndex = startIndex + text.length;\n      const endPosition = incrementPositionByText(position, text);\n\n      // console.log('CZUNK', text);\n\n      const whiteMatch = text.match(/^\\s+/);\n\n      if (whiteMatch) {\n        const whitePrefix = whiteMatch[0];\n        const suffix = text.substring(whitePrefix.length);\n\n        // const endPosition = incrementPositionByText(position, text);\n\n        newChildren.push(\n          new WhitespaceNode({\n            tree: parentNode.tree,\n            treeText: parentNode.treeText,\n            parent: parentNode,\n            text: whitePrefix,\n            startIndex,\n            endIndex: startIndex + whitePrefix.length,\n            startPosition,\n            endPosition: incrementPositionByText(startPosition, whitePrefix),\n          }),\n        );\n        newChildren.push(\n          new SoftTextNode({\n            tree: parentNode.tree,\n            treeText: parentNode.treeText,\n            parent: parentNode,\n            text: suffix,\n            startIndex: startIndex + whitePrefix.length,\n            endIndex,\n            startPosition: incrementPositionByText(startPosition, whitePrefix),\n            endPosition,\n          }),\n        );\n\n        // sometimes the gap isn't always whitespace\n      } else {\n        newChildren.push(\n          new SoftTextNode({\n            tree: parentNode.tree,\n            treeText: parentNode.treeText,\n            parent: parentNode,\n            text,\n            startIndex,\n            endIndex,\n            startPosition,\n            endPosition,\n          }),\n        );\n      }\n      startIndex = endIndex;\n      startPosition = endPosition;\n    }\n  };\n\n  // preceding whitespace\n  if (parentNode.startIndex != firstChild.startIndex) {\n    const gapText = parentNode.treeText.slice(\n      parentNode.startIndex,\n      firstChild.startIndex,\n    );\n    // whitespace and non-whitespace chunks\n\n    // console.log(` 1 handleGaps ${JSON.stringify(gapText)}`);\n    handleGaps(\n      gapText,\n      parentNode.startIndex,\n      parentNode.startPosition,\n    );\n  }\n\n  const extNode = new ExtendedNode(\n    firstChild.node,\n    parentNode.treeText,\n    offsets,\n  );\n  extNode.mappers = parentNode.mappers;\n  newChildren.push(extNode);\n\n  // gaps between sibilings\n  let prevChild = firstChild;\n  for (const eachSecondaryNode of childrenCopy) {\n    if (prevChild.endIndex !== eachSecondaryNode.startIndex) {\n      const gapText = parentNode.treeText.slice(\n        prevChild.endIndex,\n        eachSecondaryNode.startIndex,\n      );\n\n      // console.log(` 2 handleGaps ${JSON.stringify(gapText)}`);\n      handleGaps(\n        gapText,\n        prevChild.endIndex,\n        prevChild.endPosition,\n      );\n    }\n\n    const extNode = new ExtendedNode(\n      eachSecondaryNode.node,\n      parentNode.treeText,\n      offsets,\n    );\n    // console.log(` 2 EX ${JSON.stringify(extNode.text)}`);\n    extNode.mappers = parentNode.mappers;\n    newChildren.push(extNode);\n\n    prevChild = eachSecondaryNode;\n  }\n\n  // gap between last child and parent\n  if (prevChild.endIndex != parentNode.endIndex) {\n    const gapText = parentNode.treeText.slice(\n      prevChild.endIndex,\n      parentNode.endIndex,\n    );\n\n    // console.log(` 3 handleGaps ${JSON.stringify(gapText)}`);\n    handleGaps(\n      gapText,\n      prevChild.endIndex,\n      prevChild.endPosition,\n    );\n  }\n\n  return newChildren;\n};\n","import { Language, Parser } from 'web-tree-sitter';\n\nlet hasBeenLoaded = false;\n\ntype AssetLoad = (name: string) => Promise<Uint8Array<any>>;\n\ninterface Options {\n  assetLoad: AssetLoad;\n}\n\nexport async function createParser(\n  wasmUint8Array: Uint8Array,\n  { assetLoad }: Options,\n): Promise<Parser> {\n  if (!hasBeenLoaded) {\n    hasBeenLoaded = true;\n    const module = {\n      wasmBinary: await assetLoad('tree-sitter/web-tree-sitter.wasm'),\n    };\n    await Parser.init(module);\n  }\n  const parser = new Parser();\n  const language = await Language.load(wasmUint8Array);\n  parser.setLanguage(language);\n  return parser;\n}\n","[\n  {\n    \"repo\": \"tree-sitter/tree-sitter\",\n    \"version\": \"latest\",\n    \"files\": [\n      \"web-tree-sitter.tar.gz/web-tree-sitter.wasm\",\n      \"web-tree-sitter.tar.gz/web-tree-sitter.wasm.map\",\n      \"web-tree-sitter.tar.gz/web-tree-sitter.js\",\n      \"web-tree-sitter.tar.gz/web-tree-sitter.js.map\",\n      \"web-tree-sitter.tar.gz/debug/web-tree-sitter.wasm\",\n      \"web-tree-sitter.tar.gz/debug/web-tree-sitter.wasm.map\",\n      \"web-tree-sitter.tar.gz/debug/web-tree-sitter.js\",\n      \"web-tree-sitter.tar.gz/debug/web-tree-sitter.js.map\"\n    ]\n  },\n  {\n    \"repo\": \"ggodlewski/tree-sitter-mermaid\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-mermaid.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter-grammars/tree-sitter-markdown\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-markdown.wasm\", \"tree-sitter-markdown_inline.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"split_parser/tree-sitter-markdown/queries/highlights.scm\",\n      \"injections.scm\": \"split_parser/tree-sitter-markdown/queries/injections.scm\",\n      \"highlights-inline.scm\": \"split_parser/tree-sitter-markdown-inline/queries/highlights.scm\",\n      \"injections-inline.scm\": \"split_parser/tree-sitter-markdown-inline/queries/injections.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter-grammars/tree-sitter-diff\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-diff.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"main/queries/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter-grammars/tree-sitter-xml\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-xml.wasm\", \"tree-sitter-dtd.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/xml/highlights.scm\",\n      \"highlights-dtd.scm\": \"master/queries/dtd/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-html\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-html.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\",\n      \"injections.scm\": \"master/queries/injections.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-css\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-css.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter-grammars/tree-sitter-toml\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-toml.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-json\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-json.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-regex\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-regex.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-rust\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-rust.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\",\n      \"injections.scm\": \"master/queries/injections.scm\",\n      \"tags.scm\": \"master/queries/tags.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-typescript\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-typescript.wasm\", \"tree-sitter-tsx.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\",\n      \"locals.scm\": \"master/queries/locals.scm\",\n      \"tags.scm\": \"master/queries/tags.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-java\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-java.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\",\n      \"tags.scm\": \"master/queries/tags.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter/tree-sitter-javascript\",\n    \"version\": \"latest\",\n    \"files\": [\"tree-sitter-javascript.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\",\n      \"highlights-jsx.scm\": \"master/queries/highlights-jsx.scm\",\n      \"highlights-params.scm\": \"master/queries/highlights-params.scm\",\n      \"injections.scm\": \"master/queries/injections.scm\",\n      \"locals.scm\": \"master/queries/locals.scm\",\n      \"tags.scm\": \"master/queries/tags.scm\"\n    }\n  },\n  {\n    \"repo\": \"tree-sitter-grammars/tree-sitter-yaml\",\n    \"files\": [\"tree-sitter-yaml.wasm\"],\n    \"queries\": {\n      \"highlights.scm\": \"master/queries/highlights.scm\"\n    }\n  }\n]\n","import { createParser, type Parser, type Tree } from '@kerebron/tree-sitter';\nimport { getLangTreeSitter } from '@kerebron/wasm';\nimport { AssetLoad } from '@kerebron/editor';\nimport { ExtendedNode, TreeSitterNodeExt } from '@kerebron/tree-sitter';\n\nexport class StackableMarkdownParser {\n  private constructor(\n    private blockParser: Parser,\n    private inlineParser: Parser,\n    private htmlParser: Parser,\n  ) {\n  }\n\n  static async create(assetLoad: AssetLoad) {\n    const mdManifest = getLangTreeSitter('markdown');\n    const htmlManifest = getLangTreeSitter('html');\n    const blockUrl: string = mdManifest.files.find((url) =>\n      url.indexOf('_inline') === -1\n    )!;\n    const inlineUrl: string = mdManifest.files.find((url) =>\n      url.indexOf('_inline') > -1\n    )!;\n    const htmlUrl: string = htmlManifest.files[0]!;\n\n    const markdownWasm = await assetLoad(mdManifest.dir + '/' + blockUrl);\n    const inlineWasm = await assetLoad(mdManifest.dir + '/' + inlineUrl);\n    const htmlWasm = await assetLoad(htmlManifest.dir + '/' + htmlUrl);\n\n    const blockParser: Parser =\n      (await createParser(markdownWasm, { assetLoad })) as unknown as Parser;\n    const inlineParser: Parser =\n      (await createParser(inlineWasm, { assetLoad })) as unknown as Parser;\n    const htmlParser: Parser =\n      (await createParser(htmlWasm, { assetLoad })) as unknown as Parser;\n\n    return new StackableMarkdownParser(blockParser, inlineParser, htmlParser);\n  }\n\n  parse(content: string): [ExtendedNode, Tree[]] | null {\n    const tree = this.blockParser.parse(content);\n    if (!tree) {\n      return null;\n    }\n\n    const trees: Tree[] = [];\n\n    const root = new ExtendedNode(tree.rootNode, content);\n    trees.push(tree);\n\n    const inlineMapper = (\n      c: TreeSitterNodeExt[],\n      parentNode: TreeSitterNodeExt,\n    ): TreeSitterNodeExt[] => {\n      return c.map((node) => {\n        if (node.type !== 'inline') {\n          return node;\n        }\n\n        const tree = this.inlineParser.parse(node.text);\n        if (!tree) {\n          return node;\n        }\n        trees.push(tree);\n\n        const offsets = {\n          startIndex: node.startIndex,\n          startPosition: node.startPosition,\n        };\n\n        const inlineRoot = new ExtendedNode(tree.rootNode, content, offsets);\n\n        inlineRoot.mappers.push(mergeHtml);\n\n        return inlineRoot;\n      });\n    };\n\n    root.mappers.push(inlineMapper);\n\n    return [root, trees];\n  }\n}\n\nexport function mergeHtml(tokens: TreeSitterNodeExt[]): TreeSitterNodeExt[] {\n  const result: TreeSitterNodeExt[] = [];\n\n  let i = 0;\n\n  while (i < tokens.length) {\n    const token = tokens[i];\n\n    // Only an opening HTML tag can start a chunk.\n    if (token.type !== 'html_tag') {\n      result.push(token);\n      i++;\n      continue;\n    }\n\n    const parsed = parseHtmlTag(token.text);\n\n    if (!parsed || parsed.type !== 'open') {\n      result.push(token);\n      i++;\n      continue;\n    }\n\n    // Try to find a valid matching HTML chunk starting here.\n    const end = findMatchingHtmlChunk(tokens, i);\n\n    if (end !== null) {\n      const htmlTokens = tokens.slice(i, end + 1);\n      const first = htmlTokens[0];\n      const text = htmlTokens\n        .map((t) => t.text)\n        .join('');\n\n      const htmlNode = new ExtendedNode({\n        type: 'html',\n        text,\n        id: 0,\n        tree: first.tree,\n        startIndex: first.startIndex,\n        endIndex: first.startIndex + text.length,\n        startPosition: first.startPosition,\n        endPosition: { // Assuming inline parser with single line\n          row: first.startPosition.row,\n          column: first.startPosition.column + text.length,\n        },\n        typeId: 0,\n        children: [],\n        parent: first.parent,\n      }, first.treeText);\n\n      result.push(htmlNode);\n\n      i = end + 1;\n      continue;\n    }\n\n    // This opening tag does not form a valid chunk.\n    // Keep it and continue looking. This is what allows\n    // nested valid HTML to be processed.\n    result.push(token);\n    i++;\n  }\n\n  return result;\n}\n\nfunction findMatchingHtmlChunk(\n  tokens: TreeSitterNodeExt[],\n  start: number,\n): number | null {\n  const stack: string[] = [];\n\n  for (let i = start; i < tokens.length; i++) {\n    const token = tokens[i];\n\n    if (token.type !== 'html_tag') {\n      continue;\n    }\n\n    const tag = parseHtmlTag(token.text);\n\n    if (!tag) {\n      return null;\n    }\n\n    if (tag.type === 'open') {\n      stack.push(tag.name);\n      continue;\n    }\n\n    if (tag.type === 'self') {\n      continue;\n    }\n\n    // Closing tag\n    if (stack.length === 0) {\n      return null;\n    }\n\n    const expected = stack[stack.length - 1];\n\n    if (expected !== tag.name) {\n      // The HTML chunk starting at `start` is invalid.\n      return null;\n    }\n\n    stack.pop();\n\n    // The original opening tag has now been closed.\n    if (stack.length === 0) {\n      return i;\n    }\n  }\n\n  // No matching closing tag.\n  return null;\n}\n\ntype ParsedTag = { type: 'open'; name: string } | {\n  type: 'close';\n  name: string;\n} | { type: 'self'; name: string };\n\nfunction parseHtmlTag(text: string): ParsedTag | null {\n  const closing = text.match(/^<\\s*\\/\\s*([a-zA-Z][\\w:-]*)\\s*>$/);\n\n  if (closing) {\n    return {\n      type: 'close',\n      name: closing[1].toLowerCase(),\n    };\n  }\n\n  const opening = text.match(\n    /^<\\s*([a-zA-Z][\\w:-]*)(?:\\s[^<>]*)?>$/,\n  );\n\n  if (opening) {\n    return {\n      type: 'open',\n      name: opening[1].toLowerCase(),\n    };\n  }\n\n  const selfClosing = text.match(\n    /^<\\s*([a-zA-Z][\\w:-]*)(?:\\s[^<>]*)?\\/\\s*>$/,\n  );\n\n  if (selfClosing) {\n    return {\n      type: 'self',\n      name: selfClosing[1].toLowerCase(),\n    };\n  }\n\n  return null;\n}\n","import { AssetLoad } from '@kerebron/editor';\nimport type { TreeSitterNode } from '@kerebron/tree-sitter';\nimport { Telemetry } from '@kerebron/editor/Telemetry';\n\nimport {\n  NESTING_CLOSING,\n  NESTING_OPENING,\n  NESTING_SELF_CLOSING,\n  Token,\n} from './types.ts';\n\nimport { CodeContentMapper } from '@kerebron/workspace/CodeContentMapper';\nimport { StackableMarkdownParser } from './StackableMarkdownParser.ts';\n\nfunction treeToTokens(\n  rootNode: TreeSitterNode,\n  source: string,\n  telemetry: Telemetry,\n): Array<Token> {\n  const retVal: Array<Token> = [];\n  let blockLevel = 0;\n\n  const nodeText = (node?: TreeSitterNode | null) => {\n    if (!node) {\n      return undefined;\n    }\n    return source.substring(node.startIndex, node.endIndex);\n  };\n\n  const pushInlineNode = (someInlineToken: Token, debug: string) => {\n    const lastBlockToken: Token | undefined = retVal[retVal.length - 1];\n\n    if (lastBlockToken?.type === 'inline') {\n      if (!lastBlockToken.children) {\n        lastBlockToken.children = [];\n      }\n      lastBlockToken.children.push(someInlineToken);\n      lastBlockToken.content = someInlineToken.content;\n      return;\n    }\n\n    const blockToken = new Token('inline', '', NESTING_SELF_CLOSING);\n    blockToken.info = debug;\n    blockToken.level = blockLevel;\n    blockToken.children = [someInlineToken];\n    blockToken.content = blockToken.children\n      .map((c) => c.content || '').join(\n        '',\n      );\n    retVal.push(blockToken);\n  };\n\n  const walkInline = (\n    children: TreeSitterNode[],\n  ) => {\n    const inlineContent = source;\n\n    const nodeText = (node?: TreeSitterNode | null) => {\n      if (!node) {\n        return undefined;\n      }\n      return inlineContent.substring(node.startIndex, node.endIndex);\n    };\n\n    const outputSplitText = (text: string, node: TreeSitterNode) => {\n      const rows = text.split('\\n');\n      let rowOffset = 0;\n      for (const row of rows) {\n        if (rowOffset > 0) {\n          const map: [number, number, number, number] = [ // TODO verify in viewer\n            node.startPosition?.row + rowOffset,\n            node.endPosition?.row + rowOffset,\n            0,\n            0,\n          ];\n\n          const sbToken = new Token('softbreak', 'wbr', NESTING_SELF_CLOSING);\n          sbToken.map = map;\n          sbToken.content = '\\n';\n          pushInlineNode(sbToken, 'softbreak between text rows');\n        }\n\n        const map: [number, number, number, number] = [\n          node.startPosition?.row + rowOffset,\n          node.endPosition?.row + rowOffset,\n          node.startPosition?.column,\n          node.endPosition?.column,\n        ];\n\n        const token = new Token('text', '', NESTING_SELF_CLOSING);\n        token.map = map;\n        token.meta = 'noEscText';\n        token.content = rows.length > 1 ? row.replace(/^\\s+/, '') : row;\n        pushInlineNode(token, 'text');\n\n        rowOffset++;\n      }\n    };\n\n    for (const node of children) {\n      const map: [number, number, number, number] = [\n        node.startPosition?.row,\n        node.endPosition?.row,\n        node.startPosition?.column,\n        node.endPosition?.column,\n      ];\n      if (node.type.length === 1) { // single letter type is text\n        const token = new Token('text', '', NESTING_SELF_CLOSING);\n        token.map = map;\n        token.meta = 'noEscText';\n        token.content = nodeText(node) || '';\n        pushInlineNode(token, 'walkInline');\n        continue;\n      }\n\n      switch (node.type) {\n        case 'block_continuation':\n        case 'emphasis_delimiter':\n        case 'code_span_delimiter':\n          break;\n\n        case 'inline':\n        case 'text':\n          {\n            const text = nodeText(node) ?? '';\n            outputSplitText(text, node);\n          }\n          break;\n\n        case 'entity_reference':\n          {\n            const text = nodeText(node) ?? '';\n            const map: [number, number, number, number] = [\n              node.startPosition?.row,\n              node.endPosition?.row,\n              0,\n              0,\n            ];\n\n            const entityToken = new Token(\n              'entity',\n              'entity',\n              NESTING_SELF_CLOSING,\n            );\n            entityToken.map = map;\n            entityToken.content = text;\n            pushInlineNode(entityToken, 'entity');\n          }\n          break;\n\n        case 'latex_block':\n          {\n            const delimiter = node.children\n              .find((c: any) => c?.type === 'latex_span_delimiter');\n\n            const content = node.children\n              .filter((c: any) => c?.type !== 'latex_span_delimiter')\n              .map((c: any) => nodeText(c))\n              .join('');\n\n            const text = nodeText(delimiter) || '';\n            if ('$$' === text) {\n              const token = new Token(\n                'fence',\n                'pre',\n                NESTING_SELF_CLOSING,\n              );\n              token.level = blockLevel;\n              token.markup = text;\n              token.meta = 'noEscText';\n              token.attrSet('lang', 'latex');\n\n              token.content = content.trim();\n              retVal.push(token);\n            } else if ('$' === text) {\n              const token = new Token(\n                'math',\n                'math',\n                NESTING_SELF_CLOSING,\n              );\n              token.level = blockLevel;\n\n              token.markup = text;\n              token.meta = 'noEscText';\n              token.attrSet('lang', 'latex');\n\n              token.content = content;\n              retVal.push(token);\n            } else {\n              const token = new Token('math', '', NESTING_SELF_CLOSING);\n              token.attrSet('lang', 'latex');\n              token.map = map;\n              token.meta = 'noEscText';\n\n              token.content = content;\n              pushInlineNode(token, 'latex_block');\n            }\n          }\n          break;\n\n        case 'whitespace':\n          {\n            const text = nodeText(node) || '';\n            if (text === '\\n') {\n              const token = new Token('softbreak', 'wbr', NESTING_SELF_CLOSING);\n              token.map = map;\n              token.content = text ?? '';\n              pushInlineNode(token, 'whitespace \\n');\n              break;\n            }\n            if (text && text.match(/^\\s+$/)) {\n              if (text.endsWith('  \\n')) {\n                const token = new Token(\n                  'hardbreak',\n                  'wbr',\n                  NESTING_SELF_CLOSING,\n                );\n                token.map = map;\n                token.meta = 'noEscText';\n                token.content = text ?? '';\n                pushInlineNode(token, 'whitespace hardbreak');\n              } else {\n                const token = new Token('text', 'br', NESTING_SELF_CLOSING);\n                token.map = map;\n                token.meta = 'noEscText';\n                token.content = text ?? '';\n                pushInlineNode(token, 'whitespace space');\n              }\n              break;\n            }\n            if (text?.trim().length > 0) {\n              outputSplitText(text, node);\n              break;\n            }\n          }\n          break;\n\n        case 'shortcut_link':\n          {\n            const tokenName = 'link';\n            const tagName = 'a';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n\n            const destination = node.children\n              .find((c: any) => c?.type === 'link_destination');\n            openToken.attrSet('href', nodeText(destination) || '');\n\n            const title = node.children\n              .find((c: any) => c?.type === 'link_title');\n            if (title) {\n              openToken.attrSet('title', nodeText(title) || '');\n            }\n\n            pushInlineNode(openToken, 'shortcut_link');\n\n            node.children\n              .filter((c: any) => c.type === 'link_text')\n              .forEach((c: any) => {\n                const token = new Token('text', '', NESTING_SELF_CLOSING);\n                token.map = map;\n                token.meta = 'noEscText';\n                token.content = nodeText(c) ?? '';\n                pushInlineNode(token, 'link_text');\n              });\n\n            // walkInline(node.children);\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            pushInlineNode(closeToken, '/shortcut_link');\n          }\n          break;\n\n        case 'uri_autolink':\n          {\n            const tokenName = 'link';\n            const tagName = 'a';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n\n            let href = node.text;\n            if (href.startsWith('<') && href.endsWith('>')) {\n              href = href.substring(1, href.length - 1);\n            }\n            openToken.attrSet('href', href || '');\n\n            pushInlineNode(openToken, 'inline_link');\n\n            node.children\n              .filter((c: any) => c.type === 'link_text')\n              .forEach((c: any) => {\n                const token = new Token('text', '', NESTING_SELF_CLOSING);\n                token.map = map;\n                token.meta = 'noEscText';\n                token.content = nodeText(c) ?? '';\n                pushInlineNode(token, 'inline_link_txt');\n              });\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            pushInlineNode(closeToken, '/inline_link');\n          }\n          break;\n\n        case 'inline_link':\n          {\n            const tokenName = 'link';\n            const tagName = 'a';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n\n            const destination = node.children\n              .find((c: any) => c.type === 'link_destination');\n            openToken.attrSet('href', destination?.text || '');\n\n            const title = node.children\n              .find((c: any) => c.type === 'link_title');\n            if (title) {\n              openToken.attrSet('title', title.text || '');\n            }\n\n            pushInlineNode(openToken, 'inline_link');\n\n            node.children\n              .filter((c: any) => c.type === 'link_text')\n              .forEach((c: any) => {\n                const token = new Token('text', '', NESTING_SELF_CLOSING);\n                token.map = map;\n                token.meta = 'noEscText';\n                token.content = nodeText(c) ?? '';\n                pushInlineNode(token, 'inline_link_txt');\n              });\n\n            // walkInline(node.children);\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            pushInlineNode(closeToken, '/inline_link');\n          }\n          break;\n        case 'image':\n          {\n            const tokenName = 'image';\n            const tagName = 'img';\n            const token = new Token(\n              tokenName,\n              tagName,\n              NESTING_SELF_CLOSING,\n            );\n\n            const image_description = node.children\n              .find((c: any) => c.type === 'image_description');\n            token.attrSet('alt', image_description?.text || '');\n\n            const destination = node.children\n              .find((c: any) => c.type === 'link_destination');\n            token.attrSet('src', destination?.text || '');\n\n            const title = node.children\n              .find((c: any) => c.type === 'link_title');\n            if (title) {\n              token.attrSet('title', title.text || '');\n            }\n\n            pushInlineNode(token, 'image');\n          }\n          break;\n        case 'strong_emphasis':\n          {\n            const delimiter = node.children\n              .find((c: any) => c.type === 'emphasis_delimiter');\n\n            const tokenName = delimiter?.text === '_' ? 'underline' : 'strong';\n            const tagName = delimiter?.text === '_' ? 'u' : 'strong';\n\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n            if (delimiter?.text === '_') {\n              openToken.markup = '__';\n            }\n            pushInlineNode(openToken, 'strongem');\n\n            walkInline(node.children);\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            if (nodeText(delimiter) === '_') {\n              closeToken.markup = '__';\n            }\n            pushInlineNode(closeToken, '/strongem');\n          }\n          break;\n        case 'emphasis':\n          {\n            const delimiter = node.children\n              .find((c: any) => c.type === 'emphasis_delimiter');\n\n            const children = node.children\n              .filter((c: any) => c.type !== 'emphasis_delimiter');\n\n            const tokenName = delimiter?.text === '_' ? 'underline' : 'em';\n            const tagName = delimiter?.text === '_' ? 'u' : 'em';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n            pushInlineNode(openToken, 'em');\n\n            walkInline(children.filter((c: any) => !!c));\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            pushInlineNode(closeToken, '/em');\n          }\n          break;\n        case 'strikethrough':\n          {\n            const tokenName = 'strike';\n            const tagName = 'strike';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n            pushInlineNode(openToken, 's');\n\n            walkInline(node.children.filter((c: any) => !!c));\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            pushInlineNode(closeToken, '/s');\n          }\n          break;\n        case 'code_span':\n          {\n            const tokenName = 'code';\n            const tagName = 'code';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n            pushInlineNode(openToken, 'code');\n\n            walkInline(node.children.filter((c: any) => !!c));\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            pushInlineNode(closeToken, '/code');\n          }\n          break;\n        case 'html':\n        case 'html_tag':\n          {\n            const tokenName = 'html_block';\n            const tagName = '';\n            const token = new Token(\n              tokenName,\n              tagName,\n              NESTING_SELF_CLOSING,\n            );\n\n            token.content = nodeText(node) || '';\n\n            pushInlineNode(token, 'html_block');\n          }\n          break;\n        case 'hard_line_break':\n          {\n            const tokenName = 'hardbreak';\n            const tagName = 'br';\n            const token = new Token(\n              tokenName,\n              tagName,\n              NESTING_SELF_CLOSING,\n            );\n\n            token.map = map;\n            token.meta = 'noEscText';\n            token.content = nodeText(node) ?? '';\n            pushInlineNode(token, 'hard_line_break');\n          }\n          break;\n        case 'backslash_escape':\n          {\n            const token = new Token('text', '', NESTING_SELF_CLOSING);\n            token.map = map;\n            token.meta = 'noEscText';\n            token.content = nodeText(node) ?? '';\n            pushInlineNode(token, 'backslash_escape');\n          }\n          break;\n        default:\n          {\n            const mapper = CodeContentMapper.create(source);\n            const [line, col] = mapper.toRawTextLineCol(node.startIndex);\n\n            const token = new Token('text', '', NESTING_SELF_CLOSING);\n            token.map = map;\n            token.meta = 'noEscText';\n\n            const json = 'toJSON' in node ? (node as any).toJSON() : {};\n            token.content =\n              `Error: Unhandled inline node type: ${node.type}, text: ${node.text} ${\n                JSON.stringify({\n                  ...json,\n                  lineNo: line,\n                  colNo: col + 1,\n                })\n              }`;\n            pushInlineNode(token, 'unhandled_inline');\n\n            if (true) {\n              console.debug(\n                `Unhandled inline node type: ${node.type}, text: ${node.text}`,\n                {\n                  cause: {\n                    ...json,\n                    lineNo: line,\n                    colNo: col + 1,\n                  },\n                },\n              );\n            } else {\n              throw new Error(\n                `Unhandled inline node type: ${node.type}, text: ${node.text}`,\n                {\n                  cause: {\n                    node,\n                    lineNo: line,\n                    colNo: col + 1,\n                  },\n                },\n              );\n            }\n          }\n          break;\n      }\n    }\n  };\n\n  const walkRecursive = (\n    node?: TreeSitterNode,\n    ctx: {\n      tableRowType: 'thead' | 'tbody';\n      cellNo: number;\n      cellAlign: Array<'left' | 'right'>;\n    } = { tableRowType: 'tbody', cellNo: 0, cellAlign: [] },\n  ) => {\n    if (!node) {\n      return;\n    }\n\n    if (node.type === 'inline') {\n      const inlineText = nodeText(node);\n      if (!inlineText) {\n        throw new Error('!inlineText');\n      }\n\n      const children = node.children.length > 0 ? node.children : [node];\n      const firstNonEmpty = children.findIndex((c) => c.type !== 'whitespace');\n      const lastNonEmpty = children.findLastIndex((c) =>\n        c.type !== 'whitespace'\n      );\n      if (firstNonEmpty > -1) {\n        walkInline(\n          children.slice(\n            firstNonEmpty,\n            lastNonEmpty > -1 ? lastNonEmpty + 1 : children.length,\n          ),\n        );\n      }\n\n      return;\n    }\n\n    if (!node.children || node.children.length === 0) {\n      if (node.type === 'text' || node.type.length === 1) {\n        const token = new Token('text', '', NESTING_SELF_CLOSING);\n        token.map = [\n          +node.startPosition?.row,\n          +node.endPosition?.row,\n          +node.startPosition?.column,\n          +node.endPosition?.column,\n        ];\n        token.meta = 'noEscText';\n        token.content = nodeText(node) ?? '';\n        pushInlineNode(token, 'txt2');\n        return;\n      }\n      if (node.type === 'whitespace') {\n        if (blockLevel === 0) {\n          return;\n        }\n        if ((nodeText(node) || '').match(/^\\n+$/)) {\n          //   const token = new Token('hardbreak', 'br', NESTING_SELF_CLOSING);\n          // token.map = [ +node.startPosition?.row, +node.endPosition?.row, +node.startPosition?.column, +node.endPosition?.column ];\n          //   token.content = nodeText(node) ?? '';\n          //   retVal.push(token);\n          return;\n        }\n\n        const text = nodeText(node) || '';\n        if (text && text.match(/^\\s+$/)) {\n          const token = new Token('text', 'br', NESTING_SELF_CLOSING);\n          token.map = [\n            +node.startPosition?.row,\n            +node.endPosition?.row,\n            +node.startPosition?.column,\n            +node.endPosition?.column,\n          ];\n          token.meta = 'noEscText';\n          token.content = nodeText(node) ?? '';\n          pushInlineNode(token, 'txt3');\n          return;\n        }\n        if (text.trim().length > 0) {\n          const token = new Token('text', '', NESTING_SELF_CLOSING);\n          token.map = [\n            +node.startPosition?.row,\n            +node.endPosition?.row,\n            +node.startPosition?.column,\n            +node.endPosition?.column,\n          ];\n          token.meta = 'noEscText';\n          token.content = text ?? '';\n          pushInlineNode(token, 'txt4');\n          return;\n        }\n      }\n    }\n\n    switch (node.type) {\n      case 'block_continuation':\n        break;\n      case 'document':\n      case 'section':\n        node.children\n          .filter((c: any) => !!c)\n          .forEach((c: any) => walkRecursive(c, ctx));\n        break;\n\n      case 'thematic_break':\n        {\n          const token = new Token('hr', 'hr', NESTING_SELF_CLOSING);\n          token.level = blockLevel;\n          token.map = [\n            +node.startPosition?.row,\n            +node.endPosition?.row,\n            +node.startPosition?.column,\n            +node.endPosition?.column,\n          ];\n          token.markup = nodeText(node) || '';\n          token.attrSet('margin_before', '1');\n          token.attrSet('margin_after', '1');\n          retVal.push(token);\n        }\n        break;\n\n      case 'setext_heading':\n        // case 'setext_h2_underline':\n        // TODO\n        // TODO\n\n        {\n          const tokenName = 'heading';\n\n          const underline = node.children\n            .filter((c: any) => !!c).find((c: any) =>\n              c.type.startsWith('setext_') &&\n              c.type.endsWith('_underline')\n            );\n\n          // const marker = node.children.find((child) =>\n          //   child.type.startsWith('atx_') && child.type.endsWith('_marker')\n          // );\n          const tagName =\n            underline?.type.substring('setext_'.length, 'setext_'.length + 2) ||\n            'h1';\n\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.markup = nodeText(underline) || '#';\n          openToken.attrSet('margin_before', '1');\n          retVal.push(openToken);\n\n          const children = node.children\n            .filter((c: any) => !!c).filter((c: any) =>\n              !c.type.startsWith('setext_')\n            );\n\n          blockLevel++;\n          children.forEach((child: any) => walkRecursive(child, ctx));\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          closeToken.markup = nodeText(underline) || '';\n\n          closeToken.attrSet('margin_after', '1');\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'atx_heading':\n        {\n          const tokenName = 'heading';\n\n          const marker = node.children.filter((c: any) => !!c).find((c: any) =>\n            c.type.startsWith('atx_') && c.type.endsWith('_marker')\n          );\n          const tagName =\n            marker?.type.substring('atx_'.length, 'atx_'.length + 2) || 'h1';\n\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.markup = nodeText(marker) || '#';\n          openToken.attrSet('margin_before', '1');\n          retVal.push(openToken);\n\n          const children = [...node.children.filter((c: any) => !!c)];\n          if (children.length > 0 && children[0].type.endsWith('_marker')) {\n            children.splice(0, 1);\n          }\n          if (children.length > 0 && children[0].type === 'whitespace') { // ' '\n            children.splice(0, 1);\n          }\n          if (\n            children.length > 0 &&\n            children[children.length - 1].type === 'whitespace'\n          ) { // /n\n            children.splice(children.length - 1, 1);\n          }\n\n          blockLevel++;\n          children.forEach((child) => walkRecursive(child, ctx));\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          closeToken.attrSet('margin_after', '1');\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'minus_metadata':\n        {\n          const tokenName = 'frontmatter';\n          const tagName = 'frontmatter';\n          const token = new Token(\n            tokenName,\n            tagName,\n            NESTING_SELF_CLOSING,\n          );\n          token.level = blockLevel;\n\n          token.content = nodeText(node) || '';\n\n          retVal.push(token);\n        }\n        break;\n\n      case 'fenced_code_block':\n        {\n          const tokenName = 'fence';\n          const tagName = 'pre';\n\n          const info = node.children.filter((c: any) => !!c).find((c: any) =>\n            c.type === 'info_string'\n          );\n\n          const token = new Token(\n            tokenName,\n            tagName,\n            NESTING_SELF_CLOSING,\n          );\n          token.meta = 'noEscText';\n          token.level = blockLevel;\n          token.markup = '```';\n          if (info) {\n            token.attrSet('lang', nodeText(info) || '');\n          }\n\n          const children = [\n            ...node.children.filter((c: any) => !!c)\n              .filter((c: any) => c?.type === 'code_fence_content'),\n          ];\n\n          const content = children\n            .map((inline) => nodeText(inline) || '')\n            .join('');\n\n          token.content = content;\n          token.attrSet('margin_before', '1');\n          token.attrSet('margin_after', '1');\n          retVal.push(token);\n        }\n        break;\n\n      case 'block_quote':\n        {\n          const tokenName = 'blockquote';\n          const tagName = 'blockquote';\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.attrSet('margin_before', '1');\n          retVal.push(openToken);\n\n          blockLevel++;\n          node.children\n            ?.filter((c: any) => !['block_quote_marker'].includes(c.type))\n            .forEach((c: any) => walkRecursive(c, ctx));\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          closeToken.attrSet('margin_after', '1');\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'indented_code_block':\n        {\n          const tokenName = 'code_block';\n          const tagName = 'code_block';\n\n          const token = new Token(\n            tokenName,\n            tagName,\n            NESTING_SELF_CLOSING,\n          );\n          token.level = blockLevel;\n\n          let indent = 80;\n          if ('indent' in node) {\n            indent = (node.indent as string).length;\n          }\n\n          const lines = node.text.split('\\n');\n          for (const line of lines) {\n            if (line.trim().length === 0) {\n              continue;\n            }\n            const m = line.match(/^ +/);\n            if (!m) {\n              indent = 0;\n            } else {\n              if (indent > m[0].length) {\n                indent = m[0].length;\n              }\n            }\n          }\n\n          const content = lines\n            .map((line: string) => line.substring(indent))\n            .join('\\n');\n\n          token.attrSet('indent', '' + indent);\n          token.content = content;\n\n          token.attrSet('margin_before', '1');\n          token.attrSet('margin_after', '1');\n          retVal.push(token);\n        }\n        break;\n\n      case 'paragraph':\n        {\n          const tokenName = 'paragraph';\n          const tagName = 'p';\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.attrSet('margin_before', '1');\n          retVal.push(openToken);\n\n          blockLevel++;\n          node.children?.forEach((c: any) => walkRecursive(c, ctx));\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          closeToken.attrSet('margin_after', '1');\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'pipe_table_cell':\n        {\n          const tokenName = ctx.tableRowType === 'thead' ? 'th' : 'td';\n          const tagName = ctx.tableRowType === 'thead' ? 'th' : 'td';\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.attrSet('align', ctx.cellAlign[ctx.cellNo] || 'left');\n          openToken.level = blockLevel;\n          retVal.push(openToken);\n\n          blockLevel++;\n\n          {\n            const tokenName = 'paragraph';\n            const tagName = 'p';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n            openToken.level = blockLevel;\n            retVal.push(openToken);\n\n            const children = [...node.children];\n            while (children.length > 0) {\n              if (children[children.length - 1].type === 'whitespace') {\n                children.splice(children.length - 1, 1);\n              } else {\n                break;\n              }\n            }\n\n            if (children.length > 0) {\n              children\n                .forEach((child) => walkRecursive(child, ctx));\n            } else {\n              const map: [number, number, number, number] = [\n                node.startPosition?.row,\n                node.endPosition?.row,\n                node.startPosition?.column,\n                node.endPosition?.column,\n              ];\n\n              const token = new Token('text', '', NESTING_SELF_CLOSING);\n              token.map = map;\n              token.meta = 'noEscText';\n              token.content = node.text?.replace(/\\s+$/, '') ?? '';\n              pushInlineNode(token, 'txt5');\n            }\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            closeToken.level = blockLevel;\n            retVal.push(closeToken);\n          }\n\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          retVal.push(closeToken);\n\n          ctx.cellNo++;\n        }\n        break;\n\n      case 'pipe_table_header':\n      case 'pipe_table_row':\n        {\n          const tokenName = 'tr';\n          const tagName = 'tr';\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          retVal.push(openToken);\n\n          blockLevel++;\n          node.children\n            .filter((c: any) => !!c)\n            .filter((c: any) => c.type === 'pipe_table_cell')\n            .forEach((c: any) => walkRecursive(c, ctx));\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'pipe_table':\n        {\n          const tokenName = 'table';\n          const tagName = 'table';\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.attrSet('margin_before', '1');\n          retVal.push(openToken);\n\n          blockLevel++;\n\n          const delimiterRows = node.children\n            .filter((c: any) => !!c)\n            .filter((c: any) => c.type === 'pipe_table_delimiter_row');\n\n          const cellAlign: Array<'left' | 'right'> = [];\n          if (delimiterRows.length > 0) {\n            const delimiterRow = delimiterRows[0];\n            const delimiterCells = delimiterRow.children\n              .filter((c: any) => !!c)\n              .filter((c: any) => c.type === 'pipe_table_delimiter_cell');\n\n            for (let cellNo = 0; cellNo < delimiterCells.length; cellNo++) {\n              const cell = delimiterCells[cellNo];\n              if (\n                cell.children\n                  .filter((c: any) => !!c)\n                  .find((c: any) => c.type === 'pipe_table_align_right')\n              ) {\n                cellAlign.push('right');\n              } else {\n                cellAlign.push('left');\n              }\n            }\n          }\n\n          const headRows = node.children\n            .filter((c: any) => !!c)\n            .filter((c: any) => c.type === 'pipe_table_header');\n          if (headRows.length > 0) {\n            const tokenName = 'thead';\n            const tagName = 'thead';\n            const openToken = new Token(\n              tokenName + '_open',\n              tagName,\n              NESTING_OPENING,\n            );\n            openToken.level = blockLevel;\n            retVal.push(openToken);\n\n            blockLevel++;\n            headRows.forEach((c: any) =>\n              walkRecursive(c, {\n                ...ctx,\n                tableRowType: 'thead',\n                cellNo: 0,\n                cellAlign: cellAlign,\n              })\n            );\n            blockLevel--;\n\n            const closeToken = new Token(\n              tokenName + '_close',\n              tagName,\n              NESTING_CLOSING,\n            );\n            closeToken.level = blockLevel;\n            retVal.push(closeToken);\n          }\n\n          const bodyRows = node.children\n            ?.filter((c: any) => c?.type === 'pipe_table_row');\n\n          if (bodyRows.length > 0) {\n            // const tokenName = 'tbody';\n            // const tagName = 'tbody';\n            // const openToken = new Token(\n            //   tokenName + '_open',\n            //   tagName,\n            //   NESTING_OPENING,\n            // );\n            // openToken.level = blockLevel;\n            // retVal.push(openToken);\n\n            blockLevel++;\n            bodyRows\n              .filter((c: any) => !!c)\n              .forEach((c: any) =>\n                walkRecursive(c, {\n                  ...ctx,\n                  tableRowType: 'tbody',\n                  cellAlign: cellAlign,\n                })\n              );\n            blockLevel--;\n\n            // const closeToken = new Token(\n            //   tokenName + '_close',\n            //   tagName,\n            //   NESTING_CLOSING,\n            // );\n            // closeToken.level = blockLevel;\n            // retVal.push(closeToken);\n          }\n\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          closeToken.attrSet('margin_after', '1');\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'list':\n        {\n          let tokenName = 'bullet_list';\n          let tagName = 'ul';\n\n          let start = '';\n          const firstItem = node.children.filter((c: any) => !!c).find((\n            item: any,\n          ) => item.type === 'list_item');\n          if (firstItem) {\n            const taskListMarker = firstItem.children.filter((c: any) => !!c)\n              .find((\n                c: any,\n              ) => c.type.startsWith('task_list_marker'));\n            const listMarker = firstItem.children.filter((c: any) => !!c).find((\n              c: any,\n            ) => c.type.startsWith('list_marker_dot'));\n            if (taskListMarker) {\n              tokenName = 'task_list';\n              tagName = 'ul';\n            } else if (listMarker) {\n              tokenName = 'ordered_list';\n              tagName = 'ol';\n              start = (nodeText(listMarker) || '').trim().replace('.', '');\n            }\n          }\n\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.markup = tagName === 'ol' ? '.' : '*';\n          openToken.attrSet('symbol', tagName === 'ol' ? '1' : '*');\n          if (start) {\n            openToken.attrSet('start', start);\n          }\n          openToken.attrSet('margin_before', '1');\n          retVal.push(openToken);\n\n          blockLevel++;\n          node.children.filter((c: any) => !!c).forEach((c: any) =>\n            walkRecursive(c, ctx)\n          );\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          closeToken.attrSet('margin_after', '1');\n          retVal.push(closeToken);\n        }\n        break;\n\n      case 'list_item':\n        {\n          const taskListMarker = node.children.filter((c: any) => !!c).find((\n            c: any,\n          ) => c.type.startsWith('task_list_marker_'));\n          const listMarker = node.children.filter((c: any) => !!c).find((\n            c: any,\n          ) => c.type.startsWith('list_marker_'));\n          if (!listMarker) {\n            break;\n          }\n\n          let tokenName = taskListMarker ? 'task_item' : 'list_item';\n          const tagName = 'li';\n          const openToken = new Token(\n            tokenName + '_open',\n            tagName,\n            NESTING_OPENING,\n          );\n          openToken.level = blockLevel;\n          openToken.markup = (nodeText(listMarker) || '').trim();\n\n          if (listMarker.type === 'list_marker_dot') {\n            // openToken.info = (nodeText(listMarker) || '').trim().replace('.', '');\n            // openToken.markup = '.';\n            openToken.info = '';\n            openToken.markup = '';\n          }\n\n          if (taskListMarker) {\n            if (taskListMarker.type === 'task_list_marker_checked') {\n              // throw new Error('aaaa')\n            }\n            openToken.attrSet(\n              'checked',\n              taskListMarker.type === 'task_list_marker_checked'\n                ? 'checked'\n                : '',\n            );\n          }\n\n          retVal.push(openToken);\n\n          blockLevel++;\n          node.children.filter((c: any) =>\n            ['paragraph', 'list', 'block_continuation'].includes(c.type)\n          ).forEach((c: any) => walkRecursive(c, ctx));\n          blockLevel--;\n\n          const closeToken = new Token(\n            tokenName + '_close',\n            tagName,\n            NESTING_CLOSING,\n          );\n          closeToken.level = blockLevel;\n          retVal.push(closeToken);\n        }\n\n        break;\n\n      case 'html_block':\n        {\n          const token = new Token('html_block', '', NESTING_SELF_CLOSING);\n          token.level = blockLevel;\n          token.content = nodeText(node) ?? '';\n          token.attrSet('margin_before', '1');\n          token.attrSet('margin_after', '1');\n          retVal.push(token);\n        }\n        break;\n\n      case 'text':\n        {\n          const token = new Token('text', '', NESTING_SELF_CLOSING);\n          token.level = blockLevel;\n          token.content = nodeText(node) ?? '';\n          retVal.push(token);\n        }\n        break;\n\n      default: {\n        const mapper = CodeContentMapper.create(source);\n        const [line, col] = mapper.toRawTextLineCol(node.startIndex);\n\n        const json = 'toJSON' in node ? (node as any).toJSON() : {};\n\n        const tokenName = 'fence';\n        const tagName = 'pre';\n\n        const info = node.children.filter((c: any) => !!c).find((c: any) =>\n          c.type === 'info_string'\n        );\n\n        const token = new Token(\n          tokenName,\n          tagName,\n          NESTING_SELF_CLOSING,\n        );\n        token.meta = 'noEscText';\n        token.level = blockLevel;\n        token.markup = '```';\n\n        const content =\n          `Error: Unhandled node type: ${node.type}, text: ${node.text} ${\n            JSON.stringify({\n              ...json,\n              lineNo: line,\n              colNo: col + 1,\n            })\n          }`;\n\n        token.content = content;\n        token.attrSet('margin_before', '1');\n        token.attrSet('margin_after', '1');\n        retVal.push(token);\n\n        if (true) {\n          console.debug(\n            `Unhandled node type: ${node.type}, text: ${node.text}`,\n            {\n              cause: {\n                ...json,\n                lineNo: line,\n                colNo: col + 1,\n              },\n            },\n          );\n        } else {\n          throw new Error(\n            `Unhandled node type: ${node?.type}, text: ${node?.text}`,\n            {\n              cause: {\n                lineNo: line + 1,\n                colNo: col + 1,\n                node,\n              },\n            },\n          );\n        }\n      }\n    }\n  };\n\n  walkRecursive(rootNode);\n\n  return retVal;\n}\n\nexport async function sitterTokenizer(\n  assetLoad: AssetLoad,\n  telemetry: Telemetry,\n) {\n  const parser = await StackableMarkdownParser.create(assetLoad);\n\n  return {\n    parse: (source: string): Array<Token> => {\n      let arr;\n      try {\n        arr = parser.parse(source);\n      } catch (err: any) {\n        const preview = source.length > 200\n          ? source.slice(0, 200) + '…'\n          : source;\n        throw new Error(\n          `StackableMarkdownParser.parse() threw (source length=${source.length}): ${\n            err?.message ?? err\n          }\\n  preview: ${JSON.stringify(preview)}`,\n          { cause: err },\n        );\n      }\n\n      if (!arr) {\n        throw new Error('Tree is null');\n      }\n\n      const rootNode = arr[0];\n      const trees = arr[1];\n\n      if (telemetry.enabled) {\n        telemetry.event('tree', rootNode);\n      }\n\n      const retVal = treeToTokens(\n        rootNode,\n        source,\n        telemetry,\n      );\n\n      for (const tree of trees) {\n        tree.delete();\n      }\n\n      return retVal;\n    },\n  };\n}\n","import type { Node, Schema } from 'prosemirror-model';\nimport { Slice } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\n\nimport {\n  AssetLoad,\n  type Converter,\n  type CoreEditor,\n  Extension,\n  type UrlRewriter,\n} from '@kerebron/editor';\nimport {\n  AsyncCommand,\n  Command,\n  CommandFactories,\n  CommandFactory,\n} from '@kerebron/editor/commands';\nimport { FrontmatterService } from '@kerebron/editor/frontmatter';\n\nimport {\n  extPmToMdConverter,\n  MarkdownResult,\n  pmToMdConverter,\n} from './pmToMdConverter.ts';\nimport { mdToPmConverter, mdToPmConverterText } from './mdToPmConverter.ts';\nimport type { Token } from './types.ts';\nimport {\n  createMarkdownPlugin,\n  MarkdownPluginKey,\n} from './createMarkdownPlugin.ts';\nimport { sitterTokenizer } from './treeSitterTokenizer.ts';\nimport { Telemetry } from '@kerebron/editor/Telemetry';\n\nexport interface MdConfig {\n  sourceMap?: boolean;\n  serializerDebug?: (...args: any[]) => void;\n  assetLoad?: AssetLoad;\n  urlRewriter?: UrlRewriter;\n  hooks?: HookArray;\n  frontmatter?: FrontmatterService;\n  tokenizer?: { parse: (source: string) => Array<Token> };\n  telemetry: Telemetry;\n  htmlListItems?: boolean;\n  listMargins?: Record<string, number>;\n}\n\nexport type HookArray = Array<Command | AsyncCommand>;\nexport type HookMap = Record<string, HookArray>;\n\nexport type { Token };\nexport type { MarkdownResult };\n\nexport class ExtensionMarkdown extends Extension {\n  name = 'markdown';\n  tokenizer: { parse: (source: string) => Array<Token> } | undefined;\n\n  public constructor(public override config: Partial<MdConfig> = {}) { // TODO move all config to dynamic commands\n    super(config);\n  }\n\n  override getConverters(\n    editor: CoreEditor,\n    schema: Schema,\n  ): Record<string, Converter> {\n    const converters: Record<string, Converter> = {\n      'text/x-markdown': {\n        fromDoc: (source: Node) => {\n          const markdownState = MarkdownPluginKey.getState(editor.state)!;\n          const telemetry: Telemetry = editor.ci.resolve('telemetry')!;\n          return telemetry.span('pm2md', () => {\n            return pmToMdConverter(\n              source,\n              {\n                telemetry,\n                assetLoad: this.editor.config.assetLoad,\n                ...this.config,\n                urlRewriter: markdownState.urlToRewriter,\n                hooks: markdownState.hooks['pm2md.pre'],\n                frontmatter: editor.ci.resolve(\n                  'frontmatter',\n                ) as FrontmatterService,\n              },\n              schema,\n              editor,\n            );\n          });\n        },\n        toDoc: async (source: Uint8Array) => {\n          if (!this.tokenizer && this.editor.config.assetLoad) {\n            this.tokenizer = await sitterTokenizer(\n              this.editor.config.assetLoad,\n              this.editor.ci.resolve('telemetry')!,\n            );\n          }\n\n          const markdownState = MarkdownPluginKey.getState(editor.state)!;\n          const telemetry: Telemetry = editor.ci.resolve('telemetry')!;\n          return telemetry.span('md2pm', async () => {\n            return await mdToPmConverter(source, {\n              telemetry,\n              assetLoad: this.editor.config.assetLoad,\n              tokenizer: this.tokenizer,\n              ...this.config,\n              urlRewriter: markdownState.urlFromRewriter,\n              hooks: markdownState.hooks['md2pm.post'],\n              frontmatter: editor.ci.resolve(\n                'frontmatter',\n              ) as FrontmatterService,\n            }, schema);\n          });\n        },\n      },\n    };\n    converters['text/markdown'] = converters['text/x-markdown'];\n    return converters;\n  }\n\n  toMarkdown(source: Node): Promise<MarkdownResult> {\n    const telemetry: Telemetry = this.editor.ci.resolve('telemetry')!;\n\n    return extPmToMdConverter(\n      source,\n      {\n        telemetry,\n        sourceMap: true,\n        frontmatter: this.editor.ci.resolve(\n          'frontmatter',\n        ) as FrontmatterService,\n      },\n      this.editor.schema,\n      this.editor,\n    );\n  }\n\n  async fromMarkdown(source: string): Promise<Slice> {\n    const telemetry: Telemetry = this.editor.ci.resolve('telemetry')!;\n\n    const doc = await mdToPmConverterText(\n      source,\n      { telemetry, assetLoad: this.editor.config.assetLoad, ...this.config },\n      this.editor.schema,\n    );\n\n    const fragment = doc.content;\n    if (fragment.content.length === 1) {\n      const first = fragment.content[0];\n      if (first.type.name === 'paragraph') {\n        return new Slice(first.content, 0, 0);\n      }\n    }\n\n    return new Slice(fragment, 0, 0);\n  }\n\n  override getCommandFactories(): Partial<CommandFactories> {\n    const getMarkdownHooks: CommandFactory = (\n      type: string,\n      cb: (hooks: HookArray) => void,\n    ) => {\n      return (state, dispatch) => {\n        const pluginState = MarkdownPluginKey.getState(state);\n        if (pluginState) {\n          cb(pluginState.hooks[type]);\n        } else {\n          cb([]);\n        }\n        return true;\n      };\n    };\n\n    const setMarkdownHooks: CommandFactory = (\n      type: string,\n      hooks: HookArray,\n    ) => {\n      return (state, dispatch) => {\n        if (dispatch) {\n          dispatch(\n            state.tr.setMeta(MarkdownPluginKey, {\n              setMarkdownHooks: { type, hooks },\n            }),\n          );\n        }\n        return true;\n      };\n    };\n\n    const setFromMarkdownUrlRewriter: CommandFactory = (\n      urlRewriter: UrlRewriter,\n    ) => {\n      return (state, dispatch) => {\n        if (dispatch) {\n          dispatch(\n            state.tr.setMeta(MarkdownPluginKey, {\n              setFromMarkdownUrlRewriter: { urlRewriter },\n            }),\n          );\n        }\n        return true;\n      };\n    };\n    const setToMarkdownUrlRewriter: CommandFactory = (\n      urlRewriter: UrlRewriter,\n    ) => {\n      return (state, dispatch) => {\n        if (dispatch) {\n          dispatch(\n            state.tr.setMeta(MarkdownPluginKey, {\n              setToMarkdownUrlRewriter: { urlRewriter },\n            }),\n          );\n        }\n        return true;\n      };\n    };\n\n    return {\n      getMarkdownHooks,\n      setMarkdownHooks,\n      setFromMarkdownUrlRewriter,\n      setToMarkdownUrlRewriter,\n    };\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      createMarkdownPlugin(this, this.editor),\n    ];\n  }\n}\n","import { NESTING_CLOSING, NESTING_OPENING } from '@kerebron/editor';\nimport { iterateChildren, NodeHandler, OdtStashContext } from '../OdtParser.ts';\n\nexport function inchesToMm(value: string): number {\n  if (!value) {\n    return 0;\n  }\n  if (value.endsWith('pt')) {\n    return parseFloat(value.substring(0, value.length - 2)) * 0.3528;\n  }\n  if (value.endsWith('in')) {\n    return parseFloat(value.substring(0, value.length - 2)) * 25.4;\n  }\n  if (value.endsWith('em')) {\n    return parseFloat(value.substring(0, value.length - 2)) / 0.125 * 25.4;\n  }\n  return 0;\n}\n\nexport function getInlineNodesHandlers(): Record<string, NodeHandler> {\n  return {\n    '$text': (ctx: OdtStashContext, value: any) => {\n      if (ctx.current.marks.length > 0) {\n        const parts = value.match(/^([ \\t\\u00A0]*)(.*)([ \\t\\u00A0]*)$/);\n\n        if (parts[1]) {\n          ctx.current.content.push(ctx.schema.text(parts[1]));\n        }\n        const node = ctx.createText(parts[2]);\n        if (node) {\n          ctx.current.content.push(node);\n        }\n        if (parts[3]) {\n          ctx.current.content.push(ctx.schema.text(parts[3]));\n        }\n        return;\n      }\n\n      const node = ctx.createText(value);\n      if (node) {\n        ctx.current.content.push(node);\n      }\n    },\n    's': (ctx: OdtStashContext, odtElement: any) => {\n      const chars = odtElement['@c'] || 1;\n      const text = ' '.repeat(chars);\n      const node = ctx.createText(text);\n      if (node) {\n        ctx.current.content.push(node);\n      }\n    },\n    'tab': (ctx: OdtStashContext, odtElement: any) => {\n      const node = ctx.createText('\\t');\n      if (node) {\n        ctx.current.content.push(node);\n      }\n    },\n    'rect': (ctx: OdtStashContext, odtElement: any) => {\n      if (odtElement['@rel-width'] === '100%') {\n        ctx.openNode();\n        ctx.closeNode('hr');\n      }\n    },\n    'line-break': (ctx: OdtStashContext, odtElement: any) => {\n      ctx.openNode();\n      ctx.closeNode('br');\n    },\n    'soft-page-break': (ctx: OdtStashContext, odtElement: any) => {\n      ctx.openNode();\n      ctx.closeNode('softbreak');\n    },\n    'bookmark': (ctx: OdtStashContext, element: any) => { // bookmark for parent para\n      ctx.openNode();\n      ctx.closeNode('node_bookmark', {\n        id: element['@name'],\n      });\n    },\n    'bookmark-start': (ctx: OdtStashContext, element: any) => {\n      // state.textMarks.add({\n      //   markName: 'bookmark',\n      //   markAttributes: {\n      //     id: element['@name'],\n      //   },\n      // });\n    },\n    'bookmark-end': (ctx: OdtStashContext, element: any) => {\n      // state.textMarks.forEach((x) =>\n      //   x.markName === 'bookmark' &&\n      //     x.markAttributes.id === element['@name']\n      //     ? state.textMarks.delete(x)\n      //     : x\n      // );\n    },\n    'change-start': (ctx: OdtStashContext, element: any) => {\n      ctx.openNode();\n      ctx.closeNode('comment', {\n        id: element['@change-id'],\n        nesting: NESTING_OPENING,\n      });\n    },\n    'change-end': (ctx: OdtStashContext, element: any) => {\n      ctx.openNode();\n      ctx.closeNode('comment', {\n        id: element['@change-id'],\n        nesting: NESTING_CLOSING,\n      });\n    },\n  };\n}\n\nexport function getBasicNodesHandlers(): Record<string, NodeHandler> {\n  return {\n    'body': (ctx: OdtStashContext, value: any) => {\n      ctx.handle('text', value.text);\n    },\n    'text': (ctx: OdtStashContext, value: any) => {\n      iterateChildren(\n        value.$value,\n        (child) => ctx.handle(child.tag, child.value),\n      );\n    },\n    'p': (ctx: OdtStashContext, value: any) => {\n      const attrs: Record<string, any> = {};\n\n      const style = ctx.getElementStyle(value);\n      const heading = style.styles.find((item) =>\n        item.startsWith('Heading_20_')\n      );\n      if (heading) {\n        attrs.level = parseInt(heading.substring('Heading_20_'.length));\n      }\n\n      let nodeType = 'paragraph';\n      if (style.styles.find((item) => item.startsWith('Heading_20_'))) {\n        nodeType = 'heading';\n      }\n\n      ctx.openNode();\n      const marks = ctx.styleToMarks(style);\n      if (marks.length > 0) {\n        ctx.current.marks = [...ctx.current.marks, ...marks];\n      }\n\n      iterateChildren(value.$value, (child) => {\n        ctx.handle(child.tag, child.value);\n      });\n\n      ctx.closeNode(nodeType, attrs);\n    },\n\n    'table-of-content': (ctx: OdtStashContext, value: any) => {\n      const levels: number[] = [];\n\n      let prevMarginLeft = -1;\n      for (const pElem of value['index-body']['p']) {\n        const style = ctx.getElementStyle(pElem) as any;\n        let marginLeft = 0;\n        if ('paragraph-properties' in style) {\n          marginLeft = inchesToMm(\n            style['paragraph-properties']['@margin-left'],\n          );\n        }\n\n        if (prevMarginLeft < marginLeft) {\n          if (levels.length > 0) {\n            ctx.openNode(); // list_item\n          }\n          ctx.openNode(); // bullet_list\n          levels.push(marginLeft);\n        } else {\n          for (let i = levels.length - 1; i >= 0; i--) {\n            if (levels[i] > marginLeft) {\n              ctx.closeNode('bullet_list', { odtMarginLeft: marginLeft });\n              if (i > 0) {\n                ctx.closeNode('list_item');\n              }\n              levels.pop();\n            } else {\n              break;\n            }\n          }\n        }\n        ctx.openNode();\n        ctx.handle('p', pElem);\n        ctx.closeNode('list_item');\n\n        prevMarginLeft = marginLeft;\n      }\n\n      for (let i = levels.length - 1; i >= 0; i--) {\n        const marginLeft = levels.pop();\n        if (i > 0) {\n          ctx.closeNode('bullet_list', { odtMarginLeft: marginLeft });\n          ctx.closeNode('list_item');\n        } else {\n          ctx.closeNode('bullet_list', {\n            odtMarginLeft: marginLeft,\n            toc: true,\n          });\n        }\n      }\n    },\n\n    'span': (ctx: OdtStashContext, value: any) => {\n      const style = ctx.getElementStyle(value);\n\n      const marks = ctx.styleToMarks(style);\n      if (marks.length > 0) {\n        ctx.stash();\n        ctx.current.marks = [...ctx.current.marks, ...marks];\n      }\n\n      iterateChildren(value.$value, (child) => {\n        ctx.handle(child.tag, child.value);\n      });\n\n      if (marks.length > 0) {\n        ctx.unstash();\n      }\n    },\n    'a': (ctx: OdtStashContext, value: any) => {\n      const attrs = {\n        href: value['@href'],\n        // title: tok.attrGet('title') || null,\n      };\n\n      const markType = ctx.schema.mark('link', attrs);\n\n      const marks = [markType];\n      if (marks.length > 0) {\n        ctx.stash();\n        ctx.current.marks = [...ctx.current.marks, ...marks];\n      }\n\n      iterateChildren(value.$value, (child) => {\n        ctx.handle(child.tag, child.value);\n      });\n\n      if (marks.length > 0) {\n        ctx.unstash();\n      }\n    },\n  };\n}\n","import {\n  iterateChildren,\n  ListStyle,\n  NodeHandler,\n  OdtStashContext,\n  resolveListStyle,\n} from '../OdtParser.ts';\nimport { inchesToMm } from './basic_node_handlers.ts';\n\n// https://docs.oasis-open.org/office/OpenDocument/v1.4/OpenDocument-v1.4-part3-schema.html#a_19_880_22__text_list_\n// The text:style-name attribute specifies the name of a list style that is applied to a list.\n// If this attribute is not included and therefore no list style is specified, one of the following actions is taken:\n//     •If a list is contained within another list, the list style defaults to the style of the surrounding list.\n//     •If there is no list style specified for the surrounding list, but the list's list items contain paragraphs that have paragraph styles attached specifying a list style, that list style is used.\n//     •An implementation-dependent default list style is used.\n// To determine which formatting properties are applied to a list, the list level and list style name are taken into account.\nfunction processListStyle(ctx: OdtStashContext, level: number) {\n  const listTracker = ctx.listTracker;\n  const attrs: Record<string, string | number> = {};\n\n  let style: ListStyle = resolveListStyle(\n    ctx.stylesTree,\n    ctx.automaticStyles,\n    '',\n  );\n\n  for (let i = listTracker.listStack.length - 1; i >= 0; i--) {\n    const list = listTracker.listStack[i];\n    if (!style['@name']) {\n      style = resolveListStyle(\n        ctx.stylesTree,\n        ctx.automaticStyles,\n        list.styleName,\n      );\n    }\n  }\n\n  let nodeTypeName = 'bullet_list';\n  if (style) {\n    const numLevelStyle = style['list-level-style-number'].find(\n      (levelStyle) => parseInt(String(levelStyle['@level'])) === level,\n    );\n    if (numLevelStyle) {\n      attrs['type'] = numLevelStyle['@num-format'] || '1';\n      if (numLevelStyle['@start-value']) {\n        attrs['start'] = String(numLevelStyle['@start-value']);\n      }\n      nodeTypeName = 'ordered_list';\n      const marginLeft =\n        numLevelStyle['list-level-properties']['list-level-label-alignment'][\n          '@margin-left'\n        ];\n      if (marginLeft) {\n        attrs['odtMarginLeft'] = inchesToMm(marginLeft);\n      }\n    }\n    const bulletLevelStyle = style['list-level-style-bullet'].find(\n      (levelStyle) => parseInt(String(levelStyle['@level'])) === level,\n    );\n    if (bulletLevelStyle) {\n      const marginLeft =\n        bulletLevelStyle['list-level-properties']['list-level-label-alignment'][\n          '@margin-left'\n        ];\n      if (marginLeft) {\n        attrs['odtMarginLeft'] = inchesToMm(marginLeft);\n      }\n    }\n  }\n\n  return {\n    attrs,\n    nodeTypeName,\n  };\n}\n\n// https://docs.oasis-open.org/office/OpenDocument/v1.4/OpenDocument-v1.4-part3-schema.html#element-text_list\nexport function getListNodesHandlers(): Record<string, NodeHandler> {\n  return {\n    'list': (ctx: OdtStashContext, odtElement) => {\n      const listTracker = ctx.listTracker;\n      listTracker.pushList(odtElement['@xml:id'], odtElement['@style-name']);\n\n      const { nodeTypeName, attrs } = processListStyle(\n        ctx,\n        listTracker.getCurrentList().level,\n      );\n\n      ctx.current.meta['list_type'] = nodeTypeName;\n\n      if (odtElement['@xml:id']) {\n        attrs['id'] = odtElement['@xml:id'];\n      }\n      if (odtElement['@continue-list']) {\n        attrs['continue'] = odtElement['@continue-list'];\n      }\n      if (odtElement['@continue-numbering']) {\n        attrs['continue'] = '_last';\n      }\n\n      ctx.openNode();\n\n      const children = odtElement['list-item'].map((item: any) => ({\n        'list-item': item,\n      }));\n\n      iterateChildren(children, (child) => {\n        ctx.handle(child.tag, child.value);\n      });\n\n      if (ctx.current.content.length === 0) {\n        ctx.dropNode();\n      } else {\n        ctx.closeNode(nodeTypeName, attrs);\n      }\n\n      listTracker.listStack.pop();\n    },\n    'list-item': (ctx: OdtStashContext, odtElement: any) => {\n      ctx.openNode();\n      iterateChildren(\n        odtElement.$value,\n        (child) => ctx.handle(child.tag, child.value),\n      );\n\n      const attrs: Record<string, string> = {};\n      attrs.markup = '* ';\n\n      ctx.closeNode('list_item', attrs);\n    },\n  };\n}\n","import { iterateChildren, NodeHandler, OdtStashContext } from '../OdtParser.ts';\n\nexport function getTableNodesHandlers(): Record<string, NodeHandler> {\n  return {\n    'table': (ctx: OdtStashContext, value: any) => {\n      ctx.openNode();\n      for (const item of value['table-row']) {\n        ctx.handle('table-row', item);\n      }\n      ctx.closeNode('table');\n    },\n    'table-row': (ctx: OdtStashContext, value: any) => {\n      ctx.openNode();\n      for (const item of value['table-cell']) {\n        ctx.handle('table-cell', item);\n      }\n      ctx.closeNode('table_row');\n    },\n    'table-cell': (ctx: OdtStashContext, value: any) => {\n      ctx.openNode();\n      iterateChildren(\n        value.$value,\n        (child) => ctx.handle(child.tag, child.value),\n      );\n      ctx.closeNode('table_cell');\n    },\n  };\n}\n","export class ListNumbering {\n  levels: { [level: number]: number } = {};\n  forceStart: { [level: number]: boolean } = {};\n\n  constructor(public readonly id: string) {\n    for (let i = 0; i < 20; i++) {\n      this.levels[i] = 1;\n    }\n  }\n\n  clearAbove(level: number) {\n    for (let i = level + 1; i < 20; i++) {\n      this.levels[i] = 1;\n    }\n  }\n\n  clone(id: string): ListNumbering {\n    const retVal = new ListNumbering(id);\n\n    retVal.levels = structuredClone(retVal.levels);\n    retVal.forceStart = structuredClone(retVal.forceStart);\n\n    return retVal;\n  }\n}\n\nexport interface List {\n  level: number;\n  id?: string;\n  styleName: string;\n}\n\nexport class ListTracker {\n  listStack: List[] = [];\n\n  pushList(id?: string, styleName = ''): List {\n    const list: List = {\n      id,\n      styleName,\n      level: this.listStack.length + 1,\n    };\n    this.listStack.push(list);\n    return list;\n  }\n\n  getCurrentList(): List {\n    return this.listStack[this.listStack.length - 1];\n  }\n}\n","import { Mark, Node, Schema } from 'prosemirror-model';\nimport {\n  getBasicNodesHandlers,\n  getInlineNodesHandlers,\n} from './node_handlers/basic_node_handlers.ts';\nimport { getListNodesHandlers } from './node_handlers/list_node_handlers.ts';\nimport { getTableNodesHandlers } from './node_handlers/table_node_handlers.ts';\nimport { ListTracker } from './lists.ts';\n\nconst COURIER_FONTS = ['Courier New', 'Courier', 'Roboto Mono'];\n\nexport interface OdtElement {\n  $value: 'TODO';\n}\n\nexport type NodeHandler = (ctx: OdtStashContext, value: any) => void;\n\nexport interface ListLLevelLabelAlignment {\n  '@margin-left'?: string;\n}\n\nexport interface ListLevelProperties {\n  'list-level-label-alignment': ListLLevelLabelAlignment;\n}\n\nexport interface ListLevelStyleBullet {\n  '@level': number;\n  'list-level-properties': ListLevelProperties;\n}\n\nexport interface ListLevelStyleNumber {\n  '@level': number;\n  '@start-value'?: number;\n  '@num-format': string;\n  'list-level-properties': ListLevelProperties;\n}\n\nexport interface ListStyle {\n  '@name'?: string;\n  'list-level-style-bullet': ListLevelStyleBullet[];\n  'list-level-style-number': ListLevelStyleNumber[];\n}\n\nexport interface TextProperty {\n  '@font-name'?: string;\n  '@font-weight'?: string;\n  '@font-style'?: string;\n  '@font-size'?: string;\n  '@text-underline-style'?: string;\n  '@color'?: string;\n}\n\nexport interface ParagraphProperty {\n  '@break-before'?: string;\n  '@break-after'?: string;\n  '@margin-left'?: string;\n}\n\nexport interface Style {\n  '@name'?: string;\n  '@parent-style-name'?: string;\n  styles: string[];\n  'text-properties'?: TextProperty;\n  'paragraph-properties'?: TextProperty;\n}\n\nexport interface StylesTree {\n  styles: {\n    'list-style': Array<ListStyle>;\n    'style': Array<Style>;\n  };\n}\n\nexport interface AutomaticStyles {\n  'style': Array<Style>;\n}\n\nexport function resolveListStyle(\n  stylesTree: StylesTree,\n  automaticStyles: AutomaticStyles,\n  name: string,\n): ListStyle {\n  let style: ListStyle | undefined;\n\n  style = stylesTree.styles['list-style'].find((item) =>\n    item['@name'] === name\n  );\n\n  if (!style) {\n    style = {\n      '@name': name,\n      'list-level-style-number': [],\n      'list-level-style-bullet': [],\n    };\n  }\n\n  return style;\n}\n\nexport function resolveStyle(\n  stylesTree: StylesTree,\n  automaticStyles: AutomaticStyles,\n  name: string,\n): Style {\n  let style: Style | undefined;\n\n  if (!style) {\n    style = stylesTree.styles['style'].find((item) => item['@name'] === name);\n  }\n  if (!style) {\n    style = automaticStyles.style.find((item) => item['@name'] === name);\n  }\n\n  if (!style) {\n    style = {\n      '@name': name,\n      styles: [],\n    };\n  }\n\n  style['styles'] = [name];\n\n  if (style['@parent-style-name']) {\n    const parentStyle = resolveStyle(\n      stylesTree,\n      automaticStyles,\n      style['@parent-style-name'],\n    );\n    if (parentStyle) {\n      const styles = [...style['styles'], ...parentStyle['styles']];\n      for (const key of Object.keys(style) as (keyof Style)[]) {\n        if (typeof style[key] === 'undefined') {\n          delete style[key];\n        }\n      }\n      style = {\n        ...parentStyle,\n        ...style,\n        styles,\n      };\n    }\n  }\n  return style;\n}\n\nexport interface TaggedEnum {\n  tag: string;\n  value: any;\n}\n\nexport function tagEnum(item: any) {\n  if ('string' === typeof item) {\n    return {\n      tag: item, // '$text',\n      value: item,\n    };\n  }\n  if ('object' === typeof item) {\n    const entries = Object.entries(item);\n    if (entries.length === 1) {\n      return {\n        tag: entries[0][0],\n        value: entries[0][1],\n      };\n    }\n  }\n\n  throw new Error('Incorrect enum: ' + JSON.stringify(item));\n}\n\nexport function iterateChildren(\n  nodes: unknown[],\n  callback: (item: TaggedEnum) => void,\n) {\n  for (const child of nodes) {\n    if ('Unknown' === child) {\n      continue;\n    }\n\n    const item = tagEnum(child);\n\n    callback(item);\n  }\n}\n\nexport function iterateEnum($value: unknown[]): Array<TaggedEnum> {\n  if (!$value) {\n    return [];\n  }\n  return $value.map(tagEnum);\n}\n\nexport interface OdtParserConfig {\n}\n\nexport interface OdtContext {\n  handlers: Record<string, NodeHandler>;\n  content: Node[];\n  marks: Mark[];\n  meta: Record<string, any>;\n}\n\nexport class OdtStashContext {\n  private ctxStash: Array<OdtContext> = [];\n  private currentCtx: OdtContext;\n  public listTracker = new ListTracker();\n  constructor(\n    readonly schema: Schema,\n    handlers: Record<string, NodeHandler>,\n    readonly stylesTree: StylesTree,\n    readonly automaticStyles: AutomaticStyles,\n  ) {\n    this.currentCtx = {\n      handlers,\n      content: [],\n      marks: [],\n      meta: {},\n    };\n    this.stash();\n  }\n\n  public stash(): number {\n    this.ctxStash.push(this.currentCtx);\n    const funcs = {};\n    const handlers = { ...this.currentCtx.handlers };\n    const content = this.currentCtx.content;\n    const marks = this.currentCtx.marks;\n    this.currentCtx = {\n      ...structuredClone({\n        ...this.currentCtx,\n        content: undefined,\n        marks: undefined,\n        handlers: undefined,\n      }),\n      ...funcs,\n      content,\n      marks,\n      handlers,\n    };\n\n    return this.ctxStash.length - 1;\n  }\n\n  public unstash() {\n    const ctx = this.ctxStash.pop();\n    if (!ctx) {\n      throw new Error('Unstash failed');\n    }\n    this.currentCtx = ctx;\n  }\n\n  public openNode() {\n    this.stash();\n    this.current.content = [];\n  }\n\n  public dropNode() {\n    this.unstash();\n  }\n\n  public closeNode(type: string, attrs = {}, marks = Mark.none) {\n    const node = this.createNode(type, attrs, marks);\n    this.unstash();\n    if (node) {\n      this.current.content.push(node);\n    }\n    return node;\n  }\n\n  private createNode(type: string, attrs = {}, marks = Mark.none) {\n    const nodeType = this.schema.nodes[type];\n    if (!nodeType) {\n      throw new Error('Invalid node type: ' + type);\n    }\n    const node = nodeType.createAndFill(attrs, this.current.content, marks);\n    if (!node) {\n      throw new Error('Error creating node: ' + type);\n    }\n    return node;\n  }\n\n  createText(text: string) {\n    if (!text) return;\n    const marks = uniqMarks(this.current.marks);\n    return this.schema.text(text, marks);\n  }\n\n  public styleToMarks(style: Style): Mark[] {\n    const marks: Mark[] = [];\n    const textProperties = style && style['text-properties'] || {};\n\n    if (COURIER_FONTS.indexOf(textProperties['@font-name'] || '') > -1) {\n      const markType = this.schema.mark('code');\n      marks.push(markType);\n    }\n\n    if (textProperties['@font-style'] === 'italic') {\n      const markType = this.schema.mark('em');\n      marks.push(markType);\n    }\n    if (textProperties['@font-weight'] === 'bold') {\n      const markType = this.schema.mark('strong');\n      marks.push(markType);\n    }\n\n    return marks;\n  }\n\n  public handle(nodeType: string, value: any) {\n    if (!this.current.handlers[nodeType]) {\n      throw new Error('No handler for node: ' + nodeType);\n    }\n    if ('function' !== typeof this.current.handlers[nodeType]) {\n      throw new Error('Invalid handler for node: ' + nodeType);\n    }\n\n    this.current.handlers[nodeType](this, value);\n  }\n\n  public getElementStyle(element: any): Style {\n    const style = ('object' === typeof element && element['@style-name'])\n      ? resolveStyle(\n        this.stylesTree,\n        this.automaticStyles,\n        element['@style-name'],\n      )\n      : {\n        styles: [],\n      };\n\n    return style;\n  }\n\n  get current() {\n    return this.currentCtx;\n  }\n}\n\nexport class OdtParser {\n  constructor(\n    private readonly schema: Schema,\n    private readonly config: OdtParserConfig = {},\n  ) {}\n\n  public filesMap?: Record<string, Uint8Array<ArrayBufferLike>>;\n\n  parse(files: any) {\n    const contentTree = files.contentTree;\n    const stylesTree = files.stylesTree;\n\n    const handlers: Record<string, NodeHandler> = {\n      ...getInlineNodesHandlers(),\n      ...getBasicNodesHandlers(),\n      ...getListNodesHandlers(),\n      ...getTableNodesHandlers(),\n      'g': () => { // Test is: embedded-diagram-example.odt\n        // DrawG draw:g\n        const node = ctx.createText(\n          'INSTEAD OF EMBEDDED DIAGRAM ABOVE USE EMBEDDED DIAGRAM FROM DRIVE AND PUT LINK TO IT IN THE DESCRIPTION. See: https://github.com/mieweb/wikiGDrive/issues/353',\n        );\n        if (node) {\n          ctx.current.content.push(node);\n        }\n      },\n      'frame': (ctx: OdtStashContext, odtElement: any) => {\n        if (odtElement.object && odtElement.object['@href']) {\n          const fullPath = odtElement.object['@href'].replace(/^\\.\\//, '') +\n            '/content.xml';\n          if (files[fullPath]) {\n            const content = new TextDecoder().decode(files[fullPath]);\n            ctx.openNode();\n            ctx.closeNode('math', {\n              lang: 'mathml',\n              content,\n            });\n            return;\n          }\n        }\n        if (odtElement.image && odtElement.image['@href']) { // TODO links rewrite\n          const alt = odtElement.desc?.['$value'] || '';\n          const src = odtElement.image['@href'];\n          ctx.openNode();\n          ctx.closeNode('image', {\n            src,\n            alt,\n          });\n        }\n      },\n\n      'annotation': () => {\n        // ignore: true,\n      },\n      'note': (ctx: OdtStashContext, value: any) => {\n        const citation = value['note-citation'];\n        const body = value['note-body'];\n\n        if (!citation || !body) {\n          return;\n        }\n\n        ctx.handle('text', { $value: [{ $text: citation.$value }] });\n        for (const para of body.p) {\n          iterateChildren(\n            para.$value,\n            (child) => ctx.handle(child.tag, child.value),\n          );\n          ctx.closeNode('paragraph');\n          ctx.openNode();\n        }\n      },\n    };\n\n    const ctx = new OdtStashContext(\n      this.schema,\n      handlers,\n      stylesTree,\n      contentTree['automatic-styles'],\n    );\n\n    ctx.openNode();\n    ctx.handle('body', contentTree.body);\n    return ctx.closeNode('doc');\n  }\n}\n\nfunction uniqMarks(marks: Mark[]): Mark[] {\n  const retVal: Mark[] = [];\n  for (const mark of marks) {\n    if (\n      ['strong', 'italic', 'underline', 'subscript', 'superscript', 'code']\n        .includes(mark.type.name)\n    ) {\n      if (retVal.find((m) => m.type === mark.type)) {\n        continue;\n      }\n    }\n    retVal.push(mark);\n  }\n\n  return retVal;\n}\n","import { Node } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport type { Command } from '@kerebron/editor/commands';\n\nexport const convertCodeParagraphsToCodeBlocks: Command = (\n  state,\n  dispatch,\n): boolean => {\n  const doc: Node = state.doc;\n  const schema = state.schema;\n  let tr: Transaction = state.tr;\n\n  const markCodeType = schema.marks.code;\n\n  doc.descendants((node, pos) => {\n    if (node.type.name === 'paragraph') {\n      let codeText = '';\n      let codeSize = 0;\n\n      const bookmarks: Node[] = [];\n\n      for (let childNo = 0; childNo < node.childCount; childNo++) {\n        const child = node.child(childNo);\n        const monospaced = child.marks.some((mark) =>\n          mark.type === markCodeType\n        );\n        const whitespaced = child.textContent.match(/^[ \\t\\u00A0]+$/);\n\n        if (child.type.name === 'node_bookmark') {\n          bookmarks.push(child);\n          codeSize += child.nodeSize;\n          continue;\n        }\n\n        if (child.type.name === 'br') {\n          codeText += '\\n';\n          codeSize += child.nodeSize;\n          continue;\n        }\n\n        if (monospaced || whitespaced) {\n          codeText += child.text || child.textBetween(0, child.content.size);\n          codeSize += child.nodeSize;\n          continue;\n        }\n\n        break;\n      }\n\n      if (codeSize > 0) {\n        const startPos = tr.mapping.map(pos);\n        const endPos = tr.mapping.map(pos + 1 + codeSize);\n\n        codeText = codeText.replaceAll('—', '-');\n\n        if (codeText.trim()) {\n          const textNode = schema.text(codeText);\n          const codeBlock = schema.nodes.code_block.createAndFill(null, [\n            textNode,\n          ]);\n\n          if (codeBlock) {\n            tr.replaceRangeWith(startPos, endPos, codeBlock);\n          }\n        } else {\n          tr.replace(startPos, endPos);\n        }\n        for (const bookmark of bookmarks) {\n          tr.insert(startPos, bookmark);\n        }\n      }\n\n      if (codeSize > 0 && codeSize + 2 === node.nodeSize) {\n        // tr.deleteRange(tr.mapping.map(pos), tr.mapping.map(pos))\n      }\n    }\n  });\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nimport { ListNumbering } from '../lists.ts';\n\nconst ANY_LIST = ['ordered_list', 'bullet_list'];\n\nexport const fixContinuedLists: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  let tr = state.tr;\n\n  const listNumberings: Map<string, ListNumbering> = new Map<\n    string,\n    ListNumbering\n  >();\n\n  let topListId = '';\n\n  function processContinuation(node: Node) {\n    let listNumbering = null;\n\n    if (topListId && listNumberings.has(topListId)) {\n      listNumbering = listNumberings.get(topListId);\n    }\n\n    const cont = node.attrs['continue'];\n    if (cont) {\n      listNumbering = listNumberings.get(cont);\n    }\n\n    if (!listNumbering) {\n      listNumbering = new ListNumbering(topListId);\n    }\n\n    listNumberings.set(topListId, listNumbering);\n\n    return { listNumbering };\n  }\n\n  let possibleContinue = true;\n  let level = 0;\n\n  function walk(\n    node: Node,\n    pos = 0,\n    depth = 0,\n  ) {\n    if ('list_item' === node.type.name) {\n      const listNumbering = listNumberings.get('_current');\n      const firstChild = node.content.firstChild;\n      if (firstChild && listNumbering) {\n        if (\n          firstChild.type.name === 'paragraph' &&\n          firstChild.content.childCount > 0\n        ) {\n          if (listNumbering.forceStart[level]) {\n            delete listNumbering.forceStart[level];\n\n            tr = tr.setNodeMarkup(tr.mapping.map(pos - 1), node.type, {\n              ...node.attrs,\n              value: listNumbering.levels[level],\n            });\n          }\n\n          listNumbering.levels[level]++;\n        } else {\n          tr = tr.setNodeMarkup(tr.mapping.map(pos - 1), node.type, {\n            ...node.attrs,\n            type: 'none',\n          });\n          listNumbering.forceStart[level] = true;\n        }\n      }\n    }\n\n    if (!ANY_LIST.includes(node.type.name)) {\n      node.forEach((child, offset) => {\n        walk(child, pos + offset + 1, depth + 1);\n      });\n    } else {\n      level++;\n\n      if (level === 1) {\n        topListId = node.attrs.id;\n        possibleContinue = true;\n      }\n\n      const { listNumbering } = processContinuation(node);\n\n      listNumberings.set('_current', listNumbering);\n\n      if (!possibleContinue) {\n        listNumbering.levels[level] = 1;\n      }\n\n      if (node.attrs.start) {\n        listNumbering.levels[level] = node.attrs.start;\n      }\n\n      if ('ordered_list' === node.type.name) {\n        if (1 < listNumbering.levels[level]) {\n          tr = tr.setNodeMarkup(tr.mapping.map(pos - 1), node.type, {\n            ...node.attrs,\n            start: listNumbering.levels[level],\n            continue: undefined,\n          });\n        }\n      }\n\n      node.forEach((child, offset) => {\n        walk(child, pos + offset + 1, depth + 1);\n      });\n\n      if (level === 1) {\n        listNumberings.set('_last', listNumbering);\n      }\n\n      level--;\n      possibleContinue = false;\n    }\n  }\n\n  walk(doc);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.steps.length > 0;\n};\n","import { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\n// Related tests:\n// test ./example-document.md\nexport const convertMathMl: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  const schema = state.schema;\n  const mathType = schema.nodes.math;\n  const codeBlockType = schema.nodes.code_block;\n\n  if (!mathType || !codeBlockType) {\n    return false;\n  }\n\n  let modified = false;\n\n  const tr = state.tr;\n\n  doc.forEach((parentNode, offset, index) => {\n    if (parentNode.childCount !== 1) {\n      return;\n    }\n\n    const parentPos = offset;\n\n    const node = parentNode.child(0);\n\n    if (node.type !== mathType) return;\n    if (node.attrs.content.length === 0) return;\n\n    const codeBlock = codeBlockType.create(\n      {\n        lang: node.attrs.lang,\n      },\n      schema.text(node.attrs.content),\n    );\n\n    tr.replaceWith(\n      tr.mapping.map(parentPos),\n      tr.mapping.map(parentPos + parentNode.nodeSize),\n      codeBlock,\n    );\n\n    modified = true;\n  });\n\n  if (!modified) return false;\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Command } from 'prosemirror-state';\n\nconst CODEBLOCK_START = ''; // gdocs\nconst CODEBLOCK_END = '';\n\n// Related tests:\n// test ./code-blocks.md\nexport const mergeCodeBlocks: Command = (state, dispatch): boolean => {\n  const schema = state.schema;\n  let tr = state.tr;\n\n  const codeBlockType = schema.nodes.code_block;\n  const paraBlockType = schema.nodes.paragraph;\n\n  state.doc.descendants((node, pos) => {\n    if (\n      [CODEBLOCK_START, CODEBLOCK_END].includes(\n        node.textContent.trim(),\n      )\n    ) {\n      tr = tr.deleteRange(\n        tr.mapping.map(pos),\n        tr.mapping.map(pos + node.nodeSize),\n      );\n    }\n  });\n\n  const parent = state.doc;\n  let offset = 0;\n  for (let nodeNo = 0; nodeNo < parent.childCount; nodeNo++) {\n    const node = parent.nodeAt(offset);\n    if (!node) {\n      continue;\n    }\n\n    if (node.type !== codeBlockType) {\n      offset += node.nodeSize;\n      continue;\n    }\n\n    let codeTexts = [];\n    let codeSize = 0;\n    {\n      codeSize += node.nodeSize;\n      const text = node.text || node.textBetween(0, node.content.size);\n      codeTexts.push(text.endsWith('\\n') ? text : text + '\\n');\n    }\n\n    let nextPos = offset + node.nodeSize;\n    while (true) {\n      const next = state.doc.nodeAt(nextPos);\n      if (!next) {\n        break;\n      }\n\n      nextPos += next.nodeSize;\n\n      if (next.type === paraBlockType && next.childCount === 0) {\n        codeTexts.push('\\n');\n        codeSize += next.nodeSize;\n        continue;\n      }\n\n      if (\n        next.type === codeBlockType && node.attrs.lang === next.attrs.lang &&\n        node.attrs.lang !== 'mathml'\n      ) {\n        const text = next.text || next.textBetween(0, next.content.size);\n        codeTexts.push(text.endsWith('\\n') ? text : text + '\\n');\n\n        codeSize += next.nodeSize;\n        continue;\n      }\n\n      break;\n    }\n\n    if (codeTexts.length > 1) {\n      const startPos = tr.mapping.map(offset);\n      const endPos = tr.mapping.map(offset + codeSize);\n\n      let codeText = codeTexts.join('').replace(/\\n+$/gm, '\\n');\n\n      const lines = codeText.split('\\n');\n      let emptyCount = 0;\n      for (emptyCount = 0; emptyCount < lines.length; emptyCount++) {\n        if (lines[emptyCount].trim()) {\n          break;\n        }\n      }\n      lines.splice(0, emptyCount);\n\n      codeText = lines.join('\\n');\n\n      const textNode = schema.text(codeText);\n      const codeBlock = schema.nodes.code_block.createAndFill({\n        lang: node.attrs.lang,\n      }, [textNode]);\n\n      if (codeBlock) {\n        tr = tr.replaceRangeWith(startPos, endPos, codeBlock);\n      }\n    }\n\n    offset += codeSize;\n  }\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import { Fragment, Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nconst ANY_LIST = ['ordered_list', 'bullet_list'];\n\ntype LevelMargins = Array<number>;\n\n// Related tests:\n// test ./example-document.md\nexport const fixListsLevels: Command = (state, dispatch): boolean => {\n  const doc: Node = state.doc;\n  const schema = state.schema;\n  const bulletListType = schema.nodes.bullet_list;\n  const listItemType = schema.nodes.list_item;\n  const paragraphType = schema.nodes.paragraph;\n\n  const tr = state.tr;\n\n  let level = 0;\n\n  let prevList: LevelMargins = [];\n  let curList: LevelMargins = [];\n  let fakeLevelGenerated = 0;\n\n  function walk(\n    nodes: readonly Node[],\n    pos = 0,\n    depth = 0,\n  ) {\n    let offset = 0;\n    for (let idx = 0; idx < nodes.length; idx++) {\n      const node = nodes[idx];\n\n      if (!ANY_LIST.includes(node.type.name)) {\n        walk(node.children, pos + offset + 1, depth + 1);\n      } else {\n        const marginLeft = node.attrs['odtMarginLeft'] || 0;\n        if (level === 0) {\n          curList = [];\n          fakeLevelGenerated = 0;\n          if (prevList.length >= level) {\n            for (let i = 0; i < prevList.length; i++) {\n              if (\n                fakeLevelGenerated < prevList.length &&\n                marginLeft > prevList[fakeLevelGenerated]\n              ) {\n                curList[level + fakeLevelGenerated] =\n                  prevList[fakeLevelGenerated];\n                fakeLevelGenerated++;\n              }\n            }\n          }\n        }\n\n        curList[level + fakeLevelGenerated] = marginLeft;\n\n        level++;\n\n        walk(node.children, pos + offset, depth + 1);\n\n        level--;\n\n        if (level === 0 && !node.attrs.toc) {\n          prevList = curList;\n          for (let i = 0; i < fakeLevelGenerated; i++) {\n            const wrapper = bulletListType.create(\n              { type: 'none' },\n              listItemType.create(\n                null,\n                Fragment.from([\n                  paragraphType.create(),\n                  node,\n                ]),\n              ),\n            );\n            tr.replaceWith(\n              tr.mapping.map(pos + offset),\n              tr.mapping.map(pos + offset + node.nodeSize),\n              wrapper,\n            );\n          }\n        }\n      }\n\n      offset += node.nodeSize;\n    }\n  }\n\n  walk(doc.children);\n\n  if (dispatch) {\n    dispatch(tr);\n  }\n\n  return tr.docChanged;\n};\n","import type { Node } from 'prosemirror-model';\nimport { Command } from 'prosemirror-state';\n\nimport { convertCodeParagraphsToCodeBlocks } from './convertCodeParagraphsToCodeBlocks.ts';\nimport { removeUnusedBookmarks } from './removeUnusedBookmarks.ts';\nimport { fixContinuedLists } from './fixContinuedLists.ts';\nimport { convertMathMl } from './convertMathMl.ts';\nimport { mergeCodeBlocks } from './mergeCodeBlocks.ts';\nimport { fixListsLevels } from './fixListsLevels.ts';\n\nexport interface PostProcessConfig {\n  doc: Node;\n  filesMap: Record<string, Uint8Array>;\n}\n\nexport function getDefaultsPostProcessFilters(\n  { doc, filesMap }: PostProcessConfig,\n): Array<Command> {\n  return [\n    // removeUnusedBookmarks,\n    convertCodeParagraphsToCodeBlocks,\n    fixListsLevels,\n    fixContinuedLists,\n    convertMathMl,\n    mergeCodeBlocks,\n  ];\n}\n","import { Node } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { UrlRewriter } from '@kerebron/editor';\n\nexport async function urlRewrite(\n  urlFromRewriter: UrlRewriter,\n  filesMap: Record<string, Uint8Array>,\n  state: EditorState,\n  dispatch: (tr: Transaction) => void,\n): Promise<boolean> {\n  const imageNodes: Array<{ node: Node; pos: number }> = [];\n  state.doc.descendants((node, pos) => {\n    if (node.type.name === 'image') {\n      imageNodes.push({ node, pos });\n    }\n  });\n\n  const linkNodes: Array<{ node: Node; pos: number }> = [];\n  state.doc.descendants((node, pos) => {\n    if (node.marks.find((mark) => mark.type.name === 'link')) {\n      linkNodes.push({ node, pos });\n    }\n  });\n\n  const tr = state.tr;\n\n  for (const { node, pos } of linkNodes) {\n    const linkMark = node.marks.find((mark) => mark.type.name === 'link');\n    if (!linkMark) {\n      continue;\n    }\n    let href = linkMark.attrs.href || '';\n    href = await urlFromRewriter(href, {\n      type: 'A',\n      dest: 'kerebron',\n    });\n    if (href !== linkMark.attrs.href) {\n      const newMarks = node.marks.map((mark) => {\n        if (mark.type.name === 'link') {\n          const markType = state.schema.marks['link'];\n          return markType.create({ ...mark.attrs, href });\n        }\n        return mark;\n      });\n\n      const nodeType = state.schema.nodes[node.type.name];\n      let replaceNode;\n      if (nodeType.isText) {\n        replaceNode = state.schema.text(\n          node.text || '',\n          newMarks,\n        );\n      } else {\n        replaceNode = nodeType.create(\n          node.attrs,\n          node.content,\n          newMarks,\n        );\n      }\n      tr.replaceWith(\n        tr.mapping.map(pos),\n        tr.mapping.map(pos + node.nodeSize),\n        replaceNode,\n      );\n    }\n  }\n\n  for (const { node, pos } of imageNodes) {\n    let src = node.attrs.src || '';\n\n    src = await urlFromRewriter(src, {\n      type: 'IMG',\n      dest: 'kerebron',\n      filesMap,\n    });\n\n    if (src !== node.attrs.src) {\n      const nodeType = state.schema.nodes[node.type.name];\n      const replaceNode = nodeType.create(\n        { ...node.attrs, src },\n        node.content,\n        node.marks,\n      );\n      tr.replaceWith(\n        tr.mapping.map(pos),\n        tr.mapping.map(pos + node.nodeSize),\n        replaceNode,\n      );\n    }\n  }\n  dispatch(tr);\n\n  return tr.docChanged;\n}\n","import type { Node, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport {\n  type Converter,\n  type CoreEditor,\n  Extension,\n  type UrlRewriter,\n} from '@kerebron/editor';\nimport {\n  Command,\n  CommandFactories,\n  CommandFactory,\n} from '@kerebron/editor/commands';\nimport { init } from '@kerebron/odt-wasm';\n\nimport { OdtParser, OdtParserConfig } from './OdtParser.ts';\nimport { getDefaultsPostProcessFilters } from './postprocess/postProcess.ts';\nimport { urlRewrite } from './postprocess/urlRewrite.ts';\n\nexport interface OdtConfig extends OdtParserConfig {\n  debug?: boolean;\n  postProcessCommands?: Command[];\n}\n\nlet odtWasm: Record<string, any> | undefined = undefined;\n\nexport class ExtensionOdt extends Extension {\n  name = 'odt';\n  public urlFromRewriter?: UrlRewriter;\n\n  constructor(public override config: OdtConfig = {}) {\n    super(config);\n  }\n\n  override getConverters(\n    editor: CoreEditor,\n    schema: Schema,\n  ): Record<string, Converter> {\n    const odtConverter = {\n      fromDoc: async (document: Node): Promise<Uint8Array> => {\n        throw new Error('Not implemented');\n      },\n      toDoc: async (buffer: Uint8Array): Promise<Node> => {\n        const assetLoad = editor.config.assetLoad;\n        if (!assetLoad) {\n          throw new Error('No assetLoad');\n        }\n\n        if (!odtWasm) {\n          const odtWasmArray = this.config.debug\n            ? await assetLoad('odt-wasm/odt-parser-debug.wasm')\n            : await assetLoad('odt-wasm/odt-parser.wasm');\n          odtWasm = await init(odtWasmArray);\n        }\n\n        const { doc, filesMap } = odtConverter.odtToJson(buffer, odtWasm);\n\n        const filterCommands = getDefaultsPostProcessFilters({\n          doc,\n          filesMap,\n        }).concat(\n          this.config.postProcessCommands || [],\n        );\n\n        let state = EditorState.create({ doc });\n        const dispatch = (tr: Transaction) => {\n          state = state.apply(tr);\n        };\n\n        if (this.urlFromRewriter) {\n          await urlRewrite(this.urlFromRewriter, filesMap, state, dispatch);\n        }\n\n        if (filterCommands.length > 0) {\n          for (const filter of filterCommands) {\n            filter(\n              state,\n              (tr) => dispatch(tr),\n            );\n          }\n        }\n\n        if (this.config.debug) {\n          const event = new CustomEvent('odt:pmdoc:filtered', {\n            detail: {\n              doc: state.doc,\n            },\n          });\n          this.editor.dispatchEvent(event);\n        }\n\n        return state.doc;\n      },\n      odtToJson: (buffer: Uint8Array, odtWasm: any) => {\n        const files = odtWasm.unzip(buffer);\n        const filesMap: Record<string, Uint8Array> = {};\n        for (const k of files.keys()) {\n          filesMap[k] = Uint8Array.from(files.get(k));\n        }\n\n        const stylesTree = odtWasm.parse_styles(files.get('styles.xml'));\n        const contentTree = odtWasm.parse_content(files.get('content.xml'));\n\n        if (this.config.debug) {\n          const event = new CustomEvent('odt:parsed', {\n            detail: {\n              stylesTree,\n              contentTree,\n              filesMap,\n            },\n          });\n          this.editor.dispatchEvent(event);\n        }\n\n        const parser = new OdtParser(editor.schema, this.config);\n        parser.filesMap = filesMap;\n\n        const doc = parser.parse({ ...filesMap, contentTree, stylesTree });\n\n        if (this.config.debug) {\n          const event = new CustomEvent('odt:pmdoc', {\n            detail: {\n              doc,\n            },\n          });\n          this.editor.dispatchEvent(event);\n        }\n\n        return { doc, stylesTree, contentTree, filesMap };\n      },\n    };\n\n    return {\n      'application/vnd.oasis.opendocument.text': odtConverter,\n    };\n  }\n\n  override getCommandFactories(): Partial<CommandFactories> {\n    const setFromOdtUrlRewriter: CommandFactory = (\n      urlRewriter: UrlRewriter,\n    ) => {\n      return () => {\n        this.urlFromRewriter = urlRewriter;\n        return true;\n      };\n    };\n\n    return {\n      setFromOdtUrlRewriter,\n    };\n  }\n}\n","import { Fragment, Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\n\nexport function createCell(\n  cellType: NodeType,\n  cellContent?: Fragment | ProsemirrorNode | Array<ProsemirrorNode>,\n): ProsemirrorNode | null | undefined {\n  if (cellContent) {\n    return cellType.createChecked(null, cellContent);\n  }\n\n  return cellType.createAndFill();\n}\n","import { NodeType, Schema } from 'prosemirror-model';\n\nexport function getTableNodeTypes(schema: Schema): { [key: string]: NodeType } {\n  if (schema.cached.tableNodeTypes) {\n    return schema.cached.tableNodeTypes;\n  }\n\n  const roles: { [key: string]: NodeType } = {};\n\n  Object.keys(schema.nodes).forEach((type) => {\n    const nodeType = schema.nodes[type];\n\n    if (nodeType.spec.tableRole) {\n      roles[nodeType.spec.tableRole] = nodeType;\n    }\n  });\n\n  schema.cached.tableNodeTypes = roles;\n\n  return roles;\n}\n","import { Fragment, Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { createCell } from './createCell.ts';\nimport { getTableNodeTypes } from './getTableNodeTypes.ts';\n\nexport function createTable(\n  schema: Schema,\n  rowsCount: number,\n  colsCount: number,\n  withHeaderRow: boolean,\n  cellContent?: Fragment | ProsemirrorNode | Array<ProsemirrorNode>,\n): ProsemirrorNode {\n  const types = getTableNodeTypes(schema);\n  const headerCells: ProsemirrorNode[] = [];\n  const cells: ProsemirrorNode[] = [];\n\n  for (let index = 0; index < colsCount; index += 1) {\n    const cell = createCell(types.cell, cellContent);\n\n    if (cell) {\n      cells.push(cell);\n    }\n\n    if (withHeaderRow) {\n      const headerCell = createCell(types.header_cell, cellContent);\n\n      if (headerCell) {\n        headerCells.push(headerCell);\n      }\n    }\n  }\n\n  const rows: ProsemirrorNode[] = [];\n\n  for (let index = 0; index < rowsCount; index += 1) {\n    rows.push(\n      types.row.createChecked(\n        null,\n        withHeaderRow && index === 0 ? headerCells : cells,\n      ),\n    );\n  }\n\n  const attrs: Record<string, string> = {};\n  const tableSpec = schema.spec.nodes.get('table')!;\n  for (const [key, attrSpec] of Object.entries(tableSpec.attrs || {})) {\n    if ('undefined' !== typeof attrSpec.default) {\n      attrs[key] = attrSpec.default;\n    }\n  }\n\n  return types.table.createChecked(attrs, rows);\n}\n","// Because working with row and column-spanning cells is not quite\n// trivial, this code builds up a descriptive structure for a given\n// table node. The structures are cached with the (persistent) table\n// nodes as key, so that they only have to be recomputed when the\n// content of the table changes.\n//\n// This does mean that they have to store table-relative, not\n// document-relative positions. So code that uses them will typically\n// compute the start position of the table and offset positions passed\n// to or gotten from this structure by that amount.\nimport { Attrs, Node } from 'prosemirror-model';\nimport { CellAttrs } from './util.ts';\n\n/**\n * @public\n */\nexport type ColWidths = number[];\n\n/**\n * @public\n */\nexport type Problem =\n  | {\n    type: 'colwidth mismatch';\n    pos: number;\n    colwidth: ColWidths;\n  }\n  | {\n    type: 'collision';\n    pos: number;\n    row: number;\n    n: number;\n  }\n  | {\n    type: 'missing';\n    row: number;\n    n: number;\n  }\n  | {\n    type: 'overlong_rowspan';\n    pos: number;\n    n: number;\n  }\n  | {\n    type: 'zero_sized';\n  };\n\nlet readFromCache: (key: Node) => TableMap | undefined;\nlet addToCache: (key: Node, value: TableMap) => TableMap;\n\n// Prefer using a weak map to cache table maps. Fall back on a\n// fixed-size cache if that's not supported.\nif (typeof WeakMap != 'undefined') {\n  // eslint-disable-next-line\n  const cache = new WeakMap<Node, TableMap>();\n  readFromCache = (key) => cache.get(key);\n  addToCache = (key, value) => {\n    cache.set(key, value);\n    return value;\n  };\n} else {\n  const cache: (Node | TableMap)[] = [];\n  const cacheSize = 10;\n  let cachePos = 0;\n  readFromCache = (key) => {\n    for (let i = 0; i < cache.length; i += 2) {\n      if (cache[i] == key) return cache[i + 1] as TableMap;\n    }\n  };\n  addToCache = (key, value) => {\n    if (cachePos == cacheSize) cachePos = 0;\n    cache[cachePos++] = key;\n    return (cache[cachePos++] = value);\n  };\n}\n\n/**\n * @public\n */\nexport interface Rect {\n  left: number;\n  top: number;\n  right: number;\n  bottom: number;\n}\n\n/**\n * A table map describes the structure of a given table. To avoid\n * recomputing them all the time, they are cached per table node. To\n * be able to do that, positions saved in the map are relative to the\n * start of the table, rather than the start of the document.\n *\n * @public\n */\nexport class TableMap {\n  constructor(\n    /**\n     * The number of columns\n     */\n    public width: number,\n    /**\n     * The number of rows\n     */\n    public height: number,\n    /**\n     * A width * height array with the start position of\n     * the cell covering that part of the table in each slot\n     */\n    public map: number[],\n    /**\n     * An optional array of problems (cell overlap or non-rectangular\n     * shape) for the table, used by the table normalizer.\n     */\n    public problems: Problem[] | null,\n  ) {}\n\n  // Find the dimensions of the cell at the given position.\n  findCell(pos: number): Rect {\n    for (let i = 0; i < this.map.length; i++) {\n      const curPos = this.map[i];\n      if (curPos != pos) continue;\n\n      const left = i % this.width;\n      const top = (i / this.width) | 0;\n      let right = left + 1;\n      let bottom = top + 1;\n\n      for (let j = 1; right < this.width && this.map[i + j] == curPos; j++) {\n        right++;\n      }\n      for (\n        let j = 1;\n        bottom < this.height && this.map[i + this.width * j] == curPos;\n        j++\n      ) {\n        bottom++;\n      }\n\n      return { left, top, right, bottom };\n    }\n    throw new RangeError(`No cell with offset ${pos} found`);\n  }\n\n  // Find the left side of the cell at the given position.\n  colCount(pos: number): number {\n    for (let i = 0; i < this.map.length; i++) {\n      if (this.map[i] == pos) {\n        return i % this.width;\n      }\n    }\n    throw new RangeError(`No cell with offset ${pos} found`);\n  }\n\n  // Find the next cell in the given direction, starting from the cell\n  // at `pos`, if any.\n  nextCell(pos: number, axis: 'horiz' | 'vert', dir: number): null | number {\n    const { left, right, top, bottom } = this.findCell(pos);\n    if (axis == 'horiz') {\n      if (dir < 0 ? left == 0 : right == this.width) return null;\n      return this.map[top * this.width + (dir < 0 ? left - 1 : right)];\n    } else {\n      if (dir < 0 ? top == 0 : bottom == this.height) return null;\n      return this.map[left + this.width * (dir < 0 ? top - 1 : bottom)];\n    }\n  }\n\n  // Get the rectangle spanning the two given cells.\n  rectBetween(a: number, b: number): Rect {\n    const {\n      left: leftA,\n      right: rightA,\n      top: topA,\n      bottom: bottomA,\n    } = this.findCell(a);\n    const {\n      left: leftB,\n      right: rightB,\n      top: topB,\n      bottom: bottomB,\n    } = this.findCell(b);\n    return {\n      left: Math.min(leftA, leftB),\n      top: Math.min(topA, topB),\n      right: Math.max(rightA, rightB),\n      bottom: Math.max(bottomA, bottomB),\n    };\n  }\n\n  // Return the position of all cells that have the top left corner in\n  // the given rectangle.\n  cellsInRect(rect: Rect): number[] {\n    const result: number[] = [];\n    const seen: Record<number, boolean> = {};\n    for (let row = rect.top; row < rect.bottom; row++) {\n      for (let col = rect.left; col < rect.right; col++) {\n        const index = row * this.width + col;\n        const pos = this.map[index];\n\n        if (seen[pos]) continue;\n        seen[pos] = true;\n\n        if (\n          (col == rect.left && col && this.map[index - 1] == pos) ||\n          (row == rect.top && row && this.map[index - this.width] == pos)\n        ) {\n          continue;\n        }\n        result.push(pos);\n      }\n    }\n    return result;\n  }\n\n  // Return the position at which the cell at the given row and column\n  // starts, or would start, if a cell started there.\n  positionAt(row: number, col: number, table: Node): number {\n    for (let i = 0, rowStart = 0;; i++) {\n      const rowEnd = rowStart + table.child(i).nodeSize;\n      if (i == row) {\n        let index = col + row * this.width;\n        const rowEndIndex = (row + 1) * this.width;\n        // Skip past cells from previous rows (via rowspan)\n        while (index < rowEndIndex && this.map[index] < rowStart) index++;\n        return index == rowEndIndex ? rowEnd - 1 : this.map[index];\n      }\n      rowStart = rowEnd;\n    }\n  }\n\n  // Find the table map for the given table node.\n  static get(table: Node): TableMap {\n    return readFromCache(table) || addToCache(table, computeMap(table));\n  }\n}\n\n// Compute a table map.\nfunction computeMap(table: Node): TableMap {\n  if (table.type.spec.tableRole != 'table') {\n    throw new RangeError('Not a table node: ' + table.type.name);\n  }\n  const width = findWidth(table),\n    height = table.childCount;\n  const map = [];\n  let mapPos = 0;\n  let problems: Problem[] | null = null;\n  const colWidths: ColWidths = [];\n  for (let i = 0, e = width * height; i < e; i++) map[i] = 0;\n\n  for (let row = 0, pos = 0; row < height; row++) {\n    const rowNode = table.child(row);\n    pos++;\n    for (let i = 0;; i++) {\n      while (mapPos < map.length && map[mapPos] != 0) mapPos++;\n      if (i == rowNode.childCount) break;\n      const cellNode = rowNode.child(i);\n      const { colspan, rowspan, colwidth } = cellNode.attrs;\n      for (let h = 0; h < rowspan; h++) {\n        if (h + row >= height) {\n          (problems || (problems = [])).push({\n            type: 'overlong_rowspan',\n            pos,\n            n: rowspan - h,\n          });\n          break;\n        }\n        const start = mapPos + h * width;\n        for (let w = 0; w < colspan; w++) {\n          if (map[start + w] == 0) map[start + w] = pos;\n          else {\n            (problems || (problems = [])).push({\n              type: 'collision',\n              row,\n              pos,\n              n: colspan - w,\n            });\n          }\n          const colW = colwidth && colwidth[w];\n          if (colW) {\n            const widthIndex = ((start + w) % width) * 2,\n              prev = colWidths[widthIndex];\n            if (\n              prev == null ||\n              (prev != colW && colWidths[widthIndex + 1] == 1)\n            ) {\n              colWidths[widthIndex] = colW;\n              colWidths[widthIndex + 1] = 1;\n            } else if (prev == colW) {\n              colWidths[widthIndex + 1]++;\n            }\n          }\n        }\n      }\n      mapPos += colspan;\n      pos += cellNode.nodeSize;\n    }\n    const expectedPos = (row + 1) * width;\n    let missing = 0;\n    while (mapPos < expectedPos) if (map[mapPos++] == 0) missing++;\n    if (missing) {\n      (problems || (problems = [])).push({ type: 'missing', row, n: missing });\n    }\n    pos++;\n  }\n\n  if (width === 0 || height === 0) {\n    (problems || (problems = [])).push({ type: 'zero_sized' });\n  }\n\n  const tableMap = new TableMap(width, height, map, problems);\n  let badWidths = false;\n\n  // For columns that have defined widths, but whose widths disagree\n  // between rows, fix up the cells whose width doesn't match the\n  // computed one.\n  for (let i = 0; !badWidths && i < colWidths.length; i += 2) {\n    if (colWidths[i] != null && colWidths[i + 1] < height) badWidths = true;\n  }\n  if (badWidths) findBadColWidths(tableMap, colWidths, table);\n\n  return tableMap;\n}\n\nfunction findWidth(table: Node): number {\n  let width = -1;\n  let hasRowSpan = false;\n  for (let row = 0; row < table.childCount; row++) {\n    const rowNode = table.child(row);\n    let rowWidth = 0;\n    if (hasRowSpan) {\n      for (let j = 0; j < row; j++) {\n        const prevRow = table.child(j);\n        for (let i = 0; i < prevRow.childCount; i++) {\n          const cell = prevRow.child(i);\n          if (j + cell.attrs.rowspan > row) rowWidth += cell.attrs.colspan;\n        }\n      }\n    }\n    for (let i = 0; i < rowNode.childCount; i++) {\n      const cell = rowNode.child(i);\n      rowWidth += cell.attrs.colspan;\n      if (cell.attrs.rowspan > 1) hasRowSpan = true;\n    }\n    if (width == -1) width = rowWidth;\n    else if (width != rowWidth) width = Math.max(width, rowWidth);\n  }\n  return width;\n}\n\nfunction findBadColWidths(\n  map: TableMap,\n  colWidths: ColWidths,\n  table: Node,\n): void {\n  if (!map.problems) map.problems = [];\n  const seen: Record<number, boolean> = {};\n  for (let i = 0; i < map.map.length; i++) {\n    const pos = map.map[i];\n    if (seen[pos]) continue;\n    seen[pos] = true;\n    const node = table.nodeAt(pos);\n    if (!node) {\n      throw new RangeError(`No cell with offset ${pos} found`);\n    }\n\n    let updated = null;\n    const attrs = node.attrs as CellAttrs;\n    for (let j = 0; j < attrs.colspan; j++) {\n      const col = (i + j) % map.width;\n      const colWidth = colWidths[col * 2];\n      if (\n        colWidth != null &&\n        (!attrs.colwidth || attrs.colwidth[j] != colWidth)\n      ) {\n        (updated || (updated = freshColWidth(attrs)))[j] = colWidth;\n      }\n    }\n    if (updated) {\n      map.problems.unshift({\n        type: 'colwidth mismatch',\n        pos,\n        colwidth: updated,\n      });\n    }\n  }\n}\n\nfunction freshColWidth(attrs: Attrs): ColWidths {\n  if (attrs.colwidth) return attrs.colwidth.slice();\n  const result: ColWidths = [];\n  for (let i = 0; i < attrs.colspan; i++) result.push(0);\n  return result;\n}\n","// Helper for creating a schema that supports tables.\n\nimport { NodeSpec, NodeType, Schema } from 'prosemirror-model';\n\n/**\n * @public\n */\nexport type TableNodes = Record<\n  'table' | 'table_row' | 'table_cell' | 'table_header',\n  NodeSpec\n>;\n\n/**\n * @public\n */\nexport type TableRole = 'table' | 'row' | 'cell' | 'header_cell';\n\n/**\n * @public\n */\nexport function tableNodeTypes(schema: Schema): Record<TableRole, NodeType> {\n  let result = schema.cached.tableNodeTypes;\n  if (!result) {\n    result = schema.cached.tableNodeTypes = {};\n    for (const name in schema.nodes) {\n      const type = schema.nodes[name],\n        role = type.spec.tableRole;\n      if (role) result[role] = type;\n    }\n  }\n  return result;\n}\n","// Various helper function for working with tables\n\nimport { EditorState, NodeSelection, PluginKey } from 'prosemirror-state';\n\nimport { Attrs, Node, ResolvedPos } from 'prosemirror-model';\nimport { CellSelection } from './CellSelection.ts';\nimport { tableNodeTypes } from './tableNodeTypes.ts';\nimport { Rect, TableMap } from './TableMap.ts';\n\n/**\n * @public\n */\nexport type MutableAttrs = Record<string, unknown>;\n\n/**\n * @public\n */\nexport interface CellAttrs {\n  colspan: number;\n  rowspan: number;\n  colwidth: number[] | null;\n}\n\n/**\n * @public\n */\nexport const tableEditingKey = new PluginKey<number>('selectingCells');\n\n/**\n * @public\n */\nexport function cellAround($pos: ResolvedPos): ResolvedPos | null {\n  for (let d = $pos.depth - 1; d > 0; d--) {\n    if ($pos.node(d).type.spec.tableRole == 'row') {\n      return $pos.node(0).resolve($pos.before(d + 1));\n    }\n  }\n  return null;\n}\n\nexport function cellWrapping($pos: ResolvedPos): null | Node {\n  for (let d = $pos.depth; d > 0; d--) {\n    // Sometimes the cell can be in the same depth.\n    const role = $pos.node(d).type.spec.tableRole;\n    if (role === 'cell' || role === 'header_cell') return $pos.node(d);\n  }\n  return null;\n}\n\n/**\n * @public\n */\nexport function isInTable(state: EditorState): boolean {\n  const $head = state.selection.$head;\n  for (let d = $head.depth; d > 0; d--) {\n    if ($head.node(d).type.spec.tableRole == 'row') return true;\n  }\n  return false;\n}\n\n/**\n * @internal\n */\nexport function selectionCell(state: EditorState): ResolvedPos {\n  const sel = state.selection as CellSelection | NodeSelection;\n  if ('$anchorCell' in sel && sel.$anchorCell) {\n    return sel.$anchorCell.pos > sel.$headCell.pos\n      ? sel.$anchorCell\n      : sel.$headCell;\n  } else if (\n    'node' in sel &&\n    sel.node &&\n    sel.node.type.spec.tableRole == 'cell'\n  ) {\n    return sel.$anchor;\n  }\n  const $cell = cellAround(sel.$head) || cellNear(sel.$head);\n  if ($cell) {\n    return $cell;\n  }\n  throw new RangeError(`No cell found around position ${sel.head}`);\n}\n\n/**\n * @public\n */\nexport function cellNear($pos: ResolvedPos): ResolvedPos | undefined {\n  for (\n    let after = $pos.nodeAfter, pos = $pos.pos;\n    after;\n    after = after.firstChild, pos++\n  ) {\n    const role = after.type.spec.tableRole;\n    if (role == 'cell' || role == 'header_cell') return $pos.doc.resolve(pos);\n  }\n  for (\n    let before = $pos.nodeBefore, pos = $pos.pos;\n    before;\n    before = before.lastChild, pos--\n  ) {\n    const role = before.type.spec.tableRole;\n    if (role == 'cell' || role == 'header_cell') {\n      return $pos.doc.resolve(pos - before.nodeSize);\n    }\n  }\n}\n\n/**\n * @public\n */\nexport function pointsAtCell($pos: ResolvedPos): boolean {\n  return $pos.parent.type.spec.tableRole == 'row' && !!$pos.nodeAfter;\n}\n\n/**\n * @public\n */\nexport function moveCellForward($pos: ResolvedPos): ResolvedPos {\n  return $pos.node(0).resolve($pos.pos + $pos.nodeAfter!.nodeSize);\n}\n\n/**\n * @internal\n */\nexport function inSameTable($cellA: ResolvedPos, $cellB: ResolvedPos): boolean {\n  return (\n    $cellA.depth == $cellB.depth &&\n    $cellA.pos >= $cellB.start(-1) &&\n    $cellA.pos <= $cellB.end(-1)\n  );\n}\n\n/**\n * @public\n */\nexport function findCell($pos: ResolvedPos): Rect {\n  return TableMap.get($pos.node(-1)).findCell($pos.pos - $pos.start(-1));\n}\n\n/**\n * @public\n */\nexport function colCount($pos: ResolvedPos): number {\n  return TableMap.get($pos.node(-1)).colCount($pos.pos - $pos.start(-1));\n}\n\n/**\n * @public\n */\nexport function nextCell(\n  $pos: ResolvedPos,\n  axis: 'horiz' | 'vert',\n  dir: number,\n): ResolvedPos | null {\n  const table = $pos.node(-1);\n  const map = TableMap.get(table);\n  const tableStart = $pos.start(-1);\n\n  const moved = map.nextCell($pos.pos - tableStart, axis, dir);\n  return moved == null ? null : $pos.node(0).resolve(tableStart + moved);\n}\n\n/**\n * @public\n */\nexport function removeColSpan(attrs: CellAttrs, pos: number, n = 1): CellAttrs {\n  const result: CellAttrs = { ...attrs, colspan: attrs.colspan - n };\n\n  if (result.colwidth) {\n    result.colwidth = result.colwidth.slice();\n    result.colwidth.splice(pos, n);\n    if (!result.colwidth.some((w) => w > 0)) result.colwidth = null;\n  }\n  return result;\n}\n\n/**\n * @public\n */\nexport function addColSpan(attrs: CellAttrs, pos: number, n = 1): Attrs {\n  const result = { ...attrs, colspan: attrs.colspan + n };\n  if (result.colwidth) {\n    result.colwidth = result.colwidth.slice();\n    for (let i = 0; i < n; i++) result.colwidth.splice(pos, 0, 0);\n  }\n  return result;\n}\n\n/**\n * @public\n */\nexport function columnIsHeader(\n  map: TableMap,\n  table: Node,\n  col: number,\n): boolean {\n  const headerCell = tableNodeTypes(table.type.schema).header_cell;\n  for (let row = 0; row < map.height; row++) {\n    if (table.nodeAt(map.map[col + row * map.width])!.type != headerCell) {\n      return false;\n    }\n  }\n  return true;\n}\n","// This file defines a ProseMirror selection subclass that models\n// table cell selections. The table plugin needs to be active to wire\n// in the user interaction part of table selections (so that you\n// actually get such selections when you select across cells).\n\nimport { Fragment, Node, ResolvedPos, Slice } from 'prosemirror-model';\nimport {\n  EditorState,\n  NodeSelection,\n  Selection,\n  SelectionRange,\n  TextSelection,\n  Transaction,\n} from 'prosemirror-state';\nimport { Decoration, DecorationSet, DecorationSource } from 'prosemirror-view';\n\nimport { Mappable } from 'prosemirror-transform';\nimport { TableMap } from './TableMap.ts';\nimport { CellAttrs, inSameTable, pointsAtCell, removeColSpan } from './util.ts';\n\n/**\n * @public\n */\nexport interface CellSelectionJSON {\n  type: string;\n  anchor: number;\n  head: number;\n}\n\n/**\n * A [`Selection`](http://prosemirror.net/docs/ref/#state.Selection)\n * subclass that represents a cell selection spanning part of a table.\n * With the plugin enabled, these will be created when the user\n * selects across cells, and will be drawn by giving selected cells a\n * `selectedCell` CSS class.\n *\n * @public\n */\nexport class CellSelection extends Selection {\n  // A resolved position pointing _in front of_ the anchor cell (the one\n  // that doesn't move when extending the selection).\n  public $anchorCell: ResolvedPos;\n\n  // A resolved position pointing in front of the head cell (the one\n  // moves when extending the selection).\n  public $headCell: ResolvedPos;\n\n  // A table selection is identified by its anchor and head cells. The\n  // positions given to this constructor should point _before_ two\n  // cells in the same table. They may be the same, to select a single\n  // cell.\n  constructor($anchorCell: ResolvedPos, $headCell: ResolvedPos = $anchorCell) {\n    const table = $anchorCell.node(-1);\n    const map = TableMap.get(table);\n    const tableStart = $anchorCell.start(-1);\n    const rect = map.rectBetween(\n      $anchorCell.pos - tableStart,\n      $headCell.pos - tableStart,\n    );\n\n    const doc = $anchorCell.node(0);\n    const cells = map\n      .cellsInRect(rect)\n      .filter((p) => p != $headCell.pos - tableStart);\n    // Make the head cell the first range, so that it counts as the\n    // primary part of the selection\n    cells.unshift($headCell.pos - tableStart);\n    const ranges = cells.map((pos) => {\n      const cell = table.nodeAt(pos);\n      if (!cell) {\n        throw RangeError(`No cell with offset ${pos} found`);\n      }\n      const from = tableStart + pos + 1;\n      return new SelectionRange(\n        doc.resolve(from),\n        doc.resolve(from + cell.content.size),\n      );\n    });\n    super(ranges[0].$from, ranges[0].$to, ranges);\n    this.$anchorCell = $anchorCell;\n    this.$headCell = $headCell;\n  }\n\n  public map(doc: Node, mapping: Mappable): CellSelection | Selection {\n    const $anchorCell = doc.resolve(mapping.map(this.$anchorCell.pos));\n    const $headCell = doc.resolve(mapping.map(this.$headCell.pos));\n    if (\n      pointsAtCell($anchorCell) &&\n      pointsAtCell($headCell) &&\n      inSameTable($anchorCell, $headCell)\n    ) {\n      const tableChanged = this.$anchorCell.node(-1) != $anchorCell.node(-1);\n      if (tableChanged && this.isRowSelection()) {\n        return CellSelection.rowSelection($anchorCell, $headCell);\n      } else if (tableChanged && this.isColSelection()) {\n        return CellSelection.colSelection($anchorCell, $headCell);\n      } else return new CellSelection($anchorCell, $headCell);\n    }\n    return TextSelection.between($anchorCell, $headCell);\n  }\n\n  // Returns a rectangular slice of table rows containing the selected\n  // cells.\n  public override content(): Slice {\n    const table = this.$anchorCell.node(-1);\n    const map = TableMap.get(table);\n    const tableStart = this.$anchorCell.start(-1);\n\n    const rect = map.rectBetween(\n      this.$anchorCell.pos - tableStart,\n      this.$headCell.pos - tableStart,\n    );\n    const seen: Record<number, boolean> = {};\n    const rows = [];\n    for (let row = rect.top; row < rect.bottom; row++) {\n      const rowContent = [];\n      for (\n        let index = row * map.width + rect.left, col = rect.left;\n        col < rect.right;\n        col++, index++\n      ) {\n        const pos = map.map[index];\n        if (seen[pos]) continue;\n        seen[pos] = true;\n\n        const cellRect = map.findCell(pos);\n        let cell = table.nodeAt(pos);\n        if (!cell) {\n          throw RangeError(`No cell with offset ${pos} found`);\n        }\n\n        const extraLeft = rect.left - cellRect.left;\n        const extraRight = cellRect.right - rect.right;\n\n        if (extraLeft > 0 || extraRight > 0) {\n          let attrs = cell.attrs as CellAttrs;\n          if (extraLeft > 0) {\n            attrs = removeColSpan(attrs, 0, extraLeft);\n          }\n          if (extraRight > 0) {\n            attrs = removeColSpan(\n              attrs,\n              attrs.colspan - extraRight,\n              extraRight,\n            );\n          }\n          if (cellRect.left < rect.left) {\n            cell = cell.type.createAndFill(attrs);\n            if (!cell) {\n              throw RangeError(\n                `Could not create cell with attrs ${JSON.stringify(attrs)}`,\n              );\n            }\n          } else {\n            cell = cell.type.create(attrs, cell.content);\n          }\n        }\n        if (cellRect.top < rect.top || cellRect.bottom > rect.bottom) {\n          const attrs = {\n            ...cell.attrs,\n            rowspan: Math.min(cellRect.bottom, rect.bottom) -\n              Math.max(cellRect.top, rect.top),\n          };\n          if (cellRect.top < rect.top) {\n            cell = cell.type.createAndFill(attrs)!;\n          } else {\n            cell = cell.type.create(attrs, cell.content);\n          }\n        }\n        rowContent.push(cell);\n      }\n      rows.push(table.child(row).copy(Fragment.from(rowContent)));\n    }\n\n    const fragment = this.isColSelection() && this.isRowSelection()\n      ? table\n      : rows;\n    return new Slice(Fragment.from(fragment), 1, 1);\n  }\n\n  public override replace(tr: Transaction, content: Slice = Slice.empty): void {\n    const mapFrom = tr.steps.length,\n      ranges = this.ranges;\n    for (let i = 0; i < ranges.length; i++) {\n      const { $from, $to } = ranges[i],\n        mapping = tr.mapping.slice(mapFrom);\n      tr.replace(\n        mapping.map($from.pos),\n        mapping.map($to.pos),\n        i ? Slice.empty : content,\n      );\n    }\n    const sel = Selection.findFrom(\n      tr.doc.resolve(tr.mapping.slice(mapFrom).map(this.to)),\n      -1,\n    );\n    if (sel) tr.setSelection(sel);\n  }\n\n  public override replaceWith(tr: Transaction, node: Node): void {\n    this.replace(tr, new Slice(Fragment.from(node), 0, 0));\n  }\n\n  public forEachCell(f: (node: Node, pos: number) => void): void {\n    const table = this.$anchorCell.node(-1);\n    const map = TableMap.get(table);\n    const tableStart = this.$anchorCell.start(-1);\n\n    const cells = map.cellsInRect(\n      map.rectBetween(\n        this.$anchorCell.pos - tableStart,\n        this.$headCell.pos - tableStart,\n      ),\n    );\n    for (let i = 0; i < cells.length; i++) {\n      f(table.nodeAt(cells[i])!, tableStart + cells[i]);\n    }\n  }\n\n  // True if this selection goes all the way from the top to the\n  // bottom of the table.\n  public isColSelection(): boolean {\n    const anchorTop = this.$anchorCell.index(-1);\n    const headTop = this.$headCell.index(-1);\n    if (Math.min(anchorTop, headTop) > 0) return false;\n\n    const anchorBottom = anchorTop + this.$anchorCell.nodeAfter!.attrs.rowspan;\n    const headBottom = headTop + this.$headCell.nodeAfter!.attrs.rowspan;\n\n    return (\n      Math.max(anchorBottom, headBottom) == this.$headCell.node(-1).childCount\n    );\n  }\n\n  // Returns the smallest column selection that covers the given anchor\n  // and head cell.\n  public static colSelection(\n    $anchorCell: ResolvedPos,\n    $headCell: ResolvedPos = $anchorCell,\n  ): CellSelection {\n    const table = $anchorCell.node(-1);\n    const map = TableMap.get(table);\n    const tableStart = $anchorCell.start(-1);\n\n    const anchorRect = map.findCell($anchorCell.pos - tableStart);\n    const headRect = map.findCell($headCell.pos - tableStart);\n    const doc = $anchorCell.node(0);\n\n    if (anchorRect.top <= headRect.top) {\n      if (anchorRect.top > 0) {\n        $anchorCell = doc.resolve(tableStart + map.map[anchorRect.left]);\n      }\n      if (headRect.bottom < map.height) {\n        $headCell = doc.resolve(\n          tableStart +\n            map.map[map.width * (map.height - 1) + headRect.right - 1],\n        );\n      }\n    } else {\n      if (headRect.top > 0) {\n        $headCell = doc.resolve(tableStart + map.map[headRect.left]);\n      }\n      if (anchorRect.bottom < map.height) {\n        $anchorCell = doc.resolve(\n          tableStart +\n            map.map[map.width * (map.height - 1) + anchorRect.right - 1],\n        );\n      }\n    }\n    return new CellSelection($anchorCell, $headCell);\n  }\n\n  // True if this selection goes all the way from the left to the\n  // right of the table.\n  public isRowSelection(): boolean {\n    const table = this.$anchorCell.node(-1);\n    const map = TableMap.get(table);\n    const tableStart = this.$anchorCell.start(-1);\n\n    const anchorLeft = map.colCount(this.$anchorCell.pos - tableStart);\n    const headLeft = map.colCount(this.$headCell.pos - tableStart);\n    if (Math.min(anchorLeft, headLeft) > 0) return false;\n\n    const anchorRight = anchorLeft + this.$anchorCell.nodeAfter!.attrs.colspan;\n    const headRight = headLeft + this.$headCell.nodeAfter!.attrs.colspan;\n    return Math.max(anchorRight, headRight) == map.width;\n  }\n\n  public eq(other: unknown): boolean {\n    return (\n      other instanceof CellSelection &&\n      other.$anchorCell.pos == this.$anchorCell.pos &&\n      other.$headCell.pos == this.$headCell.pos\n    );\n  }\n\n  // Returns the smallest row selection that covers the given anchor\n  // and head cell.\n  public static rowSelection(\n    $anchorCell: ResolvedPos,\n    $headCell: ResolvedPos = $anchorCell,\n  ): CellSelection {\n    const table = $anchorCell.node(-1);\n    const map = TableMap.get(table);\n    const tableStart = $anchorCell.start(-1);\n\n    const anchorRect = map.findCell($anchorCell.pos - tableStart);\n    const headRect = map.findCell($headCell.pos - tableStart);\n    const doc = $anchorCell.node(0);\n\n    if (anchorRect.left <= headRect.left) {\n      if (anchorRect.left > 0) {\n        $anchorCell = doc.resolve(\n          tableStart + map.map[anchorRect.top * map.width],\n        );\n      }\n      if (headRect.right < map.width) {\n        $headCell = doc.resolve(\n          tableStart + map.map[map.width * (headRect.top + 1) - 1],\n        );\n      }\n    } else {\n      if (headRect.left > 0) {\n        $headCell = doc.resolve(tableStart + map.map[headRect.top * map.width]);\n      }\n      if (anchorRect.right < map.width) {\n        $anchorCell = doc.resolve(\n          tableStart + map.map[map.width * (anchorRect.top + 1) - 1],\n        );\n      }\n    }\n    return new CellSelection($anchorCell, $headCell);\n  }\n\n  public toJSON(): CellSelectionJSON {\n    return {\n      type: 'cell',\n      anchor: this.$anchorCell.pos,\n      head: this.$headCell.pos,\n    };\n  }\n\n  static override fromJSON(doc: Node, json: CellSelectionJSON): CellSelection {\n    return new CellSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n  }\n\n  static create(\n    doc: Node,\n    anchorCell: number,\n    headCell: number = anchorCell,\n  ): CellSelection {\n    return new CellSelection(doc.resolve(anchorCell), doc.resolve(headCell));\n  }\n\n  override getBookmark(): CellBookmark {\n    return new CellBookmark(this.$anchorCell.pos, this.$headCell.pos);\n  }\n}\n\nCellSelection.prototype.visible = false;\n\nSelection.jsonID('cell', CellSelection);\n\n/**\n * @public\n */\nexport class CellBookmark {\n  constructor(\n    public anchor: number,\n    public head: number,\n  ) {}\n\n  map(mapping: Mappable): CellBookmark {\n    return new CellBookmark(mapping.map(this.anchor), mapping.map(this.head));\n  }\n\n  resolve(doc: Node): CellSelection | Selection {\n    const $anchorCell = doc.resolve(this.anchor),\n      $headCell = doc.resolve(this.head);\n    if (\n      $anchorCell.parent.type.spec.tableRole == 'row' &&\n      $headCell.parent.type.spec.tableRole == 'row' &&\n      $anchorCell.index() < $anchorCell.parent.childCount &&\n      $headCell.index() < $headCell.parent.childCount &&\n      inSameTable($anchorCell, $headCell)\n    ) {\n      return new CellSelection($anchorCell, $headCell);\n    } else return Selection.near($headCell, 1);\n  }\n}\n\nexport function drawCellSelection(state: EditorState): DecorationSource | null {\n  if (!(state.selection instanceof CellSelection)) return null;\n  const cells: Decoration[] = [];\n  state.selection.forEachCell((node, pos) => {\n    cells.push(\n      Decoration.node(pos, pos + node.nodeSize, { class: 'selectedCell' }),\n    );\n  });\n  return DecorationSet.create(state.doc, cells);\n}\n\nfunction isCellBoundarySelection({ $from, $to }: TextSelection) {\n  if ($from.pos == $to.pos || $from.pos < $to.pos - 6) return false; // Cheap elimination\n  let afterFrom = $from.pos;\n  let beforeTo = $to.pos;\n  let depth = $from.depth;\n  for (; depth >= 0; depth--, afterFrom++) {\n    if ($from.after(depth + 1) < $from.end(depth)) break;\n  }\n  for (let d = $to.depth; d >= 0; d--, beforeTo--) {\n    if ($to.before(d + 1) > $to.start(d)) break;\n  }\n  return (\n    afterFrom == beforeTo &&\n    /row|table/.test($from.node(depth).type.spec.tableRole)\n  );\n}\n\nfunction isTextSelectionAcrossCells({ $from, $to }: TextSelection) {\n  let fromCellBoundaryNode: Node | undefined;\n  let toCellBoundaryNode: Node | undefined;\n\n  for (let i = $from.depth; i > 0; i--) {\n    const node = $from.node(i);\n    if (\n      node.type.spec.tableRole === 'cell' ||\n      node.type.spec.tableRole === 'header_cell'\n    ) {\n      fromCellBoundaryNode = node;\n      break;\n    }\n  }\n\n  for (let i = $to.depth; i > 0; i--) {\n    const node = $to.node(i);\n    if (\n      node.type.spec.tableRole === 'cell' ||\n      node.type.spec.tableRole === 'header_cell'\n    ) {\n      toCellBoundaryNode = node;\n      break;\n    }\n  }\n\n  return fromCellBoundaryNode !== toCellBoundaryNode && $to.parentOffset === 0;\n}\n\nexport function normalizeSelection(\n  state: EditorState,\n  tr: Transaction | undefined,\n  allowTableNodeSelection: boolean,\n): Transaction | undefined {\n  const sel = (tr || state).selection;\n  const doc = (tr || state).doc;\n  let normalize: Selection | undefined;\n  let role: string | undefined;\n  if (sel instanceof NodeSelection && (role = sel.node.type.spec.tableRole)) {\n    if (role == 'cell' || role == 'header_cell') {\n      normalize = CellSelection.create(doc, sel.from);\n    } else if (role == 'row') {\n      const $cell = doc.resolve(sel.from + 1);\n      normalize = CellSelection.rowSelection($cell, $cell);\n    } else if (!allowTableNodeSelection) {\n      const map = TableMap.get(sel.node);\n      const start = sel.from + 1;\n      const lastCell = start + map.map[map.width * map.height - 1];\n      normalize = CellSelection.create(doc, start + 1, lastCell);\n    }\n  } else if (sel instanceof TextSelection && isCellBoundarySelection(sel)) {\n    normalize = TextSelection.create(doc, sel.from);\n  } else if (sel instanceof TextSelection && isTextSelectionAcrossCells(sel)) {\n    normalize = TextSelection.create(doc, sel.$from.start(), sel.$from.end());\n  }\n  if (normalize) (tr || (tr = state.tr)).setSelection(normalize);\n  return tr;\n}\n","import { Node } from 'prosemirror-model';\nimport { NodeView, ViewMutationRecord } from 'prosemirror-view';\nimport { CellAttrs } from './util.ts';\n\n/**\n * @public\n */\nexport class TableView implements NodeView {\n  public dom: HTMLDivElement;\n  public table: HTMLTableElement;\n  public colgroup: HTMLTableColElement;\n  public contentDOM: HTMLTableSectionElement;\n\n  constructor(\n    public node: Node,\n    public defaultCellMinWidth: number,\n  ) {\n    this.dom = document.createElement('div');\n    this.dom.className = 'tableWrapper';\n    this.table = this.dom.appendChild(document.createElement('table'));\n    this.table.style.setProperty(\n      '--default-cell-min-width',\n      `${defaultCellMinWidth}px`,\n    );\n    this.colgroup = this.table.appendChild(document.createElement('colgroup'));\n    updateColumnsOnResize(node, this.colgroup, this.table, defaultCellMinWidth);\n    this.contentDOM = this.table.appendChild(document.createElement('tbody'));\n  }\n\n  update(node: Node): boolean {\n    if (node.type != this.node.type) return false;\n    this.node = node;\n    updateColumnsOnResize(\n      node,\n      this.colgroup,\n      this.table,\n      this.defaultCellMinWidth,\n    );\n    return true;\n  }\n\n  ignoreMutation(record: ViewMutationRecord): boolean {\n    return (\n      record.type == 'attributes' &&\n      (record.target == this.table || this.colgroup.contains(record.target))\n    );\n  }\n}\n\n/**\n * @public\n */\nexport function updateColumnsOnResize(\n  node: Node,\n  colgroup: HTMLTableColElement,\n  table: HTMLTableElement,\n  defaultCellMinWidth: number,\n  overrideCol?: number,\n  overrideValue?: number,\n): void {\n  let totalWidth = 0;\n  let fixedWidth = true;\n  let nextDOM = colgroup.firstChild as HTMLElement;\n  const row = node.firstChild;\n  if (!row) return;\n\n  for (let i = 0, col = 0; i < row.childCount; i++) {\n    const { colspan, colwidth } = row.child(i).attrs as CellAttrs;\n    for (let j = 0; j < colspan; j++, col++) {\n      const hasWidth = overrideCol == col\n        ? overrideValue\n        : colwidth && colwidth[j];\n      const cssWidth = hasWidth ? hasWidth + 'px' : '';\n      totalWidth += hasWidth || defaultCellMinWidth;\n      if (!hasWidth) fixedWidth = false;\n      if (!nextDOM) {\n        const col = document.createElement('col');\n        col.style.width = cssWidth;\n        colgroup.appendChild(col);\n      } else {\n        if (nextDOM.style.width != cssWidth) {\n          nextDOM.style.width = cssWidth;\n        }\n        nextDOM = nextDOM.nextSibling as HTMLElement;\n      }\n    }\n  }\n\n  while (nextDOM) {\n    const after = nextDOM.nextSibling;\n    nextDOM.parentNode?.removeChild(nextDOM);\n    nextDOM = after as HTMLElement;\n  }\n\n  if (fixedWidth) {\n    table.style.width = totalWidth + 'px';\n    table.style.minWidth = '';\n  } else {\n    table.style.width = '';\n    table.style.minWidth = totalWidth + 'px';\n  }\n}\n","import { Attrs, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Plugin, PluginKey, Transaction } from 'prosemirror-state';\nimport {\n  Decoration,\n  DecorationSet,\n  EditorView,\n  NodeView,\n} from 'prosemirror-view';\nimport { tableNodeTypes } from './tableNodeTypes.ts';\nimport { TableMap } from './TableMap.ts';\nimport { TableView, updateColumnsOnResize } from './TableView.ts';\nimport { cellAround, CellAttrs, pointsAtCell } from './util.ts';\n\n/**\n * @public\n */\nexport const columnResizingPluginKey = new PluginKey<ResizeState>(\n  'tableColumnResizing',\n);\n\n/**\n * @public\n */\nexport type ColumnResizingOptions = {\n  handleWidth?: number;\n  /**\n   * Minimum width of a cell /column. The column cannot be resized smaller than this.\n   */\n  cellMinWidth?: number;\n  /**\n   * The default minWidth of a cell / column when it doesn't have an explicit width (i.e.: it has not been resized manually)\n   */\n  defaultCellMinWidth?: number;\n  lastColumnResizable?: boolean;\n  /**\n   * A custom node view for the rendering table nodes. By default, the plugin\n   * uses the {@link TableView} class. You can explicitly set this to `null` to\n   * not use a custom node view.\n   */\n  View?:\n    | (new (\n      node: ProsemirrorNode,\n      cellMinWidth: number,\n      view: EditorView,\n    ) => NodeView)\n    | null;\n};\n\n/**\n * @public\n */\nexport type Dragging = { startX: number; startWidth: number };\n\n/**\n * @public\n */\nexport function columnResizing({\n  handleWidth = 5,\n  cellMinWidth = 25,\n  defaultCellMinWidth = 100,\n  View = TableView,\n  lastColumnResizable = true,\n}: ColumnResizingOptions = {}): Plugin {\n  const plugin = new Plugin<ResizeState>({\n    key: columnResizingPluginKey,\n    state: {\n      init(_, state) {\n        const nodeViews = plugin.spec?.props?.nodeViews;\n        const tableName = tableNodeTypes(state.schema).table.name;\n        if (View && nodeViews) {\n          nodeViews[tableName] = (node, view) => {\n            return new View(node, defaultCellMinWidth, view);\n          };\n        }\n        return new ResizeState(-1, false);\n      },\n      apply(tr, prev) {\n        return prev.apply(tr);\n      },\n    },\n    props: {\n      attributes: (state): Record<string, string> => {\n        const pluginState = columnResizingPluginKey.getState(state);\n        return pluginState && pluginState.activeHandle > -1\n          ? { class: 'resize-cursor' }\n          : {};\n      },\n\n      handleDOMEvents: {\n        mousemove: (view, event) => {\n          handleMouseMove(view, event, handleWidth, lastColumnResizable);\n        },\n        mouseleave: (view) => {\n          handleMouseLeave(view);\n        },\n        mousedown: (view, event) => {\n          handleMouseDown(view, event, cellMinWidth, defaultCellMinWidth);\n        },\n      },\n\n      decorations: (state) => {\n        const pluginState = columnResizingPluginKey.getState(state);\n        if (pluginState && pluginState.activeHandle > -1) {\n          return handleDecorations(state, pluginState.activeHandle);\n        }\n      },\n\n      nodeViews: {},\n    },\n  });\n  return plugin;\n}\n\n/**\n * @public\n */\nexport class ResizeState {\n  constructor(\n    public activeHandle: number,\n    public dragging: Dragging | false,\n  ) {}\n\n  apply(tr: Transaction): ResizeState {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const action = tr.getMeta(columnResizingPluginKey);\n    if (action && action.setHandle != null) {\n      return new ResizeState(action.setHandle, false);\n    }\n    if (action && action.setDragging !== undefined) {\n      return new ResizeState(this.activeHandle, action.setDragging);\n    }\n    if (this.activeHandle > -1 && tr.docChanged) {\n      let handle = tr.mapping.map(this.activeHandle, -1);\n      if (!pointsAtCell(tr.doc.resolve(handle))) {\n        handle = -1;\n      }\n      return new ResizeState(handle, this.dragging);\n    }\n    return this;\n  }\n}\n\nfunction handleMouseMove(\n  view: EditorView,\n  event: MouseEvent,\n  handleWidth: number,\n  lastColumnResizable: boolean,\n): void {\n  if (!view.editable) return;\n\n  const pluginState = columnResizingPluginKey.getState(view.state);\n  if (!pluginState) return;\n\n  if (!pluginState.dragging) {\n    const target = domCellAround(event.target as HTMLElement);\n    let cell = -1;\n    if (target) {\n      const { left, right } = target.getBoundingClientRect();\n      if (event.clientX - left <= handleWidth) {\n        cell = edgeCell(view, event, 'left', handleWidth);\n      } else if (right - event.clientX <= handleWidth) {\n        cell = edgeCell(view, event, 'right', handleWidth);\n      }\n    }\n\n    if (cell != pluginState.activeHandle) {\n      if (!lastColumnResizable && cell !== -1) {\n        const $cell = view.state.doc.resolve(cell);\n        const table = $cell.node(-1);\n        const map = TableMap.get(table);\n        const tableStart = $cell.start(-1);\n        const col = map.colCount($cell.pos - tableStart) +\n          $cell.nodeAfter!.attrs.colspan -\n          1;\n\n        if (col == map.width - 1) {\n          return;\n        }\n      }\n\n      updateHandle(view, cell);\n    }\n  }\n}\n\nfunction handleMouseLeave(view: EditorView): void {\n  if (!view.editable) return;\n\n  const pluginState = columnResizingPluginKey.getState(view.state);\n  if (pluginState && pluginState.activeHandle > -1 && !pluginState.dragging) {\n    updateHandle(view, -1);\n  }\n}\n\nfunction handleMouseDown(\n  view: EditorView,\n  event: MouseEvent,\n  cellMinWidth: number,\n  defaultCellMinWidth: number,\n): boolean {\n  if (!view.editable) return false;\n\n  const win = view.dom.ownerDocument.defaultView || globalThis;\n\n  const pluginState = columnResizingPluginKey.getState(view.state);\n  if (!pluginState || pluginState.activeHandle == -1 || pluginState.dragging) {\n    return false;\n  }\n\n  const cell = view.state.doc.nodeAt(pluginState.activeHandle)!;\n  const width = currentColWidth(view, pluginState.activeHandle, cell.attrs);\n  view.dispatch(\n    view.state.tr.setMeta(columnResizingPluginKey, {\n      setDragging: { startX: event.clientX, startWidth: width },\n    }),\n  );\n\n  function finish(event: MouseEvent) {\n    win.removeEventListener('mouseup', finish);\n    win.removeEventListener('mousemove', move);\n    const pluginState = columnResizingPluginKey.getState(view.state);\n    if (pluginState?.dragging) {\n      updateColumnWidth(\n        view,\n        pluginState.activeHandle,\n        draggedWidth(pluginState.dragging, event, cellMinWidth),\n      );\n      view.dispatch(\n        view.state.tr.setMeta(columnResizingPluginKey, { setDragging: null }),\n      );\n    }\n  }\n\n  function move(event: MouseEvent): void {\n    if (!event.which) return finish(event);\n    const pluginState = columnResizingPluginKey.getState(view.state);\n    if (!pluginState) return;\n    if (pluginState.dragging) {\n      const dragged = draggedWidth(pluginState.dragging, event, cellMinWidth);\n      displayColumnWidth(\n        view,\n        pluginState.activeHandle,\n        dragged,\n        defaultCellMinWidth,\n      );\n    }\n  }\n\n  displayColumnWidth(\n    view,\n    pluginState.activeHandle,\n    width,\n    defaultCellMinWidth,\n  );\n\n  win.addEventListener('mouseup', finish);\n  win.addEventListener('mousemove', move);\n  event.preventDefault();\n  return true;\n}\n\nfunction currentColWidth(\n  view: EditorView,\n  cellPos: number,\n  { colspan, colwidth }: Attrs,\n): number {\n  const width = colwidth && colwidth[colwidth.length - 1];\n  if (width) return width;\n  const dom = view.domAtPos(cellPos);\n  const node = dom.node.childNodes[dom.offset] as HTMLElement;\n  let domWidth = node.offsetWidth,\n    parts = colspan;\n  if (colwidth) {\n    for (let i = 0; i < colspan; i++) {\n      if (colwidth[i]) {\n        domWidth -= colwidth[i];\n        parts--;\n      }\n    }\n  }\n  return domWidth / parts;\n}\n\nfunction domCellAround(target: HTMLElement | null): HTMLElement | null {\n  while (target && target.nodeName != 'TD' && target.nodeName != 'TH') {\n    target = target.classList && target.classList.contains('ProseMirror')\n      ? null\n      : (target.parentNode as HTMLElement);\n  }\n  return target;\n}\n\nfunction edgeCell(\n  view: EditorView,\n  event: MouseEvent,\n  side: 'left' | 'right',\n  handleWidth: number,\n): number {\n  // posAtCoords returns inconsistent positions when cursor is moving\n  // across a collapsed table border. Use an offset to adjust the\n  // target viewport coordinates away from the table border.\n  const offset = side == 'right' ? -handleWidth : handleWidth;\n  const found = view.posAtCoords({\n    left: event.clientX + offset,\n    top: event.clientY,\n  });\n  if (!found) return -1;\n  const { pos } = found;\n  const $cell = cellAround(view.state.doc.resolve(pos));\n  if (!$cell) return -1;\n  if (side == 'right') return $cell.pos;\n  const map = TableMap.get($cell.node(-1)),\n    start = $cell.start(-1);\n  const index = map.map.indexOf($cell.pos - start);\n  return index % map.width == 0 ? -1 : start + map.map[index - 1];\n}\n\nfunction draggedWidth(\n  dragging: Dragging,\n  event: MouseEvent,\n  resizeMinWidth: number,\n): number {\n  const offset = event.clientX - dragging.startX;\n  return Math.max(resizeMinWidth, dragging.startWidth + offset);\n}\n\nfunction updateHandle(view: EditorView, value: number): void {\n  view.dispatch(\n    view.state.tr.setMeta(columnResizingPluginKey, { setHandle: value }),\n  );\n}\n\nfunction updateColumnWidth(\n  view: EditorView,\n  cell: number,\n  width: number,\n): void {\n  const $cell = view.state.doc.resolve(cell);\n  const table = $cell.node(-1),\n    map = TableMap.get(table),\n    start = $cell.start(-1);\n  const col = map.colCount($cell.pos - start) + $cell.nodeAfter!.attrs.colspan -\n    1;\n  const tr = view.state.tr;\n  for (let row = 0; row < map.height; row++) {\n    const mapIndex = row * map.width + col;\n    // Rowspanning cell that has already been handled\n    if (row && map.map[mapIndex] == map.map[mapIndex - map.width]) continue;\n    const pos = map.map[mapIndex];\n    const attrs = table.nodeAt(pos)!.attrs as CellAttrs;\n    const index = attrs.colspan == 1 ? 0 : col - map.colCount(pos);\n    if (attrs.colwidth && attrs.colwidth[index] == width) continue;\n    const colwidth = attrs.colwidth\n      ? attrs.colwidth.slice()\n      : zeroes(attrs.colspan);\n    colwidth[index] = width;\n    tr.setNodeMarkup(start + pos, null, { ...attrs, colwidth: colwidth });\n  }\n  if (tr.docChanged) view.dispatch(tr);\n}\n\nfunction displayColumnWidth(\n  view: EditorView,\n  cell: number,\n  width: number,\n  defaultCellMinWidth: number,\n): void {\n  const $cell = view.state.doc.resolve(cell);\n  const table = $cell.node(-1),\n    start = $cell.start(-1);\n  const col = TableMap.get(table).colCount($cell.pos - start) +\n    $cell.nodeAfter!.attrs.colspan -\n    1;\n  let dom: Node | null = view.domAtPos($cell.start(-1)).node;\n  while (dom && dom.nodeName != 'TABLE') {\n    dom = dom.parentNode;\n  }\n  if (!dom) return;\n  updateColumnsOnResize(\n    table,\n    dom.firstChild as HTMLTableColElement,\n    dom as HTMLTableElement,\n    defaultCellMinWidth,\n    col,\n    width,\n  );\n}\n\nfunction zeroes(n: number): 0[] {\n  return Array(n).fill(0);\n}\n\nexport function handleDecorations(\n  state: EditorState,\n  cell: number,\n): DecorationSet {\n  const decorations = [];\n  const $cell = state.doc.resolve(cell);\n  const table = $cell.node(-1);\n  if (!table) {\n    return DecorationSet.empty;\n  }\n  const map = TableMap.get(table);\n  const start = $cell.start(-1);\n  const col = map.colCount($cell.pos - start) + $cell.nodeAfter!.attrs.colspan -\n    1;\n  for (let row = 0; row < map.height; row++) {\n    const index = col + row * map.width;\n    // For positions that have either a different cell or the end\n    // of the table to their right, and either the top of the table or\n    // a different cell above them, add a decoration\n    if (\n      (col == map.width - 1 || map.map[index] != map.map[index + 1]) &&\n      (row == 0 || map.map[index] != map.map[index - map.width])\n    ) {\n      const cellPos = map.map[index];\n      const pos = start + cellPos + table.nodeAt(cellPos)!.nodeSize - 1;\n      const dom = document.createElement('div');\n      dom.className = 'column-resize-handle';\n      if (columnResizingPluginKey.getState(state)?.dragging) {\n        decorations.push(\n          Decoration.node(\n            start + cellPos,\n            start + cellPos + table.nodeAt(cellPos)!.nodeSize,\n            {\n              class: 'column-resize-dragging',\n            },\n          ),\n        );\n      }\n\n      decorations.push(Decoration.widget(pos, dom));\n    }\n  }\n  return DecorationSet.create(state.doc, decorations);\n}\n","// This file defines helpers for normalizing tables, making sure no\n// cells overlap (which can happen, if you have the wrong col- and\n// rowspans) and that each row has the same width. Uses the problems\n// reported by `TableMap`.\n\nimport { Node } from 'prosemirror-model';\nimport { EditorState, PluginKey, Transaction } from 'prosemirror-state';\nimport { tableNodeTypes, TableRole } from './tableNodeTypes.ts';\nimport { TableMap } from './TableMap.ts';\nimport { CellAttrs, removeColSpan } from './util.ts';\n\n/**\n * @public\n */\nexport const fixTablesKey = new PluginKey<{ fixTables: boolean }>('fix-tables');\n\n/**\n * Helper for iterating through the nodes in a document that changed\n * compared to the given previous document. Useful for avoiding\n * duplicate work on each transaction.\n *\n * @public\n */\nfunction changedDescendants(\n  old: Node,\n  cur: Node,\n  offset: number,\n  f: (node: Node, pos: number) => void,\n): void {\n  const oldSize = old.childCount,\n    curSize = cur.childCount;\n  outer: for (let i = 0, j = 0; i < curSize; i++) {\n    const child = cur.child(i);\n    for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) {\n      if (old.child(scan) == child) {\n        j = scan + 1;\n        offset += child.nodeSize;\n        continue outer;\n      }\n    }\n    f(child, offset);\n    if (j < oldSize && old.child(j).sameMarkup(child)) {\n      changedDescendants(old.child(j), child, offset + 1, f);\n    } else child.nodesBetween(0, child.content.size, f, offset + 1);\n    offset += child.nodeSize;\n  }\n}\n\n/**\n * Inspect all tables in the given state's document and return a\n * transaction that fixes them, if necessary. If `oldState` was\n * provided, that is assumed to hold a previous, known-good state,\n * which will be used to avoid re-scanning unchanged parts of the\n * document.\n *\n * @public\n */\nexport function fixTables(\n  state: EditorState,\n  oldState?: EditorState,\n): Transaction | undefined {\n  let tr: Transaction | undefined;\n  const check = (node: Node, pos: number) => {\n    if (node.type.spec.tableRole == 'table') {\n      tr = fixTable(state, node, pos, tr);\n    }\n  };\n  if (!oldState) state.doc.descendants(check);\n  else if (oldState.doc != state.doc) {\n    changedDescendants(oldState.doc, state.doc, 0, check);\n  }\n  return tr;\n}\n\n// Fix the given table, if necessary. Will append to the transaction\n// it was given, if non-null, or create a new one if necessary.\nexport function fixTable(\n  state: EditorState,\n  table: Node,\n  tablePos: number,\n  tr: Transaction | undefined,\n): Transaction | undefined {\n  const map = TableMap.get(table);\n  if (!map.problems) return tr;\n  if (!tr) tr = state.tr;\n\n  // Track which rows we must add cells to, so that we can adjust that\n  // when fixing collisions.\n  const mustAdd: number[] = [];\n  for (let i = 0; i < map.height; i++) mustAdd.push(0);\n  for (let i = 0; i < map.problems.length; i++) {\n    const prob = map.problems[i];\n    if (prob.type == 'collision') {\n      const cell = table.nodeAt(prob.pos);\n      if (!cell) continue;\n      const attrs = cell.attrs as CellAttrs;\n      for (let j = 0; j < attrs.rowspan; j++) mustAdd[prob.row + j] += prob.n;\n      tr.setNodeMarkup(\n        tr.mapping.map(tablePos + 1 + prob.pos),\n        null,\n        removeColSpan(attrs, attrs.colspan - prob.n, prob.n),\n      );\n    } else if (prob.type == 'missing') {\n      mustAdd[prob.row] += prob.n;\n    } else if (prob.type == 'overlong_rowspan') {\n      const cell = table.nodeAt(prob.pos);\n      if (!cell) continue;\n      tr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, {\n        ...cell.attrs,\n        rowspan: cell.attrs.rowspan - prob.n,\n      });\n    } else if (prob.type == 'colwidth mismatch') {\n      const cell = table.nodeAt(prob.pos);\n      if (!cell) continue;\n      tr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, {\n        ...cell.attrs,\n        colwidth: prob.colwidth,\n      });\n    } else if (prob.type == 'zero_sized') {\n      const pos = tr.mapping.map(tablePos);\n      tr.delete(pos, pos + table.nodeSize);\n    }\n  }\n  let first, last;\n  for (let i = 0; i < mustAdd.length; i++) {\n    if (mustAdd[i]) {\n      if (first == null) first = i;\n      last = i;\n    }\n  }\n  // Add the necessary cells, using a heuristic for whether to add the\n  // cells at the start or end of the rows (if it looks like a 'bite'\n  // was taken out of the table, add cells at the start of the row\n  // after the bite. Otherwise add them at the end).\n  for (let i = 0, pos = tablePos + 1; i < map.height; i++) {\n    const row = table.child(i);\n    const end = pos + row.nodeSize;\n    const add = mustAdd[i];\n    if (add > 0) {\n      let role: TableRole = 'cell';\n      if (row.firstChild) {\n        role = row.firstChild.type.spec.tableRole;\n      }\n      const nodes: Node[] = [];\n      for (let j = 0; j < add; j++) {\n        const node = tableNodeTypes(state.schema)[role].createAndFill();\n\n        if (node) nodes.push(node);\n      }\n      const side = (i == 0 || first == i - 1) && last == i ? pos + 1 : end - 1;\n      tr.insert(tr.mapping.map(side), nodes);\n    }\n    pos = end;\n  }\n  return tr.setMeta(fixTablesKey, { fixTables: true });\n}\n","// This file defines a number of table-related commands.\n\nimport {\n  Fragment,\n  Node,\n  NodeType,\n  ResolvedPos,\n  Slice,\n} from 'prosemirror-model';\nimport { EditorState, TextSelection, Transaction } from 'prosemirror-state';\n\nimport type { Command, CommandFactory } from '@kerebron/editor/commands';\n\nimport { CellSelection } from './CellSelection.ts';\nimport type { Direction } from './input.ts';\nimport { tableNodeTypes, TableRole } from './tableNodeTypes.ts';\nimport { Rect, TableMap } from './TableMap.ts';\nimport {\n  addColSpan,\n  cellAround,\n  CellAttrs,\n  cellWrapping,\n  columnIsHeader,\n  isInTable,\n  moveCellForward,\n  removeColSpan,\n  selectionCell,\n} from './util.ts';\n\n/**\n * @public\n */\nexport type TableRect = Rect & {\n  tableStart: number;\n  map: TableMap;\n  table: Node;\n};\n\n/**\n * Helper to get the selected rectangle in a table, if any. Adds table\n * map, table node, and table start offset to the object for\n * convenience.\n *\n * @public\n */\nexport function selectedRect(state: EditorState): TableRect {\n  const sel = state.selection;\n  const $pos = selectionCell(state);\n  const table = $pos.node(-1);\n  const tableStart = $pos.start(-1);\n  const map = TableMap.get(table);\n  const rect = sel instanceof CellSelection\n    ? map.rectBetween(\n      sel.$anchorCell.pos - tableStart,\n      sel.$headCell.pos - tableStart,\n    )\n    : map.findCell($pos.pos - tableStart);\n  return { ...rect, tableStart, map, table };\n}\n\n/**\n * Add a column at the given position in a table.\n *\n * @public\n */\nexport function addColumn(\n  tr: Transaction,\n  { map, tableStart, table }: TableRect,\n  col: number,\n): Transaction {\n  let refColumn: number | null = col > 0 ? -1 : 0;\n  if (columnIsHeader(map, table, col + refColumn)) {\n    refColumn = col == 0 || col == map.width ? null : 0;\n  }\n\n  for (let row = 0; row < map.height; row++) {\n    const index = row * map.width + col;\n    // If this position falls inside a col-spanning cell\n    if (col > 0 && col < map.width && map.map[index - 1] == map.map[index]) {\n      const pos = map.map[index];\n      const cell = table.nodeAt(pos)!;\n      tr.setNodeMarkup(\n        tr.mapping.map(tableStart + pos),\n        null,\n        addColSpan(cell.attrs as CellAttrs, col - map.colCount(pos)),\n      );\n      // Skip ahead if rowspan > 1\n      row += cell.attrs.rowspan - 1;\n    } else {\n      const type = refColumn == null\n        ? tableNodeTypes(table.type.schema).cell\n        : table.nodeAt(map.map[index + refColumn])!.type;\n      const pos = map.positionAt(row, col, table);\n      tr.insert(tr.mapping.map(tableStart + pos), type.createAndFill()!);\n    }\n  }\n  return tr;\n}\n\n/**\n * Command to add a column before the column with the selection.\n *\n * @public\n */\nexport function addColumnBefore(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  if (!isInTable(state)) return false;\n  if (dispatch) {\n    const rect = selectedRect(state);\n    dispatch(addColumn(state.tr, rect, rect.left));\n  }\n  return true;\n}\n\n/**\n * Command to add a column after the column with the selection.\n *\n * @public\n */\nexport function addColumnAfter(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  if (!isInTable(state)) return false;\n  if (dispatch) {\n    const rect = selectedRect(state);\n    dispatch(addColumn(state.tr, rect, rect.right));\n  }\n  return true;\n}\n\n/**\n * @public\n */\nexport function removeColumn(\n  tr: Transaction,\n  { map, table, tableStart }: TableRect,\n  col: number,\n) {\n  const mapStart = tr.mapping.maps.length;\n  for (let row = 0; row < map.height;) {\n    const index = row * map.width + col;\n    const pos = map.map[index];\n    const cell = table.nodeAt(pos)!;\n    const attrs = cell.attrs as CellAttrs;\n    // If this is part of a col-spanning cell\n    if (\n      (col > 0 && map.map[index - 1] == pos) ||\n      (col < map.width - 1 && map.map[index + 1] == pos)\n    ) {\n      tr.setNodeMarkup(\n        tr.mapping.slice(mapStart).map(tableStart + pos),\n        null,\n        removeColSpan(attrs, col - map.colCount(pos)),\n      );\n    } else {\n      const start = tr.mapping.slice(mapStart).map(tableStart + pos);\n      tr.delete(start, start + cell.nodeSize);\n    }\n    row += attrs.rowspan;\n  }\n}\n\n/**\n * Command function that removes the selected columns from a table.\n *\n * @public\n */\nexport function deleteColumn(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  if (!isInTable(state)) return false;\n  if (dispatch) {\n    const rect = selectedRect(state);\n    const tr = state.tr;\n    if (rect.left == 0 && rect.right == rect.map.width) return false;\n    for (let i = rect.right - 1;; i--) {\n      removeColumn(tr, rect, i);\n      if (i == rect.left) break;\n      const table = rect.tableStart\n        ? tr.doc.nodeAt(rect.tableStart - 1)\n        : tr.doc;\n      if (!table) {\n        throw RangeError('No table found');\n      }\n      rect.table = table;\n      rect.map = TableMap.get(table);\n    }\n    dispatch(tr);\n  }\n  return true;\n}\n\n/**\n * @public\n */\nexport function rowIsHeader(map: TableMap, table: Node, row: number): boolean {\n  const headerCell = tableNodeTypes(table.type.schema).header_cell;\n  for (let col = 0; col < map.width; col++) {\n    if (table.nodeAt(map.map[col + row * map.width])?.type != headerCell) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * @public\n */\nexport function addRow(\n  tr: Transaction,\n  { map, tableStart, table }: TableRect,\n  row: number,\n): Transaction {\n  let rowPos = tableStart;\n  for (let i = 0; i < row; i++) rowPos += table.child(i).nodeSize;\n  const cells = [];\n  let refRow: number | null = row > 0 ? -1 : 0;\n  if (rowIsHeader(map, table, row + refRow)) {\n    refRow = row == 0 || row == map.height ? null : 0;\n  }\n  for (let col = 0, index = map.width * row; col < map.width; col++, index++) {\n    // Covered by a rowspan cell\n    if (\n      row > 0 &&\n      row < map.height &&\n      map.map[index] == map.map[index - map.width]\n    ) {\n      const pos = map.map[index];\n      const attrs = table.nodeAt(pos)!.attrs;\n      tr.setNodeMarkup(tableStart + pos, null, {\n        ...attrs,\n        rowspan: attrs.rowspan + 1,\n      });\n      col += attrs.colspan - 1;\n    } else {\n      const type = refRow == null\n        ? tableNodeTypes(table.type.schema).cell\n        : table.nodeAt(map.map[index + refRow * map.width])?.type;\n      const node = type?.createAndFill();\n      if (node) cells.push(node);\n    }\n  }\n  tr.insert(rowPos, tableNodeTypes(table.type.schema).row.create(null, cells));\n  return tr;\n}\n\n/**\n * Add a table row before the selection.\n *\n * @public\n */\nexport function addRowBefore(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  if (!isInTable(state)) return false;\n  if (dispatch) {\n    const rect = selectedRect(state);\n    dispatch(addRow(state.tr, rect, rect.top));\n  }\n  return true;\n}\n\n/**\n * Add a table row after the selection.\n *\n * @public\n */\nexport function addRowAfter(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  if (!isInTable(state)) return false;\n  if (dispatch) {\n    const rect = selectedRect(state);\n    dispatch(addRow(state.tr, rect, rect.bottom));\n  }\n  return true;\n}\n\n/**\n * @public\n */\nexport function removeRow(\n  tr: Transaction,\n  { map, table, tableStart }: TableRect,\n  row: number,\n): void {\n  let rowPos = 0;\n  for (let i = 0; i < row; i++) rowPos += table.child(i).nodeSize;\n  const nextRow = rowPos + table.child(row).nodeSize;\n\n  const mapFrom = tr.mapping.maps.length;\n  tr.delete(rowPos + tableStart, nextRow + tableStart);\n\n  const seen = new Set<number>();\n\n  for (let col = 0, index = row * map.width; col < map.width; col++, index++) {\n    const pos = map.map[index];\n\n    // Skip cells that are checked already\n    if (seen.has(pos)) continue;\n    seen.add(pos);\n\n    if (row > 0 && pos == map.map[index - map.width]) {\n      // If this cell starts in the row above, simply reduce its rowspan\n      const attrs = table.nodeAt(pos)!.attrs as CellAttrs;\n      tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + tableStart), null, {\n        ...attrs,\n        rowspan: attrs.rowspan - 1,\n      });\n      col += attrs.colspan - 1;\n    } else if (row < map.height && pos == map.map[index + map.width]) {\n      // Else, if it continues in the row below, it has to be moved down\n      const cell = table.nodeAt(pos)!;\n      const attrs = cell.attrs as CellAttrs;\n      const copy = cell.type.create(\n        { ...attrs, rowspan: cell.attrs.rowspan - 1 },\n        cell.content,\n      );\n      const newPos = map.positionAt(row + 1, col, table);\n      tr.insert(tr.mapping.slice(mapFrom).map(tableStart + newPos), copy);\n      col += attrs.colspan - 1;\n    }\n  }\n}\n\n/**\n * Remove the selected rows from a table.\n *\n * @public\n */\nexport function deleteRow(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  if (!isInTable(state)) return false;\n  if (dispatch) {\n    const rect = selectedRect(state),\n      tr = state.tr;\n    if (rect.top == 0 && rect.bottom == rect.map.height) return false;\n    for (let i = rect.bottom - 1;; i--) {\n      removeRow(tr, rect, i);\n      if (i == rect.top) break;\n      const table = rect.tableStart\n        ? tr.doc.nodeAt(rect.tableStart - 1)\n        : tr.doc;\n      if (!table) {\n        throw RangeError('No table found');\n      }\n      rect.table = table;\n      rect.map = TableMap.get(rect.table);\n    }\n    dispatch(tr);\n  }\n  return true;\n}\n\nfunction isEmpty(cell: Node): boolean {\n  const c = cell.content;\n\n  return (\n    c.childCount == 1 && c.child(0).isTextblock && c.child(0).childCount == 0\n  );\n}\n\nfunction cellsOverlapRectangle({ width, height, map }: TableMap, rect: Rect) {\n  let indexTop = rect.top * width + rect.left,\n    indexLeft = indexTop;\n  let indexBottom = (rect.bottom - 1) * width + rect.left,\n    indexRight = indexTop + (rect.right - rect.left - 1);\n  for (let i = rect.top; i < rect.bottom; i++) {\n    if (\n      (rect.left > 0 && map[indexLeft] == map[indexLeft - 1]) ||\n      (rect.right < width && map[indexRight] == map[indexRight + 1])\n    ) {\n      return true;\n    }\n    indexLeft += width;\n    indexRight += width;\n  }\n  for (let i = rect.left; i < rect.right; i++) {\n    if (\n      (rect.top > 0 && map[indexTop] == map[indexTop - width]) ||\n      (rect.bottom < height && map[indexBottom] == map[indexBottom + width])\n    ) {\n      return true;\n    }\n    indexTop++;\n    indexBottom++;\n  }\n  return false;\n}\n\n/**\n * Merge the selected cells into a single cell. Only available when\n * the selected cells' outline forms a rectangle.\n *\n * @public\n */\nexport function mergeCells(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  const sel = state.selection;\n  if (\n    !(sel instanceof CellSelection) ||\n    sel.$anchorCell.pos == sel.$headCell.pos\n  ) {\n    return false;\n  }\n  const rect = selectedRect(state),\n    { map } = rect;\n  if (cellsOverlapRectangle(map, rect)) return false;\n  if (dispatch) {\n    const tr = state.tr;\n    const seen: Record<number, boolean> = {};\n    let content = Fragment.empty;\n    let mergedPos: number | undefined;\n    let mergedCell: Node | undefined;\n    for (let row = rect.top; row < rect.bottom; row++) {\n      for (let col = rect.left; col < rect.right; col++) {\n        const cellPos = map.map[row * map.width + col];\n        const cell = rect.table.nodeAt(cellPos);\n        if (seen[cellPos] || !cell) continue;\n        seen[cellPos] = true;\n        if (mergedPos == null) {\n          mergedPos = cellPos;\n          mergedCell = cell;\n        } else {\n          if (!isEmpty(cell)) content = content.append(cell.content);\n          const mapped = tr.mapping.map(cellPos + rect.tableStart);\n          tr.delete(mapped, mapped + cell.nodeSize);\n        }\n      }\n    }\n    if (mergedPos == null || mergedCell == null) {\n      return true;\n    }\n\n    tr.setNodeMarkup(mergedPos + rect.tableStart, null, {\n      ...addColSpan(\n        mergedCell.attrs as CellAttrs,\n        mergedCell.attrs.colspan,\n        rect.right - rect.left - mergedCell.attrs.colspan,\n      ),\n      rowspan: rect.bottom - rect.top,\n    });\n    if (content.size) {\n      const end = mergedPos + 1 + mergedCell.content.size;\n      const start = isEmpty(mergedCell) ? mergedPos + 1 : end;\n      tr.replaceWith(start + rect.tableStart, end + rect.tableStart, content);\n    }\n    tr.setSelection(\n      new CellSelection(tr.doc.resolve(mergedPos + rect.tableStart)),\n    );\n    dispatch(tr);\n  }\n  return true;\n}\n\n/**\n * Split a selected cell, whose rowpan or colspan is greater than one,\n * into smaller cells. Use the first cell type for the new cells.\n *\n * @public\n */\nexport function splitCell(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  const nodeTypes = tableNodeTypes(state.schema);\n  return splitCellWithType(({ node }: { node: Node }) => {\n    return nodeTypes[node.type.spec.tableRole as TableRole];\n  })(state, dispatch);\n}\n\n/**\n * @public\n */\nexport interface GetCellTypeOptions {\n  node: Node;\n  row: number;\n  col: number;\n}\n\n/**\n * Split a selected cell, whose rowpan or colspan is greater than one,\n * into smaller cells with the cell type (th, td) returned by getType function.\n *\n * @public\n */\nexport const splitCellWithType: CommandFactory = (\n  getCellType: (options: GetCellTypeOptions) => NodeType,\n) => {\n  return (state, dispatch) => {\n    const sel = state.selection;\n    let cellNode: Node | null | undefined;\n    let cellPos: number | undefined;\n    if (!(sel instanceof CellSelection)) {\n      cellNode = cellWrapping(sel.$from);\n      if (!cellNode) return false;\n      cellPos = cellAround(sel.$from)?.pos;\n    } else {\n      if (sel.$anchorCell.pos != sel.$headCell.pos) return false;\n      cellNode = sel.$anchorCell.nodeAfter;\n      cellPos = sel.$anchorCell.pos;\n    }\n    if (cellNode == null || cellPos == null) {\n      return false;\n    }\n    if (cellNode.attrs.colspan == 1 && cellNode.attrs.rowspan == 1) {\n      return false;\n    }\n    if (dispatch) {\n      let baseAttrs = cellNode.attrs;\n      const attrs = [];\n      const colwidth = baseAttrs.colwidth;\n      if (baseAttrs.rowspan > 1) baseAttrs = { ...baseAttrs, rowspan: 1 };\n      if (baseAttrs.colspan > 1) baseAttrs = { ...baseAttrs, colspan: 1 };\n      const rect = selectedRect(state),\n        tr = state.tr;\n      for (let i = 0; i < rect.right - rect.left; i++) {\n        attrs.push(\n          colwidth\n            ? {\n              ...baseAttrs,\n              colwidth: colwidth && colwidth[i] ? [colwidth[i]] : null,\n            }\n            : baseAttrs,\n        );\n      }\n      let lastCell;\n      for (let row = rect.top; row < rect.bottom; row++) {\n        let pos = rect.map.positionAt(row, rect.left, rect.table);\n        if (row == rect.top) pos += cellNode.nodeSize;\n        for (let col = rect.left, i = 0; col < rect.right; col++, i++) {\n          if (col == rect.left && row == rect.top) continue;\n          tr.insert(\n            lastCell = tr.mapping.map(pos + rect.tableStart, 1),\n            getCellType({ node: cellNode, row, col }).createAndFill(attrs[i])!,\n          );\n        }\n      }\n      tr.setNodeMarkup(\n        cellPos,\n        getCellType({ node: cellNode, row: rect.top, col: rect.left }),\n        attrs[0],\n      );\n      if (sel instanceof CellSelection) {\n        tr.setSelection(\n          new CellSelection(\n            tr.doc.resolve(sel.$anchorCell.pos),\n            lastCell ? tr.doc.resolve(lastCell) : undefined,\n          ),\n        );\n      }\n      dispatch(tr);\n    }\n    return true;\n  };\n};\n\n/**\n * Returns a command that sets the given attribute to the given value,\n * and is only available when the currently selected cell doesn't\n * already have that attribute set to that value.\n *\n * @public\n */\nexport const setCellAttr: CommandFactory = (name: string, value: unknown) => {\n  return function (state, dispatch) {\n    if (!isInTable(state)) return false;\n    const $cell = selectionCell(state);\n    if ($cell.nodeAfter!.attrs[name] === value) return false;\n    if (dispatch) {\n      const tr = state.tr;\n      if (state.selection instanceof CellSelection) {\n        state.selection.forEachCell((node, pos) => {\n          if (node.attrs[name] !== value) {\n            tr.setNodeMarkup(pos, null, {\n              ...node.attrs,\n              [name]: value,\n            });\n          }\n        });\n      } else {\n        tr.setNodeMarkup($cell.pos, null, {\n          ...$cell.nodeAfter!.attrs,\n          [name]: value,\n        });\n      }\n      dispatch(tr);\n    }\n    return true;\n  };\n};\n\nfunction deprecated_toggleHeader(type: ToggleHeaderType): Command {\n  return function (state, dispatch) {\n    if (!isInTable(state)) return false;\n    if (dispatch) {\n      const types = tableNodeTypes(state.schema);\n      const rect = selectedRect(state),\n        tr = state.tr;\n      const cells = rect.map.cellsInRect(\n        type == 'column'\n          ? {\n            left: rect.left,\n            top: 0,\n            right: rect.right,\n            bottom: rect.map.height,\n          }\n          : type == 'row'\n          ? {\n            left: 0,\n            top: rect.top,\n            right: rect.map.width,\n            bottom: rect.bottom,\n          }\n          : rect,\n      );\n      const nodes = cells.map((pos) => rect.table.nodeAt(pos)!);\n      for (\n        let i = 0;\n        i < cells.length;\n        i++ // Remove headers, if any\n      ) {\n        if (nodes[i].type == types.header_cell) {\n          tr.setNodeMarkup(\n            rect.tableStart + cells[i],\n            types.cell,\n            nodes[i].attrs,\n          );\n        }\n      }\n      if (tr.steps.length == 0) {\n        for (\n          let i = 0;\n          i < cells.length;\n          i++ // No headers removed, add instead\n        ) {\n          tr.setNodeMarkup(\n            rect.tableStart + cells[i],\n            types.header_cell,\n            nodes[i].attrs,\n          );\n        }\n      }\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction isHeaderEnabledByType(\n  type: 'row' | 'column',\n  rect: TableRect,\n  types: Record<string, NodeType>,\n): boolean {\n  // Get cell positions for first row or first column\n  const cellPositions = rect.map.cellsInRect({\n    left: 0,\n    top: 0,\n    right: type == 'row' ? rect.map.width : 1,\n    bottom: type == 'column' ? rect.map.height : 1,\n  });\n\n  for (let i = 0; i < cellPositions.length; i++) {\n    const cell = rect.table.nodeAt(cellPositions[i]);\n    if (cell && cell.type !== types.header_cell) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * @public\n */\nexport type ToggleHeaderType = 'column' | 'row' | 'cell';\n\n/**\n * Toggles between row/column header and normal cells (Only applies to first row/column).\n * For deprecated behavior pass `useDeprecatedLogic` in options with true.\n *\n * @public\n */\nexport const toggleHeader: CommandFactory = (\n  type: ToggleHeaderType,\n  options?: { useDeprecatedLogic: boolean } | undefined,\n) => {\n  options = options || { useDeprecatedLogic: false };\n\n  if (options.useDeprecatedLogic) return deprecated_toggleHeader(type);\n\n  return function (state, dispatch) {\n    if (!isInTable(state)) return false;\n    if (dispatch) {\n      const types = tableNodeTypes(state.schema);\n      const rect = selectedRect(state),\n        tr = state.tr;\n\n      const isHeaderRowEnabled = isHeaderEnabledByType('row', rect, types);\n      const isHeaderColumnEnabled = isHeaderEnabledByType(\n        'column',\n        rect,\n        types,\n      );\n\n      const isHeaderEnabled = type === 'column'\n        ? isHeaderRowEnabled\n        : type === 'row'\n        ? isHeaderColumnEnabled\n        : false;\n\n      const selectionStartsAt = isHeaderEnabled ? 1 : 0;\n\n      const cellsRect = type == 'column'\n        ? {\n          left: 0,\n          top: selectionStartsAt,\n          right: 1,\n          bottom: rect.map.height,\n        }\n        : type == 'row'\n        ? {\n          left: selectionStartsAt,\n          top: 0,\n          right: rect.map.width,\n          bottom: 1,\n        }\n        : rect;\n\n      const newType = type == 'column'\n        ? isHeaderColumnEnabled ? types.cell : types.header_cell\n        : type == 'row'\n        ? isHeaderRowEnabled ? types.cell : types.header_cell\n        : types.cell;\n\n      rect.map.cellsInRect(cellsRect).forEach((relativeCellPos) => {\n        const cellPos = relativeCellPos + rect.tableStart;\n        const cell = tr.doc.nodeAt(cellPos);\n\n        if (cell) {\n          tr.setNodeMarkup(cellPos, newType, cell.attrs);\n        }\n      });\n\n      dispatch(tr);\n    }\n    return true;\n  };\n};\n\n/**\n * Toggles whether the selected row contains header cells.\n *\n * @public\n */\nexport const toggleHeaderRow: Command = toggleHeader('row', {\n  useDeprecatedLogic: true,\n});\n\n/**\n * Toggles whether the selected column contains header cells.\n *\n * @public\n */\nexport const toggleHeaderColumn: Command = toggleHeader('column', {\n  useDeprecatedLogic: true,\n});\n\n/**\n * Toggles whether the selected cells are header cells.\n *\n * @public\n */\nexport const toggleHeaderCell: Command = toggleHeader('cell', {\n  useDeprecatedLogic: true,\n});\n\nfunction findNextCell($cell: ResolvedPos, dir: Direction): number | null {\n  if (dir < 0) {\n    const before = $cell.nodeBefore;\n    if (before) return $cell.pos - before.nodeSize;\n    for (\n      let row = $cell.index(-1) - 1, rowEnd = $cell.before();\n      row >= 0;\n      row--\n    ) {\n      const rowNode = $cell.node(-1).child(row);\n      const lastChild = rowNode.lastChild;\n      if (lastChild) {\n        return rowEnd - 1 - lastChild.nodeSize;\n      }\n      rowEnd -= rowNode.nodeSize;\n    }\n  } else {\n    if ($cell.index() < $cell.parent.childCount - 1) {\n      return $cell.pos + $cell.nodeAfter!.nodeSize;\n    }\n    const table = $cell.node(-1);\n    for (\n      let row = $cell.indexAfter(-1), rowStart = $cell.after();\n      row < table.childCount;\n      row++\n    ) {\n      const rowNode = table.child(row);\n      if (rowNode.childCount) return rowStart + 1;\n      rowStart += rowNode.nodeSize;\n    }\n  }\n  return null;\n}\n\n/**\n * Returns a command for selecting the next (direction=1) or previous\n * (direction=-1) cell in a table.\n *\n * @public\n */\nexport const goToNextCell: CommandFactory = (direction: Direction) => {\n  return function (state, dispatch) {\n    if (!isInTable(state)) return false;\n    const cell = findNextCell(selectionCell(state), direction);\n    if (cell == null) return false;\n    if (dispatch) {\n      const $cell = state.doc.resolve(cell);\n      dispatch(\n        state.tr\n          .setSelection(TextSelection.between($cell, moveCellForward($cell)))\n          .scrollIntoView(),\n      );\n    }\n    return true;\n  };\n};\n\n/**\n * Deletes the table around the selection, if any.\n *\n * @public\n */\nexport function deleteTable(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  const $pos = state.selection.$anchor;\n  for (let d = $pos.depth; d > 0; d--) {\n    const node = $pos.node(d);\n    if (node.type.spec.tableRole == 'table') {\n      if (dispatch) {\n        dispatch(\n          state.tr.delete($pos.before(d), $pos.after(d)).scrollIntoView(),\n        );\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Deletes the content of the selected cells, if they are not empty.\n *\n * @public\n */\nexport function deleteCellSelection(\n  state: EditorState,\n  dispatch?: (tr: Transaction) => void,\n): boolean {\n  const sel = state.selection;\n  if (!(sel instanceof CellSelection)) return false;\n  if (dispatch) {\n    const tr = state.tr;\n    const baseContent = tableNodeTypes(state.schema).cell.createAndFill()!\n      .content;\n    sel.forEachCell((cell, pos) => {\n      if (!cell.content.eq(baseContent)) {\n        tr.replace(\n          tr.mapping.map(pos + 1),\n          tr.mapping.map(pos + cell.nodeSize - 1),\n          new Slice(baseContent, 0, 0),\n        );\n      }\n    });\n    if (tr.docChanged) dispatch(tr);\n  }\n  return true;\n}\n","// Utilities used for copy/paste handling.\n//\n// This module handles pasting cell content into tables, or pasting\n// anything into a cell selection, as replacing a block of cells with\n// the content of the selection. When pasting cells into a cell, that\n// involves placing the block of pasted content so that its top left\n// aligns with the selection cell, optionally extending the table to\n// the right or bottom to make sure it is large enough. Pasting into a\n// cell selection is different, here the cells in the selection are\n// clipped to the selection's rectangle, optionally repeating the\n// pasted cells when they are smaller than the selection.\n\nimport { Fragment, Node, NodeType, Schema, Slice } from 'prosemirror-model';\nimport { Transform } from 'prosemirror-transform';\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { CellSelection } from './CellSelection.ts';\nimport { tableNodeTypes } from './tableNodeTypes.ts';\nimport { ColWidths, Rect, TableMap } from './TableMap.ts';\nimport { CellAttrs, removeColSpan } from './util.ts';\n\n/**\n * @internal\n */\nexport type Area = { width: number; height: number; rows: Fragment[] };\n\n// Utilities to help with copying and pasting table cells\n\n/**\n * Get a rectangular area of cells from a slice, or null if the outer\n * nodes of the slice aren't table cells or rows.\n *\n * @internal\n */\nexport function pastedCells(slice: Slice): Area | null {\n  if (!slice.size) return null;\n  let { content, openStart, openEnd } = slice;\n  while (\n    content.childCount == 1 &&\n    ((openStart > 0 && openEnd > 0) ||\n      content.child(0).type.spec.tableRole == 'table')\n  ) {\n    openStart--;\n    openEnd--;\n    content = content.child(0).content;\n  }\n  const first = content.child(0);\n  const role = first.type.spec.tableRole;\n  const schema = first.type.schema,\n    rows = [];\n  if (role == 'row') {\n    for (let i = 0; i < content.childCount; i++) {\n      let cells = content.child(i).content;\n      const left = i ? 0 : Math.max(0, openStart - 1);\n      const right = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1);\n      if (left || right) {\n        cells = fitSlice(\n          tableNodeTypes(schema).row,\n          new Slice(cells, left, right),\n        ).content;\n      }\n      rows.push(cells);\n    }\n  } else if (role == 'cell' || role == 'header_cell') {\n    rows.push(\n      openStart || openEnd\n        ? fitSlice(\n          tableNodeTypes(schema).row,\n          new Slice(content, openStart, openEnd),\n        ).content\n        : content,\n    );\n  } else {\n    return null;\n  }\n  return ensureRectangular(schema, rows);\n}\n\n// Compute the width and height of a set of cells, and make sure each\n// row has the same number of cells.\nfunction ensureRectangular(schema: Schema, rows: Fragment[]): Area {\n  const widths: ColWidths = [];\n  for (let i = 0; i < rows.length; i++) {\n    const row = rows[i];\n    for (let j = row.childCount - 1; j >= 0; j--) {\n      const { rowspan, colspan } = row.child(j).attrs;\n      for (let r = i; r < i + rowspan; r++) {\n        widths[r] = (widths[r] || 0) + colspan;\n      }\n    }\n  }\n  let width = 0;\n  for (let r = 0; r < widths.length; r++) width = Math.max(width, widths[r]);\n  for (let r = 0; r < widths.length; r++) {\n    if (r >= rows.length) rows.push(Fragment.empty);\n    if (widths[r] < width) {\n      const empty = tableNodeTypes(schema).cell.createAndFill()!;\n      const cells = [];\n      for (let i = widths[r]; i < width; i++) {\n        cells.push(empty);\n      }\n      rows[r] = rows[r].append(Fragment.from(cells));\n    }\n  }\n  return { height: rows.length, width, rows };\n}\n\nexport function fitSlice(nodeType: NodeType, slice: Slice): Node {\n  const node = nodeType.createAndFill()!;\n  const tr = new Transform(node).replace(0, node.content.size, slice);\n  return tr.doc;\n}\n\n/**\n * Clip or extend (repeat) the given set of cells to cover the given\n * width and height. Will clip rowspan/colspan cells at the edges when\n * they stick out.\n *\n * @internal\n */\nexport function clipCells(\n  { width, height, rows }: Area,\n  newWidth: number,\n  newHeight: number,\n): Area {\n  if (width != newWidth) {\n    const added: number[] = [];\n    const newRows: Fragment[] = [];\n    for (let row = 0; row < rows.length; row++) {\n      const frag = rows[row],\n        cells = [];\n      for (let col = added[row] || 0, i = 0; col < newWidth; i++) {\n        let cell = frag.child(i % frag.childCount);\n        if (col + cell.attrs.colspan > newWidth) {\n          cell = cell.type.createChecked(\n            removeColSpan(\n              cell.attrs as CellAttrs,\n              cell.attrs.colspan,\n              col + cell.attrs.colspan - newWidth,\n            ),\n            cell.content,\n          );\n        }\n        cells.push(cell);\n        col += cell.attrs.colspan;\n        for (let j = 1; j < cell.attrs.rowspan; j++) {\n          added[row + j] = (added[row + j] || 0) + cell.attrs.colspan;\n        }\n      }\n      newRows.push(Fragment.from(cells));\n    }\n    rows = newRows;\n    width = newWidth;\n  }\n\n  if (height != newHeight) {\n    const newRows = [];\n    for (let row = 0, i = 0; row < newHeight; row++, i++) {\n      const cells = [],\n        source = rows[i % height];\n      for (let j = 0; j < source.childCount; j++) {\n        let cell = source.child(j);\n        if (row + cell.attrs.rowspan > newHeight) {\n          cell = cell.type.create(\n            {\n              ...cell.attrs,\n              rowspan: Math.max(1, newHeight - cell.attrs.rowspan),\n            },\n            cell.content,\n          );\n        }\n        cells.push(cell);\n      }\n      newRows.push(Fragment.from(cells));\n    }\n    rows = newRows;\n    height = newHeight;\n  }\n\n  return { width, height, rows };\n}\n\n// Make sure a table has at least the given width and height. Return\n// true if something was changed.\nfunction growTable(\n  tr: Transaction,\n  map: TableMap,\n  table: Node,\n  start: number,\n  width: number,\n  height: number,\n  mapFrom: number,\n): boolean {\n  const schema = tr.doc.type.schema;\n  const types = tableNodeTypes(schema);\n  let empty;\n  let emptyHead;\n  if (width > map.width) {\n    for (let row = 0, rowEnd = 0; row < map.height; row++) {\n      const rowNode = table.child(row);\n      rowEnd += rowNode.nodeSize;\n      const cells: Node[] = [];\n      let add: Node;\n      if (rowNode.lastChild == null || rowNode.lastChild.type == types.cell) {\n        add = empty || (empty = types.cell.createAndFill()!);\n      } else {add = emptyHead ||\n          (emptyHead = types.header_cell.createAndFill()!);}\n      for (let i = map.width; i < width; i++) cells.push(add);\n      tr.insert(tr.mapping.slice(mapFrom).map(rowEnd - 1 + start), cells);\n    }\n  }\n  if (height > map.height) {\n    const cells = [];\n    for (\n      let i = 0, start = (map.height - 1) * map.width;\n      i < Math.max(map.width, width);\n      i++\n    ) {\n      const header = i >= map.width\n        ? false\n        : table.nodeAt(map.map[start + i])!.type == types.header_cell;\n      cells.push(\n        header\n          ? emptyHead || (emptyHead = types.header_cell.createAndFill()!)\n          : empty || (empty = types.cell.createAndFill()!),\n      );\n    }\n\n    const emptyRow = types.row.create(null, Fragment.from(cells)),\n      rows = [];\n    for (let i = map.height; i < height; i++) rows.push(emptyRow);\n    tr.insert(tr.mapping.slice(mapFrom).map(start + table.nodeSize - 2), rows);\n  }\n  return !!(empty || emptyHead);\n}\n\n// Make sure the given line (left, top) to (right, top) doesn't cross\n// any rowspan cells by splitting cells that cross it. Return true if\n// something changed.\nfunction isolateHorizontal(\n  tr: Transaction,\n  map: TableMap,\n  table: Node,\n  start: number,\n  left: number,\n  right: number,\n  top: number,\n  mapFrom: number,\n): boolean {\n  if (top == 0 || top == map.height) return false;\n  let found = false;\n  for (let col = left; col < right; col++) {\n    const index = top * map.width + col,\n      pos = map.map[index];\n    if (map.map[index - map.width] == pos) {\n      found = true;\n      const cell = table.nodeAt(pos)!;\n      const { top: cellTop, left: cellLeft } = map.findCell(pos);\n      tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + start), null, {\n        ...cell.attrs,\n        rowspan: top - cellTop,\n      });\n      tr.insert(\n        tr.mapping.slice(mapFrom).map(map.positionAt(top, cellLeft, table)),\n        cell.type.createAndFill({\n          ...cell.attrs,\n          rowspan: cellTop + cell.attrs.rowspan - top,\n        })!,\n      );\n      col += cell.attrs.colspan - 1;\n    }\n  }\n  return found;\n}\n\n// Make sure the given line (left, top) to (left, bottom) doesn't\n// cross any colspan cells by splitting cells that cross it. Return\n// true if something changed.\nfunction isolateVertical(\n  tr: Transaction,\n  map: TableMap,\n  table: Node,\n  start: number,\n  top: number,\n  bottom: number,\n  left: number,\n  mapFrom: number,\n): boolean {\n  if (left == 0 || left == map.width) return false;\n  let found = false;\n  for (let row = top; row < bottom; row++) {\n    const index = row * map.width + left,\n      pos = map.map[index];\n    if (map.map[index - 1] == pos) {\n      found = true;\n      const cell = table.nodeAt(pos)!;\n      const cellLeft = map.colCount(pos);\n      const updatePos = tr.mapping.slice(mapFrom).map(pos + start);\n      tr.setNodeMarkup(\n        updatePos,\n        null,\n        removeColSpan(\n          cell.attrs as CellAttrs,\n          left - cellLeft,\n          cell.attrs.colspan - (left - cellLeft),\n        ),\n      );\n      tr.insert(\n        updatePos + cell.nodeSize,\n        cell.type.createAndFill(\n          removeColSpan(cell.attrs as CellAttrs, 0, left - cellLeft),\n        )!,\n      );\n      row += cell.attrs.rowspan - 1;\n    }\n  }\n  return found;\n}\n\n/**\n * Insert the given set of cells (as returned by `pastedCells`) into a\n * table, at the position pointed at by rect.\n *\n * @internal\n */\nexport function insertCells(\n  state: EditorState,\n  dispatch: (tr: Transaction) => void,\n  tableStart: number,\n  rect: Rect,\n  cells: Area,\n): void {\n  let table = tableStart ? state.doc.nodeAt(tableStart - 1) : state.doc;\n  if (!table) {\n    throw new Error('No table found');\n  }\n  let map = TableMap.get(table);\n  const { top, left } = rect;\n  const right = left + cells.width,\n    bottom = top + cells.height;\n  const tr = state.tr;\n  let mapFrom = 0;\n\n  function recomp(): void {\n    table = tableStart ? tr.doc.nodeAt(tableStart - 1) : tr.doc;\n    if (!table) {\n      throw new Error('No table found');\n    }\n    map = TableMap.get(table);\n    mapFrom = tr.mapping.maps.length;\n  }\n\n  // Prepare the table to be large enough and not have any cells\n  // crossing the boundaries of the rectangle that we want to\n  // insert into. If anything about it changes, recompute the table\n  // map so that subsequent operations can see the current shape.\n  if (growTable(tr, map, table, tableStart, right, bottom, mapFrom)) recomp();\n  if (\n    isolateHorizontal(tr, map, table, tableStart, left, right, top, mapFrom)\n  ) {\n    recomp();\n  }\n  if (\n    isolateHorizontal(tr, map, table, tableStart, left, right, bottom, mapFrom)\n  ) {\n    recomp();\n  }\n  if (isolateVertical(tr, map, table, tableStart, top, bottom, left, mapFrom)) {\n    recomp();\n  }\n  if (\n    isolateVertical(tr, map, table, tableStart, top, bottom, right, mapFrom)\n  ) {\n    recomp();\n  }\n\n  for (let row = top; row < bottom; row++) {\n    const from = map.positionAt(row, left, table),\n      to = map.positionAt(row, right, table);\n    tr.replace(\n      tr.mapping.slice(mapFrom).map(from + tableStart),\n      tr.mapping.slice(mapFrom).map(to + tableStart),\n      new Slice(cells.rows[row - top], 0, 0),\n    );\n  }\n  recomp();\n  tr.setSelection(\n    new CellSelection(\n      tr.doc.resolve(tableStart + map.positionAt(top, left, table)),\n      tr.doc.resolve(tableStart + map.positionAt(bottom - 1, right - 1, table)),\n    ),\n  );\n  dispatch(tr);\n}\n","// This file defines a number of helpers for wiring up user input to\n// table-related functionality.\n\nimport { Fragment, ResolvedPos, Slice } from 'prosemirror-model';\nimport {\n  EditorState,\n  Selection,\n  TextSelection,\n  Transaction,\n} from 'prosemirror-state';\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { keydownHandler } from '@kerebron/editor/plugins/keymap';\nimport type { Command } from '@kerebron/editor/commands';\n\nimport { CellSelection } from './CellSelection.ts';\nimport { deleteCellSelection } from './commands.ts';\nimport { clipCells, fitSlice, insertCells, pastedCells } from './copypaste.ts';\nimport { tableNodeTypes } from './tableNodeTypes.ts';\nimport { TableMap } from './TableMap.ts';\nimport {\n  cellAround,\n  inSameTable,\n  isInTable,\n  nextCell,\n  selectionCell,\n  tableEditingKey,\n} from './util.ts';\n\ntype Axis = 'horiz' | 'vert';\n\n/**\n * @public\n */\nexport type Direction = -1 | 1;\n\nexport const handleKeyDown = keydownHandler({\n  ArrowLeft: arrow('horiz', -1),\n  ArrowRight: arrow('horiz', 1),\n  // ArrowUp: arrow('vert', -1),\n  // ArrowDown: arrow('vert', 1),\n\n  'Shift-ArrowLeft': shiftArrow('horiz', -1),\n  'Shift-ArrowRight': shiftArrow('horiz', 1),\n  'Shift-ArrowUp': shiftArrow('vert', -1),\n  'Shift-ArrowDown': shiftArrow('vert', 1),\n\n  Backspace: deleteCellSelection,\n  'Mod-Backspace': deleteCellSelection,\n  Delete: deleteCellSelection,\n  'Mod-Delete': deleteCellSelection,\n});\n\nfunction maybeSetSelection(\n  state: EditorState,\n  dispatch: undefined | ((tr: Transaction) => void),\n  selection: Selection,\n): boolean {\n  if (selection.eq(state.selection)) return false;\n  if (dispatch) dispatch(state.tr.setSelection(selection).scrollIntoView());\n  return true;\n}\n\n/**\n * @internal\n */\nexport function arrow(axis: Axis, dir: Direction): Command {\n  return (state, dispatch, view) => {\n    if (!view) return false;\n    const sel = state.selection;\n    if (sel instanceof CellSelection) {\n      return maybeSetSelection(\n        state,\n        dispatch,\n        Selection.near(sel.$headCell, dir),\n      );\n    }\n    if (axis != 'horiz' && !sel.empty) return false;\n    const end = atEndOfCell(view, axis, dir);\n    if (end == null) return false;\n    if (axis == 'horiz') {\n      return maybeSetSelection(\n        state,\n        dispatch,\n        Selection.near(state.doc.resolve(sel.head + dir), dir),\n      );\n    } else {\n      const $cell = state.doc.resolve(end);\n      const $next = nextCell($cell, axis, dir);\n      let newSel;\n      if ($next) newSel = Selection.near($next, 1);\n      else if (dir < 0) {\n        newSel = Selection.near(state.doc.resolve($cell.before(-1)), -1);\n      } else newSel = Selection.near(state.doc.resolve($cell.after(-1)), 1);\n      return maybeSetSelection(state, dispatch, newSel);\n    }\n  };\n}\n\nfunction shiftArrow(axis: Axis, dir: Direction): Command {\n  return (state, dispatch, view) => {\n    if (!view) return false;\n    const sel = state.selection;\n    let cellSel: CellSelection;\n    if (sel instanceof CellSelection) {\n      cellSel = sel;\n    } else {\n      const end = atEndOfCell(view, axis, dir);\n      if (end == null) return false;\n      cellSel = new CellSelection(state.doc.resolve(end));\n    }\n\n    const $head = nextCell(cellSel.$headCell, axis, dir);\n    if (!$head) return false;\n    return maybeSetSelection(\n      state,\n      dispatch,\n      new CellSelection(cellSel.$anchorCell, $head),\n    );\n  };\n}\n\nexport function handleTripleClick(view: EditorView, pos: number): boolean {\n  const doc = view.state.doc,\n    $cell = cellAround(doc.resolve(pos));\n  if (!$cell) return false;\n  view.dispatch(view.state.tr.setSelection(new CellSelection($cell)));\n  return true;\n}\n\n/**\n * @public\n */\nexport function handlePaste(\n  view: EditorView,\n  _: ClipboardEvent,\n  slice: Slice,\n): boolean {\n  if (!isInTable(view.state)) return false;\n  let cells = pastedCells(slice);\n  const sel = view.state.selection;\n  if (sel instanceof CellSelection) {\n    if (!cells) {\n      cells = {\n        width: 1,\n        height: 1,\n        rows: [\n          Fragment.from(\n            fitSlice(tableNodeTypes(view.state.schema).cell, slice),\n          ),\n        ],\n      };\n    }\n    const table = sel.$anchorCell.node(-1);\n    const start = sel.$anchorCell.start(-1);\n    const rect = TableMap.get(table).rectBetween(\n      sel.$anchorCell.pos - start,\n      sel.$headCell.pos - start,\n    );\n    cells = clipCells(cells, rect.right - rect.left, rect.bottom - rect.top);\n    insertCells(view.state, view.dispatch, start, rect, cells);\n    return true;\n  } else if (cells) {\n    const $cell = selectionCell(view.state);\n    const start = $cell.start(-1);\n    insertCells(\n      view.state,\n      view.dispatch,\n      start,\n      TableMap.get($cell.node(-1)).findCell($cell.pos - start),\n      cells,\n    );\n    return true;\n  } else {\n    return false;\n  }\n}\n\nexport function handleMouseDown(\n  view: EditorView,\n  startEvent: MouseEvent,\n): void {\n  if (startEvent.ctrlKey || startEvent.metaKey) return;\n\n  const startDOMCell = domInCell(view, startEvent.target as Node);\n  let $anchor;\n  if (startEvent.shiftKey && view.state.selection instanceof CellSelection) {\n    // Adding to an existing cell selection\n    setCellSelection(view.state.selection.$anchorCell, startEvent);\n    startEvent.preventDefault();\n  } else if (\n    startEvent.shiftKey &&\n    startDOMCell &&\n    ($anchor = cellAround(view.state.selection.$anchor)) != null &&\n    cellUnderMouse(view, startEvent)?.pos != $anchor.pos\n  ) {\n    // Adding to a selection that starts in another cell (causing a\n    // cell selection to be created).\n    setCellSelection($anchor, startEvent);\n    startEvent.preventDefault();\n  } else if (!startDOMCell) {\n    // Not in a cell, let the default behavior happen.\n    return;\n  }\n\n  // Create and dispatch a cell selection between the given anchor and\n  // the position under the mouse.\n  function setCellSelection($anchor: ResolvedPos, event: MouseEvent): void {\n    let $head = cellUnderMouse(view, event);\n    const starting = tableEditingKey.getState(view.state) == null;\n    if (!$head || !inSameTable($anchor, $head)) {\n      if (starting) $head = $anchor;\n      else return;\n    }\n    const selection = new CellSelection($anchor, $head);\n    if (starting || !view.state.selection.eq(selection)) {\n      const tr = view.state.tr.setSelection(selection);\n      if (starting) tr.setMeta(tableEditingKey, $anchor.pos);\n      view.dispatch(tr);\n    }\n  }\n\n  // Stop listening to mouse motion events.\n  function stop(): void {\n    view.root.removeEventListener('mouseup', stop);\n    view.root.removeEventListener('dragstart', stop);\n    view.root.removeEventListener('mousemove', move);\n    if (tableEditingKey.getState(view.state) != null) {\n      view.dispatch(view.state.tr.setMeta(tableEditingKey, -1));\n    }\n  }\n\n  function move(_event: Event): void {\n    const event = _event as MouseEvent;\n    const anchor = tableEditingKey.getState(view.state);\n    let $anchor;\n    if (anchor != null) {\n      // Continuing an existing cross-cell selection\n      $anchor = view.state.doc.resolve(anchor);\n    } else if (domInCell(view, event.target as Node) != startDOMCell) {\n      // Moving out of the initial cell -- start a new cell selection\n      $anchor = cellUnderMouse(view, startEvent);\n      if (!$anchor) return stop();\n    }\n    if ($anchor) setCellSelection($anchor, event);\n  }\n\n  view.root.addEventListener('mouseup', stop);\n  view.root.addEventListener('dragstart', stop);\n  view.root.addEventListener('mousemove', move);\n}\n\n// Check whether the cursor is at the end of a cell (so that further\n// motion would move out of the cell)\nfunction atEndOfCell(view: EditorView, axis: Axis, dir: number): null | number {\n  if (!(view.state.selection instanceof TextSelection)) return null;\n\n  const { $head } = view.state.selection;\n  for (let d = $head.depth - 1; d >= 0; d--) {\n    const parent = $head.node(d),\n      index = dir < 0 ? $head.index(d) : $head.indexAfter(d);\n    if (index != (dir < 0 ? 0 : parent.childCount)) return null;\n    if (\n      parent.type.spec.tableRole == 'cell' ||\n      parent.type.spec.tableRole == 'header_cell'\n    ) {\n      const cellPos = $head.before(d);\n      const dirStr: 'up' | 'down' | 'left' | 'right' = axis == 'vert'\n        ? (dir > 0 ? 'down' : 'up')\n        : dir > 0\n        ? 'right'\n        : 'left';\n      return view.endOfTextblock(dirStr) ? cellPos : null;\n    }\n  }\n  return null;\n}\n\nfunction domInCell(view: EditorView, dom: Node | null): Node | null {\n  for (; dom && dom != view.dom; dom = dom.parentNode) {\n    if (dom.nodeName == 'TD' || dom.nodeName == 'TH') {\n      return dom;\n    }\n  }\n  return null;\n}\n\nfunction cellUnderMouse(\n  view: EditorView,\n  event: MouseEvent,\n): ResolvedPos | null {\n  const mousePos = view.posAtCoords({\n    left: event.clientX,\n    top: event.clientY,\n  });\n  if (!mousePos) return null;\n  return mousePos ? cellAround(view.state.doc.resolve(mousePos.pos)) : null;\n}\n","// This file defines a plugin that handles the drawing of cell\n// selections and the basic user interactions for creating and working\n// with such selections. It also makes sure that, after each\n// transaction, the shapes of tables are normalized to be rectangular\n// and not contain overlapping cells.\n\nimport { Plugin } from 'prosemirror-state';\n\nimport { drawCellSelection, normalizeSelection } from './CellSelection.ts';\nimport { fixTables, fixTablesKey } from './fixTables.ts';\nimport {\n  handleKeyDown,\n  handleMouseDown,\n  handlePaste,\n  handleTripleClick,\n} from './input.ts';\nimport { tableEditingKey } from './util.ts';\n\n/**\n * @public\n */\nexport type TableEditingOptions = {\n  allowTableNodeSelection?: boolean;\n};\n\n/**\n * Creates a [plugin](http://prosemirror.net/docs/ref/#state.Plugin)\n * that, when added to an editor, enables cell-selection, handles\n * cell-based copy/paste, and makes sure tables stay well-formed (each\n * row has the same width, and cells don't overlap).\n *\n * You should probably put this plugin near the end of your array of\n * plugins, since it handles mouse and arrow key events in tables\n * rather broadly, and other plugins, like the gap cursor or the\n * column-width dragging plugin, might want to get a turn first to\n * perform more specific behavior.\n *\n * @public\n */\nexport function tableEditing({\n  allowTableNodeSelection = false,\n}: TableEditingOptions = {}): Plugin {\n  return new Plugin({\n    key: tableEditingKey,\n\n    // This piece of state is used to remember when a mouse-drag\n    // cell-selection is happening, so that it can continue even as\n    // transactions (which might move its anchor cell) come in.\n    state: {\n      init() {\n        return null;\n      },\n      apply(tr, cur) {\n        const set = tr.getMeta(tableEditingKey);\n        if (set != null) return set == -1 ? null : set;\n        if (cur == null || !tr.docChanged) return cur;\n        const { deleted, pos } = tr.mapping.mapResult(cur);\n        return deleted ? null : pos;\n      },\n    },\n\n    props: {\n      decorations: drawCellSelection,\n\n      handleDOMEvents: {\n        mousedown: handleMouseDown,\n      },\n\n      createSelectionBetween(view) {\n        return tableEditingKey.getState(view.state) != null\n          ? view.state.selection\n          : null;\n      },\n\n      handleTripleClick,\n\n      handleKeyDown,\n\n      handlePaste,\n    },\n\n    appendTransaction(_, oldState, state) {\n      return normalizeSelection(\n        state,\n        fixTables(state, oldState),\n        allowTableNodeSelection,\n      );\n    },\n  });\n}\n","import { TextSelection } from 'prosemirror-state';\nimport { NodeSpec, NodeType } from 'prosemirror-model';\nimport { Node as ProseMirrorNode } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { type InputRule } from '@kerebron/editor/plugins/input-rules';\nimport {\n  getHtmlAttributes,\n  setHtmlAttributes,\n} from '@kerebron/editor/utilities';\n\nimport { createTable } from './utilities/createTable.ts';\nimport { CellSelection } from './utilities/CellSelection.ts';\nimport { columnResizing } from './utilities/columnResizing.ts';\nimport { tableEditing } from './utilities/tableEditing.ts';\nimport {\n  addColumnAfter,\n  addColumnBefore,\n  addRowAfter,\n  addRowBefore,\n  deleteColumn,\n  deleteRow,\n  deleteTable,\n  goToNextCell,\n  mergeCells,\n  setCellAttr,\n  splitCell,\n  toggleHeader,\n  toggleHeaderCell,\n  toggleHeaderColumn,\n  toggleHeaderRow,\n} from './utilities/commands.ts';\nimport { Plugin } from 'prosemirror-state';\nimport { Direction } from './utilities/input.ts';\n\nexport class NodeTable extends Node {\n  override name = 'table';\n  requires = ['doc'];\n\n  override attributes = {\n    class: {\n      default: 'table',\n      fromDom(element: HTMLElement) {\n        return element.hasAttribute('class')\n          ? element.getAttribute('class')!\n          : undefined;\n      },\n    },\n  };\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'table_row+',\n      tableRole: 'table',\n      isolating: true,\n      group: 'block',\n      parseDOM: [{\n        tag: 'table',\n        getAttrs: (element) => setHtmlAttributes(this, element),\n      }],\n      toDOM: (\n        node: ProseMirrorNode,\n      ) => ['table', getHtmlAttributes(this, node), ['tbody', 0]],\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const commands: Partial<CommandFactories> = {\n      addColumnAfter: () => (state, dispatch) =>\n        addColumnAfter(state, dispatch),\n      addColumnBefore: () => (state, dispatch) =>\n        addColumnBefore(state, dispatch),\n      addRowAfter: () => (state, dispatch) => addRowAfter(state, dispatch),\n      addRowBefore: () => (state, dispatch) => addRowBefore(state, dispatch),\n      deleteColumn: () => (state, dispatch) => deleteColumn(state, dispatch),\n      deleteRow: () => (state, dispatch) => deleteRow(state, dispatch),\n      deleteTable: () => (state, dispatch) => deleteTable(state, dispatch),\n      goToNextCell: (direction: Direction) => goToNextCell(direction),\n      mergeCells: () => (state, dispatch) => mergeCells(state, dispatch),\n      setCellAttr: (...args) => setCellAttr(...args),\n      splitCell: () => (state, dispatch) => splitCell(state, dispatch),\n      toggleHeader: (...args) => toggleHeader(...args),\n      toggleHeaderCell: () => (state, dispatch) =>\n        toggleHeaderCell(state, dispatch),\n      toggleHeaderRow: () => (state, dispatch) =>\n        toggleHeaderRow(state, dispatch),\n      toggleHeaderColumn: () => (state, dispatch) =>\n        toggleHeaderColumn(state, dispatch),\n      insertTable:\n        ({ rows = 3, cols = 3, withHeaderRow = true } = {}) =>\n        (state, dispatch) => {\n          const tr = state.tr;\n          const node = createTable(editor.schema, rows, cols, withHeaderRow);\n\n          if (dispatch) {\n            const offset = tr.selection.from + 1;\n\n            tr.replaceSelectionWith(node)\n              .scrollIntoView()\n              .setSelection(TextSelection.near(tr.doc.resolve(offset)));\n          }\n\n          return true;\n        },\n      setCellSelection: (position) => (state, dispatch) => {\n        if (dispatch) {\n          const selection = CellSelection.create(\n            state.doc,\n            position.anchorCell,\n            position.headCell,\n          );\n\n          state.tr.setSelection(selection);\n        }\n        return true;\n      },\n    };\n    return commands;\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    const keys = {};\n    return keys;\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      columnResizing(),\n      tableEditing(),\n    ];\n  }\n}\n","import { NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport {\n  type InputRule,\n  textblockTypeInputRule,\n} from '@kerebron/editor/plugins/input-rules';\n\nexport class NodeTableRow extends Node {\n  override name = 'table_row';\n  requires = ['table'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: '(table_cell | table_header)*',\n      tableRole: 'row',\n      parseDOM: [{ tag: 'tr' }],\n      toDOM() {\n        return ['tr', 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const commands = {};\n\n    return commands;\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    const keys = {};\n    return keys;\n  }\n}\n","import type { Attrs, Node as PmNode, NodeSpec } from 'prosemirror-model';\nimport { Node } from '@kerebron/editor';\n\nfunction getCellAttrs(dom: HTMLElement | string): Attrs {\n  if (typeof dom === 'string') {\n    return {};\n  }\n\n  const widthAttr = dom.getAttribute('data-colwidth');\n  const widths = widthAttr && /^\\d+(,\\d+)*$/.test(widthAttr)\n    ? widthAttr.split(',').map((s) => Number(s))\n    : null;\n  const colspan = Number(dom.getAttribute('colspan') || 1);\n  return {\n    colspan,\n    rowspan: Number(dom.getAttribute('rowspan') || 1),\n    colwidth: widths && widths.length == colspan ? widths : null,\n  };\n}\n\nfunction setCellAttrs(node: PmNode): Attrs {\n  return {\n    colspan: (node.attrs.colspan != 1) ? node.attrs.colspan : undefined,\n    rowspan: (node.attrs.rowspan != 1) ? node.attrs.rowspan : undefined,\n    'data-colwidth': node.attrs.colwidth?.join(','),\n  };\n}\n\nexport class NodeTableHeader extends Node {\n  override name = 'table_header';\n  requires = ['table'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'block+',\n      attrs: {\n        colspan: { default: 1 },\n        rowspan: { default: 1 },\n        colwidth: { default: undefined },\n      },\n      tableRole: 'header_cell',\n      isolating: true,\n      parseDOM: [\n        { tag: 'th', getAttrs: (dom) => getCellAttrs(dom) },\n      ],\n      toDOM: (node) => ['th', setCellAttrs(node), 0],\n    };\n  }\n}\n","import { Attrs, Node as PmNode, NodeSpec, NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor, Node } from '@kerebron/editor';\nimport {\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\nimport { type InputRule } from '@kerebron/editor/plugins/input-rules';\n\nfunction getCellAttrs(dom: HTMLElement | string): Attrs {\n  if (typeof dom === 'string') {\n    return {};\n  }\n\n  const widthAttr = dom.getAttribute('data-colwidth');\n  const widths = widthAttr && /^\\d+(,\\d+)*$/.test(widthAttr)\n    ? widthAttr.split(',').map((s) => Number(s))\n    : null;\n  const colspan = Number(dom.getAttribute('colspan') || 1);\n  return {\n    colspan,\n    rowspan: Number(dom.getAttribute('rowspan') || 1),\n    colwidth: widths && widths.length == colspan ? widths : null,\n  };\n}\n\nfunction setCellAttrs(node: PmNode): Attrs {\n  return {\n    colspan: (node.attrs.colspan != 1) ? node.attrs.colspan : undefined,\n    rowspan: (node.attrs.rowspan != 1) ? node.attrs.rowspan : undefined,\n    'data-colwidth': node.attrs.colwidth?.join(','),\n  };\n}\n\nexport class NodeTableCell extends Node {\n  override name = 'table_cell';\n  requires = ['table_row'];\n\n  override getNodeSpec(): NodeSpec {\n    return {\n      content: 'block+',\n      attrs: {\n        colspan: { default: 1 },\n        rowspan: { default: 1 },\n        colwidth: { default: undefined },\n      },\n      tableRole: 'cell',\n      isolating: true,\n      parseDOM: [\n        { tag: 'td', getAttrs: (dom) => getCellAttrs(dom) },\n      ],\n      toDOM(node) {\n        return ['td', setCellAttrs(node), 0];\n      },\n    };\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    const commands = {};\n    return commands;\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    const keys = {};\n    return keys;\n  }\n}\n","import { Extension } from '@kerebron/editor';\n\nimport { NodeTable } from './NodeTable.ts';\nimport { NodeTableRow } from './NodeTableRow.ts';\nimport { NodeTableHeader } from './NodeTableHeader.ts';\nimport { NodeTableCell } from './NodeTableCell.ts';\n\nexport class ExtensionTables extends Extension {\n  name = 'extension-tables';\n  requires = [\n    new NodeTable(),\n    new NodeTableHeader(),\n    new NodeTableRow(),\n    new NodeTableCell(),\n  ];\n}\n","import { createParser, ExtendedNode, type Parser } from '@kerebron/tree-sitter';\n\nimport { getLangTreeSitter } from '@kerebron/wasm';\n\nimport { DecorationInline, Decorator } from './Decorator.ts';\nimport { AssetLoad } from '@kerebron/editor';\n\nexport class TreeSitterHighlighter {\n  parser: Parser | undefined;\n  hightligtScm: string | undefined;\n  lang?: string;\n\n  constructor(private assetLoad: AssetLoad) {\n  }\n\n  async init(lang: string): Promise<boolean> {\n    this.lang = lang;\n    if (!lang || !this.assetLoad) {\n      this.parser = undefined;\n      this.hightligtScm = undefined;\n      return true;\n    }\n    const treeSitterConfig = getLangTreeSitter(lang);\n    const wasmUrl = treeSitterConfig.files[0]; // TODO add support for split parsers like markdown\n\n    try {\n      const wasm = await this.assetLoad(treeSitterConfig.dir + '/' + wasmUrl);\n      this.parser = await createParser(wasm, { assetLoad: this.assetLoad });\n\n      this.hightligtScm = new TextDecoder().decode(\n        await this.assetLoad(treeSitterConfig.dir + '/' + 'highlights.scm'),\n      );\n    } catch (err) {\n      console.error('Error init highlight for: ' + lang, err);\n    }\n\n    if (!this.parser) {\n      console.warn('Parser not inited');\n      return false;\n    }\n    if (!this.hightligtScm) {\n      console.warn('hightligtScm not inited');\n      return false;\n    }\n\n    return true;\n  }\n\n  highlight(code: string, decorator: Decorator) {\n    if (!this.lang || !this.parser || !this.hightligtScm) {\n      decorator.decorationGroups['highlight'] = [];\n      return decorator.highlight(code);\n    }\n\n    const tree = this.parser.parse(code)!;\n    const root = new ExtendedNode(tree.rootNode, code);\n\n    const highlightsQuery = root.query(this.hightligtScm);\n\n    const captures = [];\n\n    for (const item of highlightsQuery) {\n      captures.push(...item.captures);\n    }\n\n    const decorations: DecorationInline[] = [];\n\n    for (const capture of captures) {\n      const { node, name } = capture; // name is the capture like \"@string\"\n\n      const startIndex = node.startIndex;\n      const endIndex = node.endIndex;\n\n      decorations.push({\n        startIndex,\n        endIndex,\n        attrs: {\n          class: 'ts-' + name.replaceAll('.', '_'),\n        },\n      });\n    }\n\n    decorator.decorationGroups['highlight'] = decorations;\n\n    return decorator.highlight(code);\n  }\n}\n","export interface DecorationInline {\n  startIndex: number;\n  endIndex: number;\n  attrs: { [k: string]: string };\n}\n\nexport class Decorator {\n  public decorationGroups: Record<string, DecorationInline[]> = {};\n\n  public refreshers: Array<() => void> = [];\n\n  refresh() {\n    for (const refresh of this.refreshers) {\n      refresh();\n    }\n    this.refreshers.splice(0, this.refreshers.length);\n  }\n\n  highlight(code: string) {\n    const decorations: DecorationInline[] = [];\n\n    for (const groupName in this.decorationGroups) {\n      const group = this.decorationGroups[groupName];\n      decorations.push(...group);\n    }\n\n    const cutIndexes = new Set<number>();\n    for (const d of decorations) {\n      cutIndexes.add(d.startIndex);\n      cutIndexes.add(d.endIndex);\n    }\n    cutIndexes.add(0);\n    cutIndexes.add(code.length);\n\n    const cutIndexesArr = Array.from(cutIndexes);\n    cutIndexesArr.sort((a, b) => a - b);\n\n    let html = '';\n    let lastIndex = 0;\n\n    for (const currentIdx of cutIndexesArr) {\n      const text = code.substring(lastIndex, currentIdx);\n      const activeDecors = decorations.filter((d) =>\n        lastIndex >= d.startIndex && currentIdx <= d.endIndex\n      );\n\n      for (const decor of activeDecors) {\n        html += `<span `;\n        for (const [k, v] of Object.entries(decor.attrs || {})) {\n          html += ` ${k}=\"${escapeHtml(v || '')}\"`;\n        }\n        html += '>';\n      }\n\n      html += escapeHtml(text);\n\n      for (const decor of activeDecors) {\n        html += '</span>';\n      }\n\n      const activeWidgetDecors = decorations.filter((d) =>\n        currentIdx === d.startIndex && d.startIndex === d.endIndex\n      );\n      for (const decor of activeWidgetDecors) {\n        html += `<span `;\n        for (const [k, v] of Object.entries(decor.attrs)) {\n          html += ` ${k}=\"${escapeHtml(v || '')}\"`;\n        }\n        html += '></span>';\n      }\n\n      lastIndex = currentIdx;\n    }\n\n    return html;\n  }\n}\n\nfunction escapeHtml(text: string) {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n","// This class was copied from https://github.com/antonmedv/codejar/blob/3.7.0/linenumbers.ts\n// and applied with further improvements and fixes\n\ntype Options = {\n  class: string;\n  wrapClass: string;\n  width: string;\n  color: string;\n};\n\nexport const lineNumberOptions: Options = {\n  class: 'codecrock-linenumbers',\n  wrapClass: 'codecrock-wrap',\n  color: '',\n};\n\nexport function withLineNumbers(\n  highlight: (e: HTMLElement) => void,\n  options: Partial<Options> = {},\n) {\n  let lineNumbers: HTMLElement;\n  return function (editor: HTMLElement) {\n    highlight(editor);\n\n    if (!lineNumbers) {\n      lineNumbers = initLineNumbers(editor, {\n        ...lineNumberOptions,\n        ...options,\n      });\n      editor.addEventListener(\n        'scroll',\n        () => lineNumbers.style.top = `-${editor.scrollTop}px`,\n      );\n    }\n\n    const code = editor.textContent || '';\n    const linesCount = code.replace(/\\n$/g, '').split('\\n').length;\n\n    let text = '';\n    for (let i = 0; i < linesCount; i++) {\n      text += `${i + 1}\\n`;\n    }\n\n    lineNumbers.innerText = text;\n  };\n}\n\nexport function refreshNumbers(\n  lineNumbers: HTMLElement,\n  editor: HTMLElement,\n) {\n  const code = editor.textContent || '';\n  const linesCount = code.replace(/\\n$/g, '').split('\\n').length;\n\n  let text = '';\n  for (let i = 0; i < linesCount; i++) {\n    text += `${i + 1}\\n`;\n  }\n  lineNumbers.innerText = text;\n\n  // Hack editor styles\n  editor.style.marginLeft = `calc(40px + 5px)`;\n}\n\nexport function initLineNumbers(\n  dom: HTMLElement,\n  editable: HTMLElement,\n  opts: Options,\n): HTMLElement {\n  const css = getComputedStyle(editable);\n\n  const wrap = document.createElement('div');\n  wrap.className = opts.wrapClass;\n  wrap.style.position = 'relative';\n\n  const innerWrap = document.createElement('div');\n  innerWrap.className = 'codecrock-linenumbers-inner-wrap';\n  innerWrap.style.background = css.background;\n  innerWrap.style.marginTop = css.borderTopWidth;\n  innerWrap.style.marginBottom = css.borderBottomWidth;\n  innerWrap.style.marginLeft = css.borderLeftWidth;\n  innerWrap.style.borderTopLeftRadius = css.borderTopLeftRadius;\n  innerWrap.style.borderBottomLeftRadius = css.borderBottomLeftRadius;\n\n  const gutter = document.createElement('div');\n  gutter.className = opts.class;\n  innerWrap.appendChild(gutter);\n\n  wrap.appendChild(innerWrap);\n\n  // Add own styles\n  gutter.style.width = opts.width;\n  gutter.style.overflow = 'hidden';\n\n  // Copy editor styles\n  gutter.style.fontFamily = css.fontFamily;\n  gutter.style.fontSize = css.fontSize;\n  gutter.style.lineHeight = css.lineHeight;\n  gutter.style.paddingTop = `calc(${css.paddingTop})`;\n  gutter.style.paddingLeft = css.paddingLeft;\n  gutter.style.borderTopLeftRadius = css.borderTopLeftRadius;\n  gutter.style.borderBottomLeftRadius = css.borderBottomLeftRadius;\n\n  // Add line numbers\n  const lineNumbers = document.createElement('div');\n  lineNumbers.setAttribute('class', 'codecrock-linenumber');\n  lineNumbers.style.color = opts.color || css.color;\n  lineNumbers.style.setProperty('mix-blend-mode', 'unset');\n  gutter.appendChild(lineNumbers);\n\n  // Tweak editor styles\n  editable.style.paddingLeft =\n    `calc(${opts.width} + ${gutter.style.paddingLeft} + 5px)`;\n  editable.style.whiteSpace = 'pre';\n\n  // Swap editor with a wrap\n  dom.insertBefore(wrap, editable);\n  wrap.appendChild(editable);\n\n  editable.addEventListener(\n    'scroll',\n    () => lineNumbers.style.top = `-${editable.scrollTop}px`,\n  );\n\n  return lineNumbers;\n}\n","import { Node } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { CodeCrock, Position } from './CodeCrock.ts';\nimport { TextSelection } from 'prosemirror-state';\n\nimport { CodeContentMapper } from '@kerebron/workspace/CodeContentMapper';\n\nimport { CodeNodeView } from './ui.ts';\n\nexport function computeChange(oldVal: string, newVal: string) {\n  if (oldVal === newVal) return null;\n  let start = 0;\n  let oldEnd = oldVal.length;\n  let newEnd = newVal.length;\n  while (\n    start < oldEnd &&\n    oldVal.charCodeAt(start) === newVal.charCodeAt(start)\n  ) {\n    start += 1;\n  }\n  while (\n    oldEnd > start &&\n    newEnd > start &&\n    oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)\n  ) {\n    oldEnd -= 1;\n    newEnd -= 1;\n  }\n  return { from: start, to: oldEnd, text: newVal.slice(start, newEnd) };\n}\n\nexport const valueChanged = (\n  textUpdate: string,\n  node: Node,\n  getPos: () => number | undefined,\n  view: EditorView,\n) => {\n  const change = computeChange(node.textContent, textUpdate);\n\n  if (change) {\n    const pos = getPos();\n    if ('undefined' !== typeof pos) {\n      const start = pos + 1;\n\n      let pmTr = view.state.tr;\n      pmTr = pmTr.replaceWith(\n        start + change.from,\n        start + change.to,\n        change.text ? view.state.schema.text(change.text) : [],\n      );\n      view.dispatch(pmTr);\n    }\n  }\n};\n\nexport const forwardSelection = (\n  codeCrock: CodeCrock,\n  pmView: EditorView,\n  getPos: () => number | undefined,\n) => {\n  // if (!cmView.hasFocus) return;\n  const codeCrockPos = codeCrock.save();\n  if (!codeCrockPos) {\n    return;\n  }\n  const selection = asProseMirrorSelection(\n    pmView.state.doc,\n    codeCrockPos,\n    getPos,\n  );\n  if (!selection.eq(pmView.state.selection)) {\n    pmView.dispatch(pmView.state.tr.setSelection(selection));\n  }\n};\n\nconst asProseMirrorSelection = (\n  pmDoc: Node,\n  pos: Position,\n  getPos: () => number | undefined,\n) => {\n  const offset = (typeof getPos === 'function' ? getPos() || 0 : 0) + 1;\n  if (pos.dir === '<-') {\n    return TextSelection.create(pmDoc, pos.start + offset, pos.end + offset);\n  } else {\n    return TextSelection.create(pmDoc, pos.end + offset, pos.start + offset);\n  }\n};\n\nexport function applyChangeOverPos(\n  pos: Position | undefined,\n  change: { from: number; to: number; text: string },\n): Position | undefined {\n  if (!pos) {\n    return pos;\n  }\n\n  const lenGrowth = change.text.length - (change.to - change.from);\n  if (!lenGrowth) {\n    return pos;\n  }\n\n  pos = { ...pos };\n\n  if (change.to <= pos.start) {\n    pos.start += lenGrowth;\n  }\n  if (change.to <= pos.end) {\n    pos.end += lenGrowth;\n  }\n\n  return pos;\n}\n\nexport function replaceExt(uri: string, lang: string) {\n  switch (lang) {\n    case 'markdown':\n      lang = 'md';\n      break;\n    case 'mermaid':\n      lang = 'mmd';\n      break;\n    case 'javascript':\n      lang = 'js';\n      break;\n    case 'typescript':\n      lang = 'ts';\n      break;\n  }\n\n  const parts = uri.split('.');\n  parts.pop();\n  parts.push(lang);\n  return parts.join('.');\n}\n\nexport const STOP_EVENTS = [\n  'keydown',\n  'keyup',\n  'keypress',\n  'beforeinput',\n  'input',\n  'compositionstart',\n  'compositionupdate',\n  'compositionend',\n  'paste',\n  'cut',\n  'copy',\n  'dragstart',\n  'dragover',\n  'drop',\n];\n\nexport interface SnapshotCtx {\n  version: number;\n  text: string;\n  materialized?: CodeContentMapper;\n}\n\nexport function performSnapshot(nodeView: CodeNodeView, codeCrock: CodeCrock) {\n  const version = nodeView.editor.version;\n  const ctx: SnapshotCtx = {\n    version,\n    text: codeCrock.toString(),\n    materialized: undefined,\n  };\n  const getContentMapper = async () => {\n    if (ctx.materialized) {\n      return ctx.materialized;\n    }\n    ctx.materialized = CodeContentMapper.create(ctx.text);\n    return ctx.materialized;\n  };\n\n  return { version, getContentMapper };\n}\n","import { debounce } from '@kerebron/editor/utilities';\n\nconst globalWindow = window;\n\ntype Options = {\n  tab: string;\n  indentOn: RegExp;\n  moveToNewLine: RegExp;\n  spellcheck: boolean;\n  catchTab: boolean;\n  preserveIdent: boolean;\n  addClosing: boolean;\n  history: boolean;\n  readOnly?: boolean;\n  window: typeof window;\n  autoclose: {\n    open: string;\n    close: string;\n  };\n};\n\ntype HistoryRecord = {\n  html: string;\n  pos: Position;\n};\n\nexport type Position = {\n  start: number;\n  end: number;\n  dir?: '->' | '<-';\n};\n\nfunction visit(\n  editor: HTMLElement,\n  visitor: (el: Node) => 'stop' | undefined,\n) {\n  const queue: Node[] = [];\n  if (editor.firstChild) queue.push(editor.firstChild);\n  let el = queue.pop();\n  while (el) {\n    if (visitor(el) === 'stop') break;\n    if (el.nextSibling) queue.push(el.nextSibling);\n    if (el.firstChild) queue.push(el.firstChild);\n    el = queue.pop();\n  }\n}\n\nfunction isCtrl(event: KeyboardEvent) {\n  return event.metaKey || event.ctrlKey;\n}\n\nfunction isUndo(event: KeyboardEvent) {\n  return isCtrl(event) && !event.shiftKey && getKeyCode(event) === 'Z';\n}\n\nfunction isRedo(event: KeyboardEvent) {\n  return isCtrl(event) && event.shiftKey && getKeyCode(event) === 'Z';\n}\n\nfunction isCopy(event: KeyboardEvent) {\n  return isCtrl(event) && getKeyCode(event) === 'C';\n}\n\nfunction getKeyCode(event: KeyboardEvent): string | undefined {\n  let key = event.key || event.keyCode || event.which;\n  if (!key) return undefined;\n  return (typeof key === 'string' ? key : String.fromCharCode(key))\n    .toUpperCase();\n}\n\nfunction insert(text: string) {\n  text = text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#039;');\n  document.execCommand('insertHTML', false, text);\n}\n\nfunction findPadding(text: string): [string, number, number] {\n  // Find beginning of previous line.\n  let i = text.length - 1;\n  while (i >= 0 && text[i] !== '\\n') i--;\n  i++;\n  // Find padding of the line.\n  let j = i;\n  while (j < text.length && /[ \\t]/.test(text[j])) j++;\n  return [text.substring(i, j) || '', i, j];\n}\n\nexport class CodeCrock extends EventTarget {\n  options: Options;\n  listeners: [string, any][] = [];\n  history: HistoryRecord[] = [];\n  at = -1;\n  onUpdateCbk: (code: string) => void | undefined = () => void 0;\n  focus = false;\n  prev: string | undefined; // code content prior keydown event\n  debounceHighlight: (...args: any) => void;\n\n  constructor(\n    private editor: HTMLElement,\n    private highlight: (e: HTMLElement, pos?: Position) => void,\n    opt: Partial<Options> = {},\n  ) {\n    super();\n\n    this.options = {\n      tab: '\\t',\n      indentOn: /[({\\[]$/,\n      moveToNewLine: /^[)}\\]]/,\n      spellcheck: false,\n      catchTab: true,\n      preserveIdent: true,\n      addClosing: true,\n      history: true,\n      window: globalWindow,\n      autoclose: {\n        open: '',\n        close: '',\n      },\n      ...opt,\n    };\n\n    const window = this.options.window;\n    const document = window.document;\n\n    editor.style.outline = 'none';\n    editor.style.overflowWrap = 'break-word';\n    editor.style.overflowY = 'auto';\n    editor.style.whiteSpace = 'pre-wrap';\n\n    const matchFirefoxVersion = window.navigator.userAgent.match(\n      /Firefox\\/([0-9]+)\\./,\n    );\n    const firefoxVersion = matchFirefoxVersion\n      ? parseInt(matchFirefoxVersion[1])\n      : 0;\n\n    let isLegacy = false; // true if plaintext-only is not supported\n\n    if (!opt.readOnly) {\n      editor.setAttribute('contenteditable', 'plaintext-only');\n\n      if (\n        editor.contentEditable !== 'plaintext-only' || firefoxVersion >= 136\n      ) {\n        isLegacy = true;\n      }\n\n      if (isLegacy) editor.setAttribute('contenteditable', 'true');\n      editor.setAttribute(\n        'spellcheck',\n        this.options.spellcheck ? 'true' : 'false',\n      );\n    }\n\n    const debounceHighlight = debounce(() => {\n      const pos = this.save();\n      this.highlight(editor, pos);\n      this.restore(pos);\n    }, 30);\n    this.debounceHighlight = debounceHighlight;\n\n    let recording = false;\n    const shouldRecord = (event: KeyboardEvent): boolean => {\n      return !isUndo(event) && !isRedo(event) &&\n        event.key !== 'Meta' &&\n        event.key !== 'Control' &&\n        event.key !== 'Alt' &&\n        !event.key.startsWith('Arrow');\n    };\n    const debounceRecordHistory = debounce((event: KeyboardEvent) => {\n      if (shouldRecord(event)) {\n        this.recordHistory();\n        recording = false;\n      }\n    }, 300);\n\n    const on = <K extends keyof HTMLElementEventMap>(\n      type: K,\n      fn: (event: HTMLElementEventMap[K]) => void,\n    ) => {\n      this.listeners.push([type, fn]);\n      this.editor.addEventListener(type, fn);\n    };\n\n    const getCaretOffset = (root: HTMLElement) => {\n      const sel = this.getSelection();\n      if (!sel || sel.rangeCount === 0) return 0;\n\n      const range = sel.getRangeAt(0);\n      const preRange = range.cloneRange();\n\n      preRange.selectNodeContents(root);\n      preRange.setEnd(range.endContainer, range.endOffset);\n\n      return preRange.toString().length;\n    };\n\n    function getRowCol(root: HTMLElement) {\n      const text = root.textContent;\n      const offset = getCaretOffset(root);\n\n      const before = text.slice(0, offset);\n      const lines = before.split('\\n');\n\n      const row = lines.length - 1;\n      const col = lines[lines.length - 1].length;\n\n      const rows = text.split('\\n');\n\n      return {\n        row,\n        col,\n        lastRow: rows.length - 1,\n        lastCol: rows[rows.length - 1].length,\n      };\n    }\n\n    const maybeEscape = (event: KeyboardEvent) => {\n      const { row, col, lastRow, lastCol } = getRowCol(this.editor);\n\n      switch (event.key) {\n        case 'ArrowUp':\n          if (row === 0) {\n            this.dispatchEvent(new CustomEvent('blur-previous'));\n            event.stopPropagation();\n            event.preventDefault();\n            return true;\n          }\n          break;\n        case 'ArrowLeft':\n          if (row === 0 && col === 0) {\n            this.dispatchEvent(new CustomEvent('blur-previous'));\n            event.stopPropagation();\n            event.preventDefault();\n            return true;\n          }\n          break;\n        case 'ArrowDown':\n          if (row >= lastRow) {\n            this.dispatchEvent(new CustomEvent('blur-next'));\n            event.stopPropagation();\n            event.preventDefault();\n            return true;\n          }\n          break;\n        case 'ArrowRight':\n          if (row >= lastRow && col >= lastCol) {\n            this.dispatchEvent(new CustomEvent('blur-next'));\n            event.stopPropagation();\n            event.preventDefault();\n            return true;\n          }\n          break;\n      }\n\n      return false;\n    };\n\n    on('keydown', (event) => {\n      if (event.defaultPrevented) return;\n\n      const isSelectAll = (event.ctrlKey || event.metaKey) &&\n        event.key.toLowerCase() === 'a';\n\n      if (isSelectAll) {\n        event.preventDefault();\n\n        const range = document.createRange();\n        range.selectNodeContents(editor);\n\n        const selection = this.getSelection();\n        if (selection) {\n          selection.removeAllRanges();\n          selection.addRange(range);\n        }\n      }\n\n      switch (event.key) {\n        case 'Enter':\n          if (event.shiftKey) {\n            const { row, col, lastRow, lastCol } = getRowCol(this.editor);\n\n            if (row === 0) {\n              this.dispatchEvent(new CustomEvent('prepend-empty-line'));\n              event.stopPropagation();\n              event.preventDefault();\n            } else if (row >= lastRow) {\n              this.dispatchEvent(new CustomEvent('append-empty-line'));\n            }\n            return;\n          }\n          break;\n        case 'ArrowUp':\n        case 'ArrowLeft':\n        case 'ArrowDown':\n        case 'ArrowRight':\n          if (maybeEscape(event)) {\n            return;\n          }\n          break;\n      }\n\n      this.prev = this.toString();\n      if (this.options.preserveIdent) handleNewLine(event);\n      else legacyNewLineFix(event);\n      if (this.options.catchTab) handleTabCharacters(event);\n      if (this.options.addClosing) handleSelfClosingCharacters(event);\n      if (this.options.history) {\n        handleUndoRedo(event);\n        if (shouldRecord(event) && !recording) {\n          this.recordHistory();\n          recording = true;\n        }\n      }\n    });\n\n    on('keyup', (event) => {\n      if (event.defaultPrevented) return;\n      if (event.isComposing) return;\n\n      if (this.prev !== this.toString()) debounceHighlight();\n      debounceRecordHistory(event);\n      this.onUpdateCbk(this.toString());\n\n      const selection = this.save();\n      if (selection) {\n        this.dispatchEvent(\n          new CustomEvent('selectionchange', { detail: selection }),\n        );\n      }\n    });\n\n    on('focus', (_event) => {\n      this.focus = true;\n    });\n\n    on('blur', (_event) => {\n      this.focus = false;\n    });\n\n    on('paste', (event) => {\n      this.recordHistory();\n      handlePaste(event);\n      this.recordHistory();\n      this.onUpdateCbk(this.toString());\n    });\n\n    on('cut', (event) => {\n      this.recordHistory();\n      handleCut(event);\n      this.recordHistory();\n      this.onUpdateCbk(this.toString());\n    });\n\n    const beforeCursor = () => {\n      const s = this.getSelection();\n      if (!s) {\n        return '';\n      }\n      const r0 = s.getRangeAt(0);\n      const r = document.createRange();\n      r.selectNodeContents(editor);\n      r.setEnd(r0.startContainer, r0.startOffset);\n      return r.toString();\n    };\n\n    const afterCursor = () => {\n      const s = this.getSelection();\n      if (!s) {\n        return '';\n      }\n      const r0 = s.getRangeAt(0);\n      const r = document.createRange();\n      r.selectNodeContents(editor);\n      r.setStart(r0.endContainer, r0.endOffset);\n      return r.toString();\n    };\n\n    const handleNewLine = (event: KeyboardEvent) => {\n      if (event.key === 'Enter') {\n        const before = beforeCursor();\n        const after = afterCursor();\n\n        let [padding] = findPadding(before);\n        let newLinePadding = padding;\n\n        // If last symbol is \"{\" ident new line\n        if (this.options.indentOn.test(before)) {\n          newLinePadding += this.options.tab;\n        }\n\n        // Preserve padding\n        if (newLinePadding.length > 0) {\n          event.preventDefault();\n          event.stopPropagation();\n          insert('\\n' + newLinePadding);\n        } else {\n          legacyNewLineFix(event);\n        }\n\n        // Place adjacent \"}\" on next line\n        if (\n          newLinePadding !== padding && this.options.moveToNewLine.test(after)\n        ) {\n          const pos = this.save();\n          insert('\\n' + padding);\n          this.restore(pos);\n        }\n      }\n    };\n\n    const legacyNewLineFix = (event: KeyboardEvent) => {\n      // Firefox does not support plaintext-only mode\n      // and puts <div><br></div> on Enter. Let's help.\n      if (isLegacy && event.key === 'Enter') {\n        event.preventDefault();\n        event.stopPropagation();\n        if (afterCursor() == '') {\n          insert('\\n\\u200B');\n          const pos = this.save();\n          if (pos) {\n            pos.start = --pos.end;\n            this.restore(pos);\n          }\n        } else {\n          insert('\\n');\n        }\n      }\n    };\n\n    const handleSelfClosingCharacters = (event: KeyboardEvent) => {\n      const open = this.options.autoclose.open;\n      const close = this.options.autoclose.close;\n      if (open.includes(event.key)) {\n        event.preventDefault();\n        const pos = this.save();\n        const wrapText = pos && pos.start == pos.end\n          ? ''\n          : (this.getSelection()?.toString() || '');\n        const text = event.key + wrapText +\n          (close[open.indexOf(event.key)] ?? '');\n        insert(text);\n        if (pos) {\n          pos.start++;\n          pos.end++;\n          this.restore(pos);\n        }\n      }\n    };\n\n    const handleTabCharacters = (event: KeyboardEvent) => {\n      if (event.key === 'Tab') {\n        event.preventDefault();\n        if (event.shiftKey) {\n          const before = beforeCursor();\n          let [padding, start] = findPadding(before);\n          if (padding.length > 0) {\n            const pos = this.save();\n            // Remove full length tab or just remaining padding\n            const len = Math.min(this.options.tab.length, padding.length);\n            this.restore({ start, end: start + len });\n            document.execCommand('delete');\n            if (pos) {\n              pos.start -= len;\n              pos.end -= len;\n              this.restore(pos);\n            }\n          }\n        } else {\n          insert(this.options.tab);\n        }\n      }\n    };\n\n    const handleUndoRedo = (event: KeyboardEvent) => {\n      if (isUndo(event)) {\n        event.preventDefault();\n        this.at--;\n        const record = this.history[this.at];\n        if (record) {\n          editor.innerHTML = record.html;\n          this.restore(record.pos);\n        }\n        if (this.at < 0) this.at = 0;\n      }\n      if (isRedo(event)) {\n        event.preventDefault();\n        this.at++;\n        const record = this.history[this.at];\n        if (record) {\n          editor.innerHTML = record.html;\n          this.restore(record.pos);\n        }\n        if (this.at >= history.length) this.at--;\n      }\n    };\n\n    const handlePaste = (event: ClipboardEvent) => {\n      if (event.defaultPrevented) return;\n      event.preventDefault();\n      const originalEvent = (event as any).originalEvent ?? event;\n      const text = originalEvent.clipboardData.getData('text/plain').replace(\n        /\\r\\n?/g,\n        '\\n',\n      );\n      const pos = this.save();\n      insert(text);\n      this.highlight(editor);\n      if (pos) {\n        this.restore({\n          start: Math.min(pos.start, pos.end) + text.length,\n          end: Math.min(pos.start, pos.end) + text.length,\n          dir: '<-',\n        });\n      }\n    };\n\n    const handleCut = (event: ClipboardEvent) => {\n      const selection = this.getSelection();\n      if (!selection) {\n        return;\n      }\n      const pos = this.save();\n      const originalEvent = (event as any).originalEvent ?? event;\n      originalEvent.clipboardData.setData('text/plain', selection.toString());\n      document.execCommand('delete');\n      this.highlight(editor);\n      if (pos) {\n        this.restore({\n          start: Math.min(pos.start, pos.end),\n          end: Math.min(pos.start, pos.end),\n          dir: '<-',\n        });\n      }\n      event.preventDefault();\n    };\n  }\n\n  getSelection() {\n    const root = this.editor.getRootNode();\n\n    if (typeof (root as any).getSelection === 'function') {\n      return (root as any).getSelection() as Selection;\n    }\n\n    const doc = root instanceof Document ? root : root.ownerDocument;\n\n    return doc?.defaultView?.getSelection() ?? null;\n  }\n\n  private uneditable(node: Node): Element | undefined {\n    while (node && node !== this.editor) {\n      if (node.nodeType === Node.ELEMENT_NODE) {\n        const el = node as Element;\n        if (el.getAttribute('contenteditable') == 'false') {\n          return el;\n        }\n      }\n      node = node.parentNode!;\n    }\n  }\n\n  override toString() {\n    return this.editor.textContent.replace(/\\u200B/g, '') || '';\n  }\n\n  updateOptions(newOptions: Partial<Options>) {\n    Object.assign(this.options, newOptions);\n  }\n\n  updateCode(code: string, callOnUpdate: boolean = true) {\n    this.editor.textContent = code;\n    this.highlight(this.editor);\n    callOnUpdate && this.onUpdateCbk(code);\n  }\n\n  onUpdate(callback: (code: string) => void) {\n    this.onUpdateCbk = debounce((code: string) => {\n      callback(code);\n    }, 100);\n  }\n\n  save(): Position | undefined {\n    const s = this.getSelection();\n    if (!s) return undefined;\n\n    let { anchorNode, anchorOffset, focusNode, focusOffset } = s;\n    if (!anchorNode) {\n      return undefined;\n    }\n    if (!focusNode) {\n      return undefined;\n    }\n\n    if (\n      !this.editor.contains(anchorNode) ||\n      !this.editor.contains(focusNode)\n    ) {\n      return undefined;\n    }\n\n    const pos: Position = { start: 0, end: 0, dir: undefined };\n\n    const textContent = this.editor.textContent.replace(/\\u200B/g, '');\n    // If the anchor and focus are the editor element, return either a full\n    // highlight or a start/end cursor position depending on the selection\n    if (anchorNode === this.editor && focusNode === this.editor) {\n      pos.start = (anchorOffset > 0 && textContent) ? textContent.length : 0;\n      pos.end = (focusOffset > 0 && textContent) ? textContent.length : 0;\n      pos.dir = (focusOffset >= anchorOffset) ? '->' : '<-';\n      return pos;\n    }\n\n    // Selection anchor and focus are expected to be text nodes,\n    // so normalize them.\n    if (anchorNode.nodeType === Node.ELEMENT_NODE) {\n      const node = document.createTextNode('');\n      anchorNode.insertBefore(node, anchorNode.childNodes[anchorOffset]);\n      anchorNode = node;\n      anchorOffset = 0;\n    }\n    if (focusNode.nodeType === Node.ELEMENT_NODE) {\n      const node = document.createTextNode('');\n      focusNode.insertBefore(node, focusNode.childNodes[focusOffset]);\n      focusNode = node;\n      focusOffset = 0;\n    }\n\n    visit(this.editor, (el) => {\n      if (el === anchorNode && el === focusNode) {\n        pos.start += anchorOffset;\n        pos.end += focusOffset;\n        pos.dir = anchorOffset <= focusOffset ? '->' : '<-';\n        return 'stop';\n      }\n\n      if (el === anchorNode) {\n        pos.start += anchorOffset;\n        if (!pos.dir) {\n          pos.dir = '->';\n        } else {\n          return 'stop';\n        }\n      } else if (el === focusNode) {\n        pos.end += focusOffset;\n        if (!pos.dir) {\n          pos.dir = '<-';\n        } else {\n          return 'stop';\n        }\n      }\n\n      if (el.nodeType === Node.TEXT_NODE) {\n        if (pos.dir != '->') pos.start += el.nodeValue!.length;\n        if (pos.dir != '<-') pos.end += el.nodeValue!.length;\n      }\n    });\n\n    this.editor.normalize(); // collapse empty text nodes\n    return pos;\n  }\n\n  restore(pos?: Position) {\n    if (!pos) {\n      return;\n    }\n    const s = this.getSelection();\n    if (!s) {\n      return;\n    }\n\n    let startNode: Node | undefined, startOffset = 0;\n    let endNode: Node | undefined, endOffset = 0;\n\n    if (!pos.dir) pos.dir = '->';\n    if (pos.start < 0) pos.start = 0;\n    if (pos.end < 0) pos.end = 0;\n\n    // Flip start and end if the direction reversed\n    if (pos.dir == '<-') {\n      const { start, end } = pos;\n      pos.start = end;\n      pos.end = start;\n    }\n\n    let current = 0;\n\n    visit(this.editor, (el) => {\n      if (el.nodeType !== Node.TEXT_NODE) return;\n\n      const len = (el.nodeValue || '').length;\n      if (current + len > pos.start) {\n        if (!startNode) {\n          startNode = el;\n          startOffset = pos.start - current;\n        }\n        if (current + len > pos.end) {\n          endNode = el;\n          endOffset = pos.end - current;\n          return 'stop';\n        }\n      }\n      current += len;\n    });\n\n    if (!startNode) {\n      startNode = this.editor;\n      startOffset = this.editor.childNodes.length;\n    }\n    if (!endNode) {\n      endNode = this.editor;\n      endOffset = this.editor.childNodes.length;\n    }\n\n    // Flip back the selection\n    if (pos.dir == '<-') {\n      [startNode, startOffset, endNode, endOffset] = [\n        endNode,\n        endOffset,\n        startNode,\n        startOffset,\n      ];\n    }\n\n    {\n      // If nodes not editable, create a text node.\n      const startEl = this.uneditable(startNode);\n      if (startEl) {\n        const node = document.createTextNode('');\n        startEl.parentNode?.insertBefore(node, startEl);\n        startNode = node;\n        startOffset = 0;\n      }\n      const endEl = this.uneditable(endNode);\n      if (endEl) {\n        const node = document.createTextNode('');\n        endEl.parentNode?.insertBefore(node, endEl);\n        endNode = node;\n        endOffset = 0;\n      }\n    }\n\n    s.setBaseAndExtent(startNode, startOffset, endNode, endOffset);\n    this.editor.normalize(); // collapse empty text nodes\n  }\n\n  recordHistory() {\n    if (!focus) return;\n\n    const html = this.editor.innerHTML;\n    const pos = this.save();\n    if (!pos) {\n      return;\n    }\n\n    const lastRecord = this.history[this.at];\n    if (lastRecord) {\n      if (\n        lastRecord.html === html &&\n        lastRecord.pos.start === pos.start &&\n        lastRecord.pos.end === pos.end\n      ) return;\n    }\n\n    this.at++;\n    this.history[this.at] = { html, pos };\n    this.history.splice(this.at + 1);\n\n    const maxHistory = 300;\n    if (this.at > maxHistory) {\n      this.at = maxHistory;\n      this.history.splice(0, 1);\n    }\n  }\n\n  forceHighlight() {\n    this.highlight(this.editor);\n  }\n\n  destroy() {\n    for (let [type, fn] of this.listeners) {\n      this.editor.removeEventListener(type, fn);\n    }\n  }\n}\n","import { Node as PmNode } from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { CoreEditor } from '@kerebron/editor';\n\nimport { NodeCodeCrockConfig } from './NodeCodeCrock.ts';\nimport { CodeCrock, Position } from './CodeCrock.ts';\nimport { initLineNumbers, lineNumberOptions } from './codeCrockLineNumbers.ts';\n\nexport interface CodeNodeView {\n  readonly editor: CoreEditor;\n  readonly node: PmNode;\n  readonly view: EditorView;\n  readonly getPos: () => number | undefined;\n\n  dom: HTMLDivElement;\n\n  config: NodeCodeCrockConfig;\n  setLang(lang: string): void;\n  highlight(element: HTMLElement): void;\n}\n\nexport function addLanguageDropDown(nodeView: CodeNodeView) {\n  const select = document.createElement('select');\n  nodeView.dom.appendChild(select);\n  select.classList.add('codecrock-select');\n  for (const lang of [''].concat(nodeView.config.languageWhitelist || [])) {\n    const option = document.createElement('option');\n    option.value = lang;\n    option.innerText = lang;\n    select.appendChild(option);\n  }\n  select.addEventListener('change', async () => {\n    const lang = select.value;\n    const pos = nodeView.getPos();\n    if (pos) {\n      nodeView.view.dispatch(\n        nodeView.view.state.tr.setNodeMarkup(pos, undefined, {\n          ...nodeView.node.attrs,\n          lang,\n        }),\n      );\n    }\n    nodeView.setLang(lang);\n  });\n  return select;\n}\n\nexport function addEditable(nodeView: CodeNodeView) {\n  const editable = document.createElement('div');\n  nodeView.dom.appendChild(editable);\n  editable.classList.add('codecrock');\n\n  const codeCrock = new CodeCrock(\n    editable,\n    (element) => nodeView.highlight(element),\n    {\n      tab: '  ',\n      indentOn: new RegExp('^(?!)'),\n      moveToNewLine: new RegExp('^(?!)'),\n      history: false,\n      readOnly: nodeView.config.readOnly,\n    },\n  );\n\n  const blur = (dir: 1 | -1) => {\n    nodeView.view.focus();\n    const pos = nodeView.getPos();\n    if (typeof pos === 'undefined') {\n      return false;\n    }\n\n    const targetPos = pos + (dir < 0 ? 0 : nodeView.node.nodeSize);\n    const selection = Selection.near(\n      nodeView.view.state.doc.resolve(targetPos),\n      dir,\n    );\n\n    nodeView.view.dispatch(\n      nodeView.view.state.tr.setSelection(selection).scrollIntoView(),\n    );\n    // this.view.focus();\n    // editor.chain().ArrowDown().run();\n\n    return true;\n  };\n\n  codeCrock.addEventListener('blur-previous', () => {\n    blur(-1);\n  });\n  codeCrock.addEventListener('blur-next', () => {\n    blur(1);\n  });\n\n  codeCrock.addEventListener('prepend-empty-line', () => {\n    const pos = nodeView.getPos();\n    if (typeof pos === 'undefined') {\n      return false;\n    }\n    nodeView.editor.chain().replaceRangeText({ from: pos, to: pos }, '').run();\n  });\n  codeCrock.addEventListener('append-empty-line', () => {\n    const pos = nodeView.getPos();\n    if (typeof pos === 'undefined') {\n      return false;\n    }\n    nodeView.editor.chain().replaceRangeText({\n      from: pos + nodeView.node.nodeSize,\n      to: pos + nodeView.node.nodeSize,\n    }, '').run();\n  });\n\n  codeCrock.addEventListener('selectionchange', (event) => {\n    const pos: Position | undefined = (event as CustomEvent).detail;\n    if (!pos) {\n      return;\n    }\n    const selection = Selection.near(\n      nodeView.view.state.doc.resolve(pos.start),\n      pos.end - pos.start,\n    );\n\n    nodeView.view.dispatch(\n      nodeView.view.state.tr.setSelection(selection),\n    );\n  });\n\n  return { codeCrock, editable };\n}\n\nexport function addLineNumbers(nodeView: CodeNodeView, editable: HTMLElement) {\n  return initLineNumbers(nodeView.dom, editable, lineNumberOptions);\n}\n\nexport function addResultsElement(nodeView: CodeNodeView) {\n  const element = document.createElement('div');\n  nodeView.dom.appendChild(element);\n  return element;\n}\n","import { Node as PmNode } from 'prosemirror-model';\nimport {\n  Decoration,\n  DecorationSource,\n  EditorView,\n  NodeView,\n  NodeViewConstructor,\n} from 'prosemirror-view';\n\nimport { CoreEditor } from '@kerebron/editor';\nimport { Workspace } from '@kerebron/workspace';\n\nimport { CodeCrock, Position } from './CodeCrock.ts';\nimport { TreeSitterHighlighter } from './TreeSitterHighlighter.ts';\nimport { DecorationInline, Decorator } from './Decorator.ts';\nimport { refreshNumbers } from './codeCrockLineNumbers.ts';\nimport { NodeCodeCrockConfig } from './NodeCodeCrock.ts';\nimport {\n  applyChangeOverPos,\n  computeChange,\n  forwardSelection,\n  performSnapshot,\n  replaceExt,\n  STOP_EVENTS,\n  valueChanged,\n} from './utils.ts';\nimport {\n  addEditable,\n  addLanguageDropDown,\n  addLineNumbers,\n  CodeNodeView,\n} from './ui.ts';\n\nexport class NodeViewCodeCrock implements NodeView, CodeNodeView {\n  node: PmNode;\n  readonly view: EditorView;\n  readonly getPos: () => number | undefined;\n\n  dom: HTMLDivElement;\n  codeCrock: CodeCrock;\n  updating: boolean;\n  editable: HTMLDivElement;\n  highlighter: TreeSitterHighlighter;\n  decorator: Decorator;\n  languageDropDown: HTMLSelectElement;\n  lineNumbers: HTMLElement;\n\n  lang: string = 'plaintext';\n  uri: string = 'file:///' + Math.random() + '.txt';\n  workspace: Workspace;\n\n  constructor(\n    public readonly editor: CoreEditor,\n    public readonly config: NodeCodeCrockConfig,\n    ...args: Parameters<NodeViewConstructor>\n  ) {\n    this.node = args[0];\n    this.view = args[1];\n    this.getPos = args[2];\n\n    this.workspace = editor.ci.resolve('workspace')!;\n\n    this.updating = false;\n    const dom = document.createElement('div');\n    this.dom = dom;\n    dom.className = 'codecrock-root';\n\n    this.languageDropDown = addLanguageDropDown(this);\n\n    const root = (editor.view && 'root' in editor.view)\n      ? editor.view.root\n      : document || document;\n\n    const { codeCrock, editable } = addEditable(this);\n    this.editable = editable;\n    (editable as any).getLocalPos = (offset: number) => {\n      const element = this.editable;\n      const localPos = offset;\n      return {\n        pos: (this.getPos() || 0) + offset,\n        node: this.node,\n        uri: this.uri,\n        localPos,\n        element,\n      };\n    };\n\n    this.codeCrock = codeCrock;\n\n    this.codeCrock.onUpdate(() => {\n      if (!this.updating) {\n        const textUpdate = this.codeCrock.toString();\n        valueChanged(textUpdate, this.node, this.getPos, this.view);\n        if (document.activeElement === this.editable) {\n          forwardSelection(this.codeCrock, this.view, this.getPos);\n        }\n\n        const { version, getContentMapper } = performSnapshot(\n          this,\n          this.codeCrock,\n        );\n\n        this.workspace.modifyFile({\n          lang: this.lang,\n          uri: this.uri,\n          version,\n          getContentMapper,\n        });\n      }\n    });\n\n    this.highlighter = new TreeSitterHighlighter(this.editor.config.assetLoad!);\n    this.decorator = new Decorator();\n\n    this.lineNumbers = addLineNumbers(this, this.editable);\n  }\n\n  setLang(lang: string) {\n    this.languageDropDown.value = lang || '';\n    this.lang = lang;\n\n    this.uri = replaceExt(this.uri, lang);\n    this.editable.setAttribute('data-uri', this.uri);\n\n    const { version, getContentMapper } = performSnapshot(this, this.codeCrock);\n\n    this.workspace.openFile({\n      uri: this.uri,\n      lang,\n      version,\n      getContentMapper,\n    });\n\n    this.highlighter.init(lang)\n      .then(() => {\n        this.highlight(this.editable);\n      });\n  }\n\n  init() {\n    this.codeCrock.updateCode(this.node.textContent, false);\n    if (this.node.attrs.lang) {\n      this.setLang(this.node.attrs.lang);\n    }\n  }\n\n  setSelection(anchor: number, head: number) {\n    this.editable.focus();\n    this.updating = true;\n\n    const pos = this.getPos();\n    if (typeof pos !== 'undefined') {\n      anchor -= pos;\n      head -= pos;\n\n      const posJar: Position = {\n        start: Math.min(anchor, head),\n        end: Math.max(anchor, head),\n        dir: (anchor <= head) ? '->' : '<-',\n      };\n      this.codeCrock.restore(posJar);\n    }\n\n    this.updating = false;\n  }\n\n  highlight(editable: HTMLElement) {\n    const pos = this.codeCrock.save();\n\n    if (!this.highlighter) {\n      editable.innerHTML = editable.textContent;\n    } else {\n      const content = editable.textContent;\n      editable.innerHTML =\n        this.highlighter.highlight(content, this.decorator) ||\n        content;\n    }\n\n    this.codeCrock.restore(pos);\n\n    refreshNumbers(this.lineNumbers, editable);\n    this.decorator.refresh();\n  }\n\n  update(\n    updateNode: PmNode,\n    decorations: readonly Decoration[],\n    innerDecorations: DecorationSource,\n  ) {\n    if (updateNode.attrs.type !== this.node.attrs.type) {\n      return false; // recreate NodeView\n    }\n\n    const { state } = this.view;\n    const pos = this.getPos();\n\n    const isSelected = pos &&\n      state.selection.from <= pos &&\n      state.selection.to >= pos + updateNode.nodeSize;\n\n    const codeDecorations: Decoration[] = [];\n\n    innerDecorations\n      .forEachSet((set) =>\n        set.find()\n          .map((d) => {\n            codeDecorations.push(d);\n          })\n      );\n\n    const decors: DecorationInline[] = [];\n\n    for (const cd of codeDecorations) {\n      if (cd.spec?.refresh) {\n        this.decorator.refreshers.push(cd.spec?.refresh);\n      }\n\n      decors.push({\n        startIndex: cd.from,\n        endIndex: cd.to,\n        attrs: {\n          class: cd.spec.class,\n          title: cd.spec.title,\n          'data-decoration-id': cd.spec['data-decoration-id'],\n        },\n      });\n    }\n\n    const oldDecors = this.decorator.decorationGroups.diag;\n    this.decorator.decorationGroups.diag = decors;\n\n    const oldNode = this.node;\n\n    const content = this.codeCrock.toString();\n\n    const change = computeChange(\n      content,\n      updateNode.textContent,\n    );\n\n    if (change) {\n      const savedPos = this.codeCrock.save();\n\n      const pos = applyChangeOverPos(savedPos, change);\n\n      this.updating = true;\n      console.info('codeCrock.updateCode');\n      this.codeCrock.updateCode(updateNode.textContent, true);\n      this.updating = false;\n\n      // TODO fix for yjs collab\n      // change.from, change.to, change.text.length\n      if (pos) {\n        this.codeCrock.restore(pos);\n      }\n    } else {\n      // if (JSON.stringify(oldDecors) !== JSON.stringify(decors)) {\n      // }\n    }\n\n    this.codeCrock.forceHighlight();\n\n    this.node = updateNode;\n    if (updateNode.attrs.lang !== oldNode.attrs.lang) {\n      this.setLang(updateNode.attrs.lang);\n    }\n\n    return true;\n  }\n\n  selectNode() {\n    this.dom.classList.add('focused');\n    this.editable.focus();\n  }\n\n  deselectNode() {\n    this.dom.classList.remove('focused');\n  }\n\n  stopEvent(event: Event) {\n    return STOP_EVENTS.includes(event.type);\n  }\n\n  ignoreMutation() {\n    return true;\n  }\n\n  destroy() {\n    this.workspace.closeFile(this.uri);\n    this.codeCrock.destroy();\n  }\n}\n","import { EditorView, NodeViewConstructor } from 'prosemirror-view';\nimport {\n  EditorState,\n  PluginKey,\n  Selection,\n  Transaction,\n} from 'prosemirror-state';\nimport type { NodeType } from 'prosemirror-model';\n\nimport { type CoreEditor } from '@kerebron/editor';\nimport { getShadowRoot } from '@kerebron/editor/utilities';\nimport {\n  Command,\n  type CommandFactories,\n  type CommandShortcuts,\n} from '@kerebron/editor/commands';\n\nimport { getLangsList } from '@kerebron/wasm';\nimport { NodeCodeBlock } from '@kerebron/extension-basic-editor/NodeCodeBlock';\n\nimport { NodeViewCodeCrock } from './NodeViewCodeCrock.ts';\n\nfunction arrowHandler(dir: 'left' | 'right' | 'up' | 'down'): Command {\n  return function (\n    state: EditorState,\n    dispatch?: (tr: Transaction) => void,\n    view?: EditorView,\n  ) {\n    if (!view) {\n      return false;\n    }\n    if (state.selection.empty && view.endOfTextblock(dir)) {\n      let side = dir == 'left' || dir == 'up' ? -1 : 1;\n      let $head = state.selection.$head;\n      let nextPos = Selection.near(\n        state.doc.resolve(side > 0 ? $head.after() : $head.before()),\n        side,\n      );\n      if (nextPos.$head && nextPos.$head.parent.type.name == 'code_block') {\n        if (dispatch) {\n          dispatch(state.tr.setSelection(nextPos));\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n}\n\nexport interface NodeCodeCrockConfig {\n  readOnly?: boolean;\n  languageWhitelist?: string[];\n}\n\nexport class NodeCodeCrock extends NodeCodeBlock {\n  constructor(override config: NodeCodeCrockConfig) {\n    super(config);\n  }\n\n  override getCommandFactories(\n    editor: CoreEditor,\n    type: NodeType,\n  ): Partial<CommandFactories> {\n    return {\n      'setCodeBlock': (lang?: string) =>\n        editor.commandFactories.setBlockType(type, { lang }),\n      ArrowLeft: () => arrowHandler('left'),\n      ArrowRight: () => arrowHandler('right'),\n      ArrowUp: () => arrowHandler('up'),\n      ArrowDown: () => arrowHandler('down'),\n    };\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    return {\n      'Shift-Ctrl-\"': 'setCodeBlock',\n      'ArrowLeft': 'ArrowLeft',\n      'ArrowRight': 'ArrowRight',\n      'ArrowUp': 'ArrowUp',\n      'ArrowDown': 'ArrowDown',\n    };\n  }\n\n  override getNodeView(editor: CoreEditor): NodeViewConstructor {\n    return (...args) => {\n      const node = args[0];\n\n      const shadowRoot = getShadowRoot(this.editor.config.element);\n      const settings = {\n        languageWhitelist: this.config.languageWhitelist || getLangsList(),\n        shadowRoot,\n        readOnly: this.editor.config.readOnly || this.config.readOnly,\n        undo: () => {\n          this.editor.chain().undo().run();\n        },\n        redo: () => {\n          this.editor.chain().redo().run();\n        },\n      };\n\n      const nodeView = new NodeViewCodeCrock(editor, settings, ...args);\n      nodeView.init();\n      return nodeView;\n    };\n  }\n}\n","import { Extension } from '@kerebron/editor';\nimport { NodeCodeCrock } from './NodeCodeCrock.ts';\n\nexport * from './NodeCodeCrock.ts';\n\nexport interface ExtensionCodeCrockConfig {\n  readOnly?: boolean;\n  languageWhitelist?: string[];\n}\n\nexport class ExtensionCodeCrock extends Extension {\n  override name = 'code-crock';\n\n  nodeCodeCrock = new NodeCodeCrock({});\n  requires = [\n    this.nodeCodeCrock,\n  ];\n\n  constructor(public override config: ExtensionCodeCrockConfig = {}) {\n    super(config);\n  }\n\n  override created(): void {\n    this.nodeCodeCrock.config.languageWhitelist = this.config.languageWhitelist;\n    // theme: config.theme,\n  }\n}\n","/*\n\n Style HTML\n---------------\n\n  Written by Nochum Sossonko, (nsossonko@hotmail.com)\n\n  Based on code initially developed by: Einar Lielmanis, <elfz@laacz.lv>\n    http://jsbeautifier.org/\n\n\n  You are free to use this in any way you want, in case you find this useful or working for you.\n\n  Usage:\n    style_html(html_source);\n\n    style_html(html_source, options);\n\n  The options are:\n    indent_size (default 4)          — indentation size,\n    indent_char (default space)      — character to indent with,\n    max_char (default 70)            -  maximum amount of characters per line,\n    brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\"\n            put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line.\n    unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted\n    indent_scripts (default normal)  - \"keep\"|\"separate\"|\"normal\"\n\n    e.g.\n\n    style_html(html_source, {\n      'indent_size': 2,\n      'indent_char': ' ',\n      'max_char': 78,\n      'brace_style': 'expand',\n      'unformatted': ['a', 'sub', 'sup', 'b', 'i', 'u']\n    });\n*/\n\nfunction style_html(html_source, options) {\n//Wrapper function to invoke all the necessary constructors and deal with the output.\n\n  var multi_parser,\n      indent_size,\n      indent_character,\n      max_char,\n      brace_style,\n      unformatted;\n\n  options = options || {};\n  indent_size = options.indent_size || 4;\n  indent_character = options.indent_char || ' ';\n  brace_style = options.brace_style || 'collapse';\n  max_char = options.max_char == 0 ? Infinity : options.max_char || 70;\n  unformatted = options.unformatted || ['a', 'span', 'bdo', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'sub', 'sup', 'tt', 'i', 'b', 'big', 'small', 'u', 's', 'strike', 'font', 'ins', 'del', 'pre', 'address', 'dt', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n  function Parser() {\n\n    this.pos = 0; //Parser position\n    this.token = '';\n    this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT\n    this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values\n      parent: 'parent1',\n      parentcount: 1,\n      parent1: ''\n    };\n    this.tag_type = '';\n    this.token_text = this.last_token = this.last_text = this.token_type = '';\n\n    this.Utils = { //Uilities made available to the various functions\n      whitespace: \"\\n\\r\\t \".split(''),\n      single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed,?php,?,?='.split(','), //all the single tags for HTML\n      extra_liners: 'head,body,/html'.split(','), //for tags that need a line of whitespace before them\n      in_array: function (what, arr) {\n        for (var i=0; i<arr.length; i++) {\n          if (what === arr[i]) {\n            return true;\n          }\n        }\n        return false;\n      }\n    }\n\n    this.get_content = function () { //function to capture regular content between tags\n\n      var input_char = '',\n          content = [],\n          space = false; //if a space is needed\n\n      while (this.input.charAt(this.pos) !== '<') {\n        if (this.pos >= this.input.length) {\n          return content.length?content.join(''):['', 'TK_EOF'];\n        }\n\n        input_char = this.input.charAt(this.pos);\n        this.pos++;\n        this.line_char_count++;\n\n        if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n          if (content.length) {\n            space = true;\n          }\n          this.line_char_count--;\n          continue; //don't want to insert unnecessary space\n        }\n        else if (space) {\n          if (this.line_char_count >= this.max_char) { //insert a line when the max_char is reached\n            content.push('\\n');\n            for (var i=0; i<this.indent_level; i++) {\n              content.push(this.indent_string);\n            }\n            this.line_char_count = 0;\n          }\n          else{\n            content.push(' ');\n            this.line_char_count++;\n          }\n          space = false;\n        }\n        content.push(input_char); //letter at-a-time (or string) inserted to an array\n      }\n      return content.length?content.join(''):'';\n    }\n\n    this.get_contents_to = function (name) { //get the full content of a script or style to pass to js_beautify\n      if (this.pos == this.input.length) {\n        return ['', 'TK_EOF'];\n      }\n      var input_char = '';\n      var content = '';\n      var reg_match = new RegExp('\\<\\/' + name + '\\\\s*\\>', 'igm');\n      reg_match.lastIndex = this.pos;\n      var reg_array = reg_match.exec(this.input);\n      var end_script = reg_array?reg_array.index:this.input.length; //absolute end of script\n      if(this.pos < end_script) { //get everything in between the script tags\n        content = this.input.substring(this.pos, end_script);\n        this.pos = end_script;\n      }\n      return content;\n    }\n\n    this.record_tag = function (tag){ //function to record a tag and its parent in this.tags Object\n      if (this.tags[tag + 'count']) { //check for the existence of this tag type\n        this.tags[tag + 'count']++;\n        this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\n      }\n      else { //otherwise initialize this tag type\n        this.tags[tag + 'count'] = 1;\n        this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level\n      }\n      this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent)\n      this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1')\n    }\n\n    this.retrieve_tag = function (tag) { //function to retrieve the opening tag to the corresponding closer\n      if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it\n        var temp_parent = this.tags.parent; //check to see if it's a closable tag.\n        while (temp_parent) { //till we reach '' (the initial value);\n          if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it\n            break;\n          }\n          temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree\n        }\n        if (temp_parent) { //if we caught something\n          this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly\n          this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent\n        }\n        delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference...\n        delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself\n        if (this.tags[tag + 'count'] == 1) {\n          delete this.tags[tag + 'count'];\n        }\n        else {\n          this.tags[tag + 'count']--;\n        }\n      }\n    }\n\n    this.get_tag = function () { //function to get a full tag and parse its type\n      var input_char = '',\n          content = [],\n          space = false,\n          tag_start, tag_end;\n\n      do {\n        if (this.pos >= this.input.length) {\n          return content.length?content.join(''):['', 'TK_EOF'];\n        }\n\n        input_char = this.input.charAt(this.pos);\n        this.pos++;\n        this.line_char_count++;\n\n        if (this.Utils.in_array(input_char, this.Utils.whitespace)) { //don't want to insert unnecessary space\n          space = true;\n          this.line_char_count--;\n          continue;\n        }\n\n        if (input_char === \"'\" || input_char === '\"') {\n          if (!content[1] || content[1] !== '!') { //if we're in a comment strings don't get treated specially\n            input_char += this.get_unformatted(input_char);\n            space = true;\n          }\n        }\n\n        if (input_char === '=') { //no space before =\n          space = false;\n        }\n\n        if (content.length && content[content.length-1] !== '=' && input_char !== '>'\n            && space) { //no space after = or before >\n          if (this.line_char_count >= this.max_char) {\n            this.print_newline(false, content);\n            this.line_char_count = 0;\n          }\n          else {\n            content.push(' ');\n            this.line_char_count++;\n          }\n          space = false;\n        }\n        if (input_char === '<') {\n            tag_start = this.pos - 1;\n        }\n        content.push(input_char); //inserts character at-a-time (or string)\n      } while (input_char !== '>');\n\n      var tag_complete = content.join('');\n      var tag_index;\n      if (tag_complete.indexOf(' ') != -1) { //if there's whitespace, thats where the tag name ends\n        tag_index = tag_complete.indexOf(' ');\n      }\n      else { //otherwise go with the tag ending\n        tag_index = tag_complete.indexOf('>');\n      }\n      var tag_check = tag_complete.substring(1, tag_index).toLowerCase();\n      if (tag_complete.charAt(tag_complete.length-2) === '/' ||\n          this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /)\n        this.tag_type = 'SINGLE';\n      }\n      else if (tag_check === 'script') { //for later script handling\n        this.record_tag(tag_check);\n        this.tag_type = 'SCRIPT';\n      }\n      else if (tag_check === 'style') { //for future style handling (for now it justs uses get_content)\n        this.record_tag(tag_check);\n        this.tag_type = 'STYLE';\n      }\n      else if (this.Utils.in_array(tag_check, unformatted)) { // do not reformat the \"unformatted\" tags\n        var comment = this.get_unformatted('</'+tag_check+'>', tag_complete); //...delegate to get_unformatted function\n        content.push(comment);\n        // Preserve collapsed whitespace either before or after this tag.\n        if (tag_start > 0 && this.Utils.in_array(this.input.charAt(tag_start - 1), this.Utils.whitespace)){\n            content.splice(0, 0, this.input.charAt(tag_start - 1));\n        }\n        tag_end = this.pos - 1;\n        if (this.Utils.in_array(this.input.charAt(tag_end + 1), this.Utils.whitespace)){\n            content.push(this.input.charAt(tag_end + 1));\n        }\n        this.tag_type = 'SINGLE';\n      }\n      else if (tag_check.charAt(0) === '!') { //peek for <!-- comment\n        if (tag_check.indexOf('[if') != -1) { //peek for <!--[if conditional comment\n          if (tag_complete.indexOf('!IE') != -1) { //this type needs a closing --> so...\n            var comment = this.get_unformatted('-->', tag_complete); //...delegate to get_unformatted\n            content.push(comment);\n          }\n          this.tag_type = 'START';\n        }\n        else if (tag_check.indexOf('[endif') != -1) {//peek for <!--[endif end conditional comment\n          this.tag_type = 'END';\n          this.unindent();\n        }\n        else if (tag_check.indexOf('[cdata[') != -1) { //if it's a <[cdata[ comment...\n          var comment = this.get_unformatted(']]>', tag_complete); //...delegate to get_unformatted function\n          content.push(comment);\n          this.tag_type = 'SINGLE'; //<![CDATA[ comments are treated like single tags\n        }\n        else {\n          var comment = this.get_unformatted('-->', tag_complete);\n          content.push(comment);\n          this.tag_type = 'SINGLE';\n        }\n      }\n      else {\n        if (tag_check.charAt(0) === '/') { //this tag is a double tag so check for tag-ending\n          this.retrieve_tag(tag_check.substring(1)); //remove it and all ancestors\n          this.tag_type = 'END';\n        }\n        else { //otherwise it's a start-tag\n          this.record_tag(tag_check); //push it on the tag stack\n          this.tag_type = 'START';\n        }\n        if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) { //check if this double needs an extra line\n          this.print_newline(true, this.output);\n        }\n      }\n      return content.join(''); //returns fully formatted tag\n    }\n\n    this.get_unformatted = function (delimiter, orig_tag) { //function to return unformatted content in its entirety\n\n      if (orig_tag && orig_tag.toLowerCase().indexOf(delimiter) != -1) {\n        return '';\n      }\n      var input_char = '';\n      var content = '';\n      var space = true;\n      do {\n\n        if (this.pos >= this.input.length) {\n          return content;\n        }\n\n        input_char = this.input.charAt(this.pos);\n        this.pos++\n\n        if (this.Utils.in_array(input_char, this.Utils.whitespace)) {\n          if (!space) {\n            this.line_char_count--;\n            continue;\n          }\n          if (input_char === '\\n' || input_char === '\\r') {\n            content += '\\n';\n            /*  Don't change tab indention for unformatted blocks.  If using code for html editing, this will greatly affect <pre> tags if they are specified in the 'unformatted array'\n            for (var i=0; i<this.indent_level; i++) {\n              content += this.indent_string;\n            }\n            space = false; //...and make sure other indentation is erased\n            */\n            this.line_char_count = 0;\n            continue;\n          }\n        }\n        content += input_char;\n        this.line_char_count++;\n        space = true;\n\n\n      } while (content.toLowerCase().indexOf(delimiter) == -1);\n      return content;\n    }\n\n    this.get_token = function () { //initial handler for token-retrieval\n      var token;\n\n      if (this.last_token === 'TK_TAG_SCRIPT' || this.last_token === 'TK_TAG_STYLE') { //check if we need to format javascript\n       var type = this.last_token.substr(7)\n       token = this.get_contents_to(type);\n        if (typeof token !== 'string') {\n          return token;\n        }\n        return [token, 'TK_' + type];\n      }\n      if (this.current_mode === 'CONTENT') {\n        token = this.get_content();\n        if (typeof token !== 'string') {\n          return token;\n        }\n        else {\n          return [token, 'TK_CONTENT'];\n        }\n      }\n\n      if (this.current_mode === 'TAG') {\n        token = this.get_tag();\n        if (typeof token !== 'string') {\n          return token;\n        }\n        else {\n          var tag_name_type = 'TK_TAG_' + this.tag_type;\n          return [token, tag_name_type];\n        }\n      }\n    }\n\n    this.get_full_indent = function (level) {\n      level = this.indent_level + level || 0;\n      if (level < 1)\n        return '';\n\n      return Array(level + 1).join(this.indent_string);\n    }\n\n\n    this.printer = function (js_source, indent_character, indent_size, max_char, brace_style) { //handles input/output and some other printing functions\n\n      this.input = js_source || ''; //gets the input for the Parser\n      this.output = [];\n      this.indent_character = indent_character;\n      this.indent_string = '';\n      this.indent_size = indent_size;\n      this.brace_style = brace_style;\n      this.indent_level = 0;\n      this.max_char = max_char;\n      this.line_char_count = 0; //count to see if max_char was exceeded\n\n      for (var i=0; i<this.indent_size; i++) {\n        this.indent_string += this.indent_character;\n      }\n\n      this.print_newline = function (ignore, arr) {\n        this.line_char_count = 0;\n        if (!arr || !arr.length) {\n          return;\n        }\n        if (!ignore) { //we might want the extra line\n          while (this.Utils.in_array(arr[arr.length-1], this.Utils.whitespace)) {\n            arr.pop();\n          }\n        }\n        arr.push('\\n');\n        for (var i=0; i<this.indent_level; i++) {\n          arr.push(this.indent_string);\n        }\n      }\n\n      this.print_token = function (text) {\n        this.output.push(text);\n      }\n\n      this.indent = function () {\n        this.indent_level++;\n      }\n\n      this.unindent = function () {\n        if (this.indent_level > 0) {\n          this.indent_level--;\n        }\n      }\n    }\n    return this;\n  }\n\n  /*_____________________--------------------_____________________*/\n\n  multi_parser = new Parser(); //wrapping functions Parser\n  multi_parser.printer(html_source, indent_character, indent_size, max_char, brace_style); //initialize starting values\n\n  while (true) {\n      var t = multi_parser.get_token();\n      multi_parser.token_text = t[0];\n      multi_parser.token_type = t[1];\n\n    if (multi_parser.token_type === 'TK_EOF') {\n      break;\n    }\n\n    switch (multi_parser.token_type) {\n      case 'TK_TAG_START':\n        multi_parser.print_newline(false, multi_parser.output);\n        multi_parser.print_token(multi_parser.token_text);\n        multi_parser.indent();\n        multi_parser.current_mode = 'CONTENT';\n        break;\n      case 'TK_TAG_STYLE':\n      case 'TK_TAG_SCRIPT':\n        multi_parser.print_newline(false, multi_parser.output);\n        multi_parser.print_token(multi_parser.token_text);\n        multi_parser.current_mode = 'CONTENT';\n        break;\n      case 'TK_TAG_END':\n        //Print new line only if the tag has no content and has child\n        if (multi_parser.last_token === 'TK_CONTENT' && multi_parser.last_text === '') {\n            var tag_name = multi_parser.token_text.match(/\\w+/)[0];\n            var tag_extracted_from_last_output = multi_parser.output[multi_parser.output.length -1].match(/<\\s*(\\w+)/);\n            if (tag_extracted_from_last_output === null || tag_extracted_from_last_output[1] !== tag_name)\n                multi_parser.print_newline(true, multi_parser.output);\n        }\n        multi_parser.print_token(multi_parser.token_text);\n        multi_parser.current_mode = 'CONTENT';\n        break;\n      case 'TK_TAG_SINGLE':\n        // Don't add a newline before elements that should remain unformatted.\n        var tag_check = multi_parser.token_text.match(/^\\s*<([a-z]+)/i);\n        if (!tag_check || !multi_parser.Utils.in_array(tag_check[1], unformatted)){\n            multi_parser.print_newline(false, multi_parser.output);\n        }\n        multi_parser.print_token(multi_parser.token_text);\n        multi_parser.current_mode = 'CONTENT';\n        break;\n      case 'TK_CONTENT':\n        if (multi_parser.token_text !== '') {\n          multi_parser.print_token(multi_parser.token_text);\n        }\n        multi_parser.current_mode = 'TAG';\n        break;\n      case 'TK_STYLE':\n      case 'TK_SCRIPT':\n        if (multi_parser.token_text !== '') {\n          multi_parser.output.push('\\n');\n          var text = multi_parser.token_text;\n          if (multi_parser.token_type == 'TK_SCRIPT') {\n            var _beautifier = typeof js_beautify == 'function' && js_beautify;\n          } else if (multi_parser.token_type == 'TK_STYLE') {\n            var _beautifier = typeof css_beautify == 'function' && css_beautify;\n          }\n\n          if (options.indent_scripts == \"keep\") {\n            var script_indent_level = 0;\n          } else if (options.indent_scripts == \"separate\") {\n            var script_indent_level = -multi_parser.indent_level;\n          } else {\n            var script_indent_level = 1;\n          }\n\n          var indentation = multi_parser.get_full_indent(script_indent_level);\n          if (_beautifier) {\n            // call the Beautifier if avaliable\n            text = _beautifier(text.replace(/^\\s*/, indentation), options);\n          } else {\n            // simply indent the string otherwise\n            var white = text.match(/^\\s*/)[0];\n            var _level = white.match(/[^\\n\\r]*$/)[0].split(multi_parser.indent_string).length - 1;\n            var reindent = multi_parser.get_full_indent(script_indent_level -_level);\n            text = text.replace(/^\\s*/, indentation)\n                   .replace(/\\r\\n|\\r|\\n/g, '\\n' + reindent)\n                   .replace(/\\s*$/, '');\n          }\n          if (text) {\n            multi_parser.print_token(text);\n            multi_parser.print_newline(true, multi_parser.output);\n          }\n        }\n        multi_parser.current_mode = 'TAG';\n        break;\n    }\n    multi_parser.last_token = multi_parser.token_type;\n    multi_parser.last_text = multi_parser.token_text;\n  }\n  return multi_parser.output.join('');\n}\n\nmodule.exports = {\n  prettyPrint: style_html\n};","import { DOMSerializer } from 'prosemirror-model';\nimport { prettyPrint } from 'html';\nimport chalk from './empty.js';\n\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\nfunction __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\n/** @returns {void} */\nfunction noop() {}\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nfunction assign(tar, src) {\n  // @ts-ignore\n  for (const k in src) tar[k] = src[k];\n  return /** @type {T & S} */tar;\n}\nfunction run(fn) {\n  return fn();\n}\nfunction blank_object() {\n  return Object.create(null);\n}\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nfunction run_all(fns) {\n  fns.forEach(run);\n}\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nfunction is_function(thing) {\n  return typeof thing === 'function';\n}\n/** @returns {boolean} */\nfunction safe_not_equal(a, b) {\n  return a != a ? b == b : a !== b || a && typeof a === 'object' || typeof a === 'function';\n}\n/** @returns {boolean} */\nfunction is_empty(obj) {\n  return Object.keys(obj).length === 0;\n}\nfunction subscribe(store) {\n  for (var _len = arguments.length, callbacks = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    callbacks[_key - 1] = arguments[_key];\n  }\n  if (store == null) {\n    for (const callback of callbacks) {\n      callback(undefined);\n    }\n    return noop;\n  }\n  const unsub = store.subscribe(...callbacks);\n  return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable<T>} store\n * @returns {T}\n */\nfunction get_store_value(store) {\n  let value;\n  subscribe(store, _ => value = _)();\n  return value;\n}\n/** @returns {void} */\nfunction component_subscribe(component, store, callback) {\n  component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n  if (definition) {\n    const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n    return definition[0](slot_ctx);\n  }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n  return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n  if (definition[2] && fn) {\n    const lets = definition[2](fn(dirty));\n    if ($$scope.dirty === undefined) {\n      return lets;\n    }\n    if (typeof lets === 'object') {\n      const merged = [];\n      const len = Math.max($$scope.dirty.length, lets.length);\n      for (let i = 0; i < len; i += 1) {\n        merged[i] = $$scope.dirty[i] | lets[i];\n      }\n      return merged;\n    }\n    return $$scope.dirty | lets;\n  }\n  return $$scope.dirty;\n}\n/** @returns {void} */\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n  if (slot_changes) {\n    const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n    slot.p(slot_context, slot_changes);\n  }\n}\n/** @returns {any[] | -1} */\nfunction get_all_dirty_from_scope($$scope) {\n  if ($$scope.ctx.length > 32) {\n    const dirty = [];\n    const length = $$scope.ctx.length / 32;\n    for (let i = 0; i < length; i++) {\n      dirty[i] = -1;\n    }\n    return dirty;\n  }\n  return -1;\n}\n/** @returns {{}} */\nfunction exclude_internal_props(props) {\n  const result = {};\n  for (const k in props) if (k[0] !== '$') result[k] = props[k];\n  return result;\n}\nfunction null_to_empty(value) {\n  return value == null ? '' : value;\n}\nfunction action_destroyer(action_result) {\n  return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @returns {void}\n */\nfunction append(target, node) {\n  target.appendChild(node);\n}\n/**\n * @param {Node} target\n * @param {string} style_sheet_id\n * @param {string} styles\n * @returns {void}\n */\nfunction append_styles(target, style_sheet_id, styles) {\n  const append_styles_to = get_root_for_style(target);\n  if (!append_styles_to.getElementById(style_sheet_id)) {\n    const style = element('style');\n    style.id = style_sheet_id;\n    style.textContent = styles;\n    append_stylesheet(append_styles_to, style);\n  }\n}\n/**\n * @param {Node} node\n * @returns {ShadowRoot | Document}\n */\nfunction get_root_for_style(node) {\n  if (!node) return document;\n  const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n  if (root && /** @type {ShadowRoot} */root.host) {\n    return /** @type {ShadowRoot} */root;\n  }\n  return node.ownerDocument;\n}\n/**\n * @param {ShadowRoot | Document} node\n * @param {HTMLStyleElement} style\n * @returns {CSSStyleSheet}\n */\nfunction append_stylesheet(node, style) {\n  append( /** @type {Document} */node.head || node, style);\n  return style.sheet;\n}\n/**\n * @param {Node} target\n * @param {Node} node\n * @param {Node} [anchor]\n * @returns {void}\n */\nfunction insert(target, node, anchor) {\n  target.insertBefore(node, anchor || null);\n}\n/**\n * @param {Node} node\n * @returns {void}\n */\nfunction detach(node) {\n  if (node.parentNode) {\n    node.parentNode.removeChild(node);\n  }\n}\n/**\n * @returns {void} */\nfunction destroy_each(iterations, detaching) {\n  for (let i = 0; i < iterations.length; i += 1) {\n    if (iterations[i]) iterations[i].d(detaching);\n  }\n}\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @returns {HTMLElementTagNameMap[K]}\n */\nfunction element(name) {\n  return document.createElement(name);\n}\n/**\n * @template {keyof SVGElementTagNameMap} K\n * @param {K} name\n * @returns {SVGElement}\n */\nfunction svg_element(name) {\n  return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\n/**\n * @param {string} data\n * @returns {Text}\n */\nfunction text(data) {\n  return document.createTextNode(data);\n}\n/**\n * @returns {Text} */\nfunction space() {\n  return text(' ');\n}\n/**\n * @returns {Text} */\nfunction empty() {\n  return text('');\n}\n/**\n * @param {EventTarget} node\n * @param {string} event\n * @param {EventListenerOrEventListenerObject} handler\n * @param {boolean | AddEventListenerOptions | EventListenerOptions} [options]\n * @returns {() => void}\n */\nfunction listen(node, event, handler, options) {\n  node.addEventListener(event, handler, options);\n  return () => node.removeEventListener(event, handler, options);\n}\n/**\n * @returns {(event: any) => any} */\nfunction prevent_default(fn) {\n  return function (event) {\n    event.preventDefault();\n    // @ts-ignore\n    return fn.call(this, event);\n  };\n}\n/**\n * @param {Element} node\n * @param {string} attribute\n * @param {string} [value]\n * @returns {void}\n */\nfunction attr(node, attribute, value) {\n  if (value == null) node.removeAttribute(attribute);else if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value);\n}\n/**\n * @returns {void}\n */\nfunction xlink_attr(node, attribute, value) {\n  node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\n/**\n * @param {Element} element\n * @returns {ChildNode[]}\n */\nfunction children(element) {\n  return Array.from(element.childNodes);\n}\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nfunction set_data(text, data) {\n  data = '' + data;\n  if (text.data === data) return;\n  text.data = /** @type {string} */data;\n}\n/**\n * @returns {void} */\nfunction set_input_value(input, value) {\n  input.value = value == null ? '' : value;\n}\n/**\n * @returns {void} */\nfunction set_style(node, key, value, important) {\n  {\n    node.style.setProperty(key, value, '');\n  }\n}\n/**\n * @returns {void} */\nfunction toggle_class(element, name, toggle) {\n  // The `!!` is required because an `undefined` flag means flipping the current state.\n  element.classList.toggle(name, !!toggle);\n}\n/**\n * @template T\n * @param {string} type\n * @param {T} [detail]\n * @param {{ bubbles?: boolean, cancelable?: boolean }} [options]\n * @returns {CustomEvent<T>}\n */\nfunction custom_event(type, detail) {\n  let {\n    bubbles = false,\n    cancelable = false\n  } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  return new CustomEvent(type, {\n    detail,\n    bubbles,\n    cancelable\n  });\n}\nfunction construct_svelte_component(component, props) {\n  return new component(props);\n}\n/**\n * @typedef {Node & {\n * \tclaim_order?: number;\n * \thydrate_init?: true;\n * \tactual_end_child?: NodeEx;\n * \tchildNodes: NodeListOf<NodeEx>;\n * }} NodeEx\n */\n/** @typedef {ChildNode & NodeEx} ChildNodeEx */\n/** @typedef {NodeEx & { claim_order: number }} NodeEx2 */\n/**\n * @typedef {ChildNodeEx[] & {\n * \tclaim_info?: {\n * \t\tlast_index: number;\n * \t\ttotal_claimed: number;\n * \t};\n * }} ChildNodeArray\n */\n\nlet current_component;\n/** @returns {void} */\nfunction set_current_component(component) {\n  current_component = component;\n}\nfunction get_current_component() {\n  if (!current_component) throw new Error('Function called outside component initialization');\n  return current_component;\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * If a function is returned _synchronously_ from `onMount`, it will be called when the component is unmounted.\n *\n * `onMount` does not run inside a [server-side component](https://svelte.dev/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs/svelte#onmount\n * @template T\n * @param {() => import('./private.js').NotFunction<T> | Promise<import('./private.js').NotFunction<T>> | (() => any)} fn\n * @returns {void}\n */\nfunction onMount(fn) {\n  get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs/svelte#ondestroy\n * @param {() => any} fn\n * @returns {void}\n */\nfunction onDestroy(fn) {\n  get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](https://svelte.dev/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument:\n * ```ts\n * const dispatch = createEventDispatcher<{\n *  loaded: never; // does not take a detail argument\n *  change: string; // takes a detail argument of type string, which is required\n *  optional: number | null; // takes an optional detail argument of type number\n * }>();\n * ```\n *\n * https://svelte.dev/docs/svelte#createeventdispatcher\n * @template {Record<string, any>} [EventMap=any]\n * @returns {import('./public.js').EventDispatcher<EventMap>}\n */\nfunction createEventDispatcher() {\n  const component = get_current_component();\n  return function (type, detail) {\n    let {\n      cancelable = false\n    } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    const callbacks = component.$$.callbacks[type];\n    if (callbacks) {\n      // TODO are there situations where events could be dispatched\n      // in a server (non-DOM) environment?\n      const event = custom_event( /** @type {string} */type, detail, {\n        cancelable\n      });\n      callbacks.slice().forEach(fn => {\n        fn.call(component, event);\n      });\n      return !event.defaultPrevented;\n    }\n    return true;\n  };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#setcontext\n * @template T\n * @param {any} key\n * @param {T} context\n * @returns {T}\n */\nfunction setContext$1(key, context) {\n  get_current_component().$$.context.set(key, context);\n  return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#getcontext\n * @template T\n * @param {any} key\n * @returns {T}\n */\nfunction getContext$1(key) {\n  return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\n/**\n * @param component\n * @param event\n * @returns {void}\n */\nfunction bubble(component, event) {\n  const callbacks = component.$$.callbacks[event.type];\n  if (callbacks) {\n    // @ts-ignore\n    callbacks.slice().forEach(fn => fn.call(this, event));\n  }\n}\n\nconst dirty_components = [];\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */Promise.resolve();\nlet update_scheduled = false;\n/** @returns {void} */\nfunction schedule_update() {\n  if (!update_scheduled) {\n    update_scheduled = true;\n    resolved_promise.then(flush);\n  }\n}\n/** @returns {void} */\nfunction add_render_callback(fn) {\n  render_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n//    for afterUpdates called during the initial onMount, which are called in\n//    reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n//    dirty_components array and will cause a reentrant call to flush(). Because\n//    the flush index is kept outside the function, the reentrant call will pick\n//    up where the earlier call left off and go through all dirty components. The\n//    current_component value is saved and restored so that the reentrant call will\n//    not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n//    callback called a second time; the seen_callbacks set, outside the flush()\n//    function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\n/** @returns {void} */\nfunction flush() {\n  // Do not reenter flush while dirty components are updated, as this can\n  // result in an infinite loop. Instead, let the inner flush handle it.\n  // Reentrancy is ok afterwards for bindings etc.\n  if (flushidx !== 0) {\n    return;\n  }\n  const saved_component = current_component;\n  do {\n    // first, call beforeUpdate functions\n    // and update components\n    try {\n      while (flushidx < dirty_components.length) {\n        const component = dirty_components[flushidx];\n        flushidx++;\n        set_current_component(component);\n        update(component.$$);\n      }\n    } catch (e) {\n      // reset dirty state to not end up in a deadlocked state and then rethrow\n      dirty_components.length = 0;\n      flushidx = 0;\n      throw e;\n    }\n    set_current_component(null);\n    dirty_components.length = 0;\n    flushidx = 0;\n    while (binding_callbacks.length) binding_callbacks.pop()();\n    // then, once components are updated, call\n    // afterUpdate functions. This may cause\n    // subsequent updates...\n    for (let i = 0; i < render_callbacks.length; i += 1) {\n      const callback = render_callbacks[i];\n      if (!seen_callbacks.has(callback)) {\n        // ...so guard against infinite loops\n        seen_callbacks.add(callback);\n        callback();\n      }\n    }\n    render_callbacks.length = 0;\n  } while (dirty_components.length);\n  while (flush_callbacks.length) {\n    flush_callbacks.pop()();\n  }\n  update_scheduled = false;\n  seen_callbacks.clear();\n  set_current_component(saved_component);\n}\n/** @returns {void} */\nfunction update($$) {\n  if ($$.fragment !== null) {\n    $$.update();\n    run_all($$.before_update);\n    const dirty = $$.dirty;\n    $$.dirty = [-1];\n    $$.fragment && $$.fragment.p($$.ctx, dirty);\n    $$.after_update.forEach(add_render_callback);\n  }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n * @param {Function[]} fns\n * @returns {void}\n */\nfunction flush_render_callbacks(fns) {\n  const filtered = [];\n  const targets = [];\n  render_callbacks.forEach(c => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n  targets.forEach(c => c());\n  render_callbacks = filtered;\n}\n\nconst outroing = new Set();\n/**\n * @type {Outro}\n */\nlet outros;\n/**\n * @returns {void} */\nfunction group_outros() {\n  outros = {\n    r: 0,\n    c: [],\n    p: outros // parent group\n  };\n}\n/**\n * @returns {void} */\nfunction check_outros() {\n  if (!outros.r) {\n    run_all(outros.c);\n  }\n  outros = outros.p;\n}\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} [local]\n * @returns {void}\n */\nfunction transition_in(block, local) {\n  if (block && block.i) {\n    outroing.delete(block);\n    block.i(local);\n  }\n}\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} local\n * @param {0 | 1} [detach]\n * @param {() => void} [callback]\n * @returns {void}\n */\nfunction transition_out(block, local, detach, callback) {\n  if (block && block.o) {\n    if (outroing.has(block)) return;\n    outroing.add(block);\n    outros.c.push(() => {\n      outroing.delete(block);\n      if (callback) {\n        if (detach) block.d(1);\n        callback();\n      }\n    });\n    block.o(local);\n  } else if (callback) {\n    callback();\n  }\n}\n/** @typedef {1} INTRO */\n/** @typedef {0} OUTRO */\n/** @typedef {{ direction: 'in' | 'out' | 'both' }} TransitionOptions */\n/** @typedef {(node: Element, params: any, options: TransitionOptions) => import('../transition/public.js').TransitionConfig} TransitionFn */\n/**\n * @typedef {Object} Outro\n * @property {number} r\n * @property {Function[]} c\n * @property {Object} p\n */\n/**\n * @typedef {Object} PendingProgram\n * @property {number} start\n * @property {INTRO|OUTRO} b\n * @property {Outro} [group]\n */\n/**\n * @typedef {Object} Program\n * @property {number} a\n * @property {INTRO|OUTRO} b\n * @property {1|-1} d\n * @property {number} duration\n * @property {number} start\n * @property {number} end\n * @property {Outro} [group]\n */\n\n// general each functions:\nfunction ensure_array_like(array_like_or_iterator) {\n  return (array_like_or_iterator === null || array_like_or_iterator === void 0 ? void 0 : array_like_or_iterator.length) !== undefined ? array_like_or_iterator : Array.from(array_like_or_iterator);\n}\n// keyed each functions:\n/** @returns {void} */\nfunction destroy_block(block, lookup) {\n  block.d(1);\n  lookup.delete(block.key);\n}\n/** @returns {any[]} */\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n  let o = old_blocks.length;\n  let n = list.length;\n  let i = o;\n  const old_indexes = {};\n  while (i--) old_indexes[old_blocks[i].key] = i;\n  const new_blocks = [];\n  const new_lookup = new Map();\n  const deltas = new Map();\n  const updates = [];\n  i = n;\n  while (i--) {\n    const child_ctx = get_context(ctx, list, i);\n    const key = get_key(child_ctx);\n    let block = lookup.get(key);\n    if (!block) {\n      block = create_each_block(key, child_ctx);\n      block.c();\n    } else {\n      // defer updates until all the DOM shuffling is done\n      updates.push(() => block.p(child_ctx, dirty));\n    }\n    new_lookup.set(key, new_blocks[i] = block);\n    if (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key]));\n  }\n  const will_move = new Set();\n  const did_move = new Set();\n  /** @returns {void} */\n  function insert(block) {\n    transition_in(block, 1);\n    block.m(node, next);\n    lookup.set(block.key, block);\n    next = block.first;\n    n--;\n  }\n  while (o && n) {\n    const new_block = new_blocks[n - 1];\n    const old_block = old_blocks[o - 1];\n    const new_key = new_block.key;\n    const old_key = old_block.key;\n    if (new_block === old_block) {\n      // do nothing\n      next = new_block.first;\n      o--;\n      n--;\n    } else if (!new_lookup.has(old_key)) {\n      // remove old block\n      destroy(old_block, lookup);\n      o--;\n    } else if (!lookup.has(new_key) || will_move.has(new_key)) {\n      insert(new_block);\n    } else if (did_move.has(old_key)) {\n      o--;\n    } else if (deltas.get(new_key) > deltas.get(old_key)) {\n      did_move.add(new_key);\n      insert(new_block);\n    } else {\n      will_move.add(old_key);\n      o--;\n    }\n  }\n  while (o--) {\n    const old_block = old_blocks[o];\n    if (!new_lookup.has(old_block.key)) destroy(old_block, lookup);\n  }\n  while (n) insert(new_blocks[n - 1]);\n  run_all(updates);\n  return new_blocks;\n}\n\n/** @returns {void} */\nfunction create_component(block) {\n  block && block.c();\n}\n/** @returns {void} */\nfunction mount_component(component, target, anchor) {\n  const {\n    fragment,\n    after_update\n  } = component.$$;\n  fragment && fragment.m(target, anchor);\n  // onMount happens before the initial afterUpdate\n  add_render_callback(() => {\n    const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n    // if the component was destroyed immediately\n    // it will update the `$$.on_destroy` reference to `null`.\n    // the destructured on_destroy may still reference to the old array\n    if (component.$$.on_destroy) {\n      component.$$.on_destroy.push(...new_on_destroy);\n    } else {\n      // Edge case - component was destroyed immediately,\n      // most likely as a result of a binding initialising\n      run_all(new_on_destroy);\n    }\n    component.$$.on_mount = [];\n  });\n  after_update.forEach(add_render_callback);\n}\n/** @returns {void} */\nfunction destroy_component(component, detaching) {\n  const $$ = component.$$;\n  if ($$.fragment !== null) {\n    flush_render_callbacks($$.after_update);\n    run_all($$.on_destroy);\n    $$.fragment && $$.fragment.d(detaching);\n    // TODO null out other refs, including component.$$ (but need to\n    // preserve final state?)\n    $$.on_destroy = $$.fragment = null;\n    $$.ctx = [];\n  }\n}\n/** @returns {void} */\nfunction make_dirty(component, i) {\n  if (component.$$.dirty[0] === -1) {\n    dirty_components.push(component);\n    schedule_update();\n    component.$$.dirty.fill(0);\n  }\n  component.$$.dirty[i / 31 | 0] |= 1 << i % 31;\n}\n// TODO: Document the other params\n/**\n * @param {SvelteComponent} component\n * @param {import('./public.js').ComponentConstructorOptions} options\n *\n * @param {import('./utils.js')['not_equal']} not_equal Used to compare props and state values.\n * @param {(target: Element | ShadowRoot) => void} [append_styles] Function that appends styles to the DOM when the component is first initialised.\n * This will be the `add_css` function from the compiled component.\n *\n * @returns {void}\n */\nfunction init(component, options, instance, create_fragment, not_equal, props) {\n  let append_styles = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;\n  let dirty = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : [-1];\n  const parent_component = current_component;\n  set_current_component(component);\n  /** @type {import('./private.js').T$$} */\n  const $$ = component.$$ = {\n    fragment: null,\n    ctx: [],\n    // state\n    props,\n    update: noop,\n    not_equal,\n    bound: blank_object(),\n    // lifecycle\n    on_mount: [],\n    on_destroy: [],\n    on_disconnect: [],\n    before_update: [],\n    after_update: [],\n    context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n    // everything else\n    callbacks: blank_object(),\n    dirty,\n    skip_bound: false,\n    root: options.target || parent_component.$$.root\n  };\n  append_styles && append_styles($$.root);\n  let ready = false;\n  $$.ctx = instance ? instance(component, options.props || {}, function (i, ret) {\n    const value = (arguments.length <= 2 ? 0 : arguments.length - 2) ? arguments.length <= 2 ? undefined : arguments[2] : ret;\n    if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n      if (!$$.skip_bound && $$.bound[i]) $$.bound[i](value);\n      if (ready) make_dirty(component, i);\n    }\n    return ret;\n  }) : [];\n  $$.update();\n  ready = true;\n  run_all($$.before_update);\n  // `false` as a special case of no DOM component\n  $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n  if (options.target) {\n    if (options.hydrate) {\n      // TODO: what is the correct type here?\n      // @ts-expect-error\n      const nodes = children(options.target);\n      $$.fragment && $$.fragment.l(nodes);\n      nodes.forEach(detach);\n    } else {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      $$.fragment && $$.fragment.c();\n    }\n    if (options.intro) transition_in(component.$$.fragment);\n    mount_component(component, options.target, options.anchor);\n    flush();\n  }\n  set_current_component(parent_component);\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n *\n * @template {Record<string, any>} [Props=any]\n * @template {Record<string, any>} [Events=any]\n */\nclass SvelteComponent {\n  constructor() {\n    /**\n     * ### PRIVATE API\n     *\n     * Do not use, may change at any time\n     *\n     * @type {any}\n     */\n    this.$$ = undefined;\n    /**\n     * ### PRIVATE API\n     *\n     * Do not use, may change at any time\n     *\n     * @type {any}\n     */\n    this.$$set = undefined;\n  }\n  /** @returns {void} */\n  $destroy() {\n    destroy_component(this, 1);\n    this.$destroy = noop;\n  }\n  /**\n   * @template {Extract<keyof Events, string>} K\n   * @param {K} type\n   * @param {((e: Events[K]) => void) | null | undefined} callback\n   * @returns {() => void}\n   */\n  $on(type, callback) {\n    if (!is_function(callback)) {\n      return noop;\n    }\n    const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);\n    callbacks.push(callback);\n    return () => {\n      const index = callbacks.indexOf(callback);\n      if (index !== -1) callbacks.splice(index, 1);\n    };\n  }\n  /**\n   * @param {Partial<Props>} props\n   * @returns {void}\n   */\n  $set(props) {\n    if (this.$$set && !is_empty(props)) {\n      this.$$.skip_bound = true;\n      this.$$set(props);\n      this.$$.skip_bound = false;\n    }\n  }\n}\n/**\n * @typedef {Object} CustomElementPropDefinition\n * @property {string} [attribute]\n * @property {boolean} [reflect]\n * @property {'String'|'Boolean'|'Number'|'Array'|'Object'} [type]\n */\n\n// generated during release, do not modify\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nconst PUBLIC_VERSION = '4';\n\nif (typeof window !== 'undefined')\n  // @ts-ignore\n  (window.__svelte || (window.__svelte = {\n    v: new Set()\n  })).v.add(PUBLIC_VERSION);\n\nconst setContext = (ctx, val) => setContext$1(ctx, val);\nconst getContext = (ctx) => getContext$1(ctx);\n\n/* src/components/FloatingBtn.svelte generated by Svelte v4.2.15 */\nfunction add_css$k(target) {\n  append_styles(target, \"svelte-1lt2k10\", \".floating-btn.svelte-1lt2k10.svelte-1lt2k10{background:#363755;border:0;border-radius:50%;box-shadow:0 0 30px rgba(34, 34, 34, 0.3);cursor:pointer;position:fixed;padding:6px;transition:opacity 0.3s;-webkit-transition:opacity 0.3s;z-index:99999}.floating-btn.bottom-right.svelte-1lt2k10.svelte-1lt2k10{bottom:16px;right:16px}.floating-btn.bottom-left.svelte-1lt2k10.svelte-1lt2k10{bottom:16px;left:16px}.floating-btn.top-right.svelte-1lt2k10.svelte-1lt2k10{top:16px;right:16px}.floating-btn.top-left.svelte-1lt2k10.svelte-1lt2k10{top:16px;left:16px}.floating-btn.svelte-1lt2k10.svelte-1lt2k10:hover{opacity:0.7}.floating-btn.svelte-1lt2k10>svg.svelte-1lt2k10{display:block;width:34px;height:34px;position:relative}\");\n}\nfunction create_fragment$k(ctx) {\n  let button;\n  let svg;\n  let title;\n  let t0;\n  let desc;\n  let t1;\n  let use0;\n  let use1;\n  let use2;\n  let use3;\n  let use4;\n  let use5;\n  let use6;\n  let defs;\n  let path0;\n  let path1;\n  let path2;\n  let path3;\n  let path4;\n  let path5;\n  let path6;\n  let button_class_value;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      button = element(\"button\");\n      svg = svg_element(\"svg\");\n      title = svg_element(\"title\");\n      t0 = text(\"prosemirror\");\n      desc = svg_element(\"desc\");\n      t1 = text(\"Created using Figma\");\n      use0 = svg_element(\"use\");\n      use1 = svg_element(\"use\");\n      use2 = svg_element(\"use\");\n      use3 = svg_element(\"use\");\n      use4 = svg_element(\"use\");\n      use5 = svg_element(\"use\");\n      use6 = svg_element(\"use\");\n      defs = svg_element(\"defs\");\n      path0 = svg_element(\"path\");\n      path1 = svg_element(\"path\");\n      path2 = svg_element(\"path\");\n      path3 = svg_element(\"path\");\n      path4 = svg_element(\"path\");\n      path5 = svg_element(\"path\");\n      path6 = svg_element(\"path\");\n      xlink_attr(use0, \"xlink:href\", \"#a\");\n      attr(use0, \"transform\", \"matrix(2 0 0 2 118 116)\");\n      attr(use0, \"fill\", \"#FFF\");\n      xlink_attr(use1, \"xlink:href\", \"#b\");\n      attr(use1, \"transform\", \"rotate(16 59.054 420.192) scale(2)\");\n      attr(use1, \"fill\", \"#FFF\");\n      xlink_attr(use2, \"xlink:href\", \"#c\");\n      attr(use2, \"transform\", \"matrix(2 0 0 2 154.024 141.58)\");\n      attr(use2, \"fill\", \"#363755\");\n      xlink_attr(use3, \"xlink:href\", \"#d\");\n      attr(use3, \"transform\", \"matrix(2 0 0 2 220 334.8)\");\n      attr(use3, \"fill\", \"#FFF\");\n      xlink_attr(use4, \"xlink:href\", \"#e\");\n      attr(use4, \"transform\", \"matrix(2 0 0 2 218.826 262.052)\");\n      attr(use4, \"fill\", \"#363755\");\n      xlink_attr(use5, \"xlink:href\", \"#f\");\n      attr(use5, \"transform\", \"matrix(2 0 0 2 197.108 184.998)\");\n      attr(use5, \"fill\", \"#FFF\");\n      xlink_attr(use6, \"xlink:href\", \"#g\");\n      attr(use6, \"transform\", \"matrix(2 0 0 2 221.8 216)\");\n      attr(use6, \"fill\", \"#363755\");\n      attr(path0, \"id\", \"a\");\n      attr(path0, \"d\", \"M73.5 0C32.859 0 0 32.859 0 73.5S32.859 147 73.5 147 147 114.141 147 73.5 114.069 0 73.5\\n        0z\");\n      attr(path1, \"id\", \"b\");\n      attr(path1, \"d\", \"M193.601 107.116c0-13.376 8.238-23.91\\n        20.619-31.153-2.244-7.447-5.19-14.6-8.824-21.32-13.886\\n        3.633-25.12-1.799-34.568-11.26-9.449-9.437-12.344-20.672-8.709-34.571A111.362 111.362 0 0 0\\n        140.799 0c-7.243 12.37-20.339 20.594-33.689 20.594-13.363\\n        0-26.446-8.225-33.701-20.594A110.888 110.888 0 0 0 52.1 8.812c3.634 13.9.753 25.134-8.721\\n        34.57-9.436 9.462-20.67 14.894-34.569 11.26A112.178 112.178 0 0 0 0 75.963c12.369 7.243\\n        20.593 17.777 20.593 31.153 0 13.352-8.224 26.448-20.593 33.704a113.338 113.338 0 0 0 8.811\\n        21.321c13.899-3.634 25.133-.752 34.569 8.697 9.448 9.462 12.355 20.696 8.721 34.57a112.653\\n        112.653 0 0 0 21.32 8.837c7.243-12.407 20.338-20.619 33.702-20.619 13.35 0 26.446 8.225\\n        33.701 20.619a114.22 114.22 0 0 0 21.32-8.837c-3.634-13.874-.752-25.108 8.709-34.57\\n        9.449-9.437 20.683-14.869 34.569-11.26a112.343 112.343 0 0 0\\n        8.823-21.321c-12.406-7.256-20.644-17.789-20.644-31.141zm-86.491 46.57c-25.732\\n        0-46.58-20.849-46.58-46.57 0-25.733 20.86-46.595 46.58-46.595 25.732 0 46.567 20.875 46.567\\n        46.595 0 25.734-20.835 46.57-46.567 46.57z\");\n      attr(path2, \"id\", \"c\");\n      attr(path2, \"d\", \"M98.088 49.91c-6.9 83.9 10.8 103.401 10.8 103.401s-55.1\\n        5.499-82.7-13.401c-30.5-20.9-26-67.5-25.9-94.6.1-28.4 25.6-45.8 49.9-45.3 29.1.5 50.2 21.6\\n        47.9 49.9z\");\n      attr(path3, \"id\", \"d\");\n      attr(path3, \"d\", \"M.1.1c12.2 33.3 22.5 42.7 40 55.2 25.3 18 36.6 17.5 76.3 41C78.1 60.3 30.8 45.7 0 0l.1.1z\");\n      attr(path4, \"id\", \"e\");\n      attr(path4, \"d\", \"M.687 36.474c3 13.3 17.9 29.9 30.4 41.6 24.8 23.2 42 22.4 86\\n        54.7-18.2-51.8-18.8-62-43.5-106.1-24.7-44-67.6-20.3-67.6-20.3s-8.4 16.6-5.3 29.9v.2z\");\n      attr(path5, \"id\", \"f\");\n      attr(path5, \"d\", \"M38.346 11.5s-4-11.6-18-11.5c-30 .2-28.8 52.1 16.9 52 39.6-.1 39.2-49.4\\n        16.1-49.6-10.2-.2-15 9.1-15 9.1z\");\n      attr(path6, \"id\", \"g\");\n      attr(path6, \"d\", \"M26.5 15c10.8 0 2 14.9-.6 20.9-1.8-8.4-10.2-20.9.6-20.9zM10.2.1C4.6.1 0 4.6 0 10.3c0 5.6\\n        4.5 10.2 10.2 10.2 5.6 0 10.2-4.5 10.2-10.2C20.4 4.7 15.9.1 10.2.1zM40.7 0c-4.8 0-8.8\\n        4.5-8.8 10.2 0 5.6 3.9 10.2 8.8 10.2 4.8 0 8.8-4.5 8.8-10.2C49.5 4.6 45.6 0 40.7 0z\");\n      attr(svg, \"width\", \"530\");\n      attr(svg, \"height\", \"530\");\n      attr(svg, \"viewBox\", \"0 0 530 530\");\n      attr(svg, \"xmlns\", \"http://www.w3.org/2000/svg\");\n      attr(svg, \"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n      attr(svg, \"class\", \"svelte-1lt2k10\");\n      attr(button, \"class\", button_class_value = \"\" + (null_to_empty(\"floating-btn \".concat( /*buttonPosition*/ctx[0])) + \" svelte-1lt2k10\"));\n    },\n    m(target, anchor) {\n      insert(target, button, anchor);\n      append(button, svg);\n      append(svg, title);\n      append(title, t0);\n      append(svg, desc);\n      append(desc, t1);\n      append(svg, use0);\n      append(svg, use1);\n      append(svg, use2);\n      append(svg, use3);\n      append(svg, use4);\n      append(svg, use5);\n      append(svg, use6);\n      append(svg, defs);\n      append(defs, path0);\n      append(defs, path1);\n      append(defs, path2);\n      append(defs, path3);\n      append(defs, path4);\n      append(defs, path5);\n      append(defs, path6);\n      if (!mounted) {\n        dispose = listen(button, \"click\", /*click_handler*/ctx[1]);\n        mounted = true;\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*buttonPosition*/1 && button_class_value !== (button_class_value = \"\" + (null_to_empty(\"floating-btn \".concat( /*buttonPosition*/ctx[0])) + \" svelte-1lt2k10\"))) {\n        attr(button, \"class\", button_class_value);\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(button);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\nfunction instance$k($$self, $$props, $$invalidate) {\n  let {\n    buttonPosition\n  } = $$props;\n  function click_handler(event) {\n    bubble.call(this, $$self, event);\n  }\n  $$self.$$set = $$props => {\n    if ('buttonPosition' in $$props) $$invalidate(0, buttonPosition = $$props.buttonPosition);\n  };\n  return [buttonPosition, click_handler];\n}\nclass FloatingBtn extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$k, create_fragment$k, safe_not_equal, {\n      buttonPosition: 0\n    }, add_css$k);\n  }\n}\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#readable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Readable<T>}\n */\nfunction readable(value, start) {\n  return {\n    subscribe: writable(value, start).subscribe\n  };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#writable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Writable<T>}\n */\nfunction writable(value) {\n  let start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n  /** @type {import('./public.js').Unsubscriber} */\n  let stop;\n  /** @type {Set<import('./private.js').SubscribeInvalidateTuple<T>>} */\n  const subscribers = new Set();\n  /** @param {T} new_value\n   * @returns {void}\n   */\n  function set(new_value) {\n    if (safe_not_equal(value, new_value)) {\n      value = new_value;\n      if (stop) {\n        // store is ready\n        const run_queue = !subscriber_queue.length;\n        for (const subscriber of subscribers) {\n          subscriber[1]();\n          subscriber_queue.push(subscriber, value);\n        }\n        if (run_queue) {\n          for (let i = 0; i < subscriber_queue.length; i += 2) {\n            subscriber_queue[i][0](subscriber_queue[i + 1]);\n          }\n          subscriber_queue.length = 0;\n        }\n      }\n    }\n  }\n  /**\n   * @param {import('./public.js').Updater<T>} fn\n   * @returns {void}\n   */\n  function update(fn) {\n    set(fn(value));\n  }\n  /**\n   * @param {import('./public.js').Subscriber<T>} run\n   * @param {import('./private.js').Invalidator<T>} [invalidate]\n   * @returns {import('./public.js').Unsubscriber}\n   */\n  function subscribe(run) {\n    let invalidate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n    /** @type {import('./private.js').SubscribeInvalidateTuple<T>} */\n    const subscriber = [run, invalidate];\n    subscribers.add(subscriber);\n    if (subscribers.size === 1) {\n      stop = start(set, update) || noop;\n    }\n    run(value);\n    return () => {\n      subscribers.delete(subscriber);\n      if (subscribers.size === 0 && stop) {\n        stop();\n        stop = null;\n      }\n    };\n  }\n  return {\n    set,\n    update,\n    subscribe\n  };\n}\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>, set: (value: T) => void, update: (fn: import('./public.js').Updater<T>) => void) => import('./public.js').Unsubscriber | void} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>) => T} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n/**\n * @template {import('./private.js').Stores} S\n * @template T\n * @param {S} stores\n * @param {Function} fn\n * @param {T} [initial_value]\n * @returns {import('./public.js').Readable<T>}\n */\nfunction derived(stores, fn, initial_value) {\n  const single = !Array.isArray(stores);\n  /** @type {Array<import('./public.js').Readable<any>>} */\n  const stores_array = single ? [stores] : stores;\n  if (!stores_array.every(Boolean)) {\n    throw new Error('derived() expects stores as input, got a falsy value');\n  }\n  const auto = fn.length < 2;\n  return readable(initial_value, (set, update) => {\n    let started = false;\n    const values = [];\n    let pending = 0;\n    let cleanup = noop;\n    const sync = () => {\n      if (pending) {\n        return;\n      }\n      cleanup();\n      const result = fn(single ? values[0] : values, set, update);\n      if (auto) {\n        set(result);\n      } else {\n        cleanup = is_function(result) ? result : noop;\n      }\n    };\n    const unsubscribers = stores_array.map((store, i) => subscribe(store, value => {\n      values[i] = value;\n      pending &= ~(1 << i);\n      if (started) {\n        sync();\n      }\n    }, () => {\n      pending |= 1 << i;\n    }));\n    started = true;\n    sync();\n    return function stop() {\n      run_all(unsubscribers);\n      cleanup();\n      // We need to set this to false because callbacks can still happen despite having unsubscribed:\n      // Callbacks might already be placed in the queue which doesn't know it should no longer\n      // invoke this derived store.\n      started = false;\n    };\n  });\n}\n\nconst SNAPSHOTS_KEY = '__prosemirror-dev-toolkit__snapshots';\nconst snapshots = writable([]);\nconst selectedSnapshot = writable();\nconst previousEditorState = writable();\nlet canAccessLocalStorage = true;\nfunction hydrate() {\n    let persisted = null;\n    try {\n        persisted = localStorage.getItem(SNAPSHOTS_KEY);\n    }\n    catch (err) {\n        // Will crash when window is undefined, eg in server-side rendering\n        // but also in a codesandbox where you are denied access to localStorage\n        canAccessLocalStorage = false;\n    }\n    if (persisted && persisted.length > 0) {\n        try {\n            const parsed = JSON.parse(persisted);\n            snapshots.set(parsed);\n        }\n        catch (err) {\n            console.error('Corrupted snapshots values in localStorage', err);\n        }\n    }\n}\nhydrate();\nsnapshots.subscribe(val => {\n    if (canAccessLocalStorage) {\n        localStorage.setItem(SNAPSHOTS_KEY, JSON.stringify(val));\n    }\n});\nfunction setEditorDoc(view, doc) {\n    const node = view.state.schema.nodeFromJSON(doc);\n    const tr = view.state.tr;\n    tr.replaceWith(0, view.state.doc.nodeSize - 2, node.content);\n    view.dispatch(tr);\n}\nfunction saveSnapshot(snapshotName, doc) {\n    const snap = {\n        name: snapshotName,\n        timestamp: Date.now(),\n        doc\n    };\n    snapshots.update(val => [snap, ...val]);\n    return snap;\n}\nfunction importSnapshot(snapshotName, json, schema) {\n    const doc = schema.nodeFromJSON(json);\n    const snap = {\n        name: snapshotName,\n        timestamp: Date.now(),\n        doc: doc.toJSON()\n    };\n    snapshots.update(val => [snap, ...val]);\n    return snap;\n}\nfunction updateSnapshot(snapshot) {\n    snapshots.update(val => val.map(s => {\n        if (s.timestamp === snapshot.timestamp) {\n            return snapshot;\n        }\n        return s;\n    }));\n}\nfunction toggleViewSnapshot(view, snap) {\n    if (snap) {\n        const prevState = get_store_value(previousEditorState);\n        if (!prevState)\n            previousEditorState.set(view.state);\n        setEditorDoc(view, snap.doc);\n    }\n    else {\n        const prevState = get_store_value(previousEditorState);\n        if (!prevState) {\n            console.error('No previous state to restore!');\n        }\n        else {\n            view.updateState(prevState);\n        }\n        previousEditorState.set(undefined);\n    }\n    selectedSnapshot.set(snap);\n}\nfunction restoreSnapshot(view, snap) {\n    setEditorDoc(view, snap.doc);\n    previousEditorState.set(undefined);\n    selectedSnapshot.set(undefined);\n}\nfunction exportSnapshot(snapshot) {\n    const a = document.createElement('a');\n    const file = new Blob([JSON.stringify(snapshot.doc)], { type: 'application/json' });\n    a.href = URL.createObjectURL(file);\n    a.download = `${snapshot.name}.json`;\n    a.click();\n}\nfunction deleteSnapshot(snapshot) {\n    snapshots.update(val => val.filter(s => s.timestamp !== snapshot.timestamp));\n    const selected = get_store_value(selectedSnapshot);\n    if ((selected === null || selected === void 0 ? void 0 : selected.timestamp) === snapshot.timestamp) {\n        selectedSnapshot.set(undefined);\n    }\n}\n\nfunction clickOutside(el, onClickOutside) {\n    const onClick = (event) => {\n        el && !event.composedPath().includes(el) && !event.defaultPrevented && onClickOutside();\n    };\n    document.addEventListener('click', onClick, true);\n    return {\n        destroy() {\n            document.removeEventListener('click', onClick, true);\n        }\n    };\n}\n\n/* src/components/PasteModal.svelte generated by Svelte v4.2.15 */\nfunction add_css$j(target) {\n  append_styles(target, \"svelte-19h7j7n\", \".paste-modal.svelte-19h7j7n.svelte-19h7j7n{font-size:15px;height:100%;left:0;position:fixed;top:0;width:100%;z-index:1000}.paste-modal.svelte-19h7j7n>form.svelte-19h7j7n{display:flex;height:100%;justify-content:center;padding:64px}.modal-bg.svelte-19h7j7n.svelte-19h7j7n{background:#000;height:100%;left:0;opacity:0.8;position:absolute;top:0;width:100%;z-index:-1}fieldset.svelte-19h7j7n.svelte-19h7j7n{border-color:transparent;width:100%;max-width:800px}.submit-container.svelte-19h7j7n.svelte-19h7j7n{position:relative;width:100%}button.svelte-19h7j7n.svelte-19h7j7n{cursor:pointer;padding:4px 8px;position:absolute;right:-6px;top:-32px}legend.svelte-19h7j7n.svelte-19h7j7n{color:white}textarea.svelte-19h7j7n.svelte-19h7j7n{background:#fefcfc;height:calc(100vh - 128px);width:100%}\");\n}\nfunction create_fragment$j(ctx) {\n  let div2;\n  let div0;\n  let t0;\n  let form;\n  let fieldset;\n  let div1;\n  let t2;\n  let legend;\n  let t4;\n  let textarea;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      div2 = element(\"div\");\n      div0 = element(\"div\");\n      t0 = space();\n      form = element(\"form\");\n      fieldset = element(\"fieldset\");\n      div1 = element(\"div\");\n      div1.innerHTML = \"<button class=\\\"svelte-19h7j7n\\\">Submit</button>\";\n      t2 = space();\n      legend = element(\"legend\");\n      legend.textContent = \"Doc\";\n      t4 = space();\n      textarea = element(\"textarea\");\n      attr(div0, \"class\", \"modal-bg svelte-19h7j7n\");\n      attr(div1, \"class\", \"submit-container svelte-19h7j7n\");\n      attr(legend, \"class\", \"svelte-19h7j7n\");\n      attr(textarea, \"class\", \"svelte-19h7j7n\");\n      attr(fieldset, \"class\", \"svelte-19h7j7n\");\n      attr(form, \"class\", \"paste-content svelte-19h7j7n\");\n      attr(div2, \"class\", \"paste-modal svelte-19h7j7n\");\n      toggle_class(div2, \"hidden\", ! /*isOpen*/ctx[0]);\n    },\n    m(target, anchor) {\n      insert(target, div2, anchor);\n      append(div2, div0);\n      append(div2, t0);\n      append(div2, form);\n      append(form, fieldset);\n      append(fieldset, div1);\n      append(fieldset, t2);\n      append(fieldset, legend);\n      append(fieldset, t4);\n      append(fieldset, textarea);\n      set_input_value(textarea, /*doc*/ctx[1]);\n      if (!mounted) {\n        dispose = [listen(textarea, \"input\", /*textarea_input_handler*/ctx[4]), action_destroyer(clickOutside.call(null, fieldset, /*handleClickOutside*/ctx[2])), listen(form, \"submit\", prevent_default( /*handleSubmit*/ctx[3]))];\n        mounted = true;\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*doc*/2) {\n        set_input_value(textarea, /*doc*/ctx[1]);\n      }\n      if (dirty & /*isOpen*/1) {\n        toggle_class(div2, \"hidden\", ! /*isOpen*/ctx[0]);\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(div2);\n      }\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction instance$j($$self, $$props, $$invalidate) {\n  let {\n    isOpen\n  } = $$props;\n  let doc;\n  const dispatch = createEventDispatcher();\n  function handleClickOutside() {\n    dispatch('close');\n  }\n  function handleSubmit() {\n    try {\n      dispatch('submit', {\n        doc: JSON.parse(doc)\n      });\n    } catch (err) {}\n  }\n  function textarea_input_handler() {\n    doc = this.value;\n    $$invalidate(1, doc);\n  }\n  $$self.$$set = $$props => {\n    if ('isOpen' in $$props) $$invalidate(0, isOpen = $$props.isOpen);\n  };\n  return [isOpen, doc, handleClickOutside, handleSubmit, textarea_input_handler];\n}\nclass PasteModal extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$j, create_fragment$j, safe_not_equal, {\n      isOpen: 0\n    }, add_css$j);\n  }\n}\n\n/* src/tabs/TabsMenu.svelte generated by Svelte v4.2.15 */\nfunction add_css$i(target) {\n  append_styles(target, \"svelte-10notzq\", \"ul.svelte-10notzq{display:flex;list-style:none;margin:0;overflow-x:scroll;padding:0}button.svelte-10notzq{background:transparent;border:0;border-bottom:2px solid transparent;color:#fff;cursor:pointer;height:100%;font-size:var(--font-medium);font-weight:400;padding:1em}button.svelte-10notzq:hover{background:rgba(255, 255, 255, 0.05)}button.active.svelte-10notzq{border-bottom:2px solid rgb(255, 162, 177)}\");\n}\nfunction create_fragment$i(ctx) {\n  let ul;\n  let li0;\n  let button0;\n  let t1;\n  let li1;\n  let button1;\n  let t3;\n  let li2;\n  let button2;\n  let t5;\n  let li3;\n  let button3;\n  let t7;\n  let li4;\n  let button4;\n  let t9;\n  let li5;\n  let button5;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      ul = element(\"ul\");\n      li0 = element(\"li\");\n      button0 = element(\"button\");\n      button0.textContent = \"STATE\";\n      t1 = space();\n      li1 = element(\"li\");\n      button1 = element(\"button\");\n      button1.textContent = \"HISTORY\";\n      t3 = space();\n      li2 = element(\"li\");\n      button2 = element(\"button\");\n      button2.textContent = \"PLUGINS\";\n      t5 = space();\n      li3 = element(\"li\");\n      button3 = element(\"button\");\n      button3.textContent = \"SCHEMA\";\n      t7 = space();\n      li4 = element(\"li\");\n      button4 = element(\"button\");\n      button4.textContent = \"STRUCTURE\";\n      t9 = space();\n      li5 = element(\"li\");\n      button5 = element(\"button\");\n      button5.textContent = \"SNAPSHOTS\";\n      attr(button0, \"class\", \"svelte-10notzq\");\n      toggle_class(button0, \"active\", /*active*/ctx[0] === 'state');\n      attr(button1, \"class\", \"svelte-10notzq\");\n      toggle_class(button1, \"active\", /*active*/ctx[0] === 'history');\n      attr(button2, \"class\", \"svelte-10notzq\");\n      toggle_class(button2, \"active\", /*active*/ctx[0] === 'plugins');\n      attr(button3, \"class\", \"svelte-10notzq\");\n      toggle_class(button3, \"active\", /*active*/ctx[0] === 'schema');\n      attr(button4, \"class\", \"svelte-10notzq\");\n      toggle_class(button4, \"active\", /*active*/ctx[0] === 'structure');\n      attr(button5, \"class\", \"svelte-10notzq\");\n      toggle_class(button5, \"active\", /*active*/ctx[0] === 'snapshots');\n      attr(ul, \"class\", \"tabs-menu svelte-10notzq\");\n    },\n    m(target, anchor) {\n      insert(target, ul, anchor);\n      append(ul, li0);\n      append(li0, button0);\n      append(ul, t1);\n      append(ul, li1);\n      append(li1, button1);\n      append(ul, t3);\n      append(ul, li2);\n      append(li2, button2);\n      append(ul, t5);\n      append(ul, li3);\n      append(li3, button3);\n      append(ul, t7);\n      append(ul, li4);\n      append(li4, button4);\n      append(ul, t9);\n      append(ul, li5);\n      append(li5, button5);\n      if (!mounted) {\n        dispose = [listen(button0, \"click\", /*click_handler*/ctx[2]), listen(button1, \"click\", /*click_handler_1*/ctx[3]), listen(button2, \"click\", /*click_handler_2*/ctx[4]), listen(button3, \"click\", /*click_handler_3*/ctx[5]), listen(button4, \"click\", /*click_handler_4*/ctx[6]), listen(button5, \"click\", /*click_handler_5*/ctx[7])];\n        mounted = true;\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*active*/1) {\n        toggle_class(button0, \"active\", /*active*/ctx[0] === 'state');\n      }\n      if (dirty & /*active*/1) {\n        toggle_class(button1, \"active\", /*active*/ctx[0] === 'history');\n      }\n      if (dirty & /*active*/1) {\n        toggle_class(button2, \"active\", /*active*/ctx[0] === 'plugins');\n      }\n      if (dirty & /*active*/1) {\n        toggle_class(button3, \"active\", /*active*/ctx[0] === 'schema');\n      }\n      if (dirty & /*active*/1) {\n        toggle_class(button4, \"active\", /*active*/ctx[0] === 'structure');\n      }\n      if (dirty & /*active*/1) {\n        toggle_class(button5, \"active\", /*active*/ctx[0] === 'snapshots');\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(ul);\n      }\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction instance$i($$self, $$props, $$invalidate) {\n  let {\n    active,\n    onClickTab\n  } = $$props;\n  const click_handler = () => onClickTab('state');\n  const click_handler_1 = () => onClickTab('history');\n  const click_handler_2 = () => onClickTab('plugins');\n  const click_handler_3 = () => onClickTab('schema');\n  const click_handler_4 = () => onClickTab('structure');\n  const click_handler_5 = () => onClickTab('snapshots');\n  $$self.$$set = $$props => {\n    if ('active' in $$props) $$invalidate(0, active = $$props.active);\n    if ('onClickTab' in $$props) $$invalidate(1, onClickTab = $$props.onClickTab);\n  };\n  return [active, onClickTab, click_handler, click_handler_1, click_handler_2, click_handler_3, click_handler_4, click_handler_5];\n}\nclass TabsMenu extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$i, create_fragment$i, safe_not_equal, {\n      active: 0,\n      onClickTab: 1\n    }, add_css$i);\n  }\n}\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar diffMatchPatch = {exports: {}};\n\n/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n(function (module) {\n  /**\n   * @fileoverview Computes the difference between two texts to create a patch.\n   * Applies the patch onto another text, allowing for errors.\n   * @author fraser@google.com (Neil Fraser)\n   */\n  /**\n   * Class containing the diff, match and patch methods.\n   * @constructor\n   */\n  var diff_match_patch = function () {\n    // Defaults.\n    // Redefine these in your program to override the defaults.\n    // Number of seconds to map a diff before giving up (0 for infinity).\n    this.Diff_Timeout = 1.0;\n    // Cost of an empty edit operation in terms of edit characters.\n    this.Diff_EditCost = 4;\n    // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n    this.Match_Threshold = 0.5;\n    // How far to search for a match (0 = exact location, 1000+ = broad match).\n    // A match this many characters away from the expected location will add\n    // 1.0 to the score (0.0 is a perfect match).\n    this.Match_Distance = 1000;\n    // When deleting a large block of text (over ~64 characters), how close do\n    // the contents have to be to match the expected contents. (0.0 = perfection,\n    // 1.0 = very loose).  Note that Match_Threshold controls how closely the\n    // end points of a delete need to match.\n    this.Patch_DeleteThreshold = 0.5;\n    // Chunk size for context length.\n    this.Patch_Margin = 4;\n    // The number of bits in an int.\n    this.Match_MaxBits = 32;\n  };\n  //  DIFF FUNCTIONS\n  /**\n   * The data structure representing a diff is an array of tuples:\n   * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n   * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n   */\n  var DIFF_DELETE = -1;\n  var DIFF_INSERT = 1;\n  var DIFF_EQUAL = 0;\n  /**\n   * Class representing one diff tuple.\n   * ~Attempts to look like a two-element array (which is what this used to be).~\n   * Constructor returns an actual two-element array, to allow destructing @JackuB\n   * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n   * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n   * @param {string} text Text to be deleted, inserted, or retained.\n   * @constructor\n   */\n  diff_match_patch.Diff = function (op, text) {\n    return [op, text];\n  };\n  /**\n   * Find the differences between two texts.  Simplifies the problem by stripping\n   * any common prefix or suffix off the texts before diffing.\n   * @param {string} text1 Old string to be diffed.\n   * @param {string} text2 New string to be diffed.\n   * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n   *     then don't run a line-level diff first to identify the changed areas.\n   *     Defaults to true, which does a faster, slightly less optimal diff.\n   * @param {number=} opt_deadline Optional time when the diff should be complete\n   *     by.  Used internally for recursive calls.  Users should set DiffTimeout\n   *     instead.\n   * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n   */\n  diff_match_patch.prototype.diff_main = function (text1, text2, opt_checklines, opt_deadline) {\n    // Set a deadline by which time the diff must be complete.\n    if (typeof opt_deadline == 'undefined') {\n      if (this.Diff_Timeout <= 0) {\n        opt_deadline = Number.MAX_VALUE;\n      } else {\n        opt_deadline = new Date().getTime() + this.Diff_Timeout * 1000;\n      }\n    }\n    var deadline = opt_deadline;\n    // Check for null inputs.\n    if (text1 == null || text2 == null) {\n      throw new Error('Null input. (diff_main)');\n    }\n    // Check for equality (speedup).\n    if (text1 == text2) {\n      if (text1) {\n        return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n      }\n      return [];\n    }\n    if (typeof opt_checklines == 'undefined') {\n      opt_checklines = true;\n    }\n    var checklines = opt_checklines;\n    // Trim off common prefix (speedup).\n    var commonlength = this.diff_commonPrefix(text1, text2);\n    var commonprefix = text1.substring(0, commonlength);\n    text1 = text1.substring(commonlength);\n    text2 = text2.substring(commonlength);\n    // Trim off common suffix (speedup).\n    commonlength = this.diff_commonSuffix(text1, text2);\n    var commonsuffix = text1.substring(text1.length - commonlength);\n    text1 = text1.substring(0, text1.length - commonlength);\n    text2 = text2.substring(0, text2.length - commonlength);\n    // Compute the diff on the middle block.\n    var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n    // Restore the prefix and suffix.\n    if (commonprefix) {\n      diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n    }\n    if (commonsuffix) {\n      diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n    }\n    this.diff_cleanupMerge(diffs);\n    return diffs;\n  };\n  /**\n   * Find the differences between two texts.  Assumes that the texts do not\n   * have any common prefix or suffix.\n   * @param {string} text1 Old string to be diffed.\n   * @param {string} text2 New string to be diffed.\n   * @param {boolean} checklines Speedup flag.  If false, then don't run a\n   *     line-level diff first to identify the changed areas.\n   *     If true, then run a faster, slightly less optimal diff.\n   * @param {number} deadline Time when the diff should be complete by.\n   * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n   * @private\n   */\n  diff_match_patch.prototype.diff_compute_ = function (text1, text2, checklines, deadline) {\n    var diffs;\n    if (!text1) {\n      // Just add some text (speedup).\n      return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n    }\n    if (!text2) {\n      // Just delete some text (speedup).\n      return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n    }\n    var longtext = text1.length > text2.length ? text1 : text2;\n    var shorttext = text1.length > text2.length ? text2 : text1;\n    var i = longtext.indexOf(shorttext);\n    if (i != -1) {\n      // Shorter text is inside the longer text (speedup).\n      diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)), new diff_match_patch.Diff(DIFF_EQUAL, shorttext), new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(i + shorttext.length))];\n      // Swap insertions for deletions if diff is reversed.\n      if (text1.length > text2.length) {\n        diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n      }\n      return diffs;\n    }\n    if (shorttext.length == 1) {\n      // Single character string.\n      // After the previous speedup, the character can't be an equality.\n      return [new diff_match_patch.Diff(DIFF_DELETE, text1), new diff_match_patch.Diff(DIFF_INSERT, text2)];\n    }\n    // Check to see if the problem can be split in two.\n    var hm = this.diff_halfMatch_(text1, text2);\n    if (hm) {\n      // A half-match was found, sort out the return data.\n      var text1_a = hm[0];\n      var text1_b = hm[1];\n      var text2_a = hm[2];\n      var text2_b = hm[3];\n      var mid_common = hm[4];\n      // Send both pairs off for separate processing.\n      var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n      var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n      // Merge the results.\n      return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)], diffs_b);\n    }\n    if (checklines && text1.length > 100 && text2.length > 100) {\n      return this.diff_lineMode_(text1, text2, deadline);\n    }\n    return this.diff_bisect_(text1, text2, deadline);\n  };\n  /**\n   * Do a quick line-level diff on both strings, then rediff the parts for\n   * greater accuracy.\n   * This speedup can produce non-minimal diffs.\n   * @param {string} text1 Old string to be diffed.\n   * @param {string} text2 New string to be diffed.\n   * @param {number} deadline Time when the diff should be complete by.\n   * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n   * @private\n   */\n  diff_match_patch.prototype.diff_lineMode_ = function (text1, text2, deadline) {\n    // Scan the text on a line-by-line basis first.\n    var a = this.diff_linesToChars_(text1, text2);\n    text1 = a.chars1;\n    text2 = a.chars2;\n    var linearray = a.lineArray;\n    var diffs = this.diff_main(text1, text2, false, deadline);\n    // Convert the diff back to original text.\n    this.diff_charsToLines_(diffs, linearray);\n    // Eliminate freak matches (e.g. blank lines)\n    this.diff_cleanupSemantic(diffs);\n    // Rediff any replacement blocks, this time character-by-character.\n    // Add a dummy entry at the end.\n    diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n    var pointer = 0;\n    var count_delete = 0;\n    var count_insert = 0;\n    var text_delete = '';\n    var text_insert = '';\n    while (pointer < diffs.length) {\n      switch (diffs[pointer][0]) {\n        case DIFF_INSERT:\n          count_insert++;\n          text_insert += diffs[pointer][1];\n          break;\n        case DIFF_DELETE:\n          count_delete++;\n          text_delete += diffs[pointer][1];\n          break;\n        case DIFF_EQUAL:\n          // Upon reaching an equality, check for prior redundancies.\n          if (count_delete >= 1 && count_insert >= 1) {\n            // Delete the offending records and add the merged ones.\n            diffs.splice(pointer - count_delete - count_insert, count_delete + count_insert);\n            pointer = pointer - count_delete - count_insert;\n            var subDiff = this.diff_main(text_delete, text_insert, false, deadline);\n            for (var j = subDiff.length - 1; j >= 0; j--) {\n              diffs.splice(pointer, 0, subDiff[j]);\n            }\n            pointer = pointer + subDiff.length;\n          }\n          count_insert = 0;\n          count_delete = 0;\n          text_delete = '';\n          text_insert = '';\n          break;\n      }\n      pointer++;\n    }\n    diffs.pop(); // Remove the dummy entry at the end.\n    return diffs;\n  };\n  /**\n   * Find the 'middle snake' of a diff, split the problem in two\n   * and return the recursively constructed diff.\n   * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n   * @param {string} text1 Old string to be diffed.\n   * @param {string} text2 New string to be diffed.\n   * @param {number} deadline Time at which to bail if not yet complete.\n   * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n   * @private\n   */\n  diff_match_patch.prototype.diff_bisect_ = function (text1, text2, deadline) {\n    // Cache the text lengths to prevent multiple calls.\n    var text1_length = text1.length;\n    var text2_length = text2.length;\n    var max_d = Math.ceil((text1_length + text2_length) / 2);\n    var v_offset = max_d;\n    var v_length = 2 * max_d;\n    var v1 = new Array(v_length);\n    var v2 = new Array(v_length);\n    // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n    // integers and undefined.\n    for (var x = 0; x < v_length; x++) {\n      v1[x] = -1;\n      v2[x] = -1;\n    }\n    v1[v_offset + 1] = 0;\n    v2[v_offset + 1] = 0;\n    var delta = text1_length - text2_length;\n    // If the total number of characters is odd, then the front path will collide\n    // with the reverse path.\n    var front = delta % 2 != 0;\n    // Offsets for start and end of k loop.\n    // Prevents mapping of space beyond the grid.\n    var k1start = 0;\n    var k1end = 0;\n    var k2start = 0;\n    var k2end = 0;\n    for (var d = 0; d < max_d; d++) {\n      // Bail out if deadline is reached.\n      if (new Date().getTime() > deadline) {\n        break;\n      }\n      // Walk the front path one step.\n      for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n        var k1_offset = v_offset + k1;\n        var x1;\n        if (k1 == -d || k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1]) {\n          x1 = v1[k1_offset + 1];\n        } else {\n          x1 = v1[k1_offset - 1] + 1;\n        }\n        var y1 = x1 - k1;\n        while (x1 < text1_length && y1 < text2_length && text1.charAt(x1) == text2.charAt(y1)) {\n          x1++;\n          y1++;\n        }\n        v1[k1_offset] = x1;\n        if (x1 > text1_length) {\n          // Ran off the right of the graph.\n          k1end += 2;\n        } else if (y1 > text2_length) {\n          // Ran off the bottom of the graph.\n          k1start += 2;\n        } else if (front) {\n          var k2_offset = v_offset + delta - k1;\n          if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n            // Mirror x2 onto top-left coordinate system.\n            var x2 = text1_length - v2[k2_offset];\n            if (x1 >= x2) {\n              // Overlap detected.\n              return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n            }\n          }\n        }\n      }\n      // Walk the reverse path one step.\n      for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n        var k2_offset = v_offset + k2;\n        var x2;\n        if (k2 == -d || k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1]) {\n          x2 = v2[k2_offset + 1];\n        } else {\n          x2 = v2[k2_offset - 1] + 1;\n        }\n        var y2 = x2 - k2;\n        while (x2 < text1_length && y2 < text2_length && text1.charAt(text1_length - x2 - 1) == text2.charAt(text2_length - y2 - 1)) {\n          x2++;\n          y2++;\n        }\n        v2[k2_offset] = x2;\n        if (x2 > text1_length) {\n          // Ran off the left of the graph.\n          k2end += 2;\n        } else if (y2 > text2_length) {\n          // Ran off the top of the graph.\n          k2start += 2;\n        } else if (!front) {\n          var k1_offset = v_offset + delta - k2;\n          if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n            var x1 = v1[k1_offset];\n            var y1 = v_offset + x1 - k1_offset;\n            // Mirror x2 onto top-left coordinate system.\n            x2 = text1_length - x2;\n            if (x1 >= x2) {\n              // Overlap detected.\n              return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n            }\n          }\n        }\n      }\n    }\n    // Diff took too long and hit the deadline or\n    // number of diffs equals number of characters, no commonality at all.\n    return [new diff_match_patch.Diff(DIFF_DELETE, text1), new diff_match_patch.Diff(DIFF_INSERT, text2)];\n  };\n  /**\n   * Given the location of the 'middle snake', split the diff in two parts\n   * and recurse.\n   * @param {string} text1 Old string to be diffed.\n   * @param {string} text2 New string to be diffed.\n   * @param {number} x Index of split point in text1.\n   * @param {number} y Index of split point in text2.\n   * @param {number} deadline Time at which to bail if not yet complete.\n   * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n   * @private\n   */\n  diff_match_patch.prototype.diff_bisectSplit_ = function (text1, text2, x, y, deadline) {\n    var text1a = text1.substring(0, x);\n    var text2a = text2.substring(0, y);\n    var text1b = text1.substring(x);\n    var text2b = text2.substring(y);\n    // Compute both diffs serially.\n    var diffs = this.diff_main(text1a, text2a, false, deadline);\n    var diffsb = this.diff_main(text1b, text2b, false, deadline);\n    return diffs.concat(diffsb);\n  };\n  /**\n   * Split two texts into an array of strings.  Reduce the texts to a string of\n   * hashes where each Unicode character represents one line.\n   * @param {string} text1 First string.\n   * @param {string} text2 Second string.\n   * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n   *     An object containing the encoded text1, the encoded text2 and\n   *     the array of unique strings.\n   *     The zeroth element of the array of unique strings is intentionally blank.\n   * @private\n   */\n  diff_match_patch.prototype.diff_linesToChars_ = function (text1, text2) {\n    var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n    var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n    // '\\x00' is a valid character, but various debuggers don't like it.\n    // So we'll insert a junk entry to avoid generating a null character.\n    lineArray[0] = '';\n    /**\n     * Split a text into an array of strings.  Reduce the texts to a string of\n     * hashes where each Unicode character represents one line.\n     * Modifies linearray and linehash through being a closure.\n     * @param {string} text String to encode.\n     * @return {string} Encoded string.\n     * @private\n     */\n    function diff_linesToCharsMunge_(text) {\n      var chars = '';\n      // Walk the text, pulling out a substring for each line.\n      // text.split('\\n') would would temporarily double our memory footprint.\n      // Modifying text would create many large strings to garbage collect.\n      var lineStart = 0;\n      var lineEnd = -1;\n      // Keeping our own length variable is faster than looking it up.\n      var lineArrayLength = lineArray.length;\n      while (lineEnd < text.length - 1) {\n        lineEnd = text.indexOf('\\n', lineStart);\n        if (lineEnd == -1) {\n          lineEnd = text.length - 1;\n        }\n        var line = text.substring(lineStart, lineEnd + 1);\n        if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) {\n          chars += String.fromCharCode(lineHash[line]);\n        } else {\n          if (lineArrayLength == maxLines) {\n            // Bail out at 65535 because\n            // String.fromCharCode(65536) == String.fromCharCode(0)\n            line = text.substring(lineStart);\n            lineEnd = text.length;\n          }\n          chars += String.fromCharCode(lineArrayLength);\n          lineHash[line] = lineArrayLength;\n          lineArray[lineArrayLength++] = line;\n        }\n        lineStart = lineEnd + 1;\n      }\n      return chars;\n    }\n    // Allocate 2/3rds of the space for text1, the rest for text2.\n    var maxLines = 40000;\n    var chars1 = diff_linesToCharsMunge_(text1);\n    maxLines = 65535;\n    var chars2 = diff_linesToCharsMunge_(text2);\n    return {\n      chars1: chars1,\n      chars2: chars2,\n      lineArray: lineArray\n    };\n  };\n  /**\n   * Rehydrate the text in a diff from a string of line hashes to real lines of\n   * text.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @param {!Array.<string>} lineArray Array of unique strings.\n   * @private\n   */\n  diff_match_patch.prototype.diff_charsToLines_ = function (diffs, lineArray) {\n    for (var i = 0; i < diffs.length; i++) {\n      var chars = diffs[i][1];\n      var text = [];\n      for (var j = 0; j < chars.length; j++) {\n        text[j] = lineArray[chars.charCodeAt(j)];\n      }\n      diffs[i][1] = text.join('');\n    }\n  };\n  /**\n   * Determine the common prefix of two strings.\n   * @param {string} text1 First string.\n   * @param {string} text2 Second string.\n   * @return {number} The number of characters common to the start of each\n   *     string.\n   */\n  diff_match_patch.prototype.diff_commonPrefix = function (text1, text2) {\n    // Quick check for common null cases.\n    if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n      return 0;\n    }\n    // Binary search.\n    // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n    var pointermin = 0;\n    var pointermax = Math.min(text1.length, text2.length);\n    var pointermid = pointermax;\n    var pointerstart = 0;\n    while (pointermin < pointermid) {\n      if (text1.substring(pointerstart, pointermid) == text2.substring(pointerstart, pointermid)) {\n        pointermin = pointermid;\n        pointerstart = pointermin;\n      } else {\n        pointermax = pointermid;\n      }\n      pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n    }\n    return pointermid;\n  };\n  /**\n   * Determine the common suffix of two strings.\n   * @param {string} text1 First string.\n   * @param {string} text2 Second string.\n   * @return {number} The number of characters common to the end of each string.\n   */\n  diff_match_patch.prototype.diff_commonSuffix = function (text1, text2) {\n    // Quick check for common null cases.\n    if (!text1 || !text2 || text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n      return 0;\n    }\n    // Binary search.\n    // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n    var pointermin = 0;\n    var pointermax = Math.min(text1.length, text2.length);\n    var pointermid = pointermax;\n    var pointerend = 0;\n    while (pointermin < pointermid) {\n      if (text1.substring(text1.length - pointermid, text1.length - pointerend) == text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n        pointermin = pointermid;\n        pointerend = pointermin;\n      } else {\n        pointermax = pointermid;\n      }\n      pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n    }\n    return pointermid;\n  };\n  /**\n   * Determine if the suffix of one string is the prefix of another.\n   * @param {string} text1 First string.\n   * @param {string} text2 Second string.\n   * @return {number} The number of characters common to the end of the first\n   *     string and the start of the second string.\n   * @private\n   */\n  diff_match_patch.prototype.diff_commonOverlap_ = function (text1, text2) {\n    // Cache the text lengths to prevent multiple calls.\n    var text1_length = text1.length;\n    var text2_length = text2.length;\n    // Eliminate the null case.\n    if (text1_length == 0 || text2_length == 0) {\n      return 0;\n    }\n    // Truncate the longer string.\n    if (text1_length > text2_length) {\n      text1 = text1.substring(text1_length - text2_length);\n    } else if (text1_length < text2_length) {\n      text2 = text2.substring(0, text1_length);\n    }\n    var text_length = Math.min(text1_length, text2_length);\n    // Quick check for the worst case.\n    if (text1 == text2) {\n      return text_length;\n    }\n    // Start by looking for a single character match\n    // and increase length until no match is found.\n    // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n    var best = 0;\n    var length = 1;\n    while (true) {\n      var pattern = text1.substring(text_length - length);\n      var found = text2.indexOf(pattern);\n      if (found == -1) {\n        return best;\n      }\n      length += found;\n      if (found == 0 || text1.substring(text_length - length) == text2.substring(0, length)) {\n        best = length;\n        length++;\n      }\n    }\n  };\n  /**\n   * Do the two texts share a substring which is at least half the length of the\n   * longer text?\n   * This speedup can produce non-minimal diffs.\n   * @param {string} text1 First string.\n   * @param {string} text2 Second string.\n   * @return {Array.<string>} Five element Array, containing the prefix of\n   *     text1, the suffix of text1, the prefix of text2, the suffix of\n   *     text2 and the common middle.  Or null if there was no match.\n   * @private\n   */\n  diff_match_patch.prototype.diff_halfMatch_ = function (text1, text2) {\n    if (this.Diff_Timeout <= 0) {\n      // Don't risk returning a non-optimal diff if we have unlimited time.\n      return null;\n    }\n    var longtext = text1.length > text2.length ? text1 : text2;\n    var shorttext = text1.length > text2.length ? text2 : text1;\n    if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n      return null; // Pointless.\n    }\n    var dmp = this; // 'this' becomes 'window' in a closure.\n    /**\n     * Does a substring of shorttext exist within longtext such that the substring\n     * is at least half the length of longtext?\n     * Closure, but does not reference any external variables.\n     * @param {string} longtext Longer string.\n     * @param {string} shorttext Shorter string.\n     * @param {number} i Start index of quarter length substring within longtext.\n     * @return {Array.<string>} Five element Array, containing the prefix of\n     *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n     *     of shorttext and the common middle.  Or null if there was no match.\n     * @private\n     */\n    function diff_halfMatchI_(longtext, shorttext, i) {\n      // Start with a 1/4 length substring at position i as a seed.\n      var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n      var j = -1;\n      var best_common = '';\n      var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n      while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n        var prefixLength = dmp.diff_commonPrefix(longtext.substring(i), shorttext.substring(j));\n        var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n        if (best_common.length < suffixLength + prefixLength) {\n          best_common = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n          best_longtext_a = longtext.substring(0, i - suffixLength);\n          best_longtext_b = longtext.substring(i + prefixLength);\n          best_shorttext_a = shorttext.substring(0, j - suffixLength);\n          best_shorttext_b = shorttext.substring(j + prefixLength);\n        }\n      }\n      if (best_common.length * 2 >= longtext.length) {\n        return [best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common];\n      } else {\n        return null;\n      }\n    }\n    // First check if the second quarter is the seed for a half-match.\n    var hm1 = diff_halfMatchI_(longtext, shorttext, Math.ceil(longtext.length / 4));\n    // Check again based on the third quarter.\n    var hm2 = diff_halfMatchI_(longtext, shorttext, Math.ceil(longtext.length / 2));\n    var hm;\n    if (!hm1 && !hm2) {\n      return null;\n    } else if (!hm2) {\n      hm = hm1;\n    } else if (!hm1) {\n      hm = hm2;\n    } else {\n      // Both matched.  Select the longest.\n      hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n    }\n    // A half-match was found, sort out the return data.\n    var text1_a, text1_b, text2_a, text2_b;\n    if (text1.length > text2.length) {\n      text1_a = hm[0];\n      text1_b = hm[1];\n      text2_a = hm[2];\n      text2_b = hm[3];\n    } else {\n      text2_a = hm[0];\n      text2_b = hm[1];\n      text1_a = hm[2];\n      text1_b = hm[3];\n    }\n    var mid_common = hm[4];\n    return [text1_a, text1_b, text2_a, text2_b, mid_common];\n  };\n  /**\n   * Reduce the number of edits by eliminating semantically trivial equalities.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   */\n  diff_match_patch.prototype.diff_cleanupSemantic = function (diffs) {\n    var changes = false;\n    var equalities = []; // Stack of indices where equalities are found.\n    var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n    /** @type {?string} */\n    var lastEquality = null;\n    // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n    var pointer = 0; // Index of current position.\n    // Number of characters that changed prior to the equality.\n    var length_insertions1 = 0;\n    var length_deletions1 = 0;\n    // Number of characters that changed after the equality.\n    var length_insertions2 = 0;\n    var length_deletions2 = 0;\n    while (pointer < diffs.length) {\n      if (diffs[pointer][0] == DIFF_EQUAL) {\n        // Equality found.\n        equalities[equalitiesLength++] = pointer;\n        length_insertions1 = length_insertions2;\n        length_deletions1 = length_deletions2;\n        length_insertions2 = 0;\n        length_deletions2 = 0;\n        lastEquality = diffs[pointer][1];\n      } else {\n        // An insertion or deletion.\n        if (diffs[pointer][0] == DIFF_INSERT) {\n          length_insertions2 += diffs[pointer][1].length;\n        } else {\n          length_deletions2 += diffs[pointer][1].length;\n        }\n        // Eliminate an equality that is smaller or equal to the edits on both\n        // sides of it.\n        if (lastEquality && lastEquality.length <= Math.max(length_insertions1, length_deletions1) && lastEquality.length <= Math.max(length_insertions2, length_deletions2)) {\n          // Duplicate record.\n          diffs.splice(equalities[equalitiesLength - 1], 0, new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n          // Change second copy to insert.\n          diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n          // Throw away the equality we just deleted.\n          equalitiesLength--;\n          // Throw away the previous equality (it needs to be reevaluated).\n          equalitiesLength--;\n          pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n          length_insertions1 = 0; // Reset the counters.\n          length_deletions1 = 0;\n          length_insertions2 = 0;\n          length_deletions2 = 0;\n          lastEquality = null;\n          changes = true;\n        }\n      }\n      pointer++;\n    }\n    // Normalize the diff.\n    if (changes) {\n      this.diff_cleanupMerge(diffs);\n    }\n    this.diff_cleanupSemanticLossless(diffs);\n    // Find any overlaps between deletions and insertions.\n    // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n    //   -> <del>abc</del>xxx<ins>def</ins>\n    // e.g: <del>xxxabc</del><ins>defxxx</ins>\n    //   -> <ins>def</ins>xxx<del>abc</del>\n    // Only extract an overlap if it is as big as the edit ahead or behind it.\n    pointer = 1;\n    while (pointer < diffs.length) {\n      if (diffs[pointer - 1][0] == DIFF_DELETE && diffs[pointer][0] == DIFF_INSERT) {\n        var deletion = diffs[pointer - 1][1];\n        var insertion = diffs[pointer][1];\n        var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n        var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n        if (overlap_length1 >= overlap_length2) {\n          if (overlap_length1 >= deletion.length / 2 || overlap_length1 >= insertion.length / 2) {\n            // Overlap found.  Insert an equality and trim the surrounding edits.\n            diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL, insertion.substring(0, overlap_length1)));\n            diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlap_length1);\n            diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n            pointer++;\n          }\n        } else {\n          if (overlap_length2 >= deletion.length / 2 || overlap_length2 >= insertion.length / 2) {\n            // Reverse overlap found.\n            // Insert an equality and swap and trim the surrounding edits.\n            diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL, deletion.substring(0, overlap_length2)));\n            diffs[pointer - 1][0] = DIFF_INSERT;\n            diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlap_length2);\n            diffs[pointer + 1][0] = DIFF_DELETE;\n            diffs[pointer + 1][1] = deletion.substring(overlap_length2);\n            pointer++;\n          }\n        }\n        pointer++;\n      }\n      pointer++;\n    }\n  };\n  /**\n   * Look for single edits surrounded on both sides by equalities\n   * which can be shifted sideways to align the edit to a word boundary.\n   * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   */\n  diff_match_patch.prototype.diff_cleanupSemanticLossless = function (diffs) {\n    /**\n     * Given two strings, compute a score representing whether the internal\n     * boundary falls on logical boundaries.\n     * Scores range from 6 (best) to 0 (worst).\n     * Closure, but does not reference any external variables.\n     * @param {string} one First string.\n     * @param {string} two Second string.\n     * @return {number} The score.\n     * @private\n     */\n    function diff_cleanupSemanticScore_(one, two) {\n      if (!one || !two) {\n        // Edges are the best.\n        return 6;\n      }\n      // Each port of this function behaves slightly differently due to\n      // subtle differences in each language's definition of things like\n      // 'whitespace'.  Since this function's purpose is largely cosmetic,\n      // the choice has been made to use each language's native features\n      // rather than force total conformity.\n      var char1 = one.charAt(one.length - 1);\n      var char2 = two.charAt(0);\n      var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n      var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n      var whitespace1 = nonAlphaNumeric1 && char1.match(diff_match_patch.whitespaceRegex_);\n      var whitespace2 = nonAlphaNumeric2 && char2.match(diff_match_patch.whitespaceRegex_);\n      var lineBreak1 = whitespace1 && char1.match(diff_match_patch.linebreakRegex_);\n      var lineBreak2 = whitespace2 && char2.match(diff_match_patch.linebreakRegex_);\n      var blankLine1 = lineBreak1 && one.match(diff_match_patch.blanklineEndRegex_);\n      var blankLine2 = lineBreak2 && two.match(diff_match_patch.blanklineStartRegex_);\n      if (blankLine1 || blankLine2) {\n        // Five points for blank lines.\n        return 5;\n      } else if (lineBreak1 || lineBreak2) {\n        // Four points for line breaks.\n        return 4;\n      } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n        // Three points for end of sentences.\n        return 3;\n      } else if (whitespace1 || whitespace2) {\n        // Two points for whitespace.\n        return 2;\n      } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n        // One point for non-alphanumeric.\n        return 1;\n      }\n      return 0;\n    }\n    var pointer = 1;\n    // Intentionally ignore the first and last element (don't need checking).\n    while (pointer < diffs.length - 1) {\n      if (diffs[pointer - 1][0] == DIFF_EQUAL && diffs[pointer + 1][0] == DIFF_EQUAL) {\n        // This is a single edit surrounded by equalities.\n        var equality1 = diffs[pointer - 1][1];\n        var edit = diffs[pointer][1];\n        var equality2 = diffs[pointer + 1][1];\n        // First, shift the edit as far left as possible.\n        var commonOffset = this.diff_commonSuffix(equality1, edit);\n        if (commonOffset) {\n          var commonString = edit.substring(edit.length - commonOffset);\n          equality1 = equality1.substring(0, equality1.length - commonOffset);\n          edit = commonString + edit.substring(0, edit.length - commonOffset);\n          equality2 = commonString + equality2;\n        }\n        // Second, step character by character right, looking for the best fit.\n        var bestEquality1 = equality1;\n        var bestEdit = edit;\n        var bestEquality2 = equality2;\n        var bestScore = diff_cleanupSemanticScore_(equality1, edit) + diff_cleanupSemanticScore_(edit, equality2);\n        while (edit.charAt(0) === equality2.charAt(0)) {\n          equality1 += edit.charAt(0);\n          edit = edit.substring(1) + equality2.charAt(0);\n          equality2 = equality2.substring(1);\n          var score = diff_cleanupSemanticScore_(equality1, edit) + diff_cleanupSemanticScore_(edit, equality2);\n          // The >= encourages trailing rather than leading whitespace on edits.\n          if (score >= bestScore) {\n            bestScore = score;\n            bestEquality1 = equality1;\n            bestEdit = edit;\n            bestEquality2 = equality2;\n          }\n        }\n        if (diffs[pointer - 1][1] != bestEquality1) {\n          // We have an improvement, save it back to the diff.\n          if (bestEquality1) {\n            diffs[pointer - 1][1] = bestEquality1;\n          } else {\n            diffs.splice(pointer - 1, 1);\n            pointer--;\n          }\n          diffs[pointer][1] = bestEdit;\n          if (bestEquality2) {\n            diffs[pointer + 1][1] = bestEquality2;\n          } else {\n            diffs.splice(pointer + 1, 1);\n            pointer--;\n          }\n        }\n      }\n      pointer++;\n    }\n  };\n  // Define some regex patterns for matching boundaries.\n  diff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\n  diff_match_patch.whitespaceRegex_ = /\\s/;\n  diff_match_patch.linebreakRegex_ = /[\\r\\n]/;\n  diff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\n  diff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n  /**\n   * Reduce the number of edits by eliminating operationally trivial equalities.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   */\n  diff_match_patch.prototype.diff_cleanupEfficiency = function (diffs) {\n    var changes = false;\n    var equalities = []; // Stack of indices where equalities are found.\n    var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n    /** @type {?string} */\n    var lastEquality = null;\n    // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n    var pointer = 0; // Index of current position.\n    // Is there an insertion operation before the last equality.\n    var pre_ins = false;\n    // Is there a deletion operation before the last equality.\n    var pre_del = false;\n    // Is there an insertion operation after the last equality.\n    var post_ins = false;\n    // Is there a deletion operation after the last equality.\n    var post_del = false;\n    while (pointer < diffs.length) {\n      if (diffs[pointer][0] == DIFF_EQUAL) {\n        // Equality found.\n        if (diffs[pointer][1].length < this.Diff_EditCost && (post_ins || post_del)) {\n          // Candidate found.\n          equalities[equalitiesLength++] = pointer;\n          pre_ins = post_ins;\n          pre_del = post_del;\n          lastEquality = diffs[pointer][1];\n        } else {\n          // Not a candidate, and can never become one.\n          equalitiesLength = 0;\n          lastEquality = null;\n        }\n        post_ins = post_del = false;\n      } else {\n        // An insertion or deletion.\n        if (diffs[pointer][0] == DIFF_DELETE) {\n          post_del = true;\n        } else {\n          post_ins = true;\n        }\n        /*\n         * Five types to be split:\n         * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n         * <ins>A</ins>X<ins>C</ins><del>D</del>\n         * <ins>A</ins><del>B</del>X<ins>C</ins>\n         * <ins>A</del>X<ins>C</ins><del>D</del>\n         * <ins>A</ins><del>B</del>X<del>C</del>\n         */\n        if (lastEquality && (pre_ins && pre_del && post_ins && post_del || lastEquality.length < this.Diff_EditCost / 2 && pre_ins + pre_del + post_ins + post_del == 3)) {\n          // Duplicate record.\n          diffs.splice(equalities[equalitiesLength - 1], 0, new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n          // Change second copy to insert.\n          diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n          equalitiesLength--; // Throw away the equality we just deleted;\n          lastEquality = null;\n          if (pre_ins && pre_del) {\n            // No changes made which could affect previous entry, keep going.\n            post_ins = post_del = true;\n            equalitiesLength = 0;\n          } else {\n            equalitiesLength--; // Throw away the previous equality.\n            pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n            post_ins = post_del = false;\n          }\n          changes = true;\n        }\n      }\n      pointer++;\n    }\n    if (changes) {\n      this.diff_cleanupMerge(diffs);\n    }\n  };\n  /**\n   * Reorder and merge like edit sections.  Merge equalities.\n   * Any edit section can move as long as it doesn't cross an equality.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   */\n  diff_match_patch.prototype.diff_cleanupMerge = function (diffs) {\n    // Add a dummy entry at the end.\n    diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n    var pointer = 0;\n    var count_delete = 0;\n    var count_insert = 0;\n    var text_delete = '';\n    var text_insert = '';\n    var commonlength;\n    while (pointer < diffs.length) {\n      switch (diffs[pointer][0]) {\n        case DIFF_INSERT:\n          count_insert++;\n          text_insert += diffs[pointer][1];\n          pointer++;\n          break;\n        case DIFF_DELETE:\n          count_delete++;\n          text_delete += diffs[pointer][1];\n          pointer++;\n          break;\n        case DIFF_EQUAL:\n          // Upon reaching an equality, check for prior redundancies.\n          if (count_delete + count_insert > 1) {\n            if (count_delete !== 0 && count_insert !== 0) {\n              // Factor out any common prefixies.\n              commonlength = this.diff_commonPrefix(text_insert, text_delete);\n              if (commonlength !== 0) {\n                if (pointer - count_delete - count_insert > 0 && diffs[pointer - count_delete - count_insert - 1][0] == DIFF_EQUAL) {\n                  diffs[pointer - count_delete - count_insert - 1][1] += text_insert.substring(0, commonlength);\n                } else {\n                  diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL, text_insert.substring(0, commonlength)));\n                  pointer++;\n                }\n                text_insert = text_insert.substring(commonlength);\n                text_delete = text_delete.substring(commonlength);\n              }\n              // Factor out any common suffixies.\n              commonlength = this.diff_commonSuffix(text_insert, text_delete);\n              if (commonlength !== 0) {\n                diffs[pointer][1] = text_insert.substring(text_insert.length - commonlength) + diffs[pointer][1];\n                text_insert = text_insert.substring(0, text_insert.length - commonlength);\n                text_delete = text_delete.substring(0, text_delete.length - commonlength);\n              }\n            }\n            // Delete the offending records and add the merged ones.\n            pointer -= count_delete + count_insert;\n            diffs.splice(pointer, count_delete + count_insert);\n            if (text_delete.length) {\n              diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n              pointer++;\n            }\n            if (text_insert.length) {\n              diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n              pointer++;\n            }\n            pointer++;\n          } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n            // Merge this equality with the previous one.\n            diffs[pointer - 1][1] += diffs[pointer][1];\n            diffs.splice(pointer, 1);\n          } else {\n            pointer++;\n          }\n          count_insert = 0;\n          count_delete = 0;\n          text_delete = '';\n          text_insert = '';\n          break;\n      }\n    }\n    if (diffs[diffs.length - 1][1] === '') {\n      diffs.pop(); // Remove the dummy entry at the end.\n    }\n    // Second pass: look for single edits surrounded on both sides by equalities\n    // which can be shifted sideways to eliminate an equality.\n    // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n    var changes = false;\n    pointer = 1;\n    // Intentionally ignore the first and last element (don't need checking).\n    while (pointer < diffs.length - 1) {\n      if (diffs[pointer - 1][0] == DIFF_EQUAL && diffs[pointer + 1][0] == DIFF_EQUAL) {\n        // This is a single edit surrounded by equalities.\n        if (diffs[pointer][1].substring(diffs[pointer][1].length - diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n          // Shift the edit over the previous equality.\n          diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n          diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n          diffs.splice(pointer - 1, 1);\n          changes = true;\n        } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == diffs[pointer + 1][1]) {\n          // Shift the edit over the next equality.\n          diffs[pointer - 1][1] += diffs[pointer + 1][1];\n          diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n          diffs.splice(pointer + 1, 1);\n          changes = true;\n        }\n      }\n      pointer++;\n    }\n    // If shifts were made, the diff needs reordering and another shift sweep.\n    if (changes) {\n      this.diff_cleanupMerge(diffs);\n    }\n  };\n  /**\n   * loc is a location in text1, compute and return the equivalent location in\n   * text2.\n   * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @param {number} loc Location within text1.\n   * @return {number} Location within text2.\n   */\n  diff_match_patch.prototype.diff_xIndex = function (diffs, loc) {\n    var chars1 = 0;\n    var chars2 = 0;\n    var last_chars1 = 0;\n    var last_chars2 = 0;\n    var x;\n    for (x = 0; x < diffs.length; x++) {\n      if (diffs[x][0] !== DIFF_INSERT) {\n        // Equality or deletion.\n        chars1 += diffs[x][1].length;\n      }\n      if (diffs[x][0] !== DIFF_DELETE) {\n        // Equality or insertion.\n        chars2 += diffs[x][1].length;\n      }\n      if (chars1 > loc) {\n        // Overshot the location.\n        break;\n      }\n      last_chars1 = chars1;\n      last_chars2 = chars2;\n    }\n    // Was the location was deleted?\n    if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n      return last_chars2;\n    }\n    // Add the remaining character length.\n    return last_chars2 + (loc - last_chars1);\n  };\n  /**\n   * Convert a diff array into a pretty HTML report.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @return {string} HTML representation.\n   */\n  diff_match_patch.prototype.diff_prettyHtml = function (diffs) {\n    var html = [];\n    var pattern_amp = /&/g;\n    var pattern_lt = /</g;\n    var pattern_gt = />/g;\n    var pattern_para = /\\n/g;\n    for (var x = 0; x < diffs.length; x++) {\n      var op = diffs[x][0]; // Operation (insert, delete, equal)\n      var data = diffs[x][1]; // Text of change.\n      var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;').replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n      switch (op) {\n        case DIFF_INSERT:\n          html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n          break;\n        case DIFF_DELETE:\n          html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n          break;\n        case DIFF_EQUAL:\n          html[x] = '<span>' + text + '</span>';\n          break;\n      }\n    }\n    return html.join('');\n  };\n  /**\n   * Compute and return the source text (all equalities and deletions).\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @return {string} Source text.\n   */\n  diff_match_patch.prototype.diff_text1 = function (diffs) {\n    var text = [];\n    for (var x = 0; x < diffs.length; x++) {\n      if (diffs[x][0] !== DIFF_INSERT) {\n        text[x] = diffs[x][1];\n      }\n    }\n    return text.join('');\n  };\n  /**\n   * Compute and return the destination text (all equalities and insertions).\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @return {string} Destination text.\n   */\n  diff_match_patch.prototype.diff_text2 = function (diffs) {\n    var text = [];\n    for (var x = 0; x < diffs.length; x++) {\n      if (diffs[x][0] !== DIFF_DELETE) {\n        text[x] = diffs[x][1];\n      }\n    }\n    return text.join('');\n  };\n  /**\n   * Compute the Levenshtein distance; the number of inserted, deleted or\n   * substituted characters.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @return {number} Number of changes.\n   */\n  diff_match_patch.prototype.diff_levenshtein = function (diffs) {\n    var levenshtein = 0;\n    var insertions = 0;\n    var deletions = 0;\n    for (var x = 0; x < diffs.length; x++) {\n      var op = diffs[x][0];\n      var data = diffs[x][1];\n      switch (op) {\n        case DIFF_INSERT:\n          insertions += data.length;\n          break;\n        case DIFF_DELETE:\n          deletions += data.length;\n          break;\n        case DIFF_EQUAL:\n          // A deletion and an insertion is one substitution.\n          levenshtein += Math.max(insertions, deletions);\n          insertions = 0;\n          deletions = 0;\n          break;\n      }\n    }\n    levenshtein += Math.max(insertions, deletions);\n    return levenshtein;\n  };\n  /**\n   * Crush the diff into an encoded string which describes the operations\n   * required to transform text1 into text2.\n   * E.g. =3\\t-2\\t+ing  -> Keep 3 chars, delete 2 chars, insert 'ing'.\n   * Operations are tab-separated.  Inserted text is escaped using %xx notation.\n   * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n   * @return {string} Delta text.\n   */\n  diff_match_patch.prototype.diff_toDelta = function (diffs) {\n    var text = [];\n    for (var x = 0; x < diffs.length; x++) {\n      switch (diffs[x][0]) {\n        case DIFF_INSERT:\n          text[x] = '+' + encodeURI(diffs[x][1]);\n          break;\n        case DIFF_DELETE:\n          text[x] = '-' + diffs[x][1].length;\n          break;\n        case DIFF_EQUAL:\n          text[x] = '=' + diffs[x][1].length;\n          break;\n      }\n    }\n    return text.join('\\t').replace(/%20/g, ' ');\n  };\n  /**\n   * Given the original text1, and an encoded string which describes the\n   * operations required to transform text1 into text2, compute the full diff.\n   * @param {string} text1 Source string for the diff.\n   * @param {string} delta Delta text.\n   * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n   * @throws {!Error} If invalid input.\n   */\n  diff_match_patch.prototype.diff_fromDelta = function (text1, delta) {\n    var diffs = [];\n    var diffsLength = 0; // Keeping our own length var is faster in JS.\n    var pointer = 0; // Cursor in text1\n    var tokens = delta.split(/\\t/g);\n    for (var x = 0; x < tokens.length; x++) {\n      // Each token begins with a one character parameter which specifies the\n      // operation of this token (delete, insert, equality).\n      var param = tokens[x].substring(1);\n      switch (tokens[x].charAt(0)) {\n        case '+':\n          try {\n            diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n          } catch (ex) {\n            // Malformed URI sequence.\n            throw new Error('Illegal escape in diff_fromDelta: ' + param);\n          }\n          break;\n        case '-':\n        // Fall through.\n        case '=':\n          var n = parseInt(param, 10);\n          if (isNaN(n) || n < 0) {\n            throw new Error('Invalid number in diff_fromDelta: ' + param);\n          }\n          var text = text1.substring(pointer, pointer += n);\n          if (tokens[x].charAt(0) == '=') {\n            diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n          } else {\n            diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n          }\n          break;\n        default:\n          // Blank tokens are ok (from a trailing \\t).\n          // Anything else is an error.\n          if (tokens[x]) {\n            throw new Error('Invalid diff operation in diff_fromDelta: ' + tokens[x]);\n          }\n      }\n    }\n    if (pointer != text1.length) {\n      throw new Error('Delta length (' + pointer + ') does not equal source text length (' + text1.length + ').');\n    }\n    return diffs;\n  };\n  //  MATCH FUNCTIONS\n  /**\n   * Locate the best instance of 'pattern' in 'text' near 'loc'.\n   * @param {string} text The text to search.\n   * @param {string} pattern The pattern to search for.\n   * @param {number} loc The location to search around.\n   * @return {number} Best match index or -1.\n   */\n  diff_match_patch.prototype.match_main = function (text, pattern, loc) {\n    // Check for null inputs.\n    if (text == null || pattern == null || loc == null) {\n      throw new Error('Null input. (match_main)');\n    }\n    loc = Math.max(0, Math.min(loc, text.length));\n    if (text == pattern) {\n      // Shortcut (potentially not guaranteed by the algorithm)\n      return 0;\n    } else if (!text.length) {\n      // Nothing to match.\n      return -1;\n    } else if (text.substring(loc, loc + pattern.length) == pattern) {\n      // Perfect match at the perfect spot!  (Includes case of null pattern)\n      return loc;\n    } else {\n      // Do a fuzzy compare.\n      return this.match_bitap_(text, pattern, loc);\n    }\n  };\n  /**\n   * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n   * Bitap algorithm.\n   * @param {string} text The text to search.\n   * @param {string} pattern The pattern to search for.\n   * @param {number} loc The location to search around.\n   * @return {number} Best match index or -1.\n   * @private\n   */\n  diff_match_patch.prototype.match_bitap_ = function (text, pattern, loc) {\n    if (pattern.length > this.Match_MaxBits) {\n      throw new Error('Pattern too long for this browser.');\n    }\n    // Initialise the alphabet.\n    var s = this.match_alphabet_(pattern);\n    var dmp = this; // 'this' becomes 'window' in a closure.\n    /**\n     * Compute and return the score for a match with e errors and x location.\n     * Accesses loc and pattern through being a closure.\n     * @param {number} e Number of errors in match.\n     * @param {number} x Location of match.\n     * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n     * @private\n     */\n    function match_bitapScore_(e, x) {\n      var accuracy = e / pattern.length;\n      var proximity = Math.abs(loc - x);\n      if (!dmp.Match_Distance) {\n        // Dodge divide by zero error.\n        return proximity ? 1.0 : accuracy;\n      }\n      return accuracy + proximity / dmp.Match_Distance;\n    }\n    // Highest score beyond which we give up.\n    var score_threshold = this.Match_Threshold;\n    // Is there a nearby exact match? (speedup)\n    var best_loc = text.indexOf(pattern, loc);\n    if (best_loc != -1) {\n      score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n      // What about in the other direction? (speedup)\n      best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n      if (best_loc != -1) {\n        score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n      }\n    }\n    // Initialise the bit arrays.\n    var matchmask = 1 << pattern.length - 1;\n    best_loc = -1;\n    var bin_min, bin_mid;\n    var bin_max = pattern.length + text.length;\n    var last_rd;\n    for (var d = 0; d < pattern.length; d++) {\n      // Scan for the best match; each iteration allows for one more error.\n      // Run a binary search to determine how far from 'loc' we can stray at this\n      // error level.\n      bin_min = 0;\n      bin_mid = bin_max;\n      while (bin_min < bin_mid) {\n        if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n          bin_min = bin_mid;\n        } else {\n          bin_max = bin_mid;\n        }\n        bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n      }\n      // Use the result from this iteration as the maximum for the next.\n      bin_max = bin_mid;\n      var start = Math.max(1, loc - bin_mid + 1);\n      var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n      var rd = Array(finish + 2);\n      rd[finish + 1] = (1 << d) - 1;\n      for (var j = finish; j >= start; j--) {\n        // The alphabet (s) is a sparse hash, so the following line generates\n        // warnings.\n        var charMatch = s[text.charAt(j - 1)];\n        if (d === 0) {\n          // First pass: exact match.\n          rd[j] = (rd[j + 1] << 1 | 1) & charMatch;\n        } else {\n          // Subsequent passes: fuzzy match.\n          rd[j] = (rd[j + 1] << 1 | 1) & charMatch | ((last_rd[j + 1] | last_rd[j]) << 1 | 1) | last_rd[j + 1];\n        }\n        if (rd[j] & matchmask) {\n          var score = match_bitapScore_(d, j - 1);\n          // This match will almost certainly be better than any existing match.\n          // But check anyway.\n          if (score <= score_threshold) {\n            // Told you so.\n            score_threshold = score;\n            best_loc = j - 1;\n            if (best_loc > loc) {\n              // When passing loc, don't exceed our current distance from loc.\n              start = Math.max(1, 2 * loc - best_loc);\n            } else {\n              // Already passed loc, downhill from here on in.\n              break;\n            }\n          }\n        }\n      }\n      // No hope for a (better) match at greater error levels.\n      if (match_bitapScore_(d + 1, loc) > score_threshold) {\n        break;\n      }\n      last_rd = rd;\n    }\n    return best_loc;\n  };\n  /**\n   * Initialise the alphabet for the Bitap algorithm.\n   * @param {string} pattern The text to encode.\n   * @return {!Object} Hash of character locations.\n   * @private\n   */\n  diff_match_patch.prototype.match_alphabet_ = function (pattern) {\n    var s = {};\n    for (var i = 0; i < pattern.length; i++) {\n      s[pattern.charAt(i)] = 0;\n    }\n    for (var i = 0; i < pattern.length; i++) {\n      s[pattern.charAt(i)] |= 1 << pattern.length - i - 1;\n    }\n    return s;\n  };\n  //  PATCH FUNCTIONS\n  /**\n   * Increase the context until it is unique,\n   * but don't let the pattern expand beyond Match_MaxBits.\n   * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n   * @param {string} text Source text.\n   * @private\n   */\n  diff_match_patch.prototype.patch_addContext_ = function (patch, text) {\n    if (text.length == 0) {\n      return;\n    }\n    if (patch.start2 === null) {\n      throw Error('patch not initialized');\n    }\n    var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n    var padding = 0;\n    // Look for the first and last matches of pattern in text.  If two different\n    // matches are found, increase the pattern length.\n    while (text.indexOf(pattern) != text.lastIndexOf(pattern) && pattern.length < this.Match_MaxBits - this.Patch_Margin - this.Patch_Margin) {\n      padding += this.Patch_Margin;\n      pattern = text.substring(patch.start2 - padding, patch.start2 + patch.length1 + padding);\n    }\n    // Add one chunk for good luck.\n    padding += this.Patch_Margin;\n    // Add the prefix.\n    var prefix = text.substring(patch.start2 - padding, patch.start2);\n    if (prefix) {\n      patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n    }\n    // Add the suffix.\n    var suffix = text.substring(patch.start2 + patch.length1, patch.start2 + patch.length1 + padding);\n    if (suffix) {\n      patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n    }\n    // Roll back the start points.\n    patch.start1 -= prefix.length;\n    patch.start2 -= prefix.length;\n    // Extend the lengths.\n    patch.length1 += prefix.length + suffix.length;\n    patch.length2 += prefix.length + suffix.length;\n  };\n  /**\n   * Compute a list of patches to turn text1 into text2.\n   * Use diffs if provided, otherwise compute it ourselves.\n   * There are four ways to call this function, depending on what data is\n   * available to the caller:\n   * Method 1:\n   * a = text1, b = text2\n   * Method 2:\n   * a = diffs\n   * Method 3 (optimal):\n   * a = text1, b = diffs\n   * Method 4 (deprecated, use method 3):\n   * a = text1, b = text2, c = diffs\n   *\n   * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n   * Array of diff tuples for text1 to text2 (method 2).\n   * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n   * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n   * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n   * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n   * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n   */\n  diff_match_patch.prototype.patch_make = function (a, opt_b, opt_c) {\n    var text1, diffs;\n    if (typeof a == 'string' && typeof opt_b == 'string' && typeof opt_c == 'undefined') {\n      // Method 1: text1, text2\n      // Compute diffs from text1 and text2.\n      text1 = /** @type {string} */a;\n      diffs = this.diff_main(text1, /** @type {string} */opt_b, true);\n      if (diffs.length > 2) {\n        this.diff_cleanupSemantic(diffs);\n        this.diff_cleanupEfficiency(diffs);\n      }\n    } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' && typeof opt_c == 'undefined') {\n      // Method 2: diffs\n      // Compute text1 from diffs.\n      diffs = /** @type {!Array.<!diff_match_patch.Diff>} */a;\n      text1 = this.diff_text1(diffs);\n    } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' && typeof opt_c == 'undefined') {\n      // Method 3: text1, diffs\n      text1 = /** @type {string} */a;\n      diffs = /** @type {!Array.<!diff_match_patch.Diff>} */opt_b;\n    } else if (typeof a == 'string' && typeof opt_b == 'string' && opt_c && typeof opt_c == 'object') {\n      // Method 4: text1, text2, diffs\n      // text2 is not used.\n      text1 = /** @type {string} */a;\n      diffs = /** @type {!Array.<!diff_match_patch.Diff>} */opt_c;\n    } else {\n      throw new Error('Unknown call format to patch_make.');\n    }\n    if (diffs.length === 0) {\n      return []; // Get rid of the null case.\n    }\n    var patches = [];\n    var patch = new diff_match_patch.patch_obj();\n    var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n    var char_count1 = 0; // Number of characters into the text1 string.\n    var char_count2 = 0; // Number of characters into the text2 string.\n    // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n    // text2 (postpatch_text).  We recreate the patches one by one to determine\n    // context info.\n    var prepatch_text = text1;\n    var postpatch_text = text1;\n    for (var x = 0; x < diffs.length; x++) {\n      var diff_type = diffs[x][0];\n      var diff_text = diffs[x][1];\n      if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n        // A new patch starts here.\n        patch.start1 = char_count1;\n        patch.start2 = char_count2;\n      }\n      switch (diff_type) {\n        case DIFF_INSERT:\n          patch.diffs[patchDiffLength++] = diffs[x];\n          patch.length2 += diff_text.length;\n          postpatch_text = postpatch_text.substring(0, char_count2) + diff_text + postpatch_text.substring(char_count2);\n          break;\n        case DIFF_DELETE:\n          patch.length1 += diff_text.length;\n          patch.diffs[patchDiffLength++] = diffs[x];\n          postpatch_text = postpatch_text.substring(0, char_count2) + postpatch_text.substring(char_count2 + diff_text.length);\n          break;\n        case DIFF_EQUAL:\n          if (diff_text.length <= 2 * this.Patch_Margin && patchDiffLength && diffs.length != x + 1) {\n            // Small equality inside a patch.\n            patch.diffs[patchDiffLength++] = diffs[x];\n            patch.length1 += diff_text.length;\n            patch.length2 += diff_text.length;\n          } else if (diff_text.length >= 2 * this.Patch_Margin) {\n            // Time for a new patch.\n            if (patchDiffLength) {\n              this.patch_addContext_(patch, prepatch_text);\n              patches.push(patch);\n              patch = new diff_match_patch.patch_obj();\n              patchDiffLength = 0;\n              // Unlike Unidiff, our patch lists have a rolling context.\n              // https://github.com/google/diff-match-patch/wiki/Unidiff\n              // Update prepatch text & pos to reflect the application of the\n              // just completed patch.\n              prepatch_text = postpatch_text;\n              char_count1 = char_count2;\n            }\n          }\n          break;\n      }\n      // Update the current character count.\n      if (diff_type !== DIFF_INSERT) {\n        char_count1 += diff_text.length;\n      }\n      if (diff_type !== DIFF_DELETE) {\n        char_count2 += diff_text.length;\n      }\n    }\n    // Pick up the leftover patch if not empty.\n    if (patchDiffLength) {\n      this.patch_addContext_(patch, prepatch_text);\n      patches.push(patch);\n    }\n    return patches;\n  };\n  /**\n   * Given an array of patches, return another array that is identical.\n   * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n   * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n   */\n  diff_match_patch.prototype.patch_deepCopy = function (patches) {\n    // Making deep copies is hard in JavaScript.\n    var patchesCopy = [];\n    for (var x = 0; x < patches.length; x++) {\n      var patch = patches[x];\n      var patchCopy = new diff_match_patch.patch_obj();\n      patchCopy.diffs = [];\n      for (var y = 0; y < patch.diffs.length; y++) {\n        patchCopy.diffs[y] = new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n      }\n      patchCopy.start1 = patch.start1;\n      patchCopy.start2 = patch.start2;\n      patchCopy.length1 = patch.length1;\n      patchCopy.length2 = patch.length2;\n      patchesCopy[x] = patchCopy;\n    }\n    return patchesCopy;\n  };\n  /**\n   * Merge a set of patches onto the text.  Return a patched text, as well\n   * as a list of true/false values indicating which patches were applied.\n   * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n   * @param {string} text Old text.\n   * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n   *      new text and an array of boolean values.\n   */\n  diff_match_patch.prototype.patch_apply = function (patches, text) {\n    if (patches.length == 0) {\n      return [text, []];\n    }\n    // Deep copy the patches so that no changes are made to originals.\n    patches = this.patch_deepCopy(patches);\n    var nullPadding = this.patch_addPadding(patches);\n    text = nullPadding + text + nullPadding;\n    this.patch_splitMax(patches);\n    // delta keeps track of the offset between the expected and actual location\n    // of the previous patch.  If there are patches expected at positions 10 and\n    // 20, but the first patch was found at 12, delta is 2 and the second patch\n    // has an effective expected position of 22.\n    var delta = 0;\n    var results = [];\n    for (var x = 0; x < patches.length; x++) {\n      var expected_loc = patches[x].start2 + delta;\n      var text1 = this.diff_text1(patches[x].diffs);\n      var start_loc;\n      var end_loc = -1;\n      if (text1.length > this.Match_MaxBits) {\n        // patch_splitMax will only provide an oversized pattern in the case of\n        // a monster delete.\n        start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits), expected_loc);\n        if (start_loc != -1) {\n          end_loc = this.match_main(text, text1.substring(text1.length - this.Match_MaxBits), expected_loc + text1.length - this.Match_MaxBits);\n          if (end_loc == -1 || start_loc >= end_loc) {\n            // Can't find valid trailing context.  Drop this patch.\n            start_loc = -1;\n          }\n        }\n      } else {\n        start_loc = this.match_main(text, text1, expected_loc);\n      }\n      if (start_loc == -1) {\n        // No match found.  :(\n        results[x] = false;\n        // Subtract the delta for this failed patch from subsequent patches.\n        delta -= patches[x].length2 - patches[x].length1;\n      } else {\n        // Found a match.  :)\n        results[x] = true;\n        delta = start_loc - expected_loc;\n        var text2;\n        if (end_loc == -1) {\n          text2 = text.substring(start_loc, start_loc + text1.length);\n        } else {\n          text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n        }\n        if (text1 == text2) {\n          // Perfect match, just shove the replacement text in.\n          text = text.substring(0, start_loc) + this.diff_text2(patches[x].diffs) + text.substring(start_loc + text1.length);\n        } else {\n          // Imperfect match.  Run a diff to get a framework of equivalent\n          // indices.\n          var diffs = this.diff_main(text1, text2, false);\n          if (text1.length > this.Match_MaxBits && this.diff_levenshtein(diffs) / text1.length > this.Patch_DeleteThreshold) {\n            // The end points match, but the content is unacceptably bad.\n            results[x] = false;\n          } else {\n            this.diff_cleanupSemanticLossless(diffs);\n            var index1 = 0;\n            var index2;\n            for (var y = 0; y < patches[x].diffs.length; y++) {\n              var mod = patches[x].diffs[y];\n              if (mod[0] !== DIFF_EQUAL) {\n                index2 = this.diff_xIndex(diffs, index1);\n              }\n              if (mod[0] === DIFF_INSERT) {\n                // Insertion\n                text = text.substring(0, start_loc + index2) + mod[1] + text.substring(start_loc + index2);\n              } else if (mod[0] === DIFF_DELETE) {\n                // Deletion\n                text = text.substring(0, start_loc + index2) + text.substring(start_loc + this.diff_xIndex(diffs, index1 + mod[1].length));\n              }\n              if (mod[0] !== DIFF_DELETE) {\n                index1 += mod[1].length;\n              }\n            }\n          }\n        }\n      }\n    }\n    // Strip the padding off.\n    text = text.substring(nullPadding.length, text.length - nullPadding.length);\n    return [text, results];\n  };\n  /**\n   * Add some padding on text start and end so that edges can match something.\n   * Intended to be called only from within patch_apply.\n   * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n   * @return {string} The padding string added to each side.\n   */\n  diff_match_patch.prototype.patch_addPadding = function (patches) {\n    var paddingLength = this.Patch_Margin;\n    var nullPadding = '';\n    for (var x = 1; x <= paddingLength; x++) {\n      nullPadding += String.fromCharCode(x);\n    }\n    // Bump all the patches forward.\n    for (var x = 0; x < patches.length; x++) {\n      patches[x].start1 += paddingLength;\n      patches[x].start2 += paddingLength;\n    }\n    // Add some padding on start of first diff.\n    var patch = patches[0];\n    var diffs = patch.diffs;\n    if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n      // Add nullPadding equality.\n      diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n      patch.start1 -= paddingLength; // Should be 0.\n      patch.start2 -= paddingLength; // Should be 0.\n      patch.length1 += paddingLength;\n      patch.length2 += paddingLength;\n    } else if (paddingLength > diffs[0][1].length) {\n      // Grow first equality.\n      var extraLength = paddingLength - diffs[0][1].length;\n      diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n      patch.start1 -= extraLength;\n      patch.start2 -= extraLength;\n      patch.length1 += extraLength;\n      patch.length2 += extraLength;\n    }\n    // Add some padding on end of last diff.\n    patch = patches[patches.length - 1];\n    diffs = patch.diffs;\n    if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n      // Add nullPadding equality.\n      diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n      patch.length1 += paddingLength;\n      patch.length2 += paddingLength;\n    } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n      // Grow last equality.\n      var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n      diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n      patch.length1 += extraLength;\n      patch.length2 += extraLength;\n    }\n    return nullPadding;\n  };\n  /**\n   * Look through the patches and break up any which are longer than the maximum\n   * limit of the match algorithm.\n   * Intended to be called only from within patch_apply.\n   * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n   */\n  diff_match_patch.prototype.patch_splitMax = function (patches) {\n    var patch_size = this.Match_MaxBits;\n    for (var x = 0; x < patches.length; x++) {\n      if (patches[x].length1 <= patch_size) {\n        continue;\n      }\n      var bigpatch = patches[x];\n      // Remove the big old patch.\n      patches.splice(x--, 1);\n      var start1 = bigpatch.start1;\n      var start2 = bigpatch.start2;\n      var precontext = '';\n      while (bigpatch.diffs.length !== 0) {\n        // Create one of several smaller patches.\n        var patch = new diff_match_patch.patch_obj();\n        var empty = true;\n        patch.start1 = start1 - precontext.length;\n        patch.start2 = start2 - precontext.length;\n        if (precontext !== '') {\n          patch.length1 = patch.length2 = precontext.length;\n          patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n        }\n        while (bigpatch.diffs.length !== 0 && patch.length1 < patch_size - this.Patch_Margin) {\n          var diff_type = bigpatch.diffs[0][0];\n          var diff_text = bigpatch.diffs[0][1];\n          if (diff_type === DIFF_INSERT) {\n            // Insertions are harmless.\n            patch.length2 += diff_text.length;\n            start2 += diff_text.length;\n            patch.diffs.push(bigpatch.diffs.shift());\n            empty = false;\n          } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 && patch.diffs[0][0] == DIFF_EQUAL && diff_text.length > 2 * patch_size) {\n            // This is a large deletion.  Let it pass in one chunk.\n            patch.length1 += diff_text.length;\n            start1 += diff_text.length;\n            empty = false;\n            patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n            bigpatch.diffs.shift();\n          } else {\n            // Deletion or equality.  Only take as much as we can stomach.\n            diff_text = diff_text.substring(0, patch_size - patch.length1 - this.Patch_Margin);\n            patch.length1 += diff_text.length;\n            start1 += diff_text.length;\n            if (diff_type === DIFF_EQUAL) {\n              patch.length2 += diff_text.length;\n              start2 += diff_text.length;\n            } else {\n              empty = false;\n            }\n            patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n            if (diff_text == bigpatch.diffs[0][1]) {\n              bigpatch.diffs.shift();\n            } else {\n              bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring(diff_text.length);\n            }\n          }\n        }\n        // Compute the head context for the next patch.\n        precontext = this.diff_text2(patch.diffs);\n        precontext = precontext.substring(precontext.length - this.Patch_Margin);\n        // Append the end context for this patch.\n        var postcontext = this.diff_text1(bigpatch.diffs).substring(0, this.Patch_Margin);\n        if (postcontext !== '') {\n          patch.length1 += postcontext.length;\n          patch.length2 += postcontext.length;\n          if (patch.diffs.length !== 0 && patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n            patch.diffs[patch.diffs.length - 1][1] += postcontext;\n          } else {\n            patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n          }\n        }\n        if (!empty) {\n          patches.splice(++x, 0, patch);\n        }\n      }\n    }\n  };\n  /**\n   * Take a list of patches and return a textual representation.\n   * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n   * @return {string} Text representation of patches.\n   */\n  diff_match_patch.prototype.patch_toText = function (patches) {\n    var text = [];\n    for (var x = 0; x < patches.length; x++) {\n      text[x] = patches[x];\n    }\n    return text.join('');\n  };\n  /**\n   * Parse a textual representation of patches and return a list of Patch objects.\n   * @param {string} textline Text representation of patches.\n   * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n   * @throws {!Error} If invalid input.\n   */\n  diff_match_patch.prototype.patch_fromText = function (textline) {\n    var patches = [];\n    if (!textline) {\n      return patches;\n    }\n    var text = textline.split('\\n');\n    var textPointer = 0;\n    var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n    while (textPointer < text.length) {\n      var m = text[textPointer].match(patchHeader);\n      if (!m) {\n        throw new Error('Invalid patch string: ' + text[textPointer]);\n      }\n      var patch = new diff_match_patch.patch_obj();\n      patches.push(patch);\n      patch.start1 = parseInt(m[1], 10);\n      if (m[2] === '') {\n        patch.start1--;\n        patch.length1 = 1;\n      } else if (m[2] == '0') {\n        patch.length1 = 0;\n      } else {\n        patch.start1--;\n        patch.length1 = parseInt(m[2], 10);\n      }\n      patch.start2 = parseInt(m[3], 10);\n      if (m[4] === '') {\n        patch.start2--;\n        patch.length2 = 1;\n      } else if (m[4] == '0') {\n        patch.length2 = 0;\n      } else {\n        patch.start2--;\n        patch.length2 = parseInt(m[4], 10);\n      }\n      textPointer++;\n      while (textPointer < text.length) {\n        var sign = text[textPointer].charAt(0);\n        try {\n          var line = decodeURI(text[textPointer].substring(1));\n        } catch (ex) {\n          // Malformed URI sequence.\n          throw new Error('Illegal escape in patch_fromText: ' + line);\n        }\n        if (sign == '-') {\n          // Deletion.\n          patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n        } else if (sign == '+') {\n          // Insertion.\n          patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n        } else if (sign == ' ') {\n          // Minor equality.\n          patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n        } else if (sign == '@') {\n          // Start of next patch.\n          break;\n        } else if (sign === '') ; else {\n          // WTF?\n          throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n        }\n        textPointer++;\n      }\n    }\n    return patches;\n  };\n  /**\n   * Class representing one patch operation.\n   * @constructor\n   */\n  diff_match_patch.patch_obj = function () {\n    /** @type {!Array.<!diff_match_patch.Diff>} */\n    this.diffs = [];\n    /** @type {?number} */\n    this.start1 = null;\n    /** @type {?number} */\n    this.start2 = null;\n    /** @type {number} */\n    this.length1 = 0;\n    /** @type {number} */\n    this.length2 = 0;\n  };\n  /**\n   * Emulate GNU diff's format.\n   * Header: @@ -382,8 +481,9 @@\n   * Indices are printed as 1-based, not 0-based.\n   * @return {string} The GNU diff string.\n   */\n  diff_match_patch.patch_obj.prototype.toString = function () {\n    var coords1, coords2;\n    if (this.length1 === 0) {\n      coords1 = this.start1 + ',0';\n    } else if (this.length1 == 1) {\n      coords1 = this.start1 + 1;\n    } else {\n      coords1 = this.start1 + 1 + ',' + this.length1;\n    }\n    if (this.length2 === 0) {\n      coords2 = this.start2 + ',0';\n    } else if (this.length2 == 1) {\n      coords2 = this.start2 + 1;\n    } else {\n      coords2 = this.start2 + 1 + ',' + this.length2;\n    }\n    var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n    var op;\n    // Escape the body of the patch with %xx notation.\n    for (var x = 0; x < this.diffs.length; x++) {\n      switch (this.diffs[x][0]) {\n        case DIFF_INSERT:\n          op = '+';\n          break;\n        case DIFF_DELETE:\n          op = '-';\n          break;\n        case DIFF_EQUAL:\n          op = ' ';\n          break;\n      }\n      text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n    }\n    return text.join('').replace(/%20/g, ' ');\n  };\n  // The following export code was added by @ForbesLindesay\n  module.exports = diff_match_patch;\n  module.exports['diff_match_patch'] = diff_match_patch;\n  module.exports['DIFF_DELETE'] = DIFF_DELETE;\n  module.exports['DIFF_INSERT'] = DIFF_INSERT;\n  module.exports['DIFF_EQUAL'] = DIFF_EQUAL;\n})(diffMatchPatch);\nvar diffMatchPatchExports = diffMatchPatch.exports;\nvar dmp = /*@__PURE__*/getDefaultExportFromCjs(diffMatchPatchExports);\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\nvar get = function get(object, property, receiver) {\n  if (object === null) object = Function.prototype;\n  var desc = Object.getOwnPropertyDescriptor(object, property);\n  if (desc === undefined) {\n    var parent = Object.getPrototypeOf(object);\n    if (parent === null) {\n      return undefined;\n    } else {\n      return get(parent, property, receiver);\n    }\n  } else if (\"value\" in desc) {\n    return desc.value;\n  } else {\n    var getter = desc.get;\n    if (getter === undefined) {\n      return undefined;\n    }\n    return getter.call(receiver);\n  }\n};\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\nvar Processor = function () {\n  function Processor(options) {\n    classCallCheck(this, Processor);\n    this.selfOptions = options || {};\n    this.pipes = {};\n  }\n  createClass(Processor, [{\n    key: 'options',\n    value: function options(_options) {\n      if (_options) {\n        this.selfOptions = _options;\n      }\n      return this.selfOptions;\n    }\n  }, {\n    key: 'pipe',\n    value: function pipe(name, pipeArg) {\n      var pipe = pipeArg;\n      if (typeof name === 'string') {\n        if (typeof pipe === 'undefined') {\n          return this.pipes[name];\n        } else {\n          this.pipes[name] = pipe;\n        }\n      }\n      if (name && name.name) {\n        pipe = name;\n        if (pipe.processor === this) {\n          return pipe;\n        }\n        this.pipes[pipe.name] = pipe;\n      }\n      pipe.processor = this;\n      return pipe;\n    }\n  }, {\n    key: 'process',\n    value: function process(input, pipe) {\n      var context = input;\n      context.options = this.options();\n      var nextPipe = pipe || input.pipe || 'default';\n      var lastPipe = void 0;\n      var lastContext = void 0;\n      while (nextPipe) {\n        if (typeof context.nextAfterChildren !== 'undefined') {\n          // children processed and coming back to parent\n          context.next = context.nextAfterChildren;\n          context.nextAfterChildren = null;\n        }\n        if (typeof nextPipe === 'string') {\n          nextPipe = this.pipe(nextPipe);\n        }\n        nextPipe.process(context);\n        lastContext = context;\n        lastPipe = nextPipe;\n        nextPipe = null;\n        if (context) {\n          if (context.next) {\n            context = context.next;\n            nextPipe = lastContext.nextPipe || context.pipe || lastPipe;\n          }\n        }\n      }\n      return context.hasResult ? context.result : undefined;\n    }\n  }]);\n  return Processor;\n}();\nvar Pipe = function () {\n  function Pipe(name) {\n    classCallCheck(this, Pipe);\n    this.name = name;\n    this.filters = [];\n  }\n  createClass(Pipe, [{\n    key: 'process',\n    value: function process(input) {\n      if (!this.processor) {\n        throw new Error('add this pipe to a processor before using it');\n      }\n      var debug = this.debug;\n      var length = this.filters.length;\n      var context = input;\n      for (var index = 0; index < length; index++) {\n        var filter = this.filters[index];\n        if (debug) {\n          this.log('filter: ' + filter.filterName);\n        }\n        filter(context);\n        if ((typeof context === 'undefined' ? 'undefined' : _typeof(context)) === 'object' && context.exiting) {\n          context.exiting = false;\n          break;\n        }\n      }\n      if (!context.next && this.resultCheck) {\n        this.resultCheck(context);\n      }\n    }\n  }, {\n    key: 'log',\n    value: function log(msg) {\n      console.log('[jsondiffpatch] ' + this.name + ' pipe, ' + msg);\n    }\n  }, {\n    key: 'append',\n    value: function append() {\n      var _filters;\n      (_filters = this.filters).push.apply(_filters, arguments);\n      return this;\n    }\n  }, {\n    key: 'prepend',\n    value: function prepend() {\n      var _filters2;\n      (_filters2 = this.filters).unshift.apply(_filters2, arguments);\n      return this;\n    }\n  }, {\n    key: 'indexOf',\n    value: function indexOf(filterName) {\n      if (!filterName) {\n        throw new Error('a filter name is required');\n      }\n      for (var index = 0; index < this.filters.length; index++) {\n        var filter = this.filters[index];\n        if (filter.filterName === filterName) {\n          return index;\n        }\n      }\n      throw new Error('filter not found: ' + filterName);\n    }\n  }, {\n    key: 'list',\n    value: function list() {\n      return this.filters.map(function (f) {\n        return f.filterName;\n      });\n    }\n  }, {\n    key: 'after',\n    value: function after(filterName) {\n      var index = this.indexOf(filterName);\n      var params = Array.prototype.slice.call(arguments, 1);\n      if (!params.length) {\n        throw new Error('a filter is required');\n      }\n      params.unshift(index + 1, 0);\n      Array.prototype.splice.apply(this.filters, params);\n      return this;\n    }\n  }, {\n    key: 'before',\n    value: function before(filterName) {\n      var index = this.indexOf(filterName);\n      var params = Array.prototype.slice.call(arguments, 1);\n      if (!params.length) {\n        throw new Error('a filter is required');\n      }\n      params.unshift(index, 0);\n      Array.prototype.splice.apply(this.filters, params);\n      return this;\n    }\n  }, {\n    key: 'replace',\n    value: function replace(filterName) {\n      var index = this.indexOf(filterName);\n      var params = Array.prototype.slice.call(arguments, 1);\n      if (!params.length) {\n        throw new Error('a filter is required');\n      }\n      params.unshift(index, 1);\n      Array.prototype.splice.apply(this.filters, params);\n      return this;\n    }\n  }, {\n    key: 'remove',\n    value: function remove(filterName) {\n      var index = this.indexOf(filterName);\n      this.filters.splice(index, 1);\n      return this;\n    }\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.filters.length = 0;\n      return this;\n    }\n  }, {\n    key: 'shouldHaveResult',\n    value: function shouldHaveResult(should) {\n      if (should === false) {\n        this.resultCheck = null;\n        return;\n      }\n      if (this.resultCheck) {\n        return;\n      }\n      var pipe = this;\n      this.resultCheck = function (context) {\n        if (!context.hasResult) {\n          console.log(context);\n          var error = new Error(pipe.name + ' failed');\n          error.noResult = true;\n          throw error;\n        }\n      };\n      return this;\n    }\n  }]);\n  return Pipe;\n}();\nvar Context = function () {\n  function Context() {\n    classCallCheck(this, Context);\n  }\n  createClass(Context, [{\n    key: 'setResult',\n    value: function setResult(result) {\n      this.result = result;\n      this.hasResult = true;\n      return this;\n    }\n  }, {\n    key: 'exit',\n    value: function exit() {\n      this.exiting = true;\n      return this;\n    }\n  }, {\n    key: 'switchTo',\n    value: function switchTo(next, pipe) {\n      if (typeof next === 'string' || next instanceof Pipe) {\n        this.nextPipe = next;\n      } else {\n        this.next = next;\n        if (pipe) {\n          this.nextPipe = pipe;\n        }\n      }\n      return this;\n    }\n  }, {\n    key: 'push',\n    value: function push(child, name) {\n      child.parent = this;\n      if (typeof name !== 'undefined') {\n        child.childName = name;\n      }\n      child.root = this.root || this;\n      child.options = child.options || this.options;\n      if (!this.children) {\n        this.children = [child];\n        this.nextAfterChildren = this.next || null;\n        this.next = child;\n      } else {\n        this.children[this.children.length - 1].next = child;\n        this.children.push(child);\n      }\n      child.next = this;\n      return this;\n    }\n  }]);\n  return Context;\n}();\nvar isArray = typeof Array.isArray === 'function' ? Array.isArray : function (a) {\n  return a instanceof Array;\n};\nfunction cloneRegExp(re) {\n  var regexMatch = /^\\/(.*)\\/([gimyu]*)$/.exec(re.toString());\n  return new RegExp(regexMatch[1], regexMatch[2]);\n}\nfunction clone(arg) {\n  if ((typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) !== 'object') {\n    return arg;\n  }\n  if (arg === null) {\n    return null;\n  }\n  if (isArray(arg)) {\n    return arg.map(clone);\n  }\n  if (arg instanceof Date) {\n    return new Date(arg.getTime());\n  }\n  if (arg instanceof RegExp) {\n    return cloneRegExp(arg);\n  }\n  var cloned = {};\n  for (var name in arg) {\n    if (Object.prototype.hasOwnProperty.call(arg, name)) {\n      cloned[name] = clone(arg[name]);\n    }\n  }\n  return cloned;\n}\nvar DiffContext = function (_Context) {\n  inherits(DiffContext, _Context);\n  function DiffContext(left, right) {\n    classCallCheck(this, DiffContext);\n    var _this = possibleConstructorReturn(this, (DiffContext.__proto__ || Object.getPrototypeOf(DiffContext)).call(this));\n    _this.left = left;\n    _this.right = right;\n    _this.pipe = 'diff';\n    return _this;\n  }\n  createClass(DiffContext, [{\n    key: 'setResult',\n    value: function setResult(result) {\n      if (this.options.cloneDiffValues && (typeof result === 'undefined' ? 'undefined' : _typeof(result)) === 'object') {\n        var clone$$1 = typeof this.options.cloneDiffValues === 'function' ? this.options.cloneDiffValues : clone;\n        if (_typeof(result[0]) === 'object') {\n          result[0] = clone$$1(result[0]);\n        }\n        if (_typeof(result[1]) === 'object') {\n          result[1] = clone$$1(result[1]);\n        }\n      }\n      return Context.prototype.setResult.apply(this, arguments);\n    }\n  }]);\n  return DiffContext;\n}(Context);\nvar PatchContext = function (_Context) {\n  inherits(PatchContext, _Context);\n  function PatchContext(left, delta) {\n    classCallCheck(this, PatchContext);\n    var _this = possibleConstructorReturn(this, (PatchContext.__proto__ || Object.getPrototypeOf(PatchContext)).call(this));\n    _this.left = left;\n    _this.delta = delta;\n    _this.pipe = 'patch';\n    return _this;\n  }\n  return PatchContext;\n}(Context);\nvar ReverseContext = function (_Context) {\n  inherits(ReverseContext, _Context);\n  function ReverseContext(delta) {\n    classCallCheck(this, ReverseContext);\n    var _this = possibleConstructorReturn(this, (ReverseContext.__proto__ || Object.getPrototypeOf(ReverseContext)).call(this));\n    _this.delta = delta;\n    _this.pipe = 'reverse';\n    return _this;\n  }\n  return ReverseContext;\n}(Context);\nvar isArray$1 = typeof Array.isArray === 'function' ? Array.isArray : function (a) {\n  return a instanceof Array;\n};\nvar diffFilter = function trivialMatchesDiffFilter(context) {\n  if (context.left === context.right) {\n    context.setResult(undefined).exit();\n    return;\n  }\n  if (typeof context.left === 'undefined') {\n    if (typeof context.right === 'function') {\n      throw new Error('functions are not supported');\n    }\n    context.setResult([context.right]).exit();\n    return;\n  }\n  if (typeof context.right === 'undefined') {\n    context.setResult([context.left, 0, 0]).exit();\n    return;\n  }\n  if (typeof context.left === 'function' || typeof context.right === 'function') {\n    throw new Error('functions are not supported');\n  }\n  context.leftType = context.left === null ? 'null' : _typeof(context.left);\n  context.rightType = context.right === null ? 'null' : _typeof(context.right);\n  if (context.leftType !== context.rightType) {\n    context.setResult([context.left, context.right]).exit();\n    return;\n  }\n  if (context.leftType === 'boolean' || context.leftType === 'number') {\n    context.setResult([context.left, context.right]).exit();\n    return;\n  }\n  if (context.leftType === 'object') {\n    context.leftIsArray = isArray$1(context.left);\n  }\n  if (context.rightType === 'object') {\n    context.rightIsArray = isArray$1(context.right);\n  }\n  if (context.leftIsArray !== context.rightIsArray) {\n    context.setResult([context.left, context.right]).exit();\n    return;\n  }\n  if (context.left instanceof RegExp) {\n    if (context.right instanceof RegExp) {\n      context.setResult([context.left.toString(), context.right.toString()]).exit();\n    } else {\n      context.setResult([context.left, context.right]).exit();\n    }\n  }\n};\ndiffFilter.filterName = 'trivial';\nvar patchFilter = function trivialMatchesPatchFilter(context) {\n  if (typeof context.delta === 'undefined') {\n    context.setResult(context.left).exit();\n    return;\n  }\n  context.nested = !isArray$1(context.delta);\n  if (context.nested) {\n    return;\n  }\n  if (context.delta.length === 1) {\n    context.setResult(context.delta[0]).exit();\n    return;\n  }\n  if (context.delta.length === 2) {\n    if (context.left instanceof RegExp) {\n      var regexArgs = /^\\/(.*)\\/([gimyu]+)$/.exec(context.delta[1]);\n      if (regexArgs) {\n        context.setResult(new RegExp(regexArgs[1], regexArgs[2])).exit();\n        return;\n      }\n    }\n    context.setResult(context.delta[1]).exit();\n    return;\n  }\n  if (context.delta.length === 3 && context.delta[2] === 0) {\n    context.setResult(undefined).exit();\n  }\n};\npatchFilter.filterName = 'trivial';\nvar reverseFilter = function trivialReferseFilter(context) {\n  if (typeof context.delta === 'undefined') {\n    context.setResult(context.delta).exit();\n    return;\n  }\n  context.nested = !isArray$1(context.delta);\n  if (context.nested) {\n    return;\n  }\n  if (context.delta.length === 1) {\n    context.setResult([context.delta[0], 0, 0]).exit();\n    return;\n  }\n  if (context.delta.length === 2) {\n    context.setResult([context.delta[1], context.delta[0]]).exit();\n    return;\n  }\n  if (context.delta.length === 3 && context.delta[2] === 0) {\n    context.setResult([context.delta[0]]).exit();\n  }\n};\nreverseFilter.filterName = 'trivial';\nfunction collectChildrenDiffFilter(context) {\n  if (!context || !context.children) {\n    return;\n  }\n  var length = context.children.length;\n  var child = void 0;\n  var result = context.result;\n  for (var index = 0; index < length; index++) {\n    child = context.children[index];\n    if (typeof child.result === 'undefined') {\n      continue;\n    }\n    result = result || {};\n    result[child.childName] = child.result;\n  }\n  if (result && context.leftIsArray) {\n    result._t = 'a';\n  }\n  context.setResult(result).exit();\n}\ncollectChildrenDiffFilter.filterName = 'collectChildren';\nfunction objectsDiffFilter(context) {\n  if (context.leftIsArray || context.leftType !== 'object') {\n    return;\n  }\n  var name = void 0;\n  var child = void 0;\n  var propertyFilter = context.options.propertyFilter;\n  for (name in context.left) {\n    if (!Object.prototype.hasOwnProperty.call(context.left, name)) {\n      continue;\n    }\n    if (propertyFilter && !propertyFilter(name, context)) {\n      continue;\n    }\n    child = new DiffContext(context.left[name], context.right[name]);\n    context.push(child, name);\n  }\n  for (name in context.right) {\n    if (!Object.prototype.hasOwnProperty.call(context.right, name)) {\n      continue;\n    }\n    if (propertyFilter && !propertyFilter(name, context)) {\n      continue;\n    }\n    if (typeof context.left[name] === 'undefined') {\n      child = new DiffContext(undefined, context.right[name]);\n      context.push(child, name);\n    }\n  }\n  if (!context.children || context.children.length === 0) {\n    context.setResult(undefined).exit();\n    return;\n  }\n  context.exit();\n}\nobjectsDiffFilter.filterName = 'objects';\nvar patchFilter$1 = function nestedPatchFilter(context) {\n  if (!context.nested) {\n    return;\n  }\n  if (context.delta._t) {\n    return;\n  }\n  var name = void 0;\n  var child = void 0;\n  for (name in context.delta) {\n    child = new PatchContext(context.left[name], context.delta[name]);\n    context.push(child, name);\n  }\n  context.exit();\n};\npatchFilter$1.filterName = 'objects';\nvar collectChildrenPatchFilter = function collectChildrenPatchFilter(context) {\n  if (!context || !context.children) {\n    return;\n  }\n  if (context.delta._t) {\n    return;\n  }\n  var length = context.children.length;\n  var child = void 0;\n  for (var index = 0; index < length; index++) {\n    child = context.children[index];\n    if (Object.prototype.hasOwnProperty.call(context.left, child.childName) && child.result === undefined) {\n      delete context.left[child.childName];\n    } else if (context.left[child.childName] !== child.result) {\n      context.left[child.childName] = child.result;\n    }\n  }\n  context.setResult(context.left).exit();\n};\ncollectChildrenPatchFilter.filterName = 'collectChildren';\nvar reverseFilter$1 = function nestedReverseFilter(context) {\n  if (!context.nested) {\n    return;\n  }\n  if (context.delta._t) {\n    return;\n  }\n  var name = void 0;\n  var child = void 0;\n  for (name in context.delta) {\n    child = new ReverseContext(context.delta[name]);\n    context.push(child, name);\n  }\n  context.exit();\n};\nreverseFilter$1.filterName = 'objects';\nfunction collectChildrenReverseFilter(context) {\n  if (!context || !context.children) {\n    return;\n  }\n  if (context.delta._t) {\n    return;\n  }\n  var length = context.children.length;\n  var child = void 0;\n  var delta = {};\n  for (var index = 0; index < length; index++) {\n    child = context.children[index];\n    if (delta[child.childName] !== child.result) {\n      delta[child.childName] = child.result;\n    }\n  }\n  context.setResult(delta).exit();\n}\ncollectChildrenReverseFilter.filterName = 'collectChildren';\n/*\n\nLCS implementation that supports arrays or strings\n\nreference: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem\n\n*/\nvar defaultMatch = function defaultMatch(array1, array2, index1, index2) {\n  return array1[index1] === array2[index2];\n};\nvar lengthMatrix = function lengthMatrix(array1, array2, match, context) {\n  var len1 = array1.length;\n  var len2 = array2.length;\n  var x = void 0,\n    y = void 0;\n  // initialize empty matrix of len1+1 x len2+1\n  var matrix = [len1 + 1];\n  for (x = 0; x < len1 + 1; x++) {\n    matrix[x] = [len2 + 1];\n    for (y = 0; y < len2 + 1; y++) {\n      matrix[x][y] = 0;\n    }\n  }\n  matrix.match = match;\n  // save sequence lengths for each coordinate\n  for (x = 1; x < len1 + 1; x++) {\n    for (y = 1; y < len2 + 1; y++) {\n      if (match(array1, array2, x - 1, y - 1, context)) {\n        matrix[x][y] = matrix[x - 1][y - 1] + 1;\n      } else {\n        matrix[x][y] = Math.max(matrix[x - 1][y], matrix[x][y - 1]);\n      }\n    }\n  }\n  return matrix;\n};\nvar backtrack = function backtrack(matrix, array1, array2, context) {\n  var index1 = array1.length;\n  var index2 = array2.length;\n  var subsequence = {\n    sequence: [],\n    indices1: [],\n    indices2: []\n  };\n  while (index1 !== 0 && index2 !== 0) {\n    var sameLetter = matrix.match(array1, array2, index1 - 1, index2 - 1, context);\n    if (sameLetter) {\n      subsequence.sequence.unshift(array1[index1 - 1]);\n      subsequence.indices1.unshift(index1 - 1);\n      subsequence.indices2.unshift(index2 - 1);\n      --index1;\n      --index2;\n    } else {\n      var valueAtMatrixAbove = matrix[index1][index2 - 1];\n      var valueAtMatrixLeft = matrix[index1 - 1][index2];\n      if (valueAtMatrixAbove > valueAtMatrixLeft) {\n        --index2;\n      } else {\n        --index1;\n      }\n    }\n  }\n  return subsequence;\n};\nvar get$1 = function get(array1, array2, match, context) {\n  var innerContext = context || {};\n  var matrix = lengthMatrix(array1, array2, match || defaultMatch, innerContext);\n  var result = backtrack(matrix, array1, array2, innerContext);\n  if (typeof array1 === 'string' && typeof array2 === 'string') {\n    result.sequence = result.sequence.join('');\n  }\n  return result;\n};\nvar lcs = {\n  get: get$1\n};\nvar ARRAY_MOVE = 3;\nvar isArray$2 = typeof Array.isArray === 'function' ? Array.isArray : function (a) {\n  return a instanceof Array;\n};\nvar arrayIndexOf = typeof Array.prototype.indexOf === 'function' ? function (array, item) {\n  return array.indexOf(item);\n} : function (array, item) {\n  var length = array.length;\n  for (var i = 0; i < length; i++) {\n    if (array[i] === item) {\n      return i;\n    }\n  }\n  return -1;\n};\nfunction arraysHaveMatchByRef(array1, array2, len1, len2) {\n  for (var index1 = 0; index1 < len1; index1++) {\n    var val1 = array1[index1];\n    for (var index2 = 0; index2 < len2; index2++) {\n      var val2 = array2[index2];\n      if (index1 !== index2 && val1 === val2) {\n        return true;\n      }\n    }\n  }\n}\nfunction matchItems(array1, array2, index1, index2, context) {\n  var value1 = array1[index1];\n  var value2 = array2[index2];\n  if (value1 === value2) {\n    return true;\n  }\n  if ((typeof value1 === 'undefined' ? 'undefined' : _typeof(value1)) !== 'object' || (typeof value2 === 'undefined' ? 'undefined' : _typeof(value2)) !== 'object') {\n    return false;\n  }\n  var objectHash = context.objectHash;\n  if (!objectHash) {\n    // no way to match objects was provided, try match by position\n    return context.matchByPosition && index1 === index2;\n  }\n  var hash1 = void 0;\n  var hash2 = void 0;\n  if (typeof index1 === 'number') {\n    context.hashCache1 = context.hashCache1 || [];\n    hash1 = context.hashCache1[index1];\n    if (typeof hash1 === 'undefined') {\n      context.hashCache1[index1] = hash1 = objectHash(value1, index1);\n    }\n  } else {\n    hash1 = objectHash(value1);\n  }\n  if (typeof hash1 === 'undefined') {\n    return false;\n  }\n  if (typeof index2 === 'number') {\n    context.hashCache2 = context.hashCache2 || [];\n    hash2 = context.hashCache2[index2];\n    if (typeof hash2 === 'undefined') {\n      context.hashCache2[index2] = hash2 = objectHash(value2, index2);\n    }\n  } else {\n    hash2 = objectHash(value2);\n  }\n  if (typeof hash2 === 'undefined') {\n    return false;\n  }\n  return hash1 === hash2;\n}\nvar diffFilter$1 = function arraysDiffFilter(context) {\n  if (!context.leftIsArray) {\n    return;\n  }\n  var matchContext = {\n    objectHash: context.options && context.options.objectHash,\n    matchByPosition: context.options && context.options.matchByPosition\n  };\n  var commonHead = 0;\n  var commonTail = 0;\n  var index = void 0;\n  var index1 = void 0;\n  var index2 = void 0;\n  var array1 = context.left;\n  var array2 = context.right;\n  var len1 = array1.length;\n  var len2 = array2.length;\n  var child = void 0;\n  if (len1 > 0 && len2 > 0 && !matchContext.objectHash && typeof matchContext.matchByPosition !== 'boolean') {\n    matchContext.matchByPosition = !arraysHaveMatchByRef(array1, array2, len1, len2);\n  }\n  // separate common head\n  while (commonHead < len1 && commonHead < len2 && matchItems(array1, array2, commonHead, commonHead, matchContext)) {\n    index = commonHead;\n    child = new DiffContext(context.left[index], context.right[index]);\n    context.push(child, index);\n    commonHead++;\n  }\n  // separate common tail\n  while (commonTail + commonHead < len1 && commonTail + commonHead < len2 && matchItems(array1, array2, len1 - 1 - commonTail, len2 - 1 - commonTail, matchContext)) {\n    index1 = len1 - 1 - commonTail;\n    index2 = len2 - 1 - commonTail;\n    child = new DiffContext(context.left[index1], context.right[index2]);\n    context.push(child, index2);\n    commonTail++;\n  }\n  var result = void 0;\n  if (commonHead + commonTail === len1) {\n    if (len1 === len2) {\n      // arrays are identical\n      context.setResult(undefined).exit();\n      return;\n    }\n    // trivial case, a block (1 or more consecutive items) was added\n    result = result || {\n      _t: 'a'\n    };\n    for (index = commonHead; index < len2 - commonTail; index++) {\n      result[index] = [array2[index]];\n    }\n    context.setResult(result).exit();\n    return;\n  }\n  if (commonHead + commonTail === len2) {\n    // trivial case, a block (1 or more consecutive items) was removed\n    result = result || {\n      _t: 'a'\n    };\n    for (index = commonHead; index < len1 - commonTail; index++) {\n      result['_' + index] = [array1[index], 0, 0];\n    }\n    context.setResult(result).exit();\n    return;\n  }\n  // reset hash cache\n  delete matchContext.hashCache1;\n  delete matchContext.hashCache2;\n  // diff is not trivial, find the LCS (Longest Common Subsequence)\n  var trimmed1 = array1.slice(commonHead, len1 - commonTail);\n  var trimmed2 = array2.slice(commonHead, len2 - commonTail);\n  var seq = lcs.get(trimmed1, trimmed2, matchItems, matchContext);\n  var removedItems = [];\n  result = result || {\n    _t: 'a'\n  };\n  for (index = commonHead; index < len1 - commonTail; index++) {\n    if (arrayIndexOf(seq.indices1, index - commonHead) < 0) {\n      // removed\n      result['_' + index] = [array1[index], 0, 0];\n      removedItems.push(index);\n    }\n  }\n  var detectMove = true;\n  if (context.options && context.options.arrays && context.options.arrays.detectMove === false) {\n    detectMove = false;\n  }\n  var includeValueOnMove = false;\n  if (context.options && context.options.arrays && context.options.arrays.includeValueOnMove) {\n    includeValueOnMove = true;\n  }\n  var removedItemsLength = removedItems.length;\n  for (index = commonHead; index < len2 - commonTail; index++) {\n    var indexOnArray2 = arrayIndexOf(seq.indices2, index - commonHead);\n    if (indexOnArray2 < 0) {\n      // added, try to match with a removed item and register as position move\n      var isMove = false;\n      if (detectMove && removedItemsLength > 0) {\n        for (var removeItemIndex1 = 0; removeItemIndex1 < removedItemsLength; removeItemIndex1++) {\n          index1 = removedItems[removeItemIndex1];\n          if (matchItems(trimmed1, trimmed2, index1 - commonHead, index - commonHead, matchContext)) {\n            // store position move as: [originalValue, newPosition, ARRAY_MOVE]\n            result['_' + index1].splice(1, 2, index, ARRAY_MOVE);\n            if (!includeValueOnMove) {\n              // don't include moved value on diff, to save bytes\n              result['_' + index1][0] = '';\n            }\n            index2 = index;\n            child = new DiffContext(context.left[index1], context.right[index2]);\n            context.push(child, index2);\n            removedItems.splice(removeItemIndex1, 1);\n            isMove = true;\n            break;\n          }\n        }\n      }\n      if (!isMove) {\n        // added\n        result[index] = [array2[index]];\n      }\n    } else {\n      // match, do inner diff\n      index1 = seq.indices1[indexOnArray2] + commonHead;\n      index2 = seq.indices2[indexOnArray2] + commonHead;\n      child = new DiffContext(context.left[index1], context.right[index2]);\n      context.push(child, index2);\n    }\n  }\n  context.setResult(result).exit();\n};\ndiffFilter$1.filterName = 'arrays';\nvar compare = {\n  numerically: function numerically(a, b) {\n    return a - b;\n  },\n  numericallyBy: function numericallyBy(name) {\n    return function (a, b) {\n      return a[name] - b[name];\n    };\n  }\n};\nvar patchFilter$2 = function nestedPatchFilter(context) {\n  if (!context.nested) {\n    return;\n  }\n  if (context.delta._t !== 'a') {\n    return;\n  }\n  var index = void 0;\n  var index1 = void 0;\n  var delta = context.delta;\n  var array = context.left;\n  // first, separate removals, insertions and modifications\n  var toRemove = [];\n  var toInsert = [];\n  var toModify = [];\n  for (index in delta) {\n    if (index !== '_t') {\n      if (index[0] === '_') {\n        // removed item from original array\n        if (delta[index][2] === 0 || delta[index][2] === ARRAY_MOVE) {\n          toRemove.push(parseInt(index.slice(1), 10));\n        } else {\n          throw new Error('only removal or move can be applied at original array indices,' + (' invalid diff type: ' + delta[index][2]));\n        }\n      } else {\n        if (delta[index].length === 1) {\n          // added item at new array\n          toInsert.push({\n            index: parseInt(index, 10),\n            value: delta[index][0]\n          });\n        } else {\n          // modified item at new array\n          toModify.push({\n            index: parseInt(index, 10),\n            delta: delta[index]\n          });\n        }\n      }\n    }\n  }\n  // remove items, in reverse order to avoid sawing our own floor\n  toRemove = toRemove.sort(compare.numerically);\n  for (index = toRemove.length - 1; index >= 0; index--) {\n    index1 = toRemove[index];\n    var indexDiff = delta['_' + index1];\n    var removedValue = array.splice(index1, 1)[0];\n    if (indexDiff[2] === ARRAY_MOVE) {\n      // reinsert later\n      toInsert.push({\n        index: indexDiff[1],\n        value: removedValue\n      });\n    }\n  }\n  // insert items, in reverse order to avoid moving our own floor\n  toInsert = toInsert.sort(compare.numericallyBy('index'));\n  var toInsertLength = toInsert.length;\n  for (index = 0; index < toInsertLength; index++) {\n    var insertion = toInsert[index];\n    array.splice(insertion.index, 0, insertion.value);\n  }\n  // apply modifications\n  var toModifyLength = toModify.length;\n  var child = void 0;\n  if (toModifyLength > 0) {\n    for (index = 0; index < toModifyLength; index++) {\n      var modification = toModify[index];\n      child = new PatchContext(context.left[modification.index], modification.delta);\n      context.push(child, modification.index);\n    }\n  }\n  if (!context.children) {\n    context.setResult(context.left).exit();\n    return;\n  }\n  context.exit();\n};\npatchFilter$2.filterName = 'arrays';\nvar collectChildrenPatchFilter$1 = function collectChildrenPatchFilter(context) {\n  if (!context || !context.children) {\n    return;\n  }\n  if (context.delta._t !== 'a') {\n    return;\n  }\n  var length = context.children.length;\n  var child = void 0;\n  for (var index = 0; index < length; index++) {\n    child = context.children[index];\n    context.left[child.childName] = child.result;\n  }\n  context.setResult(context.left).exit();\n};\ncollectChildrenPatchFilter$1.filterName = 'arraysCollectChildren';\nvar reverseFilter$2 = function arraysReverseFilter(context) {\n  if (!context.nested) {\n    if (context.delta[2] === ARRAY_MOVE) {\n      context.newName = '_' + context.delta[1];\n      context.setResult([context.delta[0], parseInt(context.childName.substr(1), 10), ARRAY_MOVE]).exit();\n    }\n    return;\n  }\n  if (context.delta._t !== 'a') {\n    return;\n  }\n  var name = void 0;\n  var child = void 0;\n  for (name in context.delta) {\n    if (name === '_t') {\n      continue;\n    }\n    child = new ReverseContext(context.delta[name]);\n    context.push(child, name);\n  }\n  context.exit();\n};\nreverseFilter$2.filterName = 'arrays';\nvar reverseArrayDeltaIndex = function reverseArrayDeltaIndex(delta, index, itemDelta) {\n  if (typeof index === 'string' && index[0] === '_') {\n    return parseInt(index.substr(1), 10);\n  } else if (isArray$2(itemDelta) && itemDelta[2] === 0) {\n    return '_' + index;\n  }\n  var reverseIndex = +index;\n  for (var deltaIndex in delta) {\n    var deltaItem = delta[deltaIndex];\n    if (isArray$2(deltaItem)) {\n      if (deltaItem[2] === ARRAY_MOVE) {\n        var moveFromIndex = parseInt(deltaIndex.substr(1), 10);\n        var moveToIndex = deltaItem[1];\n        if (moveToIndex === +index) {\n          return moveFromIndex;\n        }\n        if (moveFromIndex <= reverseIndex && moveToIndex > reverseIndex) {\n          reverseIndex++;\n        } else if (moveFromIndex >= reverseIndex && moveToIndex < reverseIndex) {\n          reverseIndex--;\n        }\n      } else if (deltaItem[2] === 0) {\n        var deleteIndex = parseInt(deltaIndex.substr(1), 10);\n        if (deleteIndex <= reverseIndex) {\n          reverseIndex++;\n        }\n      } else if (deltaItem.length === 1 && deltaIndex <= reverseIndex) {\n        reverseIndex--;\n      }\n    }\n  }\n  return reverseIndex;\n};\nfunction collectChildrenReverseFilter$1(context) {\n  if (!context || !context.children) {\n    return;\n  }\n  if (context.delta._t !== 'a') {\n    return;\n  }\n  var length = context.children.length;\n  var child = void 0;\n  var delta = {\n    _t: 'a'\n  };\n  for (var index = 0; index < length; index++) {\n    child = context.children[index];\n    var name = child.newName;\n    if (typeof name === 'undefined') {\n      name = reverseArrayDeltaIndex(context.delta, child.childName, child.result);\n    }\n    if (delta[name] !== child.result) {\n      delta[name] = child.result;\n    }\n  }\n  context.setResult(delta).exit();\n}\ncollectChildrenReverseFilter$1.filterName = 'arraysCollectChildren';\nvar diffFilter$2 = function datesDiffFilter(context) {\n  if (context.left instanceof Date) {\n    if (context.right instanceof Date) {\n      if (context.left.getTime() !== context.right.getTime()) {\n        context.setResult([context.left, context.right]);\n      } else {\n        context.setResult(undefined);\n      }\n    } else {\n      context.setResult([context.left, context.right]);\n    }\n    context.exit();\n  } else if (context.right instanceof Date) {\n    context.setResult([context.left, context.right]).exit();\n  }\n};\ndiffFilter$2.filterName = 'dates';\n/* global diff_match_patch */\nvar TEXT_DIFF = 2;\nvar DEFAULT_MIN_LENGTH = 60;\nvar cachedDiffPatch = null;\nvar getDiffMatchPatch = function getDiffMatchPatch(required) {\n  /* jshint camelcase: false */\n  if (!cachedDiffPatch) {\n    var instance = void 0;\n    /* eslint-disable camelcase, new-cap */\n    if (typeof diff_match_patch !== 'undefined') {\n      // already loaded, probably a browser\n      instance = typeof diff_match_patch === 'function' ? new diff_match_patch() : new diff_match_patch.diff_match_patch();\n    } else if (dmp) {\n      try {\n        instance = dmp && new dmp();\n      } catch (err) {\n        instance = null;\n      }\n    }\n    /* eslint-enable camelcase, new-cap */\n    if (!instance) {\n      if (!required) {\n        return null;\n      }\n      var error = new Error('text diff_match_patch library not found');\n      // eslint-disable-next-line camelcase\n      error.diff_match_patch_not_found = true;\n      throw error;\n    }\n    cachedDiffPatch = {\n      diff: function diff(txt1, txt2) {\n        return instance.patch_toText(instance.patch_make(txt1, txt2));\n      },\n      patch: function patch(txt1, _patch) {\n        var results = instance.patch_apply(instance.patch_fromText(_patch), txt1);\n        for (var i = 0; i < results[1].length; i++) {\n          if (!results[1][i]) {\n            var _error = new Error('text patch failed');\n            _error.textPatchFailed = true;\n          }\n        }\n        return results[0];\n      }\n    };\n  }\n  return cachedDiffPatch;\n};\nvar diffFilter$3 = function textsDiffFilter(context) {\n  if (context.leftType !== 'string') {\n    return;\n  }\n  var minLength = context.options && context.options.textDiff && context.options.textDiff.minLength || DEFAULT_MIN_LENGTH;\n  if (context.left.length < minLength || context.right.length < minLength) {\n    context.setResult([context.left, context.right]).exit();\n    return;\n  }\n  // large text, try to use a text-diff algorithm\n  var diffMatchPatch = getDiffMatchPatch();\n  if (!diffMatchPatch) {\n    // diff-match-patch library not available,\n    // fallback to regular string replace\n    context.setResult([context.left, context.right]).exit();\n    return;\n  }\n  var diff = diffMatchPatch.diff;\n  context.setResult([diff(context.left, context.right), 0, TEXT_DIFF]).exit();\n};\ndiffFilter$3.filterName = 'texts';\nvar patchFilter$3 = function textsPatchFilter(context) {\n  if (context.nested) {\n    return;\n  }\n  if (context.delta[2] !== TEXT_DIFF) {\n    return;\n  }\n  // text-diff, use a text-patch algorithm\n  var patch = getDiffMatchPatch(true).patch;\n  context.setResult(patch(context.left, context.delta[0])).exit();\n};\npatchFilter$3.filterName = 'texts';\nvar textDeltaReverse = function textDeltaReverse(delta) {\n  var i = void 0;\n  var l = void 0;\n  var lines = void 0;\n  var line = void 0;\n  var lineTmp = void 0;\n  var header = null;\n  var headerRegex = /^@@ +-(\\d+),(\\d+) +\\+(\\d+),(\\d+) +@@$/;\n  var lineHeader = void 0;\n  lines = delta.split('\\n');\n  for (i = 0, l = lines.length; i < l; i++) {\n    line = lines[i];\n    var lineStart = line.slice(0, 1);\n    if (lineStart === '@') {\n      header = headerRegex.exec(line);\n      lineHeader = i;\n      // fix header\n      lines[lineHeader] = '@@ -' + header[3] + ',' + header[4] + ' +' + header[1] + ',' + header[2] + ' @@';\n    } else if (lineStart === '+') {\n      lines[i] = '-' + lines[i].slice(1);\n      if (lines[i - 1].slice(0, 1) === '+') {\n        // swap lines to keep default order (-+)\n        lineTmp = lines[i];\n        lines[i] = lines[i - 1];\n        lines[i - 1] = lineTmp;\n      }\n    } else if (lineStart === '-') {\n      lines[i] = '+' + lines[i].slice(1);\n    }\n  }\n  return lines.join('\\n');\n};\nvar reverseFilter$3 = function textsReverseFilter(context) {\n  if (context.nested) {\n    return;\n  }\n  if (context.delta[2] !== TEXT_DIFF) {\n    return;\n  }\n  // text-diff, use a text-diff algorithm\n  context.setResult([textDeltaReverse(context.delta[0]), 0, TEXT_DIFF]).exit();\n};\nreverseFilter$3.filterName = 'texts';\nvar DiffPatcher = function () {\n  function DiffPatcher(options) {\n    classCallCheck(this, DiffPatcher);\n    this.processor = new Processor(options);\n    this.processor.pipe(new Pipe('diff').append(collectChildrenDiffFilter, diffFilter, diffFilter$2, diffFilter$3, objectsDiffFilter, diffFilter$1).shouldHaveResult());\n    this.processor.pipe(new Pipe('patch').append(collectChildrenPatchFilter, collectChildrenPatchFilter$1, patchFilter, patchFilter$3, patchFilter$1, patchFilter$2).shouldHaveResult());\n    this.processor.pipe(new Pipe('reverse').append(collectChildrenReverseFilter, collectChildrenReverseFilter$1, reverseFilter, reverseFilter$3, reverseFilter$1, reverseFilter$2).shouldHaveResult());\n  }\n  createClass(DiffPatcher, [{\n    key: 'options',\n    value: function options() {\n      var _processor;\n      return (_processor = this.processor).options.apply(_processor, arguments);\n    }\n  }, {\n    key: 'diff',\n    value: function diff(left, right) {\n      return this.processor.process(new DiffContext(left, right));\n    }\n  }, {\n    key: 'patch',\n    value: function patch(left, delta) {\n      return this.processor.process(new PatchContext(left, delta));\n    }\n  }, {\n    key: 'reverse',\n    value: function reverse(delta) {\n      return this.processor.process(new ReverseContext(delta));\n    }\n  }, {\n    key: 'unpatch',\n    value: function unpatch(right, delta) {\n      return this.patch(right, this.reverse(delta));\n    }\n  }, {\n    key: 'clone',\n    value: function clone$$1(value) {\n      return clone(value);\n    }\n  }]);\n  return DiffPatcher;\n}();\nvar isArray$3 = typeof Array.isArray === 'function' ? Array.isArray : function (a) {\n  return a instanceof Array;\n};\nvar getObjectKeys = typeof Object.keys === 'function' ? function (obj) {\n  return Object.keys(obj);\n} : function (obj) {\n  var names = [];\n  for (var property in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, property)) {\n      names.push(property);\n    }\n  }\n  return names;\n};\nvar trimUnderscore = function trimUnderscore(str) {\n  if (str.substr(0, 1) === '_') {\n    return str.slice(1);\n  }\n  return str;\n};\nvar arrayKeyToSortNumber = function arrayKeyToSortNumber(key) {\n  if (key === '_t') {\n    return -1;\n  } else {\n    if (key.substr(0, 1) === '_') {\n      return parseInt(key.slice(1), 10);\n    } else {\n      return parseInt(key, 10) + 0.1;\n    }\n  }\n};\nvar arrayKeyComparer = function arrayKeyComparer(key1, key2) {\n  return arrayKeyToSortNumber(key1) - arrayKeyToSortNumber(key2);\n};\nvar BaseFormatter = function () {\n  function BaseFormatter() {\n    classCallCheck(this, BaseFormatter);\n  }\n  createClass(BaseFormatter, [{\n    key: 'format',\n    value: function format(delta, left) {\n      var context = {};\n      this.prepareContext(context);\n      this.recurse(context, delta, left);\n      return this.finalize(context);\n    }\n  }, {\n    key: 'prepareContext',\n    value: function prepareContext(context) {\n      context.buffer = [];\n      context.out = function () {\n        var _buffer;\n        (_buffer = this.buffer).push.apply(_buffer, arguments);\n      };\n    }\n  }, {\n    key: 'typeFormattterNotFound',\n    value: function typeFormattterNotFound(context, deltaType) {\n      throw new Error('cannot format delta type: ' + deltaType);\n    }\n  }, {\n    key: 'typeFormattterErrorFormatter',\n    value: function typeFormattterErrorFormatter(context, err) {\n      return err.toString();\n    }\n  }, {\n    key: 'finalize',\n    value: function finalize(_ref) {\n      var buffer = _ref.buffer;\n      if (isArray$3(buffer)) {\n        return buffer.join('');\n      }\n    }\n  }, {\n    key: 'recurse',\n    value: function recurse(context, delta, left, key, leftKey, movedFrom, isLast) {\n      var useMoveOriginHere = delta && movedFrom;\n      var leftValue = useMoveOriginHere ? movedFrom.value : left;\n      if (typeof delta === 'undefined' && typeof key === 'undefined') {\n        return undefined;\n      }\n      var type = this.getDeltaType(delta, movedFrom);\n      var nodeType = type === 'node' ? delta._t === 'a' ? 'array' : 'object' : '';\n      if (typeof key !== 'undefined') {\n        this.nodeBegin(context, key, leftKey, type, nodeType, isLast);\n      } else {\n        this.rootBegin(context, type, nodeType);\n      }\n      var typeFormattter = void 0;\n      try {\n        typeFormattter = this['format_' + type] || this.typeFormattterNotFound(context, type);\n        typeFormattter.call(this, context, delta, leftValue, key, leftKey, movedFrom);\n      } catch (err) {\n        this.typeFormattterErrorFormatter(context, err, delta, leftValue, key, leftKey, movedFrom);\n        if (typeof console !== 'undefined' && console.error) {\n          console.error(err.stack);\n        }\n      }\n      if (typeof key !== 'undefined') {\n        this.nodeEnd(context, key, leftKey, type, nodeType, isLast);\n      } else {\n        this.rootEnd(context, type, nodeType);\n      }\n    }\n  }, {\n    key: 'formatDeltaChildren',\n    value: function formatDeltaChildren(context, delta, left) {\n      var self = this;\n      this.forEachDeltaKey(delta, left, function (key, leftKey, movedFrom, isLast) {\n        self.recurse(context, delta[key], left ? left[leftKey] : undefined, key, leftKey, movedFrom, isLast);\n      });\n    }\n  }, {\n    key: 'forEachDeltaKey',\n    value: function forEachDeltaKey(delta, left, fn) {\n      var keys = getObjectKeys(delta);\n      var arrayKeys = delta._t === 'a';\n      var moveDestinations = {};\n      var name = void 0;\n      if (typeof left !== 'undefined') {\n        for (name in left) {\n          if (Object.prototype.hasOwnProperty.call(left, name)) {\n            if (typeof delta[name] === 'undefined' && (!arrayKeys || typeof delta['_' + name] === 'undefined')) {\n              keys.push(name);\n            }\n          }\n        }\n      }\n      // look for move destinations\n      for (name in delta) {\n        if (Object.prototype.hasOwnProperty.call(delta, name)) {\n          var value = delta[name];\n          if (isArray$3(value) && value[2] === 3) {\n            moveDestinations[value[1].toString()] = {\n              key: name,\n              value: left && left[parseInt(name.substr(1))]\n            };\n            if (this.includeMoveDestinations !== false) {\n              if (typeof left === 'undefined' && typeof delta[value[1]] === 'undefined') {\n                keys.push(value[1].toString());\n              }\n            }\n          }\n        }\n      }\n      if (arrayKeys) {\n        keys.sort(arrayKeyComparer);\n      } else {\n        keys.sort();\n      }\n      for (var index = 0, length = keys.length; index < length; index++) {\n        var key = keys[index];\n        if (arrayKeys && key === '_t') {\n          continue;\n        }\n        var leftKey = arrayKeys ? typeof key === 'number' ? key : parseInt(trimUnderscore(key), 10) : key;\n        var isLast = index === length - 1;\n        fn(key, leftKey, moveDestinations[leftKey], isLast);\n      }\n    }\n  }, {\n    key: 'getDeltaType',\n    value: function getDeltaType(delta, movedFrom) {\n      if (typeof delta === 'undefined') {\n        if (typeof movedFrom !== 'undefined') {\n          return 'movedestination';\n        }\n        return 'unchanged';\n      }\n      if (isArray$3(delta)) {\n        if (delta.length === 1) {\n          return 'added';\n        }\n        if (delta.length === 2) {\n          return 'modified';\n        }\n        if (delta.length === 3 && delta[2] === 0) {\n          return 'deleted';\n        }\n        if (delta.length === 3 && delta[2] === 2) {\n          return 'textdiff';\n        }\n        if (delta.length === 3 && delta[2] === 3) {\n          return 'moved';\n        }\n      } else if ((typeof delta === 'undefined' ? 'undefined' : _typeof(delta)) === 'object') {\n        return 'node';\n      }\n      return 'unknown';\n    }\n  }, {\n    key: 'parseTextDiff',\n    value: function parseTextDiff(value) {\n      var output = [];\n      var lines = value.split('\\n@@ ');\n      for (var i = 0, l = lines.length; i < l; i++) {\n        var line = lines[i];\n        var lineOutput = {\n          pieces: []\n        };\n        var location = /^(?:@@ )?[-+]?(\\d+),(\\d+)/.exec(line).slice(1);\n        lineOutput.location = {\n          line: location[0],\n          chr: location[1]\n        };\n        var pieces = line.split('\\n').slice(1);\n        for (var pieceIndex = 0, piecesLength = pieces.length; pieceIndex < piecesLength; pieceIndex++) {\n          var piece = pieces[pieceIndex];\n          if (!piece.length) {\n            continue;\n          }\n          var pieceOutput = {\n            type: 'context'\n          };\n          if (piece.substr(0, 1) === '+') {\n            pieceOutput.type = 'added';\n          } else if (piece.substr(0, 1) === '-') {\n            pieceOutput.type = 'deleted';\n          }\n          pieceOutput.text = piece.slice(1);\n          lineOutput.pieces.push(pieceOutput);\n        }\n        output.push(lineOutput);\n      }\n      return output;\n    }\n  }]);\n  return BaseFormatter;\n}();\n(function (_BaseFormatter) {\n  inherits(HtmlFormatter, _BaseFormatter);\n  function HtmlFormatter() {\n    classCallCheck(this, HtmlFormatter);\n    return possibleConstructorReturn(this, (HtmlFormatter.__proto__ || Object.getPrototypeOf(HtmlFormatter)).apply(this, arguments));\n  }\n  createClass(HtmlFormatter, [{\n    key: 'typeFormattterErrorFormatter',\n    value: function typeFormattterErrorFormatter(context, err) {\n      context.out('<pre class=\"jsondiffpatch-error\">' + err + '</pre>');\n    }\n  }, {\n    key: 'formatValue',\n    value: function formatValue(context, value) {\n      context.out('<pre>' + htmlEscape(JSON.stringify(value, null, 2)) + '</pre>');\n    }\n  }, {\n    key: 'formatTextDiffString',\n    value: function formatTextDiffString(context, value) {\n      var lines = this.parseTextDiff(value);\n      context.out('<ul class=\"jsondiffpatch-textdiff\">');\n      for (var i = 0, l = lines.length; i < l; i++) {\n        var line = lines[i];\n        context.out('<li><div class=\"jsondiffpatch-textdiff-location\">' + ('<span class=\"jsondiffpatch-textdiff-line-number\">' + line.location.line + '</span><span class=\"jsondiffpatch-textdiff-char\">' + line.location.chr + '</span></div><div class=\"jsondiffpatch-textdiff-line\">'));\n        var pieces = line.pieces;\n        for (var pieceIndex = 0, piecesLength = pieces.length; pieceIndex < piecesLength; pieceIndex++) {\n          /* global decodeURI */\n          var piece = pieces[pieceIndex];\n          context.out('<span class=\"jsondiffpatch-textdiff-' + piece.type + '\">' + htmlEscape(decodeURI(piece.text)) + '</span>');\n        }\n        context.out('</div></li>');\n      }\n      context.out('</ul>');\n    }\n  }, {\n    key: 'rootBegin',\n    value: function rootBegin(context, type, nodeType) {\n      var nodeClass = 'jsondiffpatch-' + type + (nodeType ? ' jsondiffpatch-child-node-type-' + nodeType : '');\n      context.out('<div class=\"jsondiffpatch-delta ' + nodeClass + '\">');\n    }\n  }, {\n    key: 'rootEnd',\n    value: function rootEnd(context) {\n      context.out('</div>' + (context.hasArrows ? '<script type=\"text/javascript\">setTimeout(' + (adjustArrows.toString() + ',10);</script>') : ''));\n    }\n  }, {\n    key: 'nodeBegin',\n    value: function nodeBegin(context, key, leftKey, type, nodeType) {\n      var nodeClass = 'jsondiffpatch-' + type + (nodeType ? ' jsondiffpatch-child-node-type-' + nodeType : '');\n      context.out('<li class=\"' + nodeClass + '\" data-key=\"' + leftKey + '\">' + ('<div class=\"jsondiffpatch-property-name\">' + leftKey + '</div>'));\n    }\n  }, {\n    key: 'nodeEnd',\n    value: function nodeEnd(context) {\n      context.out('</li>');\n    }\n    /* jshint camelcase: false */\n    /* eslint-disable camelcase */\n  }, {\n    key: 'format_unchanged',\n    value: function format_unchanged(context, delta, left) {\n      if (typeof left === 'undefined') {\n        return;\n      }\n      context.out('<div class=\"jsondiffpatch-value\">');\n      this.formatValue(context, left);\n      context.out('</div>');\n    }\n  }, {\n    key: 'format_movedestination',\n    value: function format_movedestination(context, delta, left) {\n      if (typeof left === 'undefined') {\n        return;\n      }\n      context.out('<div class=\"jsondiffpatch-value\">');\n      this.formatValue(context, left);\n      context.out('</div>');\n    }\n  }, {\n    key: 'format_node',\n    value: function format_node(context, delta, left) {\n      // recurse\n      var nodeType = delta._t === 'a' ? 'array' : 'object';\n      context.out('<ul class=\"jsondiffpatch-node jsondiffpatch-node-type-' + nodeType + '\">');\n      this.formatDeltaChildren(context, delta, left);\n      context.out('</ul>');\n    }\n  }, {\n    key: 'format_added',\n    value: function format_added(context, delta) {\n      context.out('<div class=\"jsondiffpatch-value\">');\n      this.formatValue(context, delta[0]);\n      context.out('</div>');\n    }\n  }, {\n    key: 'format_modified',\n    value: function format_modified(context, delta) {\n      context.out('<div class=\"jsondiffpatch-value jsondiffpatch-left-value\">');\n      this.formatValue(context, delta[0]);\n      context.out('</div>' + '<div class=\"jsondiffpatch-value jsondiffpatch-right-value\">');\n      this.formatValue(context, delta[1]);\n      context.out('</div>');\n    }\n  }, {\n    key: 'format_deleted',\n    value: function format_deleted(context, delta) {\n      context.out('<div class=\"jsondiffpatch-value\">');\n      this.formatValue(context, delta[0]);\n      context.out('</div>');\n    }\n  }, {\n    key: 'format_moved',\n    value: function format_moved(context, delta) {\n      context.out('<div class=\"jsondiffpatch-value\">');\n      this.formatValue(context, delta[0]);\n      context.out('</div><div class=\"jsondiffpatch-moved-destination\">' + delta[1] + '</div>');\n      // draw an SVG arrow from here to move destination\n      context.out( /* jshint multistr: true */\n      '<div class=\"jsondiffpatch-arrow\" ' + 'style=\"position: relative; left: -34px;\">\\n          <svg width=\"30\" height=\"60\" ' + 'style=\"position: absolute; display: none;\">\\n          <defs>\\n              <marker id=\"markerArrow\" markerWidth=\"8\" markerHeight=\"8\"\\n                 refx=\"2\" refy=\"4\"\\n                     orient=\"auto\" markerUnits=\"userSpaceOnUse\">\\n                  <path d=\"M1,1 L1,7 L7,4 L1,1\" style=\"fill: #339;\" />\\n              </marker>\\n          </defs>\\n          <path d=\"M30,0 Q-10,25 26,50\"\\n            style=\"stroke: #88f; stroke-width: 2px; fill: none; ' + 'stroke-opacity: 0.5; marker-end: url(#markerArrow);\"\\n          ></path>\\n          </svg>\\n      </div>');\n      context.hasArrows = true;\n    }\n  }, {\n    key: 'format_textdiff',\n    value: function format_textdiff(context, delta) {\n      context.out('<div class=\"jsondiffpatch-value\">');\n      this.formatTextDiffString(context, delta[0]);\n      context.out('</div>');\n    }\n  }]);\n  return HtmlFormatter;\n})(BaseFormatter);\nfunction htmlEscape(text) {\n  var html = text;\n  var replacements = [[/&/g, '&amp;'], [/</g, '&lt;'], [/>/g, '&gt;'], [/'/g, '&apos;'], [/\"/g, '&quot;']];\n  for (var i = 0; i < replacements.length; i++) {\n    html = html.replace(replacements[i][0], replacements[i][1]);\n  }\n  return html;\n}\nvar adjustArrows = function jsondiffpatchHtmlFormatterAdjustArrows(nodeArg) {\n  var node = nodeArg || document;\n  var getElementText = function getElementText(_ref) {\n    var textContent = _ref.textContent,\n      innerText = _ref.innerText;\n    return textContent || innerText;\n  };\n  var eachByQuery = function eachByQuery(el, query, fn) {\n    var elems = el.querySelectorAll(query);\n    for (var i = 0, l = elems.length; i < l; i++) {\n      fn(elems[i]);\n    }\n  };\n  var eachChildren = function eachChildren(_ref2, fn) {\n    var children = _ref2.children;\n    for (var i = 0, l = children.length; i < l; i++) {\n      fn(children[i], i);\n    }\n  };\n  eachByQuery(node, '.jsondiffpatch-arrow', function (_ref3) {\n    var parentNode = _ref3.parentNode,\n      children = _ref3.children,\n      style = _ref3.style;\n    var arrowParent = parentNode;\n    var svg = children[0];\n    var path = svg.children[1];\n    svg.style.display = 'none';\n    var destination = getElementText(arrowParent.querySelector('.jsondiffpatch-moved-destination'));\n    var container = arrowParent.parentNode;\n    var destinationElem = void 0;\n    eachChildren(container, function (child) {\n      if (child.getAttribute('data-key') === destination) {\n        destinationElem = child;\n      }\n    });\n    if (!destinationElem) {\n      return;\n    }\n    try {\n      var distance = destinationElem.offsetTop - arrowParent.offsetTop;\n      svg.setAttribute('height', Math.abs(distance) + 6);\n      style.top = -8 + (distance > 0 ? 0 : distance) + 'px';\n      var curve = distance > 0 ? 'M30,0 Q-10,' + Math.round(distance / 2) + ' 26,' + (distance - 4) : 'M30,' + -distance + ' Q-10,' + Math.round(-distance / 2) + ' 26,4';\n      path.setAttribute('d', curve);\n      svg.style.display = '';\n    } catch (err) {}\n  });\n};\nvar AnnotatedFormatter = function (_BaseFormatter) {\n  inherits(AnnotatedFormatter, _BaseFormatter);\n  function AnnotatedFormatter() {\n    classCallCheck(this, AnnotatedFormatter);\n    var _this = possibleConstructorReturn(this, (AnnotatedFormatter.__proto__ || Object.getPrototypeOf(AnnotatedFormatter)).call(this));\n    _this.includeMoveDestinations = false;\n    return _this;\n  }\n  createClass(AnnotatedFormatter, [{\n    key: 'prepareContext',\n    value: function prepareContext(context) {\n      get(AnnotatedFormatter.prototype.__proto__ || Object.getPrototypeOf(AnnotatedFormatter.prototype), 'prepareContext', this).call(this, context);\n      context.indent = function (levels) {\n        this.indentLevel = (this.indentLevel || 0) + (typeof levels === 'undefined' ? 1 : levels);\n        this.indentPad = new Array(this.indentLevel + 1).join('&nbsp;&nbsp;');\n      };\n      context.row = function (json, htmlNote) {\n        context.out('<tr><td style=\"white-space: nowrap;\">' + '<pre class=\"jsondiffpatch-annotated-indent\"' + ' style=\"display: inline-block\">');\n        context.out(context.indentPad);\n        context.out('</pre><pre style=\"display: inline-block\">');\n        context.out(json);\n        context.out('</pre></td><td class=\"jsondiffpatch-delta-note\"><div>');\n        context.out(htmlNote);\n        context.out('</div></td></tr>');\n      };\n    }\n  }, {\n    key: 'typeFormattterErrorFormatter',\n    value: function typeFormattterErrorFormatter(context, err) {\n      context.row('', '<pre class=\"jsondiffpatch-error\">' + err + '</pre>');\n    }\n  }, {\n    key: 'formatTextDiffString',\n    value: function formatTextDiffString(context, value) {\n      var lines = this.parseTextDiff(value);\n      context.out('<ul class=\"jsondiffpatch-textdiff\">');\n      for (var i = 0, l = lines.length; i < l; i++) {\n        var line = lines[i];\n        context.out('<li><div class=\"jsondiffpatch-textdiff-location\">' + ('<span class=\"jsondiffpatch-textdiff-line-number\">' + line.location.line + '</span><span class=\"jsondiffpatch-textdiff-char\">' + line.location.chr + '</span></div><div class=\"jsondiffpatch-textdiff-line\">'));\n        var pieces = line.pieces;\n        for (var pieceIndex = 0, piecesLength = pieces.length; pieceIndex < piecesLength; pieceIndex++) {\n          var piece = pieces[pieceIndex];\n          context.out('<span class=\"jsondiffpatch-textdiff-' + piece.type + '\">' + piece.text + '</span>');\n        }\n        context.out('</div></li>');\n      }\n      context.out('</ul>');\n    }\n  }, {\n    key: 'rootBegin',\n    value: function rootBegin(context, type, nodeType) {\n      context.out('<table class=\"jsondiffpatch-annotated-delta\">');\n      if (type === 'node') {\n        context.row('{');\n        context.indent();\n      }\n      if (nodeType === 'array') {\n        context.row('\"_t\": \"a\",', 'Array delta (member names indicate array indices)');\n      }\n    }\n  }, {\n    key: 'rootEnd',\n    value: function rootEnd(context, type) {\n      if (type === 'node') {\n        context.indent(-1);\n        context.row('}');\n      }\n      context.out('</table>');\n    }\n  }, {\n    key: 'nodeBegin',\n    value: function nodeBegin(context, key, leftKey, type, nodeType) {\n      context.row('&quot;' + key + '&quot;: {');\n      if (type === 'node') {\n        context.indent();\n      }\n      if (nodeType === 'array') {\n        context.row('\"_t\": \"a\",', 'Array delta (member names indicate array indices)');\n      }\n    }\n  }, {\n    key: 'nodeEnd',\n    value: function nodeEnd(context, key, leftKey, type, nodeType, isLast) {\n      if (type === 'node') {\n        context.indent(-1);\n      }\n      context.row('}' + (isLast ? '' : ','));\n    }\n    /* jshint camelcase: false */\n    /* eslint-disable camelcase */\n  }, {\n    key: 'format_unchanged',\n    value: function format_unchanged() {}\n  }, {\n    key: 'format_movedestination',\n    value: function format_movedestination() {}\n  }, {\n    key: 'format_node',\n    value: function format_node(context, delta, left) {\n      // recurse\n      this.formatDeltaChildren(context, delta, left);\n    }\n  }]);\n  return AnnotatedFormatter;\n}(BaseFormatter);\n/* eslint-enable camelcase */\nvar wrapPropertyName = function wrapPropertyName(name) {\n  return '<pre style=\"display:inline-block\">&quot;' + name + '&quot;</pre>';\n};\nvar deltaAnnotations = {\n  added: function added(delta, left, key, leftKey) {\n    var formatLegend = ' <pre>([newValue])</pre>';\n    if (typeof leftKey === 'undefined') {\n      return 'new value' + formatLegend;\n    }\n    if (typeof leftKey === 'number') {\n      return 'insert at index ' + leftKey + formatLegend;\n    }\n    return 'add property ' + wrapPropertyName(leftKey) + formatLegend;\n  },\n  modified: function modified(delta, left, key, leftKey) {\n    var formatLegend = ' <pre>([previousValue, newValue])</pre>';\n    if (typeof leftKey === 'undefined') {\n      return 'modify value' + formatLegend;\n    }\n    if (typeof leftKey === 'number') {\n      return 'modify at index ' + leftKey + formatLegend;\n    }\n    return 'modify property ' + wrapPropertyName(leftKey) + formatLegend;\n  },\n  deleted: function deleted(delta, left, key, leftKey) {\n    var formatLegend = ' <pre>([previousValue, 0, 0])</pre>';\n    if (typeof leftKey === 'undefined') {\n      return 'delete value' + formatLegend;\n    }\n    if (typeof leftKey === 'number') {\n      return 'remove index ' + leftKey + formatLegend;\n    }\n    return 'delete property ' + wrapPropertyName(leftKey) + formatLegend;\n  },\n  moved: function moved(delta, left, key, leftKey) {\n    return 'move from <span title=\"(position to remove at original state)\">' + ('index ' + leftKey + '</span> to <span title=\"(position to insert at final') + (' state)\">index ' + delta[1] + '</span>');\n  },\n  textdiff: function textdiff(delta, left, key, leftKey) {\n    var location = typeof leftKey === 'undefined' ? '' : typeof leftKey === 'number' ? ' at index ' + leftKey : ' at property ' + wrapPropertyName(leftKey);\n    return 'text diff' + location + ', format is <a href=\"https://code.google.com/' + 'p/google-diff-match-patch/wiki/Unidiff\">a variation of Unidiff</a>';\n  }\n};\nvar formatAnyChange = function formatAnyChange(context, delta) {\n  var deltaType = this.getDeltaType(delta);\n  var annotator = deltaAnnotations[deltaType];\n  var htmlNote = annotator && annotator.apply(annotator, Array.prototype.slice.call(arguments, 1));\n  var json = JSON.stringify(delta, null, 2);\n  if (deltaType === 'textdiff') {\n    // split text diffs lines\n    json = json.split('\\\\n').join('\\\\n\"+\\n   \"');\n  }\n  context.indent();\n  context.row(json, htmlNote);\n  context.indent(-1);\n};\n/* eslint-disable camelcase */\nAnnotatedFormatter.prototype.format_added = formatAnyChange;\nAnnotatedFormatter.prototype.format_modified = formatAnyChange;\nAnnotatedFormatter.prototype.format_deleted = formatAnyChange;\nAnnotatedFormatter.prototype.format_moved = formatAnyChange;\nAnnotatedFormatter.prototype.format_textdiff = formatAnyChange;\nvar OPERATIONS = {\n  add: 'add',\n  remove: 'remove',\n  replace: 'replace',\n  move: 'move'\n};\n(function (_BaseFormatter) {\n  inherits(JSONFormatter, _BaseFormatter);\n  function JSONFormatter() {\n    classCallCheck(this, JSONFormatter);\n    var _this = possibleConstructorReturn(this, (JSONFormatter.__proto__ || Object.getPrototypeOf(JSONFormatter)).call(this));\n    _this.includeMoveDestinations = true;\n    return _this;\n  }\n  createClass(JSONFormatter, [{\n    key: 'prepareContext',\n    value: function prepareContext(context) {\n      get(JSONFormatter.prototype.__proto__ || Object.getPrototypeOf(JSONFormatter.prototype), 'prepareContext', this).call(this, context);\n      context.result = [];\n      context.path = [];\n      context.pushCurrentOp = function (obj) {\n        var op = obj.op,\n          value = obj.value;\n        var val = {\n          op: op,\n          path: this.currentPath()\n        };\n        if (typeof value !== 'undefined') {\n          val.value = value;\n        }\n        this.result.push(val);\n      };\n      context.pushMoveOp = function (to) {\n        var from = this.currentPath();\n        this.result.push({\n          op: OPERATIONS.move,\n          from: from,\n          path: this.toPath(to)\n        });\n      };\n      context.currentPath = function () {\n        return '/' + this.path.join('/');\n      };\n      context.toPath = function (toPath) {\n        var to = this.path.slice();\n        to[to.length - 1] = toPath;\n        return '/' + to.join('/');\n      };\n    }\n  }, {\n    key: 'typeFormattterErrorFormatter',\n    value: function typeFormattterErrorFormatter(context, err) {\n      context.out('[ERROR] ' + err);\n    }\n  }, {\n    key: 'rootBegin',\n    value: function rootBegin() {}\n  }, {\n    key: 'rootEnd',\n    value: function rootEnd() {}\n  }, {\n    key: 'nodeBegin',\n    value: function nodeBegin(_ref, key, leftKey) {\n      var path = _ref.path;\n      path.push(leftKey);\n    }\n  }, {\n    key: 'nodeEnd',\n    value: function nodeEnd(_ref2) {\n      var path = _ref2.path;\n      path.pop();\n    }\n    /* jshint camelcase: false */\n    /* eslint-disable camelcase */\n  }, {\n    key: 'format_unchanged',\n    value: function format_unchanged() {}\n  }, {\n    key: 'format_movedestination',\n    value: function format_movedestination() {}\n  }, {\n    key: 'format_node',\n    value: function format_node(context, delta, left) {\n      this.formatDeltaChildren(context, delta, left);\n    }\n  }, {\n    key: 'format_added',\n    value: function format_added(context, delta) {\n      context.pushCurrentOp({\n        op: OPERATIONS.add,\n        value: delta[0]\n      });\n    }\n  }, {\n    key: 'format_modified',\n    value: function format_modified(context, delta) {\n      context.pushCurrentOp({\n        op: OPERATIONS.replace,\n        value: delta[1]\n      });\n    }\n  }, {\n    key: 'format_deleted',\n    value: function format_deleted(context) {\n      context.pushCurrentOp({\n        op: OPERATIONS.remove\n      });\n    }\n  }, {\n    key: 'format_moved',\n    value: function format_moved(context, delta) {\n      var to = delta[1];\n      context.pushMoveOp(to);\n    }\n  }, {\n    key: 'format_textdiff',\n    value: function format_textdiff() {\n      throw new Error('Not implemented');\n    }\n  }, {\n    key: 'format',\n    value: function format(delta, left) {\n      var context = {};\n      this.prepareContext(context);\n      this.recurse(context, delta, left);\n      return context.result;\n    }\n  }]);\n  return JSONFormatter;\n})(BaseFormatter);\nfunction chalkColor(name) {\n  return chalk && chalk[name] || function () {\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return args;\n  };\n}\nvar colors = {\n  added: chalkColor('green'),\n  deleted: chalkColor('red'),\n  movedestination: chalkColor('gray'),\n  moved: chalkColor('yellow'),\n  unchanged: chalkColor('gray'),\n  error: chalkColor('white.bgRed'),\n  textDiffLine: chalkColor('gray')\n};\n(function (_BaseFormatter) {\n  inherits(ConsoleFormatter, _BaseFormatter);\n  function ConsoleFormatter() {\n    classCallCheck(this, ConsoleFormatter);\n    var _this = possibleConstructorReturn(this, (ConsoleFormatter.__proto__ || Object.getPrototypeOf(ConsoleFormatter)).call(this));\n    _this.includeMoveDestinations = false;\n    return _this;\n  }\n  createClass(ConsoleFormatter, [{\n    key: 'prepareContext',\n    value: function prepareContext(context) {\n      get(ConsoleFormatter.prototype.__proto__ || Object.getPrototypeOf(ConsoleFormatter.prototype), 'prepareContext', this).call(this, context);\n      context.indent = function (levels) {\n        this.indentLevel = (this.indentLevel || 0) + (typeof levels === 'undefined' ? 1 : levels);\n        this.indentPad = new Array(this.indentLevel + 1).join('  ');\n        this.outLine();\n      };\n      context.outLine = function () {\n        this.buffer.push('\\n' + (this.indentPad || ''));\n      };\n      context.out = function () {\n        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n        for (var i = 0, l = args.length; i < l; i++) {\n          var lines = args[i].split('\\n');\n          var text = lines.join('\\n' + (this.indentPad || ''));\n          if (this.color && this.color[0]) {\n            text = this.color[0](text);\n          }\n          this.buffer.push(text);\n        }\n      };\n      context.pushColor = function (color) {\n        this.color = this.color || [];\n        this.color.unshift(color);\n      };\n      context.popColor = function () {\n        this.color = this.color || [];\n        this.color.shift();\n      };\n    }\n  }, {\n    key: 'typeFormattterErrorFormatter',\n    value: function typeFormattterErrorFormatter(context, err) {\n      context.pushColor(colors.error);\n      context.out('[ERROR]' + err);\n      context.popColor();\n    }\n  }, {\n    key: 'formatValue',\n    value: function formatValue(context, value) {\n      context.out(JSON.stringify(value, null, 2));\n    }\n  }, {\n    key: 'formatTextDiffString',\n    value: function formatTextDiffString(context, value) {\n      var lines = this.parseTextDiff(value);\n      context.indent();\n      for (var i = 0, l = lines.length; i < l; i++) {\n        var line = lines[i];\n        context.pushColor(colors.textDiffLine);\n        context.out(line.location.line + ',' + line.location.chr + ' ');\n        context.popColor();\n        var pieces = line.pieces;\n        for (var pieceIndex = 0, piecesLength = pieces.length; pieceIndex < piecesLength; pieceIndex++) {\n          var piece = pieces[pieceIndex];\n          context.pushColor(colors[piece.type]);\n          context.out(piece.text);\n          context.popColor();\n        }\n        if (i < l - 1) {\n          context.outLine();\n        }\n      }\n      context.indent(-1);\n    }\n  }, {\n    key: 'rootBegin',\n    value: function rootBegin(context, type, nodeType) {\n      context.pushColor(colors[type]);\n      if (type === 'node') {\n        context.out(nodeType === 'array' ? '[' : '{');\n        context.indent();\n      }\n    }\n  }, {\n    key: 'rootEnd',\n    value: function rootEnd(context, type, nodeType) {\n      if (type === 'node') {\n        context.indent(-1);\n        context.out(nodeType === 'array' ? ']' : '}');\n      }\n      context.popColor();\n    }\n  }, {\n    key: 'nodeBegin',\n    value: function nodeBegin(context, key, leftKey, type, nodeType) {\n      context.pushColor(colors[type]);\n      context.out(leftKey + ': ');\n      if (type === 'node') {\n        context.out(nodeType === 'array' ? '[' : '{');\n        context.indent();\n      }\n    }\n  }, {\n    key: 'nodeEnd',\n    value: function nodeEnd(context, key, leftKey, type, nodeType, isLast) {\n      if (type === 'node') {\n        context.indent(-1);\n        context.out(nodeType === 'array' ? ']' : '}' + (isLast ? '' : ','));\n      }\n      if (!isLast) {\n        context.outLine();\n      }\n      context.popColor();\n    }\n    /* jshint camelcase: false */\n    /* eslint-disable camelcase */\n  }, {\n    key: 'format_unchanged',\n    value: function format_unchanged(context, delta, left) {\n      if (typeof left === 'undefined') {\n        return;\n      }\n      this.formatValue(context, left);\n    }\n  }, {\n    key: 'format_movedestination',\n    value: function format_movedestination(context, delta, left) {\n      if (typeof left === 'undefined') {\n        return;\n      }\n      this.formatValue(context, left);\n    }\n  }, {\n    key: 'format_node',\n    value: function format_node(context, delta, left) {\n      // recurse\n      this.formatDeltaChildren(context, delta, left);\n    }\n  }, {\n    key: 'format_added',\n    value: function format_added(context, delta) {\n      this.formatValue(context, delta[0]);\n    }\n  }, {\n    key: 'format_modified',\n    value: function format_modified(context, delta) {\n      context.pushColor(colors.deleted);\n      this.formatValue(context, delta[0]);\n      context.popColor();\n      context.out(' => ');\n      context.pushColor(colors.added);\n      this.formatValue(context, delta[1]);\n      context.popColor();\n    }\n  }, {\n    key: 'format_deleted',\n    value: function format_deleted(context, delta) {\n      this.formatValue(context, delta[0]);\n    }\n  }, {\n    key: 'format_moved',\n    value: function format_moved(context, delta) {\n      context.out('==> ' + delta[1]);\n    }\n  }, {\n    key: 'format_textdiff',\n    value: function format_textdiff(context, delta) {\n      this.formatTextDiffString(context, delta[0]);\n    }\n  }]);\n  return ConsoleFormatter;\n})(BaseFormatter);\n\nconst diffPatcher = new DiffPatcher({\n    arrays: { detectMove: false, includeValueOnMove: false },\n    textDiff: { minLength: 1 }\n});\nfunction diff(inputA, inputB) {\n    return diffPatcher.diff(inputA, inputB);\n}\n\nconst addedProperties = [\n    'docChanged',\n    'isGeneric',\n    'scrolledIntoView',\n    'selectionSet',\n    'storedMarksSet'\n];\nfunction addPropertiesToTransaction(tr) {\n    return Object.keys(tr)\n        .concat(addedProperties)\n        .reduce((acc, key) => {\n        // @ts-ignore\n        acc[key] = tr[key];\n        return acc;\n    }, {});\n}\n\nfunction buildSelection(selection) {\n    return {\n        // @ts-ignore\n        type: selection.type,\n        empty: selection.empty,\n        anchor: selection.anchor,\n        head: selection.head,\n        from: selection.from,\n        to: selection.to\n    };\n}\nfunction pad(num) {\n    return ('00' + num).slice(-2);\n}\nfunction pad3(num) {\n    return ('000' + num).slice(-3);\n}\nconst formatTimestamp = (timestamp) => {\n    const date = new Date(timestamp);\n    return [\n        pad(date.getHours()),\n        pad(date.getMinutes()),\n        pad(date.getSeconds()),\n        pad3(date.getMilliseconds())\n    ].join(':');\n};\n// Matches any src attribute containing base64 data due to bug in html package and legibility\n// https://github.com/TeemuKoivisto/prosemirror-dev-toolkit/issues/81\nconst srcAttr = /src=[\\\"|\\']data:(.*);base64,(.*)[\\\"|\\']/g;\nconst wrappingCarets = /(&lt;\\/?[\\w\\d\\s=\"']+&gt;)/gim;\nconst highlightHtmlString = (html) => html\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(wrappingCarets, \"<span style='color: cadetblue;'>$&</span>\");\nfunction createHistoryEntry(trs, state, stateBeforeDispatch, oldEntry) {\n    const serializer = DOMSerializer.fromSchema(state.schema);\n    const selection = state.selection;\n    const domFragment = serializer.serializeFragment(selection.content().content);\n    const selectedElementsAsHtml = [];\n    if (domFragment) {\n        let child = domFragment.firstChild;\n        while (child) {\n            selectedElementsAsHtml.push(child.outerHTML.replaceAll(srcAttr, 'src=\"...\"'));\n            child = child.nextSibling;\n        }\n    }\n    // As described in stateHistory.ts the first entry is a special exception\n    const prevState = oldEntry ? oldEntry.state : stateBeforeDispatch;\n    const contentDiff = diff(prevState.doc.toJSON(), state.doc.toJSON());\n    const selectionDiff = diff(buildSelection(prevState.selection), buildSelection(state.selection));\n    return {\n        id: Math.random().toString() + Math.random().toString(),\n        state,\n        trs: trs.map(tr => addPropertiesToTransaction(tr)),\n        timestamp: trs[0].time,\n        timeStr: formatTimestamp(trs[0].time),\n        contentDiff,\n        selectionDiff,\n        selectionHtml: highlightHtmlString(prettyPrint(selectedElementsAsHtml.join('\\n'), {\n            max_char: 60,\n            indent_size: 2\n        }))\n    };\n}\n\nconst stateHistory = writable(new Map());\nconst shownHistoryGroups = writable([]);\nconst latestEntry = writable(undefined);\nconst nextId = writable(0);\nfunction appendNewHistoryEntry(trs, state, stateBeforeDispatch) {\n    const entryMap = get_store_value(stateHistory);\n    const prevGroup = get_store_value(shownHistoryGroups)[0];\n    const oldEntry = entryMap.get((prevGroup === null || prevGroup === void 0 ? void 0 : prevGroup.topEntryId) || '');\n    // In the case of first entry there aren't oldEntries to diff against, therefore we have to use the state\n    // before the transaction. We can't use it for the next entries because it will always be one state behind,\n    // as the current state is the one _after_ the dispatch. You can observe this in the old dev-tools.\n    const newEntry = createHistoryEntry(trs, state, stateBeforeDispatch, oldEntry);\n    stateHistory.update(val => new Map(val.set(newEntry.id, newEntry)));\n    latestEntry.set(newEntry);\n    // Groups are subsequent transactions where the doc hasn't changed (eg selection was set) OR the diff was equal\n    // Haven't seen necessary to differentiate between selection-only vs equal diffs\n    const isGroup = !newEntry.contentDiff;\n    if ((prevGroup === null || prevGroup === void 0 ? void 0 : prevGroup.isGroup) && isGroup) {\n        const newGroup = {\n            id: prevGroup.id,\n            isGroup,\n            entryIds: [newEntry.id, ...prevGroup.entryIds],\n            topEntryId: newEntry.id,\n            expanded: prevGroup.expanded\n        };\n        shownHistoryGroups.update(val => [newGroup, ...val.slice(1)]);\n    }\n    else {\n        const id = get_store_value(nextId) + 1;\n        const newGroup = {\n            id,\n            isGroup,\n            entryIds: [newEntry.id],\n            topEntryId: newEntry.id,\n            expanded: false\n        };\n        shownHistoryGroups.update(val => [newGroup, ...val]);\n        nextId.set(id);\n    }\n}\nfunction resetHistory() {\n    stateHistory.set(new Map());\n    shownHistoryGroups.set([]);\n    latestEntry.set(undefined);\n}\n\n// From https://github.com/PierBover/prosemirror-cookbook\nfunction getActiveMarks(state) {\n    if (state.selection.empty) {\n        const $from = state.selection.$from;\n        const storedMarks = state.storedMarks;\n        // Return either the stored marks, or the marks at the cursor position.\n        // Stored marks are the marks that are going to be applied to the next input\n        // if you dispatched a mark toggle with an empty cursor.\n        if (storedMarks) {\n            return storedMarks.map(mark => mark.type.name);\n        }\n        else {\n            return $from.marks().map(mark => mark.type.name);\n        }\n    }\n    else {\n        const $head = state.selection.$head;\n        const $anchor = state.selection.$anchor;\n        // We're using a Set to not get duplicate values\n        const activeMarks = new Set();\n        // Here we're getting the marks at the head and anchor of the selection\n        $head.marks().forEach(mark => activeMarks.add(mark.type.name));\n        $anchor.marks().forEach(mark => activeMarks.add(mark.type.name));\n        return Array.from(activeMarks);\n    }\n}\n\nconst defaultProperties = ['jsonID', 'empty', 'anchor', 'from', 'head', 'to'];\nconst resolvedPosProperties = ['$anchor', '$head', '$cursor', '$to', '$from'];\nconst resolvedPosSubProperties = ['nodeAfter', 'nodeBefore', 'textOffset'];\nfunction createSelection(selection) {\n    return defaultProperties.reduce((acc, key) => {\n        // @ts-ignore\n        acc[key] = selection[key];\n        return acc;\n    }, {});\n}\nfunction createFullSelection(selection) {\n    return defaultProperties.concat(resolvedPosProperties).reduce((acc, key) => {\n        // @ts-ignore\n        let val = selection[key];\n        if (val && resolvedPosProperties.includes(key)) {\n            const additionalProperties = {};\n            resolvedPosSubProperties.forEach(subKey => {\n                // @ts-ignore\n                additionalProperties[subKey] = val[subKey];\n            });\n            val = Object.assign(Object.assign({}, val), additionalProperties);\n        }\n        acc[key] = val;\n        return acc;\n    }, {});\n}\n\nfunction createNode(index, key, value, depth, parent) {\n  const path = parent ? [...parent.path, index] : [];\n  return {\n    id: \"[\".concat(path.join(','), \"]\"),\n    index,\n    key,\n    value,\n    depth,\n    collapsed: true,\n    type: getValueType(value),\n    path,\n    parentId: parent ? parent.id : null,\n    circularOfId: null,\n    children: []\n  };\n}\nfunction getValueType(value) {\n  if (Array.isArray(value)) {\n    return 'array';\n  } else if (value instanceof Map) {\n    return 'map';\n  } else if (value instanceof Set) {\n    return 'set';\n  } else if (value instanceof Date) {\n    return 'date';\n  } else if (value === null) {\n    return 'null';\n  } else {\n    return typeof value;\n  }\n}\n// From redux-dev-tools\n// case 'Object':\n//   case 'Error':\n//   case 'Array':\n//   case 'Iterable':\n//   case 'Map':\n//   case 'Set':\n//   case 'MapEntry':\n//   case 'Number':\n//     return undefined;\n//   case 'String':\n//     return raw => `\"${raw}\"`;\n//   case 'Boolean':\n//     return raw => (raw ? 'true' : 'false');\n//   case 'Date':\n//     return raw => raw.toISOString();\n//   case 'Null':\n//     return () => 'null';\n//   case 'Undefined':\n//     return () => 'undefined';\n//   case 'Function':\n//   case 'Symbol':\n// export function objType(obj: any) {\n//   const type = Object.prototype.toString.call(obj).slice(8, -1)\n//   if (type === 'Object') {\n//     if (typeof obj[Symbol.iterator] === 'function') {\n//       return 'Iterable'\n//     }\n//     return obj.constructor.name\n//   }\n//   return type\n// }\nfunction getChildren(value, type) {\n  switch (type) {\n    case 'array':\n      return value.map((v, i) => [i.toString(), v]);\n    case 'map':\n      // eslint-disable-next-line no-case-declarations\n      const entries = Array.from(value.entries());\n      return entries.map((_ref, i) => {\n        let [key, value] = _ref;\n        return [\"[map entry \".concat(i, \"]\"), {\n          '[key]': key,\n          '[value]': value\n        }];\n      });\n    case 'set':\n      return Array.from(value.values()).map((v, i) => [\"[set entry \".concat(i, \"]\"), v]);\n    case 'object':\n      return Object.entries(value);\n    default:\n      return [];\n  }\n}\nfunction shouldRecurseChildren(node, parent, iteratedValues, opts) {\n  if (!parent) {\n    // The root node's children should always be recursed\n    return true;\n  } else if (node.collapsed && (parent === null || parent === void 0 ? void 0 : parent.collapsed)) {\n    // If the node's parent is uncollapsed the node's children should still be recursed\n    // in order to compute its value properly eg \"{} 4 keys\" and to place clickable arrow caret.\n    // Only when the node is completely hidden it should not be recursed\n    return false;\n  } else if (!opts.stopCircularRecursion) {\n    return true;\n  } else if (opts.isCircularNode) {\n    return opts.isCircularNode(node, iteratedValues);\n  } else if (node.type === 'object' || node.type === 'array') {\n    const existingNodeWithValue = iteratedValues.get(node.value);\n    if (existingNodeWithValue && node.id !== existingNodeWithValue.id) {\n      node.circularOfId = existingNodeWithValue.id;\n      return false;\n    }\n    iteratedValues.set(node.value, node);\n  }\n  return true;\n}\nfunction recurseObjectProperties(index, key, value, depth, ensureNotCollapsed, parent, treeMap, oldTreeMap, iteratedValues, recomputeExpandNode, opts) {\n  var _a;\n  if (((_a = opts.omitKeys) === null || _a === void 0 ? void 0 : _a.includes(key)) || opts.maxDepth && depth > opts.maxDepth) {\n    return null;\n  }\n  const node = createNode(index, key, value, depth, parent);\n  const oldNode = oldTreeMap.get(node.id);\n  if (ensureNotCollapsed) {\n    // Used to ensure that either root node is always uncollapsed or when uncollapsing new nodes\n    // with expandNodeChildren the node children are recursed (if applicable) with mapChildren\n    node.collapsed = false;\n  } else if (oldNode && !recomputeExpandNode) {\n    // Maintain the same expanded/collapsed toggle for a node in this path/id\n    // EXCEPT when the shouldExpandNode prop is changed...\n    node.collapsed = oldNode.collapsed;\n  } else if (opts.shouldExpandNode) {\n    node.collapsed = !opts.shouldExpandNode(node);\n  }\n  treeMap.set(node.id, node);\n  if (shouldRecurseChildren(node, parent, iteratedValues, opts)) {\n    const mappedChildren = opts.mapChildren && opts.mapChildren(value, getValueType(value), node);\n    const children = mappedChildren !== null && mappedChildren !== void 0 ? mappedChildren : getChildren(value, getValueType(value));\n    node.children = children.map((_ref2, idx) => {\n      let [key, val] = _ref2;\n      return recurseObjectProperties(idx, key, val, depth + 1, false, node, treeMap, oldTreeMap, iteratedValues, recomputeExpandNode, opts);\n    }).filter(n => n !== null);\n  }\n  return node;\n}\nfunction recomputeTree(data, oldTreeMap, recursionOpts, recomputeExpandNode) {\n  const treeMap = new Map();\n  const iteratedValues = new Map();\n  const newTree = recurseObjectProperties(-1, 'root', data, 0, true, null, treeMap, oldTreeMap, iteratedValues, recomputeExpandNode, recursionOpts);\n  return {\n    treeMap,\n    tree: newTree,\n    iteratedValues\n  };\n}\n\nconst createPropsStore = initialProps => {\n  const props = writable(initialProps);\n  const recursionOpts = derived(props, p => p.recursionOpts);\n  return {\n    props,\n    recursionOpts,\n    setProps(newProps) {\n      props.set(newProps);\n    },\n    formatValue(val, node) {\n      const {\n        valueFormatter\n      } = get_store_value(props);\n      const customFormat = valueFormatter ? valueFormatter(val, node) : undefined;\n      if (customFormat) {\n        return customFormat;\n      }\n      switch (node.type) {\n        case 'array':\n          return \"\".concat(node.circularOfId ? 'circular' : '', \" [] \").concat(val.length, \" items\");\n        case 'object':\n          return \"\".concat(node.circularOfId ? 'circular' : '', \" {} \").concat(Object.keys(val).length, \" keys\");\n        case 'map':\n        case 'set':\n          return \"\".concat(node.circularOfId ? 'circular' : '', \" () \").concat(val.size, \" entries\");\n        case 'date':\n          return \"\".concat(val.toISOString());\n        case 'string':\n          return \"\\\"\".concat(val, \"\\\"\");\n        case 'boolean':\n          return val ? 'true' : 'false';\n        case 'symbol':\n          return String(val);\n        default:\n          return val;\n      }\n    }\n  };\n};\n\nconst createRootElementStore = () => {\n  const rootElementStore = writable(null);\n  return {\n    set: rootElementStore.set,\n    subscribe: rootElementStore.subscribe\n  };\n};\n\nconst createTreeStore = propsStore => {\n  const defaultRootNode = createNode(0, 'root', [], 0, null);\n  const tree = writable(defaultRootNode);\n  const treeMap = writable(new Map());\n  const iteratedValues = writable(new Map());\n  return {\n    tree,\n    treeMap,\n    defaultRootNode,\n    init(newTree, newTreeMap, iterated) {\n      if (newTree) {\n        tree.set(newTree);\n      } else {\n        tree.set(defaultRootNode);\n      }\n      treeMap.set(newTreeMap);\n      iteratedValues.set(iterated);\n    },\n    getNode(id) {\n      return get_store_value(treeMap).get(id);\n    },\n    toggleCollapse(id) {\n      const node = get_store_value(treeMap).get(id);\n      if (!node) {\n        console.warn(\"Attempted to collapse non-existent node: \".concat(id));\n        return;\n      }\n      const updatedNode = Object.assign(Object.assign({}, node), {\n        collapsed: !node.collapsed\n      });\n      treeMap.update(m => new Map(m.set(node.id, updatedNode)));\n      const recursionOpts = get_store_value(propsStore.recursionOpts);\n      if (recursionOpts) {\n        this.expandNodeChildren(updatedNode, recursionOpts);\n      }\n    },\n    expandNodeChildren(node, recursionOpts) {\n      const parent = this.getNode((node === null || node === void 0 ? void 0 : node.parentId) || '') || null;\n      if (!parent) {\n        // Only root node has no parent and it should not be expandable\n        throw Error('No parent in expandNodeChildren for node: ' + node);\n      }\n      const newTreeMap = new Map(get_store_value(treeMap));\n      const oldTreeMap = get_store_value(treeMap);\n      const previouslyIterated = get_store_value(iteratedValues);\n      const nodeWithUpdatedChildren = recurseObjectProperties(node.index, node.key, node.value, node.depth, !node.collapsed,\n      // Ensure that when uncollapsed the node's children are always recursed\n      parent, newTreeMap, oldTreeMap, previouslyIterated, false,\n      // Never recompute shouldExpandNode since it may override the collapsing of this node\n      recursionOpts);\n      if (!nodeWithUpdatedChildren) return;\n      parent.children = parent.children.map(c => c.id === nodeWithUpdatedChildren.id ? nodeWithUpdatedChildren : c);\n      newTreeMap.set(nodeWithUpdatedChildren.id, nodeWithUpdatedChildren);\n      newTreeMap.set(parent.id, parent);\n      treeMap.set(newTreeMap);\n      iteratedValues.set(previouslyIterated);\n    },\n    expandAllNodesToNode(id) {\n      function recurseNodeUpwards(updated, node) {\n        if (!node) return;\n        updated.set(node.id, Object.assign(Object.assign({}, node), {\n          collapsed: false\n        }));\n        if (node.parentId) {\n          recurseNodeUpwards(updated, updated.get(node.parentId));\n        }\n      }\n      const updated = new Map(get_store_value(treeMap));\n      recurseNodeUpwards(updated, updated.get(id));\n      treeMap.set(updated);\n    }\n  };\n};\n\n/* ../../node_modules/.pnpm/svelte-tree-view@1.4.2_svelte@4.2.15/node_modules/svelte-tree-view/pkg/TreeViewNode.svelte generated by Svelte v4.2.15 */\nfunction add_css$h(target) {\n  append_styles(target, \"svelte-ngcjq5\", \"ul.svelte-ngcjq5.svelte-ngcjq5{display:flex;flex-direction:column;height:max-content;list-style:none;padding:0;padding-left:var(--tree-view-left-indent);margin:0;width:100%}li.svelte-ngcjq5.svelte-ngcjq5{align-items:baseline;display:flex;height:max-content;line-height:var(--tree-view-line-height);list-style:none;width:100%}li.svelte-ngcjq5+li.svelte-ngcjq5{margin-top:0.25em}.empty-block.svelte-ngcjq5.svelte-ngcjq5{visibility:hidden}.node-key.svelte-ngcjq5.svelte-ngcjq5{color:var(--tree-view-base0D);margin-right:var(--tree-view-key-margin-right)}.node-key.has-children.svelte-ngcjq5.svelte-ngcjq5{cursor:pointer}.node-key.p-left.svelte-ngcjq5.svelte-ngcjq5{padding-left:1.1em}.node-value.svelte-ngcjq5.svelte-ngcjq5{color:var(--tree-view-base0B);margin-right:0.5em;word-break:break-all}.node-value[data-type=number].svelte-ngcjq5.svelte-ngcjq5,.node-value[data-type=boolean].svelte-ngcjq5.svelte-ngcjq5{color:var(--tree-view-base09)}.node-value[data-type=null].svelte-ngcjq5.svelte-ngcjq5,.node-value[data-type=undefined].svelte-ngcjq5.svelte-ngcjq5{color:var(--tree-view-base08)}.node-value.expanded.svelte-ngcjq5.svelte-ngcjq5{color:var(--tree-view-base03)}.node-value.has-children.svelte-ngcjq5.svelte-ngcjq5{cursor:pointer}.arrow-btn.svelte-ngcjq5.svelte-ngcjq5{background:transparent;border:0;color:var(--tree-view-base0D);cursor:pointer;margin-right:0.7em;padding:0;transition:all 150ms ease 0s;transform:rotateZ(90deg);transform-origin:47% 43%;position:relative;line-height:1.1em;font-size:0.75em}.arrow-btn.collapsed.svelte-ngcjq5.svelte-ngcjq5{transform:rotateZ(0deg)}.buttons.svelte-ngcjq5.svelte-ngcjq5{display:flex;flex-wrap:wrap}.log-copy-button.svelte-ngcjq5.svelte-ngcjq5{background:transparent;border:0;color:var(--tree-view-base0D);cursor:pointer;margin:0;padding:0 0.5em}.log-copy-button.svelte-ngcjq5.svelte-ngcjq5:hover{background:rgba(255, 162, 177, 0.4);border-radius:2px;color:var(--tree-view-base07)}\");\n}\nfunction get_each_context$7(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[14] = list[i];\n  return child_ctx;\n}\n\n// (60:2) {#if hasChildren}\nfunction create_if_block_4$3(ctx) {\n  let button;\n  let t;\n  let button_class_value;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      button = element(\"button\");\n      t = text(\"▶\");\n      attr(button, \"class\", button_class_value = \"\" + (null_to_empty(\"arrow-btn \".concat( /*node*/ctx[0].collapsed ? 'collapsed' : '')) + \" svelte-ngcjq5\"));\n    },\n    m(target, anchor) {\n      insert(target, button, anchor);\n      append(button, t);\n      if (!mounted) {\n        dispose = listen(button, \"click\", /*handleToggleCollapse*/ctx[9]);\n        mounted = true;\n      }\n    },\n    p(ctx, dirty) {\n      if (dirty & /*node*/1 && button_class_value !== (button_class_value = \"\" + (null_to_empty(\"arrow-btn \".concat( /*node*/ctx[0].collapsed ? 'collapsed' : '')) + \" svelte-ngcjq5\"))) {\n        attr(button, \"class\", button_class_value);\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(button);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\n\n// (92:4) {:else}\nfunction create_else_block$8(ctx) {\n  let t_value = /*propsStore*/ctx[5].formatValue( /*node*/ctx[0].value, /*node*/ctx[0]) + \"\";\n  let t;\n  return {\n    c() {\n      t = text(t_value);\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*node*/1 && t_value !== (t_value = /*propsStore*/ctx[5].formatValue( /*node*/ctx[0].value, /*node*/ctx[0]) + \"\")) set_data(t, t_value);\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (85:4) {#if valueComponent}\nfunction create_if_block_3$4(ctx) {\n  let switch_instance;\n  let switch_instance_anchor;\n  let current;\n  var switch_value = /*valueComponent*/ctx[3];\n  function switch_props(ctx, dirty) {\n    return {\n      props: {\n        value: /*node*/ctx[0].value,\n        node: /*node*/ctx[0],\n        defaultFormatter: /*valueComponentDefaultFormatter*/ctx[10]\n      }\n    };\n  }\n  if (switch_value) {\n    switch_instance = construct_svelte_component(switch_value, switch_props(ctx));\n  }\n  return {\n    c() {\n      if (switch_instance) create_component(switch_instance.$$.fragment);\n      switch_instance_anchor = empty();\n    },\n    m(target, anchor) {\n      if (switch_instance) mount_component(switch_instance, target, anchor);\n      insert(target, switch_instance_anchor, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      if (dirty & /*valueComponent*/8 && switch_value !== (switch_value = /*valueComponent*/ctx[3])) {\n        if (switch_instance) {\n          group_outros();\n          const old_component = switch_instance;\n          transition_out(old_component.$$.fragment, 1, 0, () => {\n            destroy_component(old_component, 1);\n          });\n          check_outros();\n        }\n        if (switch_value) {\n          switch_instance = construct_svelte_component(switch_value, switch_props(ctx));\n          create_component(switch_instance.$$.fragment);\n          transition_in(switch_instance.$$.fragment, 1);\n          mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor);\n        } else {\n          switch_instance = null;\n        }\n      } else if (switch_value) {\n        const switch_instance_changes = {};\n        if (dirty & /*node*/1) switch_instance_changes.value = /*node*/ctx[0].value;\n        if (dirty & /*node*/1) switch_instance_changes.node = /*node*/ctx[0];\n        switch_instance.$set(switch_instance_changes);\n      }\n    },\n    i(local) {\n      if (current) return;\n      if (switch_instance) transition_in(switch_instance.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      if (switch_instance) transition_out(switch_instance.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(switch_instance_anchor);\n      }\n      if (switch_instance) destroy_component(switch_instance, detaching);\n    }\n  };\n}\n\n// (97:4) {#if $props.showLogButton}\nfunction create_if_block_2$5(ctx) {\n  let button;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      button = element(\"button\");\n      button.textContent = \"log\";\n      attr(button, \"class\", \"log-copy-button svelte-ngcjq5\");\n    },\n    m(target, anchor) {\n      insert(target, button, anchor);\n      if (!mounted) {\n        dispose = listen(button, \"click\", /*handleLogNode*/ctx[7]);\n        mounted = true;\n      }\n    },\n    p: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(button);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\n\n// (100:4) {#if $props.showCopyButton}\nfunction create_if_block_1$6(ctx) {\n  let button;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      button = element(\"button\");\n      button.textContent = \"copy\";\n      attr(button, \"class\", \"log-copy-button svelte-ngcjq5\");\n    },\n    m(target, anchor) {\n      insert(target, button, anchor);\n      if (!mounted) {\n        dispose = listen(button, \"click\", /*handleCopyNodeToClipboard*/ctx[8]);\n        mounted = true;\n      }\n    },\n    p: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(button);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\n\n// (105:0) {#if !node.collapsed && hasChildren}\nfunction create_if_block$9(ctx) {\n  let li;\n  let ul;\n  let current;\n  let each_value = ensure_array_like( /*node*/ctx[0].children);\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block$7(get_each_context$7(ctx, each_value, i));\n  }\n  const out = i => transition_out(each_blocks[i], 1, 1, () => {\n    each_blocks[i] = null;\n  });\n  return {\n    c() {\n      li = element(\"li\");\n      ul = element(\"ul\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(ul, \"class\", \"svelte-ngcjq5\");\n      attr(li, \"class\", \"row svelte-ngcjq5\");\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      append(li, ul);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(ul, null);\n        }\n      }\n      current = true;\n    },\n    p(ctx, dirty) {\n      if (dirty & /*node*/1) {\n        each_value = ensure_array_like( /*node*/ctx[0].children);\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context$7(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n            transition_in(each_blocks[i], 1);\n          } else {\n            each_blocks[i] = create_each_block$7(child_ctx);\n            each_blocks[i].c();\n            transition_in(each_blocks[i], 1);\n            each_blocks[i].m(ul, null);\n          }\n        }\n        group_outros();\n        for (i = each_value.length; i < each_blocks.length; i += 1) {\n          out(i);\n        }\n        check_outros();\n      }\n    },\n    i(local) {\n      if (current) return;\n      for (let i = 0; i < each_value.length; i += 1) {\n        transition_in(each_blocks[i]);\n      }\n      current = true;\n    },\n    o(local) {\n      each_blocks = each_blocks.filter(Boolean);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        transition_out(each_blocks[i]);\n      }\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n      }\n      destroy_each(each_blocks, detaching);\n    }\n  };\n}\n\n// (108:6) {#each node.children as child}\nfunction create_each_block$7(ctx) {\n  let treeviewnode;\n  let current;\n  treeviewnode = new TreeViewNode({\n    props: {\n      id: /*child*/ctx[14].id\n    }\n  });\n  return {\n    c() {\n      create_component(treeviewnode.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(treeviewnode, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const treeviewnode_changes = {};\n      if (dirty & /*node*/1) treeviewnode_changes.id = /*child*/ctx[14].id;\n      treeviewnode.$set(treeviewnode_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(treeviewnode.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(treeviewnode.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(treeviewnode, detaching);\n    }\n  };\n}\nfunction create_fragment$h(ctx) {\n  let li;\n  let t0;\n  let div0;\n  let t1_value = /*node*/ctx[0].key + \"\";\n  let t1;\n  let t2;\n  let t3;\n  let div1;\n  let current_block_type_index;\n  let if_block1;\n  let div1_data_type_value;\n  let t4;\n  let div2;\n  let t5;\n  let li_data_tree_id_value;\n  let t6;\n  let if_block4_anchor;\n  let current;\n  let mounted;\n  let dispose;\n  let if_block0 = /*hasChildren*/ctx[2] && create_if_block_4$3(ctx);\n  const if_block_creators = [create_if_block_3$4, create_else_block$8];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*valueComponent*/ctx[3]) return 0;\n    return 1;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  let if_block2 = /*$props*/ctx[1].showLogButton && create_if_block_2$5(ctx);\n  let if_block3 = /*$props*/ctx[1].showCopyButton && create_if_block_1$6(ctx);\n  let if_block4 = ! /*node*/ctx[0].collapsed && /*hasChildren*/ctx[2] && create_if_block$9(ctx);\n  return {\n    c() {\n      li = element(\"li\");\n      if (if_block0) if_block0.c();\n      t0 = space();\n      div0 = element(\"div\");\n      t1 = text(t1_value);\n      t2 = text(\":\");\n      t3 = space();\n      div1 = element(\"div\");\n      if_block1.c();\n      t4 = space();\n      div2 = element(\"div\");\n      if (if_block2) if_block2.c();\n      t5 = space();\n      if (if_block3) if_block3.c();\n      t6 = space();\n      if (if_block4) if_block4.c();\n      if_block4_anchor = empty();\n      attr(div0, \"class\", \"node-key svelte-ngcjq5\");\n      attr(div0, \"role\", \"presentation\");\n      toggle_class(div0, \"has-children\", /*hasChildren*/ctx[2]);\n      toggle_class(div0, \"p-left\", ! /*hasChildren*/ctx[2]);\n      attr(div1, \"class\", \"node-value svelte-ngcjq5\");\n      attr(div1, \"data-type\", div1_data_type_value = /*node*/ctx[0].type);\n      attr(div1, \"role\", \"presentation\");\n      toggle_class(div1, \"expanded\", ! /*node*/ctx[0].collapsed && /*hasChildren*/ctx[2]);\n      toggle_class(div1, \"has-children\", /*hasChildren*/ctx[2]);\n      attr(div2, \"class\", \"buttons svelte-ngcjq5\");\n      attr(li, \"class\", \"row svelte-ngcjq5\");\n      attr(li, \"data-tree-id\", li_data_tree_id_value = /*node*/ctx[0].id);\n      toggle_class(li, \"collapsed\", /*node*/ctx[0].collapsed && /*hasChildren*/ctx[2]);\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      if (if_block0) if_block0.m(li, null);\n      append(li, t0);\n      append(li, div0);\n      append(div0, t1);\n      append(div0, t2);\n      append(li, t3);\n      append(li, div1);\n      if_blocks[current_block_type_index].m(div1, null);\n      append(li, t4);\n      append(li, div2);\n      if (if_block2) if_block2.m(div2, null);\n      append(div2, t5);\n      if (if_block3) if_block3.m(div2, null);\n      insert(target, t6, anchor);\n      if (if_block4) if_block4.m(target, anchor);\n      insert(target, if_block4_anchor, anchor);\n      current = true;\n      if (!mounted) {\n        dispose = [listen(div0, \"click\", /*handleToggleCollapse*/ctx[9]), listen(div1, \"click\", /*handleToggleCollapse*/ctx[9])];\n        mounted = true;\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if ( /*hasChildren*/ctx[2]) {\n        if (if_block0) {\n          if_block0.p(ctx, dirty);\n        } else {\n          if_block0 = create_if_block_4$3(ctx);\n          if_block0.c();\n          if_block0.m(li, t0);\n        }\n      } else if (if_block0) {\n        if_block0.d(1);\n        if_block0 = null;\n      }\n      if ((!current || dirty & /*node*/1) && t1_value !== (t1_value = /*node*/ctx[0].key + \"\")) set_data(t1, t1_value);\n      if (!current || dirty & /*hasChildren*/4) {\n        toggle_class(div0, \"has-children\", /*hasChildren*/ctx[2]);\n      }\n      if (!current || dirty & /*hasChildren*/4) {\n        toggle_class(div0, \"p-left\", ! /*hasChildren*/ctx[2]);\n      }\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index === previous_block_index) {\n        if_blocks[current_block_type_index].p(ctx, dirty);\n      } else {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block1 = if_blocks[current_block_type_index];\n        if (!if_block1) {\n          if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block1.c();\n        } else {\n          if_block1.p(ctx, dirty);\n        }\n        transition_in(if_block1, 1);\n        if_block1.m(div1, null);\n      }\n      if (!current || dirty & /*node*/1 && div1_data_type_value !== (div1_data_type_value = /*node*/ctx[0].type)) {\n        attr(div1, \"data-type\", div1_data_type_value);\n      }\n      if (!current || dirty & /*node, hasChildren*/5) {\n        toggle_class(div1, \"expanded\", ! /*node*/ctx[0].collapsed && /*hasChildren*/ctx[2]);\n      }\n      if (!current || dirty & /*hasChildren*/4) {\n        toggle_class(div1, \"has-children\", /*hasChildren*/ctx[2]);\n      }\n      if ( /*$props*/ctx[1].showLogButton) {\n        if (if_block2) {\n          if_block2.p(ctx, dirty);\n        } else {\n          if_block2 = create_if_block_2$5(ctx);\n          if_block2.c();\n          if_block2.m(div2, t5);\n        }\n      } else if (if_block2) {\n        if_block2.d(1);\n        if_block2 = null;\n      }\n      if ( /*$props*/ctx[1].showCopyButton) {\n        if (if_block3) {\n          if_block3.p(ctx, dirty);\n        } else {\n          if_block3 = create_if_block_1$6(ctx);\n          if_block3.c();\n          if_block3.m(div2, null);\n        }\n      } else if (if_block3) {\n        if_block3.d(1);\n        if_block3 = null;\n      }\n      if (!current || dirty & /*node*/1 && li_data_tree_id_value !== (li_data_tree_id_value = /*node*/ctx[0].id)) {\n        attr(li, \"data-tree-id\", li_data_tree_id_value);\n      }\n      if (!current || dirty & /*node, hasChildren*/5) {\n        toggle_class(li, \"collapsed\", /*node*/ctx[0].collapsed && /*hasChildren*/ctx[2]);\n      }\n      if (! /*node*/ctx[0].collapsed && /*hasChildren*/ctx[2]) {\n        if (if_block4) {\n          if_block4.p(ctx, dirty);\n          if (dirty & /*node, hasChildren*/5) {\n            transition_in(if_block4, 1);\n          }\n        } else {\n          if_block4 = create_if_block$9(ctx);\n          if_block4.c();\n          transition_in(if_block4, 1);\n          if_block4.m(if_block4_anchor.parentNode, if_block4_anchor);\n        }\n      } else if (if_block4) {\n        group_outros();\n        transition_out(if_block4, 1, 1, () => {\n          if_block4 = null;\n        });\n        check_outros();\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(if_block1);\n      transition_in(if_block4);\n      current = true;\n    },\n    o(local) {\n      transition_out(if_block1);\n      transition_out(if_block4);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n        detach(t6);\n        detach(if_block4_anchor);\n      }\n      if (if_block0) if_block0.d();\n      if_blocks[current_block_type_index].d();\n      if (if_block2) if_block2.d();\n      if (if_block3) if_block3.d();\n      if (if_block4) if_block4.d(detaching);\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction instance$h($$self, $$props, $$invalidate) {\n  let hasChildren;\n  let props;\n  let valueComponent;\n  let $rootElementStore;\n  let $props,\n    $$unsubscribe_props = noop,\n    $$subscribe_props = () => ($$unsubscribe_props(), $$unsubscribe_props = subscribe(props, $$value => $$invalidate(1, $props = $$value)), props);\n  $$self.$$.on_destroy.push(() => $$unsubscribe_props());\n  let {\n    id\n  } = $$props;\n  const {\n    treeStore,\n    propsStore,\n    rootElementStore\n  } = getContext$1('svelte-tree-view');\n  component_subscribe($$self, rootElementStore, value => $$invalidate(12, $rootElementStore = value));\n  let node;\n  treeStore.treeMap.subscribe(value => {\n    const n = value.get(id);\n    if (n && node !== n) {\n      $$invalidate(0, node = n);\n    }\n  });\n  function handleLogNode() {\n    // eslint-disable-next-line no-console\n    console.info('%c [svelte-tree-view]: Property added to window._node', 'color: #b8e248');\n\n    // eslint-disable-next-line no-console\n    console.log(node.value);\n    try {\n      if (typeof window !== 'undefined') window._node = node.value;\n    } catch (err) {\n      console.error('Failed to set _node, window was undefined');\n    }\n  }\n  function handleCopyNodeToClipboard() {\n    try {\n      navigator.clipboard.writeText(JSON.stringify(node.value));\n    } catch (err) {\n      console.error('Copying node to clipboard failed: ', err);\n    }\n  }\n  function handleToggleCollapse() {\n    var _a;\n    if (hasChildren) {\n      treeStore.toggleCollapse(node.id);\n    } else if (node.circularOfId) {\n      treeStore.expandAllNodesToNode(node.circularOfId);\n      (_a = $rootElementStore === null || $rootElementStore === void 0 ? void 0 : $rootElementStore.querySelector(\"li[data-tree-id=\\\"\".concat(node.circularOfId, \"\\\"]\"))) === null || _a === void 0 ? void 0 : _a.scrollIntoView();\n    }\n  }\n  function valueComponentDefaultFormatter(val) {\n    return propsStore.formatValue(val, node);\n  }\n  $$self.$$set = $$props => {\n    if ('id' in $$props) $$invalidate(11, id = $$props.id);\n  };\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*id*/2048) {\n      {\n        let found = treeStore.getNode(id);\n\n        // Should explode rather than have logic written around undefinedness\n        // as this component should be unmounted if it's undefined.\n        if (!found) {\n          throw Error('[svelte-tree-view] TreeViewNode.svelte received undefined node from treeMapStore whereas it should be already unmounted!');\n        }\n        $$invalidate(0, node = found);\n      }\n    }\n    if ($$self.$$.dirty & /*node*/1) {\n      $$invalidate(2, hasChildren = node && node.children.length > 0);\n    }\n    if ($$self.$$.dirty & /*$props*/2) {\n      $$invalidate(3, valueComponent = $props.valueComponent);\n    }\n  };\n  $$subscribe_props($$invalidate(4, props = propsStore.props));\n  return [node, $props, hasChildren, valueComponent, props, propsStore, rootElementStore, handleLogNode, handleCopyNodeToClipboard, handleToggleCollapse, valueComponentDefaultFormatter, id];\n}\nclass TreeViewNode extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$h, create_fragment$h, safe_not_equal, {\n      id: 11\n    }, add_css$h);\n  }\n}\n\n/* ../../node_modules/.pnpm/svelte-tree-view@1.4.2_svelte@4.2.15/node_modules/svelte-tree-view/pkg/TreeView.svelte generated by Svelte v4.2.15 */\nfunction add_css$g(target) {\n  append_styles(target, \"svelte-167awo5\", \":root{--tree-view-font-family:'Helvetica Neue', 'Calibri Light', Roboto, sans-serif;--tree-view-font-size:13px;--tree-view-left-indent:0.875em;--tree-view-line-height:1.1;--tree-view-key-margin-right:0.5em}ul.svelte-167awo5{background:var(--tree-view-base00);font-family:var(--tree-view-font-family);font-size:var(--tree-view-font-size);height:max-content;list-style:none;margin:0;padding:0;width:max-content}\");\n}\nfunction get_each_context$6(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[18] = list[i];\n  return child_ctx;\n}\n\n// (79:2) {#each $rootNode.children as child}\nfunction create_each_block$6(ctx) {\n  let treeviewnode;\n  let current;\n  treeviewnode = new TreeViewNode({\n    props: {\n      id: /*child*/ctx[18].id\n    }\n  });\n  return {\n    c() {\n      create_component(treeviewnode.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(treeviewnode, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const treeviewnode_changes = {};\n      if (dirty & /*$rootNode*/4) treeviewnode_changes.id = /*child*/ctx[18].id;\n      treeviewnode.$set(treeviewnode_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(treeviewnode.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(treeviewnode.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(treeviewnode, detaching);\n    }\n  };\n}\nfunction create_fragment$g(ctx) {\n  let ul;\n  let ul_class_value;\n  let current;\n  let each_value = ensure_array_like( /*$rootNode*/ctx[2].children);\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block$6(get_each_context$6(ctx, each_value, i));\n  }\n  const out = i => transition_out(each_blocks[i], 1, 1, () => {\n    each_blocks[i] = null;\n  });\n  return {\n    c() {\n      ul = element(\"ul\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(ul, \"class\", ul_class_value = \"\" + (null_to_empty(\"\".concat( /*$$props*/ctx[3].class || '', \" svelte-tree-view\")) + \" svelte-167awo5\"));\n    },\n    m(target, anchor) {\n      insert(target, ul, anchor);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(ul, null);\n        }\n      }\n\n      /*ul_binding*/\n      ctx[13](ul);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*$rootNode*/4) {\n        each_value = ensure_array_like( /*$rootNode*/ctx[2].children);\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context$6(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n            transition_in(each_blocks[i], 1);\n          } else {\n            each_blocks[i] = create_each_block$6(child_ctx);\n            each_blocks[i].c();\n            transition_in(each_blocks[i], 1);\n            each_blocks[i].m(ul, null);\n          }\n        }\n        group_outros();\n        for (i = each_value.length; i < each_blocks.length; i += 1) {\n          out(i);\n        }\n        check_outros();\n      }\n      if (!current || dirty & /*$$props*/8 && ul_class_value !== (ul_class_value = \"\" + (null_to_empty(\"\".concat( /*$$props*/ctx[3].class || '', \" svelte-tree-view\")) + \" svelte-167awo5\"))) {\n        attr(ul, \"class\", ul_class_value);\n      }\n    },\n    i(local) {\n      if (current) return;\n      for (let i = 0; i < each_value.length; i += 1) {\n        transition_in(each_blocks[i]);\n      }\n      current = true;\n    },\n    o(local) {\n      each_blocks = each_blocks.filter(Boolean);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        transition_out(each_blocks[i]);\n      }\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(ul);\n      }\n      destroy_each(each_blocks, detaching);\n      /*ul_binding*/\n      ctx[13](null);\n    }\n  };\n}\nfunction instance$g($$self, $$props, $$invalidate) {\n  let rootNode;\n  let $rootNode,\n    $$unsubscribe_rootNode = noop,\n    $$subscribe_rootNode = () => ($$unsubscribe_rootNode(), $$unsubscribe_rootNode = subscribe(rootNode, $$value => $$invalidate(2, $rootNode = $$value)), rootNode);\n  $$self.$$.on_destroy.push(() => $$unsubscribe_rootNode());\n  var _a;\n  let {\n    data,\n    theme = undefined,\n    showLogButton = false,\n    showCopyButton = false,\n    valueComponent = undefined,\n    recursionOpts = {},\n    valueFormatter = undefined\n  } = $$props;\n  let rootElement = null;\n  const defaultRecursionOpts = {\n    maxDepth: 16,\n    omitKeys: [],\n    stopCircularRecursion: false,\n    shouldExpandNode: () => false\n  };\n  let props = {\n    showLogButton,\n    showCopyButton,\n    valueComponent,\n    recursionOpts: {\n      ...defaultRecursionOpts,\n      ...recursionOpts\n    },\n    valueFormatter\n  };\n  const propsStore = createPropsStore(props);\n  const rootElementStore = createRootElementStore();\n  const treeStore = createTreeStore(propsStore);\n  setContext$1('svelte-tree-view', {\n    propsStore,\n    rootElementStore,\n    treeStore\n  });\n  onMount(() => {\n    rootElementStore.set(rootElement);\n  });\n  function ul_binding($$value) {\n    binding_callbacks[$$value ? 'unshift' : 'push'](() => {\n      rootElement = $$value;\n      $$invalidate(0, rootElement);\n    });\n  }\n  $$self.$$set = $$new_props => {\n    $$invalidate(3, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));\n    if ('data' in $$new_props) $$invalidate(4, data = $$new_props.data);\n    if ('theme' in $$new_props) $$invalidate(5, theme = $$new_props.theme);\n    if ('showLogButton' in $$new_props) $$invalidate(6, showLogButton = $$new_props.showLogButton);\n    if ('showCopyButton' in $$new_props) $$invalidate(7, showCopyButton = $$new_props.showCopyButton);\n    if ('valueComponent' in $$new_props) $$invalidate(8, valueComponent = $$new_props.valueComponent);\n    if ('recursionOpts' in $$new_props) $$invalidate(9, recursionOpts = $$new_props.recursionOpts);\n    if ('valueFormatter' in $$new_props) $$invalidate(10, valueFormatter = $$new_props.valueFormatter);\n  };\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*showLogButton, showCopyButton, valueComponent, valueFormatter, props*/5568) {\n      {\n        // To keep things less messy all props are joined to one object _except_ the recursionOpts\n        // which is picked from the old props. This is to allow checking between the old and new recursionOpts\n        // in the recomputeTree.\n        $$invalidate(12, props = {\n          showLogButton,\n          showCopyButton,\n          valueComponent,\n          valueFormatter,\n          recursionOpts: props.recursionOpts\n        });\n      }\n    }\n    if ($$self.$$.dirty & /*recursionOpts, props, _a, data*/6672) {\n      {\n        // Combine the defaultProps with the possible new recursion opts\n        const newRecursionOpts = {\n          ...defaultRecursionOpts,\n          ...recursionOpts\n        };\n\n        // Compare the old shouldExpandNode option with the possible new shouldExpandNode\n        // to know whether to whole tree should be recomputed.\n        const recomputeExpandNode = ($$invalidate(11, _a = props === null || props === void 0 ? void 0 : props.recursionOpts) === null || _a === void 0 ? void 0 : _a.shouldExpandNode) !== newRecursionOpts.shouldExpandNode;\n        const oldTreeMap = get_store_value(treeStore.treeMap);\n        const {\n          treeMap,\n          tree,\n          iteratedValues\n        } = recomputeTree(data, oldTreeMap, newRecursionOpts, recomputeExpandNode);\n        treeStore.init(tree, treeMap, iteratedValues);\n        $$invalidate(12, props.recursionOpts = newRecursionOpts, props);\n        propsStore.setProps(props);\n      }\n    }\n    if ($$self.$$.dirty & /*theme, rootElement*/33) {\n      {\n        if (theme && rootElement) {\n          let key;\n          for (key in theme) {\n            // This ridiculous thing is for TypeScript type inference. Yey..?\n            const value = theme[key];\n            if (rootElement && key.includes('base') && value) {\n              rootElement.style.setProperty(\"--tree-view-\".concat(key), value);\n            }\n          }\n        }\n      }\n    }\n  };\n  $$subscribe_rootNode($$invalidate(1, rootNode = treeStore.tree));\n  $$props = exclude_internal_props($$props);\n  return [rootElement, rootNode, $rootNode, $$props, data, theme, showLogButton, showCopyButton, valueComponent, recursionOpts, valueFormatter, _a, props, ul_binding];\n}\nclass TreeView extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$g, create_fragment$g, safe_not_equal, {\n      data: 4,\n      theme: 5,\n      showLogButton: 6,\n      showCopyButton: 7,\n      valueComponent: 8,\n      recursionOpts: 9,\n      valueFormatter: 10\n    }, add_css$g);\n  }\n}\n\n/* src/tabs/SplitView.svelte generated by Svelte v4.2.15 */\nfunction add_css$f(target) {\n  append_styles(target, \"svelte-fdudio\", \".split-view.svelte-fdudio{border-top:1px solid rgba(255, 162, 177, 0.2);color:#fff;display:flex;height:calc(100% - var(--height-tabs-menu));width:100%}.split-view h2{color:rgb(187, 145, 163);font-family:var(--font-sans);font-size:var(--font-medium);font-weight:400;letter-spacing:1px;margin:0;text-transform:uppercase}.split-view > .left-panel{display:flex;flex-direction:column;flex-grow:1;overflow:scroll;padding:1em}.split-view > .right-panel{border-left:1px solid rgba(255, 162, 177, 0.2);display:flex;flex-direction:column;flex-grow:1;overflow:scroll;padding:1em}.split-view .hidden{visibility:hidden}\");\n}\nconst get_right_slot_changes = dirty => ({});\nconst get_right_slot_context = ctx => ({\n  class: \"right-panel\"\n});\nconst get_left_slot_changes = dirty => ({});\nconst get_left_slot_context = ctx => ({\n  class: \"left-panel\"\n});\nfunction create_fragment$f(ctx) {\n  let section;\n  let t;\n  let current;\n  const left_slot_template = /*#slots*/ctx[1].left;\n  const left_slot = create_slot(left_slot_template, ctx, /*$$scope*/ctx[0], get_left_slot_context);\n  const right_slot_template = /*#slots*/ctx[1].right;\n  const right_slot = create_slot(right_slot_template, ctx, /*$$scope*/ctx[0], get_right_slot_context);\n  return {\n    c() {\n      section = element(\"section\");\n      if (left_slot) left_slot.c();\n      t = space();\n      if (right_slot) right_slot.c();\n      attr(section, \"class\", \"split-view svelte-fdudio\");\n    },\n    m(target, anchor) {\n      insert(target, section, anchor);\n      if (left_slot) {\n        left_slot.m(section, null);\n      }\n      append(section, t);\n      if (right_slot) {\n        right_slot.m(section, null);\n      }\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (left_slot) {\n        if (left_slot.p && (!current || dirty & /*$$scope*/1)) {\n          update_slot_base(left_slot, left_slot_template, ctx, /*$$scope*/ctx[0], !current ? get_all_dirty_from_scope( /*$$scope*/ctx[0]) : get_slot_changes(left_slot_template, /*$$scope*/ctx[0], dirty, get_left_slot_changes), get_left_slot_context);\n        }\n      }\n      if (right_slot) {\n        if (right_slot.p && (!current || dirty & /*$$scope*/1)) {\n          update_slot_base(right_slot, right_slot_template, ctx, /*$$scope*/ctx[0], !current ? get_all_dirty_from_scope( /*$$scope*/ctx[0]) : get_slot_changes(right_slot_template, /*$$scope*/ctx[0], dirty, get_right_slot_changes), get_right_slot_context);\n        }\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(left_slot, local);\n      transition_in(right_slot, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(left_slot, local);\n      transition_out(right_slot, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(section);\n      }\n      if (left_slot) left_slot.d(detaching);\n      if (right_slot) right_slot.d(detaching);\n    }\n  };\n}\nfunction instance$f($$self, $$props, $$invalidate) {\n  let {\n    $$slots: slots = {},\n    $$scope\n  } = $$props;\n  $$self.$$set = $$props => {\n    if ('$$scope' in $$props) $$invalidate(0, $$scope = $$props.$$scope);\n  };\n  return [$$scope, slots];\n}\nclass SplitView extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$f, create_fragment$f, safe_not_equal, {}, add_css$f);\n  }\n}\n\n/* src/components/Button.svelte generated by Svelte v4.2.15 */\nfunction add_css$e(target) {\n  append_styles(target, \"svelte-it3v6s\", \"button.svelte-it3v6s{background:transparent;border:0;border-radius:2px;color:#d3d3d9;cursor:pointer;font-family:var(--font-family);font-size:var(--font-small);font-weight:400;padding:6px 10px;text-transform:uppercase}button.svelte-it3v6s:hover{background:rgba(255, 162, 177, 0.4);color:#fff}button.selected.svelte-it3v6s{background:rgba(255, 162, 177, 0.4)}\");\n}\nfunction create_fragment$e(ctx) {\n  let button;\n  let button_class_value;\n  let current;\n  let mounted;\n  let dispose;\n  const default_slot_template = /*#slots*/ctx[3].default;\n  const default_slot = create_slot(default_slot_template, ctx, /*$$scope*/ctx[2], null);\n  return {\n    c() {\n      button = element(\"button\");\n      if (default_slot) default_slot.c();\n      attr(button, \"class\", button_class_value = \"\" + (null_to_empty(\"\".concat( /*$$props*/ctx[1].class || '')) + \" svelte-it3v6s\"));\n      toggle_class(button, \"selected\", /*selected*/ctx[0]);\n    },\n    m(target, anchor) {\n      insert(target, button, anchor);\n      if (default_slot) {\n        default_slot.m(button, null);\n      }\n      current = true;\n      if (!mounted) {\n        dispose = [listen(button, \"click\", /*click_handler*/ctx[4]), listen(button, \"mouseover\", /*mouseover_handler*/ctx[5]), listen(button, \"mouseenter\", /*mouseenter_handler*/ctx[6]), listen(button, \"mouseleave\", /*mouseleave_handler*/ctx[7]), listen(button, \"focus\", /*focus_handler*/ctx[8])];\n        mounted = true;\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (default_slot) {\n        if (default_slot.p && (!current || dirty & /*$$scope*/4)) {\n          update_slot_base(default_slot, default_slot_template, ctx, /*$$scope*/ctx[2], !current ? get_all_dirty_from_scope( /*$$scope*/ctx[2]) : get_slot_changes(default_slot_template, /*$$scope*/ctx[2], dirty, null), null);\n        }\n      }\n      if (!current || dirty & /*$$props*/2 && button_class_value !== (button_class_value = \"\" + (null_to_empty(\"\".concat( /*$$props*/ctx[1].class || '')) + \" svelte-it3v6s\"))) {\n        attr(button, \"class\", button_class_value);\n      }\n      if (!current || dirty & /*$$props, selected*/3) {\n        toggle_class(button, \"selected\", /*selected*/ctx[0]);\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(default_slot, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(default_slot, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(button);\n      }\n      if (default_slot) default_slot.d(detaching);\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction instance$e($$self, $$props, $$invalidate) {\n  let {\n    $$slots: slots = {},\n    $$scope\n  } = $$props;\n  let {\n    selected = false\n  } = $$props;\n  function click_handler(event) {\n    bubble.call(this, $$self, event);\n  }\n  function mouseover_handler(event) {\n    bubble.call(this, $$self, event);\n  }\n  function mouseenter_handler(event) {\n    bubble.call(this, $$self, event);\n  }\n  function mouseleave_handler(event) {\n    bubble.call(this, $$self, event);\n  }\n  function focus_handler(event) {\n    bubble.call(this, $$self, event);\n  }\n  $$self.$$set = $$new_props => {\n    $$invalidate(1, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));\n    if ('selected' in $$new_props) $$invalidate(0, selected = $$new_props.selected);\n    if ('$$scope' in $$new_props) $$invalidate(2, $$scope = $$new_props.$$scope);\n  };\n  $$props = exclude_internal_props($$props);\n  return [selected, $$props, $$scope, slots, click_handler, mouseover_handler, mouseenter_handler, mouseleave_handler, focus_handler];\n}\nclass Button extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$e, create_fragment$e, safe_not_equal, {\n      selected: 0\n    }, add_css$e);\n  }\n}\n\n/* src/tabs/state/StateTab.svelte generated by Svelte v4.2.15 */\nfunction add_css$d(target) {\n  append_styles(target, \"svelte-8c7oqn\", \"@charset \\\"UTF-8\\\";.top-row.svelte-8c7oqn{align-items:center;display:flex;justify-content:space-between}.left-panel[slot=left].svelte-8c7oqn{overflow:scroll}.right-panel[slot=right].svelte-8c7oqn{border-left:1px solid rgba(255, 162, 177, 0.2);flex-grow:0;min-width:200px;width:200px}.split-view .selection-btn{height:24px;width:35px}.caret-icon.svelte-8c7oqn::before{content:\\\"▶\\\"}.caret-icon.expanded.svelte-8c7oqn::before{content:\\\"▼\\\"}.no-marks.svelte-8c7oqn{color:#85d9ef;margin:0.5em 0 1.25em 1em}.split-view .tree-view{margin:0.5em 0 1.25em 0}\");\n}\n\n// (53:6) <Button on:click={handleClickLogDoc}>\nfunction create_default_slot_1$4(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (50:2) \nfunction create_left_slot$4(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let treeview;\n  let current;\n  button = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot_1$4]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button.$on(\"click\", /*handleClickLogDoc*/ctx[6]);\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*doc*/ctx[0],\n      showLogButton: true,\n      showCopyButton: true,\n      valueFormatter: formatDocNodeValue\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Current doc\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview.$$.fragment);\n      attr(div0, \"class\", \"top-row svelte-8c7oqn\");\n      attr(div1, \"slot\", \"left\");\n      attr(div1, \"class\", \"left-panel svelte-8c7oqn\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(treeview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/1024) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      const treeview_changes = {};\n      if (dirty & /*doc*/1) treeview_changes.data = /*doc*/ctx[0];\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(treeview);\n    }\n  };\n}\n\n// (66:6) <Button class=\"selection-btn\" on:click={handleExpandSelection}         >\nfunction create_default_slot$4(ctx) {\n  let span;\n  return {\n    c() {\n      span = element(\"span\");\n      attr(span, \"class\", \"caret-icon svelte-8c7oqn\");\n      toggle_class(span, \"expanded\", /*expandedSelection*/ctx[5]);\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*expandedSelection*/32) {\n        toggle_class(span, \"expanded\", /*expandedSelection*/ctx[5]);\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (75:6) {:else}\nfunction create_else_block$7(ctx) {\n  let treeview;\n  let current;\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*activeMarks*/ctx[2]\n    }\n  });\n  return {\n    c() {\n      create_component(treeview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(treeview, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const treeview_changes = {};\n      if (dirty & /*activeMarks*/4) treeview_changes.data = /*activeMarks*/ctx[2];\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(treeview, detaching);\n    }\n  };\n}\n\n// (73:6) {#if activeMarks.length === 0}\nfunction create_if_block$8(ctx) {\n  let div;\n  return {\n    c() {\n      div = element(\"div\");\n      div.textContent = \"No active marks\";\n      attr(div, \"class\", \"no-marks svelte-8c7oqn\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n    },\n    p: noop,\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n    }\n  };\n}\n\n// (63:2) \nfunction create_right_slot$5(ctx) {\n  let div3;\n  let div0;\n  let h20;\n  let t1;\n  let button;\n  let t2;\n  let treeview0;\n  let t3;\n  let div1;\n  let h21;\n  let t5;\n  let current_block_type_index;\n  let if_block;\n  let t6;\n  let div2;\n  let h22;\n  let t8;\n  let treeview1;\n  let current;\n  button = new Button({\n    props: {\n      class: \"selection-btn\",\n      $$slots: {\n        default: [create_default_slot$4]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button.$on(\"click\", /*handleExpandSelection*/ctx[7]);\n  treeview0 = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*selection*/ctx[1]\n    }\n  });\n  const if_block_creators = [create_if_block$8, create_else_block$7];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*activeMarks*/ctx[2].length === 0) return 0;\n    return 1;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  treeview1 = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: {\n        nodeSize: /*nodeSize*/ctx[3],\n        childCount: /*childCount*/ctx[4]\n      }\n    }\n  });\n  return {\n    c() {\n      div3 = element(\"div\");\n      div0 = element(\"div\");\n      h20 = element(\"h2\");\n      h20.textContent = \"Selection\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview0.$$.fragment);\n      t3 = space();\n      div1 = element(\"div\");\n      h21 = element(\"h2\");\n      h21.textContent = \"Active marks\";\n      t5 = space();\n      if_block.c();\n      t6 = space();\n      div2 = element(\"div\");\n      h22 = element(\"h2\");\n      h22.textContent = \"Document stats\";\n      t8 = space();\n      create_component(treeview1.$$.fragment);\n      attr(div0, \"class\", \"top-row svelte-8c7oqn\");\n      attr(div3, \"slot\", \"right\");\n      attr(div3, \"class\", \"right-panel svelte-8c7oqn\");\n    },\n    m(target, anchor) {\n      insert(target, div3, anchor);\n      append(div3, div0);\n      append(div0, h20);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div3, t2);\n      mount_component(treeview0, div3, null);\n      append(div3, t3);\n      append(div3, div1);\n      append(div1, h21);\n      append(div1, t5);\n      if_blocks[current_block_type_index].m(div1, null);\n      append(div3, t6);\n      append(div3, div2);\n      append(div2, h22);\n      append(div2, t8);\n      mount_component(treeview1, div2, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope, expandedSelection*/1056) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      const treeview0_changes = {};\n      if (dirty & /*selection*/2) treeview0_changes.data = /*selection*/ctx[1];\n      treeview0.$set(treeview0_changes);\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index === previous_block_index) {\n        if_blocks[current_block_type_index].p(ctx, dirty);\n      } else {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block = if_blocks[current_block_type_index];\n        if (!if_block) {\n          if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block.c();\n        } else {\n          if_block.p(ctx, dirty);\n        }\n        transition_in(if_block, 1);\n        if_block.m(div1, null);\n      }\n      const treeview1_changes = {};\n      if (dirty & /*nodeSize, childCount*/24) treeview1_changes.data = {\n        nodeSize: /*nodeSize*/ctx[3],\n        childCount: /*childCount*/ctx[4]\n      };\n      treeview1.$set(treeview1_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview0.$$.fragment, local);\n      transition_in(if_block);\n      transition_in(treeview1.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview0.$$.fragment, local);\n      transition_out(if_block);\n      transition_out(treeview1.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div3);\n      }\n      destroy_component(button);\n      destroy_component(treeview0);\n      if_blocks[current_block_type_index].d();\n      destroy_component(treeview1);\n    }\n  };\n}\nfunction create_fragment$d(ctx) {\n  let splitview;\n  let current;\n  splitview = new SplitView({\n    props: {\n      $$slots: {\n        right: [create_right_slot$5],\n        left: [create_left_slot$4]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      create_component(splitview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(splitview, target, anchor);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const splitview_changes = {};\n      if (dirty & /*$$scope, nodeSize, childCount, activeMarks, selection, expandedSelection, doc*/1087) {\n        splitview_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      splitview.$set(splitview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(splitview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(splitview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(splitview, detaching);\n    }\n  };\n}\nfunction formatDocNodeValue(val, n) {\n  if (n.type === 'object' && val.type) {\n    return \"{} \".concat(val.type);\n  }\n}\nfunction instance$d($$self, $$props, $$invalidate) {\n  const {\n    view\n  } = getContext('editor-view');\n  let doc = view.state.doc.toJSON();\n  let selection = createSelection(view.state.selection);\n  let currentState = view.state;\n  let activeMarks = [];\n  let nodeSize = view.state.doc.nodeSize;\n  let childCount = view.state.doc.childCount;\n  let expandedSelection = false;\n  latestEntry.subscribe(e => {\n    if (!e) return;\n    const {\n      state\n    } = e;\n    currentState = state;\n    $$invalidate(0, doc = state.doc.toJSON());\n    $$invalidate(1, selection = expandedSelection ? createFullSelection(state.selection) : createSelection(state.selection));\n    $$invalidate(2, activeMarks = getActiveMarks(state));\n    $$invalidate(3, nodeSize = state.doc.nodeSize);\n    $$invalidate(4, childCount = state.doc.childCount);\n  });\n  function handleClickLogDoc() {\n    console.log(doc);\n    window._doc = doc;\n  }\n  function handleExpandSelection() {\n    $$invalidate(5, expandedSelection = !expandedSelection);\n    if (expandedSelection) {\n      $$invalidate(1, selection = createFullSelection(currentState.selection));\n    } else {\n      $$invalidate(1, selection = createSelection(currentState.selection));\n    }\n  }\n  return [doc, selection, activeMarks, nodeSize, childCount, expandedSelection, handleClickLogDoc, handleExpandSelection];\n}\nclass StateTab extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$d, create_fragment$d, safe_not_equal, {}, add_css$d);\n  }\n}\n\n// function postprocessValue(value: any) {\n//   if (value && value._t === 'a') {\n//     const res: { [key: string]: string | string[] } = {}\n//     for (const key in value) {\n//       if (key !== '_t') {\n//         if (key[0] === '_' && !value[key.substr(1)]) {\n//           res[key.substr(1)] = value[key]\n//         } else if (value['_' + key]) {\n//           res[key] = [value['_' + key][0], value[key][0]]\n//         } else if (!value['_' + key] && key[0] !== '_') {\n//           res[key] = value[key]\n//         }\n//       }\n//     }\n//     return res\n//   }\n//   return value\n// }\nfunction mapSelectionDeltaChildren(_val, type, _parent) {\n    if (type !== 'array')\n        return;\n    return [];\n}\n/**\n * Magic function to transform jsondiffpatch array deltas\n * https://github.com/benjamine/jsondiffpatch/blob/master/docs/deltas.md\n * https://benjamine.github.io/jsondiffpatch/demo/index.html\n */\nfunction mapDocDeltaChildren(delta, type) {\n    // So due to the way the tree-view works, it will automatically map the children of an array\n    // to their own nodes. For diff deltas, however, we want to omit those children and just show\n    // a value wrapped with <span> to show either deleted or inserted content\n    if (type === 'array' && delta[1] === 0 && delta[2] === 0) {\n        // Remove operation is defined by two 0s in its delta [{ <deleted> }, 0, 0]\n        return [];\n        // } else if (type === 'array' && typeof delta[0] === 'string' && typeof delta[1] === 'number' && delta[2] === 3) {\n        // Move operation is almost the same as remove, except its value is empty and the second number\n        // points to the moved index eg [\"\", 6, 3] AND the third value is always '3'\n        // But since these seem to never occur (and they weren't handled in the previous version) we are not doing anything\n        // with them for now.\n    }\n    else if (type === 'array' && typeof delta[0] === 'string' && delta[1] === 0 && delta[2] === 2) {\n        // If a diff between two strings gets too long, a text diff algorithm is used which produces an array\n        // with unidiff as the first value, 0 as the second and 2 as third.\n        // Eg [\"@@ -1,4 +1,9 @@\\n-text\\n+paragraph\\n\", 0, 2]\n        return [];\n    }\n    else if (type === 'array' && delta.length === 1 && typeof delta[0] === 'object') {\n        // Insert operations do not have indexes (it's already indexed in the array) and carry\n        // only an object payload eg [{ <inserted> }]\n        return [];\n    }\n    // The main delta objects are objects denoted by key '_t' with 'a' value which we shall omit.\n    // DiffValue component handles the text diffs otherwise.\n    if (type !== 'object' || delta._t !== 'a')\n        return;\n    // We shall remap the values to omit '_t' and remove underscores from the keys\n    const transformed = [];\n    for (const key in delta) {\n        if (key === '_t')\n            continue;\n        // Remove or move operation is indicated by an underscore before the index eg '_2'\n        if (key.charAt(0) === '_') {\n            transformed.push([key.substr(1), delta[key]]);\n        }\n        else {\n            transformed.push([key, delta[key]]);\n        }\n    }\n    return transformed;\n}\n\n/* src/tabs/history/HistoryList.svelte generated by Svelte v4.2.15 */\nfunction add_css$c(target) {\n  append_styles(target, \"svelte-vbjxb8\", \"@charset \\\"UTF-8\\\";ul.svelte-vbjxb8.svelte-vbjxb8{color:#fff;list-style:none;margin:0;padding:0;height:100%;width:100%}li.svelte-vbjxb8.svelte-vbjxb8{transition:background 0.7s ease}li.svelte-vbjxb8.svelte-vbjxb8:hover{background:rgba(255, 162, 177, 0.4);color:#fff}li.selected.svelte-vbjxb8.svelte-vbjxb8{background:rgba(255, 162, 177, 0.4)}li.svelte-vbjxb8+li.svelte-vbjxb8{border-top:1px solid rgb(96, 76, 104)}button.svelte-vbjxb8.svelte-vbjxb8{background:transparent;border:0;color:#d3d3d9;cursor:pointer;display:flex;font-family:monospace;font-size:var(--font-medium);justify-content:space-between;padding:6px 18px;text-transform:uppercase;width:100%}button.p-left.svelte-vbjxb8.svelte-vbjxb8{margin-left:1em}.caret-icon.svelte-vbjxb8.svelte-vbjxb8::before{content:\\\"▶\\\"}.caret-icon.expanded.svelte-vbjxb8.svelte-vbjxb8::before{content:\\\"▼\\\"}\");\n}\nfunction get_each_context$5(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[6] = list[i];\n  child_ctx[8] = i;\n  return child_ctx;\n}\nfunction get_each_context_1(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[9] = list[i];\n  return child_ctx;\n}\n\n// (17:10) {#if group.isGroup}\nfunction create_if_block_3$3(ctx) {\n  let t0;\n  let t1_value = /*group*/ctx[6].entries.length + \"\";\n  let t1;\n  let t2;\n  return {\n    c() {\n      t0 = text(\"[\");\n      t1 = text(t1_value);\n      t2 = text(\"]\");\n    },\n    m(target, anchor) {\n      insert(target, t0, anchor);\n      insert(target, t1, anchor);\n      insert(target, t2, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*listItems*/1 && t1_value !== (t1_value = /*group*/ctx[6].entries.length + \"\")) set_data(t1, t1_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t0);\n        detach(t1);\n        detach(t2);\n      }\n    }\n  };\n}\n\n// (20:10) {#if group.topEntry && group.topEntry.trs.length > 1}\nfunction create_if_block_2$4(ctx) {\n  let t0;\n  let t1_value = /*group*/ctx[6].topEntry.trs.length - 1 + \"\";\n  let t1;\n  return {\n    c() {\n      t0 = text(\"+\");\n      t1 = text(t1_value);\n    },\n    m(target, anchor) {\n      insert(target, t0, anchor);\n      insert(target, t1, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*listItems*/1 && t1_value !== (t1_value = /*group*/ctx[6].topEntry.trs.length - 1 + \"\")) set_data(t1, t1_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t0);\n        detach(t1);\n      }\n    }\n  };\n}\n\n// (24:8) {#if group.isGroup && group.entries.length > 1}\nfunction create_if_block_1$5(ctx) {\n  let span;\n  return {\n    c() {\n      span = element(\"span\");\n      attr(span, \"class\", \"caret-icon svelte-vbjxb8\");\n      toggle_class(span, \"expanded\", /*group*/ctx[6].expanded);\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*listItems*/1) {\n        toggle_class(span, \"expanded\", /*group*/ctx[6].expanded);\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (29:4) {#if group.isGroup && group.expanded}\nfunction create_if_block$7(ctx) {\n  let each_blocks = [];\n  let each_1_lookup = new Map();\n  let each_1_anchor;\n  let each_value_1 = ensure_array_like( /*group*/ctx[6].entries);\n  const get_key = ctx => {\n    var _ctx$;\n    return /*subEntry*/(_ctx$ = ctx[9]) === null || _ctx$ === void 0 ? void 0 : _ctx$.id;\n  };\n  for (let i = 0; i < each_value_1.length; i += 1) {\n    let child_ctx = get_each_context_1(ctx, each_value_1, i);\n    let key = get_key(child_ctx);\n    each_1_lookup.set(key, each_blocks[i] = create_each_block_1(key, child_ctx));\n  }\n  return {\n    c() {\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      each_1_anchor = empty();\n    },\n    m(target, anchor) {\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(target, anchor);\n        }\n      }\n      insert(target, each_1_anchor, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*selectedId, listItems, dispatchEvent*/7) {\n        each_value_1 = ensure_array_like( /*group*/ctx[6].entries);\n        each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value_1, each_1_lookup, each_1_anchor.parentNode, destroy_block, create_each_block_1, each_1_anchor, get_each_context_1);\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(each_1_anchor);\n      }\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].d(detaching);\n      }\n    }\n  };\n}\n\n// (30:6) {#each group.entries as subEntry (subEntry?.id)}\nfunction create_each_block_1(key_1, ctx) {\n  var _ctx$2;\n  let li;\n  let button;\n  let t0_value = /*subEntry*/((_ctx$2 = ctx[9]) === null || _ctx$2 === void 0 ? void 0 : _ctx$2.timeStr) + \"\";\n  let t0;\n  let t1;\n  let mounted;\n  let dispose;\n  function click_handler_1() {\n    return /*click_handler_1*/ctx[5]( /*subEntry*/ctx[9], /*groupIdx*/ctx[8]);\n  }\n  return {\n    key: key_1,\n    first: null,\n    c() {\n      var _ctx$3;\n      li = element(\"li\");\n      button = element(\"button\");\n      t0 = text(t0_value);\n      t1 = space();\n      attr(button, \"class\", \"p-left svelte-vbjxb8\");\n      attr(li, \"class\", \"svelte-vbjxb8\");\n      toggle_class(li, \"selected\", /*selectedId*/ctx[1] === ( /*subEntry*/(_ctx$3 = ctx[9]) === null || _ctx$3 === void 0 ? void 0 : _ctx$3.id));\n      this.first = li;\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      append(li, button);\n      append(button, t0);\n      append(li, t1);\n      if (!mounted) {\n        dispose = listen(button, \"click\", click_handler_1);\n        mounted = true;\n      }\n    },\n    p(new_ctx, dirty) {\n      var _ctx$4;\n      ctx = new_ctx;\n      if (dirty & /*listItems*/1 && t0_value !== (t0_value = /*subEntry*/((_ctx$4 = ctx[9]) === null || _ctx$4 === void 0 ? void 0 : _ctx$4.timeStr) + \"\")) set_data(t0, t0_value);\n      if (dirty & /*selectedId, listItems*/3) {\n        var _ctx$5;\n        toggle_class(li, \"selected\", /*selectedId*/ctx[1] === ( /*subEntry*/(_ctx$5 = ctx[9]) === null || _ctx$5 === void 0 ? void 0 : _ctx$5.id));\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\n\n// (7:2) {#each listItems as group, groupIdx (group.id)}\nfunction create_each_block$5(key_1, ctx) {\n  var _ctx$6;\n  let li;\n  let button;\n  let span;\n  let t0_value = /*group*/((_ctx$6 = ctx[6]) === null || _ctx$6 === void 0 || (_ctx$6 = _ctx$6.topEntry) === null || _ctx$6 === void 0 ? void 0 : _ctx$6.timeStr) + \"\";\n  let t0;\n  let t1;\n  let t2;\n  let t3;\n  let t4;\n  let if_block3_anchor;\n  let mounted;\n  let dispose;\n  let if_block0 = /*group*/ctx[6].isGroup && create_if_block_3$3(ctx);\n  let if_block1 = /*group*/ctx[6].topEntry && /*group*/ctx[6].topEntry.trs.length > 1 && create_if_block_2$4(ctx);\n  let if_block2 = /*group*/ctx[6].isGroup && /*group*/ctx[6].entries.length > 1 && create_if_block_1$5(ctx);\n  function click_handler() {\n    return /*click_handler*/ctx[3]( /*group*/ctx[6], /*groupIdx*/ctx[8]);\n  }\n  function dblclick_handler() {\n    return /*dblclick_handler*/ctx[4]( /*group*/ctx[6]);\n  }\n  let if_block3 = /*group*/ctx[6].isGroup && /*group*/ctx[6].expanded && create_if_block$7(ctx);\n  return {\n    key: key_1,\n    first: null,\n    c() {\n      var _ctx$7;\n      li = element(\"li\");\n      button = element(\"button\");\n      span = element(\"span\");\n      t0 = text(t0_value);\n      t1 = space();\n      if (if_block0) if_block0.c();\n      t2 = space();\n      if (if_block1) if_block1.c();\n      t3 = space();\n      if (if_block2) if_block2.c();\n      t4 = space();\n      if (if_block3) if_block3.c();\n      if_block3_anchor = empty();\n      attr(button, \"class\", \"svelte-vbjxb8\");\n      toggle_class(button, \"is-group\", /*group*/ctx[6].isGroup);\n      attr(li, \"class\", \"svelte-vbjxb8\");\n      toggle_class(li, \"selected\", ! /*group*/ctx[6].expanded && /*selectedId*/ctx[1] === ( /*group*/(_ctx$7 = ctx[6]) === null || _ctx$7 === void 0 || (_ctx$7 = _ctx$7.topEntry) === null || _ctx$7 === void 0 ? void 0 : _ctx$7.id));\n      this.first = li;\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      append(li, button);\n      append(button, span);\n      append(span, t0);\n      append(span, t1);\n      if (if_block0) if_block0.m(span, null);\n      append(span, t2);\n      if (if_block1) if_block1.m(span, null);\n      append(button, t3);\n      if (if_block2) if_block2.m(button, null);\n      insert(target, t4, anchor);\n      if (if_block3) if_block3.m(target, anchor);\n      insert(target, if_block3_anchor, anchor);\n      if (!mounted) {\n        dispose = [listen(button, \"click\", click_handler), listen(button, \"dblclick\", dblclick_handler)];\n        mounted = true;\n      }\n    },\n    p(new_ctx, dirty) {\n      var _ctx$8;\n      ctx = new_ctx;\n      if (dirty & /*listItems*/1 && t0_value !== (t0_value = /*group*/((_ctx$8 = ctx[6]) === null || _ctx$8 === void 0 || (_ctx$8 = _ctx$8.topEntry) === null || _ctx$8 === void 0 ? void 0 : _ctx$8.timeStr) + \"\")) set_data(t0, t0_value);\n      if ( /*group*/ctx[6].isGroup) {\n        if (if_block0) {\n          if_block0.p(ctx, dirty);\n        } else {\n          if_block0 = create_if_block_3$3(ctx);\n          if_block0.c();\n          if_block0.m(span, t2);\n        }\n      } else if (if_block0) {\n        if_block0.d(1);\n        if_block0 = null;\n      }\n      if ( /*group*/ctx[6].topEntry && /*group*/ctx[6].topEntry.trs.length > 1) {\n        if (if_block1) {\n          if_block1.p(ctx, dirty);\n        } else {\n          if_block1 = create_if_block_2$4(ctx);\n          if_block1.c();\n          if_block1.m(span, null);\n        }\n      } else if (if_block1) {\n        if_block1.d(1);\n        if_block1 = null;\n      }\n      if ( /*group*/ctx[6].isGroup && /*group*/ctx[6].entries.length > 1) {\n        if (if_block2) {\n          if_block2.p(ctx, dirty);\n        } else {\n          if_block2 = create_if_block_1$5(ctx);\n          if_block2.c();\n          if_block2.m(button, null);\n        }\n      } else if (if_block2) {\n        if_block2.d(1);\n        if_block2 = null;\n      }\n      if (dirty & /*listItems*/1) {\n        toggle_class(button, \"is-group\", /*group*/ctx[6].isGroup);\n      }\n      if (dirty & /*listItems, selectedId*/3) {\n        var _ctx$9;\n        toggle_class(li, \"selected\", ! /*group*/ctx[6].expanded && /*selectedId*/ctx[1] === ( /*group*/(_ctx$9 = ctx[6]) === null || _ctx$9 === void 0 || (_ctx$9 = _ctx$9.topEntry) === null || _ctx$9 === void 0 ? void 0 : _ctx$9.id));\n      }\n      if ( /*group*/ctx[6].isGroup && /*group*/ctx[6].expanded) {\n        if (if_block3) {\n          if_block3.p(ctx, dirty);\n        } else {\n          if_block3 = create_if_block$7(ctx);\n          if_block3.c();\n          if_block3.m(if_block3_anchor.parentNode, if_block3_anchor);\n        }\n      } else if (if_block3) {\n        if_block3.d(1);\n        if_block3 = null;\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n        detach(t4);\n        detach(if_block3_anchor);\n      }\n      if (if_block0) if_block0.d();\n      if (if_block1) if_block1.d();\n      if (if_block2) if_block2.d();\n      if (if_block3) if_block3.d(detaching);\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction create_fragment$c(ctx) {\n  let ul;\n  let each_blocks = [];\n  let each_1_lookup = new Map();\n  let each_value = ensure_array_like( /*listItems*/ctx[0]);\n  const get_key = ctx => /*group*/ctx[6].id;\n  for (let i = 0; i < each_value.length; i += 1) {\n    let child_ctx = get_each_context$5(ctx, each_value, i);\n    let key = get_key(child_ctx);\n    each_1_lookup.set(key, each_blocks[i] = create_each_block$5(key, child_ctx));\n  }\n  return {\n    c() {\n      ul = element(\"ul\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(ul, \"class\", \"svelte-vbjxb8\");\n    },\n    m(target, anchor) {\n      insert(target, ul, anchor);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(ul, null);\n        }\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*listItems, selectedId, dispatchEvent*/7) {\n        each_value = ensure_array_like( /*listItems*/ctx[0]);\n        each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each_1_lookup, ul, destroy_block, create_each_block$5, null, get_each_context$5);\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(ul);\n      }\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].d();\n      }\n    }\n  };\n}\nfunction instance$c($$self, $$props, $$invalidate) {\n  let {\n    listItems = [],\n    selectedId\n  } = $$props;\n  const dispatchEvent = createEventDispatcher();\n  const click_handler = (group, groupIdx) => {\n    var _group$topEntry;\n    return dispatchEvent('click-item', {\n      id: group === null || group === void 0 || (_group$topEntry = group.topEntry) === null || _group$topEntry === void 0 ? void 0 : _group$topEntry.id,\n      groupIdx,\n      wasTopNode: true\n    });\n  };\n  const dblclick_handler = group => {\n    var _group$topEntry2;\n    return dispatchEvent('dblclick-item', {\n      id: group === null || group === void 0 || (_group$topEntry2 = group.topEntry) === null || _group$topEntry2 === void 0 ? void 0 : _group$topEntry2.id\n    });\n  };\n  const click_handler_1 = (subEntry, groupIdx) => dispatchEvent('click-item', {\n    id: subEntry === null || subEntry === void 0 ? void 0 : subEntry.id,\n    groupIdx,\n    wasTopNode: false\n  });\n  $$self.$$set = $$props => {\n    if ('listItems' in $$props) $$invalidate(0, listItems = $$props.listItems);\n    if ('selectedId' in $$props) $$invalidate(1, selectedId = $$props.selectedId);\n  };\n  return [listItems, selectedId, dispatchEvent, click_handler, dblclick_handler, click_handler_1];\n}\nclass HistoryList extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$c, create_fragment$c, safe_not_equal, {\n      listItems: 0,\n      selectedId: 1\n    }, add_css$c);\n  }\n}\n\n/* src/tabs/history/DiffValue.svelte generated by Svelte v4.2.15 */\nfunction add_css$b(target) {\n  append_styles(target, \"svelte-1a1oqej\", \".added.svelte-1a1oqej.svelte-1a1oqej{display:inline-block;background:#87cc86;border-radius:1px;color:green;padding:1px 2px;text-indent:0;min-height:1ex}.deleted.svelte-1a1oqej.svelte-1a1oqej{display:inline-block;background:#d66363;border-radius:1px;color:#222;padding:1px 2px;text-decoration:line-through;text-indent:0;min-height:1ex}.updated.svelte-1a1oqej.svelte-1a1oqej{word-break:break-all}.updated.svelte-1a1oqej .added.svelte-1a1oqej{background:#eaea37}.arrow.svelte-1a1oqej.svelte-1a1oqej{color:#87cc86}\");\n}\nfunction get_each_context$4(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[3] = list[i];\n  return child_ctx;\n}\n\n// (56:0) {:else}\nfunction create_else_block_1$1(ctx) {\n  let t_value = /*defaultFormatter*/ctx[0]( /*value*/ctx[1]) + \"\";\n  let t;\n  return {\n    c() {\n      t = text(t_value);\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*defaultFormatter, value*/3 && t_value !== (t_value = /*defaultFormatter*/ctx[0]( /*value*/ctx[1]) + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (31:0) {#if Array.isArray(value)}\nfunction create_if_block$6(ctx) {\n  let if_block_anchor;\n  function select_block_type_1(ctx, dirty) {\n    if ( /*value*/ctx[1].length === 1) return create_if_block_1$4;\n    if ( /*value*/ctx[1].length === 2) return create_if_block_2$3;\n    if ( /*value*/ctx[1].length === 3 && /*value*/ctx[1][1] === 0 && /*value*/ctx[1][2] === 0) return create_if_block_3$2;\n    if ( /*value*/ctx[1].length === 3 && /*value*/ctx[1][2] === 2) return create_if_block_4$2;\n  }\n  let current_block_type = select_block_type_1(ctx);\n  let if_block = current_block_type && current_block_type(ctx);\n  return {\n    c() {\n      if (if_block) if_block.c();\n      if_block_anchor = empty();\n    },\n    m(target, anchor) {\n      if (if_block) if_block.m(target, anchor);\n      insert(target, if_block_anchor, anchor);\n    },\n    p(ctx, dirty) {\n      if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) {\n        if_block.p(ctx, dirty);\n      } else {\n        if (if_block) if_block.d(1);\n        if_block = current_block_type && current_block_type(ctx);\n        if (if_block) {\n          if_block.c();\n          if_block.m(if_block_anchor.parentNode, if_block_anchor);\n        }\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(if_block_anchor);\n      }\n      if (if_block) {\n        if_block.d(detaching);\n      }\n    }\n  };\n}\n\n// (43:49) \nfunction create_if_block_4$2(ctx) {\n  let span;\n  let each_value = ensure_array_like(parseTextDiff( /*value*/ctx[1][0]));\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block$4(get_each_context$4(ctx, each_value, i));\n  }\n  return {\n    c() {\n      span = element(\"span\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(span, \"class\", \"updated svelte-1a1oqej\");\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(span, null);\n        }\n      }\n    },\n    p(ctx, dirty) {\n      if (dirty & /*parseTextDiff, value*/2) {\n        each_value = ensure_array_like(parseTextDiff( /*value*/ctx[1][0]));\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context$4(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n          } else {\n            each_blocks[i] = create_each_block$4(child_ctx);\n            each_blocks[i].c();\n            each_blocks[i].m(span, null);\n          }\n        }\n        for (; i < each_blocks.length; i += 1) {\n          each_blocks[i].d(1);\n        }\n        each_blocks.length = each_value.length;\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n      destroy_each(each_blocks, detaching);\n    }\n  };\n}\n\n// (41:67) \nfunction create_if_block_3$2(ctx) {\n  let span;\n  let t_value = getValueString( /*value*/ctx[1][0]) + \"\";\n  let t;\n  return {\n    c() {\n      span = element(\"span\");\n      t = text(t_value);\n      attr(span, \"class\", \"deleted svelte-1a1oqej\");\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n      append(span, t);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*value*/2 && t_value !== (t_value = getValueString( /*value*/ctx[1][0]) + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (35:31) \nfunction create_if_block_2$3(ctx) {\n  let span3;\n  let span0;\n  let t0_value = getValueString( /*value*/ctx[1][0]) + \"\";\n  let t0;\n  let t1;\n  let span1;\n  let t3;\n  let span2;\n  let t4_value = getValueString( /*value*/ctx[1][1]) + \"\";\n  let t4;\n  return {\n    c() {\n      span3 = element(\"span\");\n      span0 = element(\"span\");\n      t0 = text(t0_value);\n      t1 = space();\n      span1 = element(\"span\");\n      span1.textContent = \"=>\";\n      t3 = space();\n      span2 = element(\"span\");\n      t4 = text(t4_value);\n      attr(span0, \"class\", \"deleted svelte-1a1oqej\");\n      attr(span1, \"class\", \"arrow svelte-1a1oqej\");\n      attr(span2, \"class\", \"added svelte-1a1oqej\");\n      attr(span3, \"class\", \"updated svelte-1a1oqej\");\n    },\n    m(target, anchor) {\n      insert(target, span3, anchor);\n      append(span3, span0);\n      append(span0, t0);\n      append(span3, t1);\n      append(span3, span1);\n      append(span3, t3);\n      append(span3, span2);\n      append(span2, t4);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*value*/2 && t0_value !== (t0_value = getValueString( /*value*/ctx[1][0]) + \"\")) set_data(t0, t0_value);\n      if (dirty & /*value*/2 && t4_value !== (t4_value = getValueString( /*value*/ctx[1][1]) + \"\")) set_data(t4, t4_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span3);\n      }\n    }\n  };\n}\n\n// (33:2) {#if value.length === 1}\nfunction create_if_block_1$4(ctx) {\n  let span;\n  let t_value = getValueString( /*value*/ctx[1][0]) + \"\";\n  let t;\n  return {\n    c() {\n      span = element(\"span\");\n      t = text(t_value);\n      attr(span, \"class\", \"added svelte-1a1oqej\");\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n      append(span, t);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*value*/2 && t_value !== (t_value = getValueString( /*value*/ctx[1][0]) + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (50:8) {:else}\nfunction create_else_block$6(ctx) {\n  let span;\n  let t_value = /*item*/ctx[3].raw + \"\";\n  let t;\n  return {\n    c() {\n      span = element(\"span\");\n      t = text(t_value);\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n      append(span, t);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*value*/2 && t_value !== (t_value = /*item*/ctx[3].raw + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (48:27) \nfunction create_if_block_6(ctx) {\n  let span;\n  let t_value = /*item*/ctx[3].add + \"\";\n  let t;\n  return {\n    c() {\n      span = element(\"span\");\n      t = text(t_value);\n      attr(span, \"class\", \"added svelte-1a1oqej\");\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n      append(span, t);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*value*/2 && t_value !== (t_value = /*item*/ctx[3].add + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (46:8) {#if item.delete}\nfunction create_if_block_5$2(ctx) {\n  let span;\n  let t_value = /*item*/ctx[3].delete + \"\";\n  let t;\n  return {\n    c() {\n      span = element(\"span\");\n      t = text(t_value);\n      attr(span, \"class\", \"deleted svelte-1a1oqej\");\n    },\n    m(target, anchor) {\n      insert(target, span, anchor);\n      append(span, t);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*value*/2 && t_value !== (t_value = /*item*/ctx[3].delete + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(span);\n      }\n    }\n  };\n}\n\n// (45:6) {#each parseTextDiff(value[0]) as item}\nfunction create_each_block$4(ctx) {\n  let if_block_anchor;\n  function select_block_type_2(ctx, dirty) {\n    if ( /*item*/ctx[3].delete) return create_if_block_5$2;\n    if ( /*item*/ctx[3].add) return create_if_block_6;\n    return create_else_block$6;\n  }\n  let current_block_type = select_block_type_2(ctx);\n  let if_block = current_block_type(ctx);\n  return {\n    c() {\n      if_block.c();\n      if_block_anchor = empty();\n    },\n    m(target, anchor) {\n      if_block.m(target, anchor);\n      insert(target, if_block_anchor, anchor);\n    },\n    p(ctx, dirty) {\n      if (current_block_type === (current_block_type = select_block_type_2(ctx)) && if_block) {\n        if_block.p(ctx, dirty);\n      } else {\n        if_block.d(1);\n        if_block = current_block_type(ctx);\n        if (if_block) {\n          if_block.c();\n          if_block.m(if_block_anchor.parentNode, if_block_anchor);\n        }\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(if_block_anchor);\n      }\n      if_block.d(detaching);\n    }\n  };\n}\nfunction create_fragment$b(ctx) {\n  let show_if;\n  let if_block_anchor;\n  function select_block_type(ctx, dirty) {\n    if (dirty & /*value*/2) show_if = null;\n    if (show_if == null) show_if = !!Array.isArray( /*value*/ctx[1]);\n    if (show_if) return create_if_block$6;\n    return create_else_block_1$1;\n  }\n  let current_block_type = select_block_type(ctx, -1);\n  let if_block = current_block_type(ctx);\n  return {\n    c() {\n      if_block.c();\n      if_block_anchor = empty();\n    },\n    m(target, anchor) {\n      if_block.m(target, anchor);\n      insert(target, if_block_anchor, anchor);\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (current_block_type === (current_block_type = select_block_type(ctx, dirty)) && if_block) {\n        if_block.p(ctx, dirty);\n      } else {\n        if_block.d(1);\n        if_block = current_block_type(ctx);\n        if (if_block) {\n          if_block.c();\n          if_block.m(if_block_anchor.parentNode, if_block_anchor);\n        }\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(if_block_anchor);\n      }\n      if_block.d(detaching);\n    }\n  };\n}\nfunction replaceSpacesWithNonBreakingSpace(str) {\n  return str.replace(/\\s/gm, ' ');\n}\nfunction parseTextDiff(textDiff) {\n  const diffByLines = textDiff.split(/\\n/gm).slice(1);\n  return diffByLines.map(line => {\n    const type = line.startsWith('-') ? 'delete' : line.startsWith('+') ? 'add' : 'raw';\n    return {\n      [type]: replaceSpacesWithNonBreakingSpace(line.slice(1))\n    };\n  });\n}\nfunction stringifyAndShrink(v) {\n  if (v === null) {\n    return 'null';\n  }\n  const str = JSON.stringify(v);\n  if (typeof str === 'undefined') {\n    return 'undefined';\n  }\n  return str.length > 22 ? \"\".concat(str.slice(0, 15), \"\\u2026\").concat(str.slice(-5)) : str;\n}\nfunction getValueString(raw) {\n  if (typeof raw === 'string') {\n    return raw;\n  }\n  return stringifyAndShrink(raw);\n}\nfunction instance$b($$self, $$props, $$invalidate) {\n  let value;\n  let {\n    node,\n    defaultFormatter\n  } = $$props;\n  $$self.$$set = $$props => {\n    if ('node' in $$props) $$invalidate(2, node = $$props.node);\n    if ('defaultFormatter' in $$props) $$invalidate(0, defaultFormatter = $$props.defaultFormatter);\n  };\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*node*/4) {\n      $$invalidate(1, value = node.value);\n    }\n  };\n  return [defaultFormatter, value, node];\n}\nclass DiffValue extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$b, create_fragment$b, safe_not_equal, {\n      node: 2,\n      defaultFormatter: 0\n    }, add_css$b);\n  }\n}\n\n/* src/tabs/history/HistoryTab.svelte generated by Svelte v4.2.15 */\nfunction add_css$a(target) {\n  append_styles(target, \"svelte-r7zw98\", \".left-panel.svelte-r7zw98.svelte-r7zw98{flex-grow:0;padding:0;min-width:190px;width:190px}.title-container.svelte-r7zw98.svelte-r7zw98{align-items:center;display:flex}.transaction-buttons.svelte-r7zw98.svelte-r7zw98{margin-left:2rem}.entry-row.svelte-r7zw98+.entry-row.svelte-r7zw98{margin-top:1em}.selection-html.svelte-r7zw98.svelte-r7zw98{font-weight:100;margin:0.5em 0 0 0;padding:0}.equal-diff.svelte-r7zw98.svelte-r7zw98{align-items:center;color:rgb(255, 162, 177);display:flex;font-size:14px;height:100%;justify-content:center;width:100%}\");\n}\nfunction get_each_context$3(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[13] = list[i];\n  return child_ctx;\n}\n\n// (67:2) \nfunction create_left_slot$3(ctx) {\n  var _ctx$;\n  let div;\n  let historylist;\n  let current;\n  historylist = new HistoryList({\n    props: {\n      listItems: /*listItems*/ctx[4],\n      selectedId: /*selectedEntry*/((_ctx$ = ctx[0]) === null || _ctx$ === void 0 ? void 0 : _ctx$.id) || ''\n    }\n  });\n  historylist.$on(\"click-item\", /*handleEntrySelect*/ctx[7]);\n  historylist.$on(\"dblclick-item\", /*handleEntryDblClick*/ctx[8]);\n  return {\n    c() {\n      div = element(\"div\");\n      create_component(historylist.$$.fragment);\n      attr(div, \"slot\", \"left\");\n      attr(div, \"class\", \"left-panel svelte-r7zw98\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n      mount_component(historylist, div, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      var _ctx$2;\n      const historylist_changes = {};\n      if (dirty & /*listItems*/16) historylist_changes.listItems = /*listItems*/ctx[4];\n      if (dirty & /*selectedEntry*/1) historylist_changes.selectedId = /*selectedEntry*/((_ctx$2 = ctx[0]) === null || _ctx$2 === void 0 ? void 0 : _ctx$2.id) || '';\n      historylist.$set(historylist_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(historylist.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(historylist.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n      destroy_component(historylist);\n    }\n  };\n}\n\n// (152:4) {:else}\nfunction create_else_block$5(ctx) {\n  let div;\n  return {\n    c() {\n      div = element(\"div\");\n      div.textContent = \"Docs are equal.\";\n      attr(div, \"class\", \"equal-diff svelte-r7zw98\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n    },\n    p: noop,\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n    }\n  };\n}\n\n// (76:4) {#if selectedEntry}\nfunction create_if_block$5(ctx) {\n  let div3;\n  let t0;\n  let t1;\n  let t2;\n  let div2;\n  let div1;\n  let h2;\n  let t4;\n  let div0;\n  let t5;\n  let button;\n  let t6;\n  let current;\n  let if_block0 = /*selectedEntry*/ctx[0].contentDiff && create_if_block_5$1(ctx);\n  let if_block1 = /*selectedEntry*/ctx[0].selectionDiff && create_if_block_4$1(ctx);\n  let if_block2 = /*selectedEntry*/ctx[0].selectionHtml.length > 0 && create_if_block_3$1(ctx);\n  let if_block3 = /*showTr*/ctx[1] && create_if_block_2$2(ctx);\n  button = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot$3]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button.$on(\"click\", /*toggleShowTr*/ctx[5]);\n  let if_block4 = /*showTr*/ctx[1] && create_if_block_1$3(ctx);\n  return {\n    c() {\n      div3 = element(\"div\");\n      if (if_block0) if_block0.c();\n      t0 = space();\n      if (if_block1) if_block1.c();\n      t1 = space();\n      if (if_block2) if_block2.c();\n      t2 = space();\n      div2 = element(\"div\");\n      div1 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Transactions\";\n      t4 = space();\n      div0 = element(\"div\");\n      if (if_block3) if_block3.c();\n      t5 = space();\n      create_component(button.$$.fragment);\n      t6 = space();\n      if (if_block4) if_block4.c();\n      attr(div0, \"class\", \"transaction-buttons svelte-r7zw98\");\n      attr(div1, \"class\", \"title-container svelte-r7zw98\");\n      attr(div2, \"class\", \"entry-row svelte-r7zw98\");\n    },\n    m(target, anchor) {\n      insert(target, div3, anchor);\n      if (if_block0) if_block0.m(div3, null);\n      append(div3, t0);\n      if (if_block1) if_block1.m(div3, null);\n      append(div3, t1);\n      if (if_block2) if_block2.m(div3, null);\n      append(div3, t2);\n      append(div3, div2);\n      append(div2, div1);\n      append(div1, h2);\n      append(div1, t4);\n      append(div1, div0);\n      if (if_block3) if_block3.m(div0, null);\n      append(div0, t5);\n      mount_component(button, div0, null);\n      append(div2, t6);\n      if (if_block4) if_block4.m(div2, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      if ( /*selectedEntry*/ctx[0].contentDiff) {\n        if (if_block0) {\n          if_block0.p(ctx, dirty);\n          if (dirty & /*selectedEntry*/1) {\n            transition_in(if_block0, 1);\n          }\n        } else {\n          if_block0 = create_if_block_5$1(ctx);\n          if_block0.c();\n          transition_in(if_block0, 1);\n          if_block0.m(div3, t0);\n        }\n      } else if (if_block0) {\n        group_outros();\n        transition_out(if_block0, 1, 1, () => {\n          if_block0 = null;\n        });\n        check_outros();\n      }\n      if ( /*selectedEntry*/ctx[0].selectionDiff) {\n        if (if_block1) {\n          if_block1.p(ctx, dirty);\n          if (dirty & /*selectedEntry*/1) {\n            transition_in(if_block1, 1);\n          }\n        } else {\n          if_block1 = create_if_block_4$1(ctx);\n          if_block1.c();\n          transition_in(if_block1, 1);\n          if_block1.m(div3, t1);\n        }\n      } else if (if_block1) {\n        group_outros();\n        transition_out(if_block1, 1, 1, () => {\n          if_block1 = null;\n        });\n        check_outros();\n      }\n      if ( /*selectedEntry*/ctx[0].selectionHtml.length > 0) {\n        if (if_block2) {\n          if_block2.p(ctx, dirty);\n          if (dirty & /*selectedEntry*/1) {\n            transition_in(if_block2, 1);\n          }\n        } else {\n          if_block2 = create_if_block_3$1(ctx);\n          if_block2.c();\n          transition_in(if_block2, 1);\n          if_block2.m(div3, t2);\n        }\n      } else if (if_block2) {\n        group_outros();\n        transition_out(if_block2, 1, 1, () => {\n          if_block2 = null;\n        });\n        check_outros();\n      }\n      if ( /*showTr*/ctx[1]) {\n        if (if_block3) {\n          if_block3.p(ctx, dirty);\n          if (dirty & /*showTr*/2) {\n            transition_in(if_block3, 1);\n          }\n        } else {\n          if_block3 = create_if_block_2$2(ctx);\n          if_block3.c();\n          transition_in(if_block3, 1);\n          if_block3.m(div0, t5);\n        }\n      } else if (if_block3) {\n        group_outros();\n        transition_out(if_block3, 1, 1, () => {\n          if_block3 = null;\n        });\n        check_outros();\n      }\n      const button_changes = {};\n      if (dirty & /*$$scope, showTr*/65538) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      if ( /*showTr*/ctx[1]) {\n        if (if_block4) {\n          if_block4.p(ctx, dirty);\n          if (dirty & /*showTr*/2) {\n            transition_in(if_block4, 1);\n          }\n        } else {\n          if_block4 = create_if_block_1$3(ctx);\n          if_block4.c();\n          transition_in(if_block4, 1);\n          if_block4.m(div2, null);\n        }\n      } else if (if_block4) {\n        group_outros();\n        transition_out(if_block4, 1, 1, () => {\n          if_block4 = null;\n        });\n        check_outros();\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(if_block0);\n      transition_in(if_block1);\n      transition_in(if_block2);\n      transition_in(if_block3);\n      transition_in(button.$$.fragment, local);\n      transition_in(if_block4);\n      current = true;\n    },\n    o(local) {\n      transition_out(if_block0);\n      transition_out(if_block1);\n      transition_out(if_block2);\n      transition_out(if_block3);\n      transition_out(button.$$.fragment, local);\n      transition_out(if_block4);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div3);\n      }\n      if (if_block0) if_block0.d();\n      if (if_block1) if_block1.d();\n      if (if_block2) if_block2.d();\n      if (if_block3) if_block3.d();\n      destroy_component(button);\n      if (if_block4) if_block4.d();\n    }\n  };\n}\n\n// (78:8) {#if selectedEntry.contentDiff}\nfunction create_if_block_5$1(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let treeview;\n  let current;\n  button = new Button({\n    props: {\n      class: \"hidden\",\n      $$slots: {\n        default: [create_default_slot_5]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*selectedEntry*/ctx[0].contentDiff,\n      showLogButton: true,\n      showCopyButton: true,\n      valueComponent: DiffValue,\n      recursionOpts: {\n        maxDepth: 12,\n        mapChildren: mapDocDeltaChildren,\n        shouldExpandNode: func$1\n      }\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Doc diff\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview.$$.fragment);\n      attr(div0, \"class\", \"title-container svelte-r7zw98\");\n      attr(div1, \"class\", \"entry-row svelte-r7zw98\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(treeview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/65536) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      const treeview_changes = {};\n      if (dirty & /*selectedEntry*/1) treeview_changes.data = /*selectedEntry*/ctx[0].contentDiff;\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(treeview);\n    }\n  };\n}\n\n// (82:14) <Button class=\"hidden\">\nfunction create_default_slot_5(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (98:8) {#if selectedEntry.selectionDiff}\nfunction create_if_block_4$1(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let treeview;\n  let current;\n  button = new Button({\n    props: {\n      class: \"hidden\",\n      $$slots: {\n        default: [create_default_slot_4]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*selectedEntry*/ctx[0].selectionDiff,\n      valueComponent: DiffValue,\n      recursionOpts: {\n        mapChildren: mapSelectionDeltaChildren,\n        shouldExpandNode: func_1\n      }\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Selection diff\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview.$$.fragment);\n      attr(div0, \"class\", \"title-container svelte-r7zw98\");\n      attr(div1, \"class\", \"entry-row svelte-r7zw98\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(treeview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/65536) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      const treeview_changes = {};\n      if (dirty & /*selectedEntry*/1) treeview_changes.data = /*selectedEntry*/ctx[0].selectionDiff;\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(treeview);\n    }\n  };\n}\n\n// (102:14) <Button class=\"hidden\">\nfunction create_default_slot_4(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (115:8) {#if selectedEntry.selectionHtml.length > 0}\nfunction create_if_block_3$1(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let pre;\n  let code;\n  let raw_value = /*selectedEntry*/ctx[0].selectionHtml + \"\";\n  let current;\n  button = new Button({\n    props: {\n      class: \"hidden\",\n      $$slots: {\n        default: [create_default_slot_3]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Selection content\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      pre = element(\"pre\");\n      code = element(\"code\");\n      attr(div0, \"class\", \"title-container svelte-r7zw98\");\n      attr(pre, \"class\", \"selection-html svelte-r7zw98\");\n      attr(div1, \"class\", \"entry-row svelte-r7zw98\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      append(div1, pre);\n      append(pre, code);\n      code.innerHTML = raw_value;\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/65536) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      if ((!current || dirty & /*selectedEntry*/1) && raw_value !== (raw_value = /*selectedEntry*/ctx[0].selectionHtml + \"\")) code.innerHTML = raw_value;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n    }\n  };\n}\n\n// (119:14) <Button class=\"hidden\">\nfunction create_default_slot_3(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (128:14) {#if showTr}\nfunction create_if_block_2$2(ctx) {\n  let button0;\n  let t;\n  let button1;\n  let current;\n  button0 = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot_2]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button0.$on(\"click\", /*handleToggleExpandTrTreeView*/ctx[9]);\n  button1 = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot_1$3]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button1.$on(\"click\", /*handleLogTr*/ctx[6]);\n  return {\n    c() {\n      create_component(button0.$$.fragment);\n      t = space();\n      create_component(button1.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(button0, target, anchor);\n      insert(target, t, anchor);\n      mount_component(button1, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button0_changes = {};\n      if (dirty & /*$$scope, expandTrTreeView*/65540) {\n        button0_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button0.$set(button0_changes);\n      const button1_changes = {};\n      if (dirty & /*$$scope*/65536) {\n        button1_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button1.$set(button1_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button0.$$.fragment, local);\n      transition_in(button1.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button0.$$.fragment, local);\n      transition_out(button1.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n      destroy_component(button0, detaching);\n      destroy_component(button1, detaching);\n    }\n  };\n}\n\n// (129:16) <Button on:click={handleToggleExpandTrTreeView}>\nfunction create_default_slot_2(ctx) {\n  let t_value = ( /*expandTrTreeView*/ctx[2] ? 'collapse' : 'expand') + \"\";\n  let t;\n  return {\n    c() {\n      t = text(t_value);\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*expandTrTreeView*/4 && t_value !== (t_value = ( /*expandTrTreeView*/ctx[2] ? 'collapse' : 'expand') + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (132:16) <Button on:click={handleLogTr}>\nfunction create_default_slot_1$3(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (134:14) <Button on:click={toggleShowTr}>\nfunction create_default_slot$3(ctx) {\n  let t_value = ( /*showTr*/ctx[1] ? 'hide' : 'show') + \"\";\n  let t;\n  return {\n    c() {\n      t = text(t_value);\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*showTr*/2 && t_value !== (t_value = ( /*showTr*/ctx[1] ? 'hide' : 'show') + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (139:10) {#if showTr}\nfunction create_if_block_1$3(ctx) {\n  let each_1_anchor;\n  let current;\n  let each_value = ensure_array_like( /*selectedEntry*/ctx[0].trs);\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i));\n  }\n  const out = i => transition_out(each_blocks[i], 1, 1, () => {\n    each_blocks[i] = null;\n  });\n  return {\n    c() {\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      each_1_anchor = empty();\n    },\n    m(target, anchor) {\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(target, anchor);\n        }\n      }\n      insert(target, each_1_anchor, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      if (dirty & /*selectedEntry, transactionRecursionOpts*/9) {\n        each_value = ensure_array_like( /*selectedEntry*/ctx[0].trs);\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context$3(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n            transition_in(each_blocks[i], 1);\n          } else {\n            each_blocks[i] = create_each_block$3(child_ctx);\n            each_blocks[i].c();\n            transition_in(each_blocks[i], 1);\n            each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);\n          }\n        }\n        group_outros();\n        for (i = each_value.length; i < each_blocks.length; i += 1) {\n          out(i);\n        }\n        check_outros();\n      }\n    },\n    i(local) {\n      if (current) return;\n      for (let i = 0; i < each_value.length; i += 1) {\n        transition_in(each_blocks[i]);\n      }\n      current = true;\n    },\n    o(local) {\n      each_blocks = each_blocks.filter(Boolean);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        transition_out(each_blocks[i]);\n      }\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(each_1_anchor);\n      }\n      destroy_each(each_blocks, detaching);\n    }\n  };\n}\n\n// (140:12) {#each selectedEntry.trs as tr}\nfunction create_each_block$3(ctx) {\n  let treeview;\n  let current;\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*tr*/ctx[13],\n      showLogButton: true,\n      showCopyButton: true,\n      recursionOpts: /*transactionRecursionOpts*/ctx[3]\n    }\n  });\n  return {\n    c() {\n      create_component(treeview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(treeview, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const treeview_changes = {};\n      if (dirty & /*selectedEntry*/1) treeview_changes.data = /*tr*/ctx[13];\n      if (dirty & /*transactionRecursionOpts*/8) treeview_changes.recursionOpts = /*transactionRecursionOpts*/ctx[3];\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(treeview, detaching);\n    }\n  };\n}\n\n// (75:2) \nfunction create_right_slot$4(ctx) {\n  let div;\n  let current_block_type_index;\n  let if_block;\n  let current;\n  const if_block_creators = [create_if_block$5, create_else_block$5];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*selectedEntry*/ctx[0]) return 0;\n    return 1;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  return {\n    c() {\n      div = element(\"div\");\n      if_block.c();\n      attr(div, \"slot\", \"right\");\n      attr(div, \"class\", \"right-panel\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n      if_blocks[current_block_type_index].m(div, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index === previous_block_index) {\n        if_blocks[current_block_type_index].p(ctx, dirty);\n      } else {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block = if_blocks[current_block_type_index];\n        if (!if_block) {\n          if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block.c();\n        } else {\n          if_block.p(ctx, dirty);\n        }\n        transition_in(if_block, 1);\n        if_block.m(div, null);\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(if_block);\n      current = true;\n    },\n    o(local) {\n      transition_out(if_block);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n      if_blocks[current_block_type_index].d();\n    }\n  };\n}\nfunction create_fragment$a(ctx) {\n  let splitview;\n  let current;\n  splitview = new SplitView({\n    props: {\n      $$slots: {\n        right: [create_right_slot$4],\n        left: [create_left_slot$3]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      create_component(splitview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(splitview, target, anchor);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const splitview_changes = {};\n      if (dirty & /*$$scope, selectedEntry, transactionRecursionOpts, showTr, expandTrTreeView, listItems*/65567) {\n        splitview_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      splitview.$set(splitview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(splitview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(splitview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(splitview, detaching);\n    }\n  };\n}\nconst func$1 = () => true;\nconst func_1 = () => true;\nfunction instance$a($$self, $$props, $$invalidate) {\n  let listItems;\n  let $stateHistory;\n  let $shownHistoryGroups;\n  component_subscribe($$self, stateHistory, $$value => $$invalidate(10, $stateHistory = $$value));\n  component_subscribe($$self, shownHistoryGroups, $$value => $$invalidate(11, $shownHistoryGroups = $$value));\n  let selectedEntry = undefined,\n    showTr = false;\n  const {\n    replaceEditorContent\n  } = getContext('editor-view');\n  let expandTrTreeView = false;\n  let transactionRecursionOpts = {\n    maxDepth: 24,\n    stopCircularRecursion: true,\n    omitKeys: ['schema'],\n    shouldExpandNode: () => expandTrTreeView\n  };\n  latestEntry.subscribe(v => {\n    if (v) $$invalidate(0, selectedEntry = v);\n  });\n  function toggleShowTr() {\n    $$invalidate(1, showTr = !showTr);\n  }\n  function handleLogTr() {\n    console.info('%c [prosemirror-dev-toolkit]: Property added to window._trs', 'color: #b8e248');\n    console.log(selectedEntry === null || selectedEntry === void 0 ? void 0 : selectedEntry.trs);\n    window._trs = selectedEntry === null || selectedEntry === void 0 ? void 0 : selectedEntry.trs;\n  }\n\n  /**\n  * Handles the clicks of the history entries.\n  *\n  * Sets the clicked entry as the selectedEntry but in the case of topNode, meaning\n  * in a selection group (shown with [x] number) the entry has a sublist of entries\n  * where the previous is duplicated as the first entry. Therefore on expanding the group\n  * selecting the first sub-entry, otherwise collapsing but still keeping the topNode selected.\n  * Kinda confusing but eh.\n  */\n  function handleEntrySelect(e) {\n    const {\n      id = '',\n      groupIdx,\n      wasTopNode\n    } = e.detail;\n    $$invalidate(0, selectedEntry = $stateHistory.get(id));\n    if (!selectedEntry) return;\n    const group = listItems[groupIdx];\n    if (group.isGroup && group.entries.length > 1 && wasTopNode) {\n      shownHistoryGroups.update(val => val.map((g, idx) => idx !== groupIdx ? g : Object.assign(Object.assign({}, g), {\n        expanded: !g.expanded\n      })));\n    }\n  }\n  function handleEntryDblClick(e) {\n    $$invalidate(0, selectedEntry = $stateHistory.get(e.detail.id || ''));\n    selectedEntry && replaceEditorContent(selectedEntry.state);\n  }\n  function handleToggleExpandTrTreeView() {\n    $$invalidate(2, expandTrTreeView = !expandTrTreeView);\n    $$invalidate(3, transactionRecursionOpts = Object.assign(Object.assign({}, transactionRecursionOpts), {\n      shouldExpandNode: () => expandTrTreeView\n    }));\n  }\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*$shownHistoryGroups, $stateHistory*/3072) {\n      $$invalidate(4, listItems = $shownHistoryGroups.map(g => ({\n        id: g.id,\n        isGroup: g.isGroup,\n        topEntry: $stateHistory.get(g.topEntryId),\n        entries: g.entryIds.map(id => $stateHistory.get(id)),\n        expanded: g.expanded\n      })));\n    }\n  };\n  return [selectedEntry, showTr, expandTrTreeView, transactionRecursionOpts, listItems, toggleShowTr, handleLogTr, handleEntrySelect, handleEntryDblClick, handleToggleExpandTrTreeView, $stateHistory, $shownHistoryGroups];\n}\nclass HistoryTab extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$a, create_fragment$a, safe_not_equal, {}, add_css$a);\n  }\n}\n\n/* src/tabs/List.svelte generated by Svelte v4.2.15 */\nfunction add_css$9(target) {\n  append_styles(target, \"svelte-1fq2hhi\", \"ul.svelte-1fq2hhi.svelte-1fq2hhi{color:#fff;list-style:none;margin:0;padding:0;height:100%;width:100%}li.svelte-1fq2hhi+li.svelte-1fq2hhi{border-top:1px solid rgb(96, 76, 104)}button.svelte-1fq2hhi.svelte-1fq2hhi{background:transparent;border:0;color:#d3d3d9;cursor:pointer;display:flex;font-family:monospace;font-size:var(--font-medium);font-weight:100;padding:6px 18px;text-transform:uppercase;width:100%}button.svelte-1fq2hhi.svelte-1fq2hhi:hover{background:rgba(255, 162, 177, 0.4);color:#fff}button:hover.empty.svelte-1fq2hhi.svelte-1fq2hhi{background:rgb(80, 68, 93)}button.selected.svelte-1fq2hhi.svelte-1fq2hhi{background:rgba(255, 162, 177, 0.4)}button.selected.empty.svelte-1fq2hhi.svelte-1fq2hhi{background:rgb(80, 68, 93)}button.empty.svelte-1fq2hhi.svelte-1fq2hhi{color:#727288}\");\n}\nfunction get_each_context$2(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[4] = list[i];\n  return child_ctx;\n}\n\n// (5:2) {#each listItems as item}\nfunction create_each_block$2(ctx) {\n  let li;\n  let button;\n  let t0_value = /*item*/ctx[4].value + \"\";\n  let t0;\n  let t1;\n  let mounted;\n  let dispose;\n  function click_handler() {\n    return /*click_handler*/ctx[3]( /*item*/ctx[4]);\n  }\n  return {\n    c() {\n      li = element(\"li\");\n      button = element(\"button\");\n      t0 = text(t0_value);\n      t1 = space();\n      attr(button, \"class\", \"svelte-1fq2hhi\");\n      toggle_class(button, \"selected\", /*selectedKey*/ctx[1] === /*item*/ctx[4].key);\n      toggle_class(button, \"empty\", /*item*/ctx[4].empty);\n      attr(li, \"class\", \"svelte-1fq2hhi\");\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      append(li, button);\n      append(button, t0);\n      append(li, t1);\n      if (!mounted) {\n        dispose = listen(button, \"click\", click_handler);\n        mounted = true;\n      }\n    },\n    p(new_ctx, dirty) {\n      ctx = new_ctx;\n      if (dirty & /*listItems*/1 && t0_value !== (t0_value = /*item*/ctx[4].value + \"\")) set_data(t0, t0_value);\n      if (dirty & /*selectedKey, listItems*/3) {\n        toggle_class(button, \"selected\", /*selectedKey*/ctx[1] === /*item*/ctx[4].key);\n      }\n      if (dirty & /*listItems*/1) {\n        toggle_class(button, \"empty\", /*item*/ctx[4].empty);\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\nfunction create_fragment$9(ctx) {\n  let ul;\n  let each_value = ensure_array_like( /*listItems*/ctx[0]);\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i));\n  }\n  return {\n    c() {\n      ul = element(\"ul\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(ul, \"class\", \"svelte-1fq2hhi\");\n    },\n    m(target, anchor) {\n      insert(target, ul, anchor);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(ul, null);\n        }\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*selectedKey, listItems, onSelect*/7) {\n        each_value = ensure_array_like( /*listItems*/ctx[0]);\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context$2(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n          } else {\n            each_blocks[i] = create_each_block$2(child_ctx);\n            each_blocks[i].c();\n            each_blocks[i].m(ul, null);\n          }\n        }\n        for (; i < each_blocks.length; i += 1) {\n          each_blocks[i].d(1);\n        }\n        each_blocks.length = each_value.length;\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(ul);\n      }\n      destroy_each(each_blocks, detaching);\n    }\n  };\n}\nfunction instance$9($$self, $$props, $$invalidate) {\n  let {\n    listItems = [],\n    selectedKey,\n    onSelect\n  } = $$props;\n  const click_handler = item => onSelect(item);\n  $$self.$$set = $$props => {\n    if ('listItems' in $$props) $$invalidate(0, listItems = $$props.listItems);\n    if ('selectedKey' in $$props) $$invalidate(1, selectedKey = $$props.selectedKey);\n    if ('onSelect' in $$props) $$invalidate(2, onSelect = $$props.onSelect);\n  };\n  return [listItems, selectedKey, onSelect, click_handler];\n}\nclass List extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$9, create_fragment$9, safe_not_equal, {\n      listItems: 0,\n      selectedKey: 1,\n      onSelect: 2\n    }, add_css$9);\n  }\n}\n\n/* src/tabs/PluginsTab.svelte generated by Svelte v4.2.15 */\nfunction add_css$8(target) {\n  append_styles(target, \"svelte-9l897d\", \".top-row.svelte-9l897d{align-items:center;display:flex;justify-content:space-between;margin-bottom:0.5em}.left-panel[slot=left].svelte-9l897d{flex-grow:0;overflow:scroll;padding:0;min-width:190px;width:190px}.right-panel[slot=right].svelte-9l897d{border-left:1px solid rgba(255, 162, 177, 0.2)}.empty-state.svelte-9l897d{align-items:center;color:rgb(255, 162, 177);display:flex;font-size:14px;height:100%;justify-content:center;width:100%}\");\n}\n\n// (49:2) \nfunction create_left_slot$2(ctx) {\n  var _ctx$;\n  let div;\n  let list;\n  let current;\n  list = new List({\n    props: {\n      listItems: /*listItems*/ctx[4],\n      selectedKey: /*selectedPlugin*/(_ctx$ = ctx[0]) === null || _ctx$ === void 0 ? void 0 : _ctx$.key,\n      onSelect: /*handlePluginSelect*/ctx[5]\n    }\n  });\n  return {\n    c() {\n      div = element(\"div\");\n      create_component(list.$$.fragment);\n      attr(div, \"slot\", \"left\");\n      attr(div, \"class\", \"left-panel svelte-9l897d\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n      mount_component(list, div, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      var _ctx$2;\n      const list_changes = {};\n      if (dirty & /*listItems*/16) list_changes.listItems = /*listItems*/ctx[4];\n      if (dirty & /*selectedPlugin*/1) list_changes.selectedKey = /*selectedPlugin*/(_ctx$2 = ctx[0]) === null || _ctx$2 === void 0 ? void 0 : _ctx$2.key;\n      list.$set(list_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(list.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(list.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n      destroy_component(list);\n    }\n  };\n}\n\n// (53:4) {#if pluginState}\nfunction create_if_block_1$2(ctx) {\n  let div1;\n  let h2;\n  let t1;\n  let div0;\n  let button0;\n  let t2;\n  let button1;\n  let current;\n  button0 = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot_1$2]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button0.$on(\"click\", /*handleToggleExpand*/ctx[6]);\n  button1 = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot$2]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button1.$on(\"click\", /*handleLogState*/ctx[7]);\n  return {\n    c() {\n      div1 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Plugin state\";\n      t1 = space();\n      div0 = element(\"div\");\n      create_component(button0.$$.fragment);\n      t2 = space();\n      create_component(button1.$$.fragment);\n      attr(div1, \"class\", \"top-row svelte-9l897d\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, h2);\n      append(div1, t1);\n      append(div1, div0);\n      mount_component(button0, div0, null);\n      append(div0, t2);\n      mount_component(button1, div0, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button0_changes = {};\n      if (dirty & /*$$scope, expandPluginState*/2050) {\n        button0_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button0.$set(button0_changes);\n      const button1_changes = {};\n      if (dirty & /*$$scope*/2048) {\n        button1_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button1.$set(button1_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button0.$$.fragment, local);\n      transition_in(button1.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button0.$$.fragment, local);\n      transition_out(button1.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button0);\n      destroy_component(button1);\n    }\n  };\n}\n\n// (57:10) <Button on:click={handleToggleExpand}>\nfunction create_default_slot_1$2(ctx) {\n  let t_value = ( /*expandPluginState*/ctx[1] ? 'collapse' : 'expand') + \"\";\n  let t;\n  return {\n    c() {\n      t = text(t_value);\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    p(ctx, dirty) {\n      if (dirty & /*expandPluginState*/2 && t_value !== (t_value = ( /*expandPluginState*/ctx[1] ? 'collapse' : 'expand') + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (60:10) <Button on:click={handleLogState}>\nfunction create_default_slot$2(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (66:4) {:else}\nfunction create_else_block$4(ctx) {\n  let div;\n  return {\n    c() {\n      div = element(\"div\");\n      div.textContent = \"Plugin has no state\";\n      attr(div, \"class\", \"empty-state svelte-9l897d\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n    },\n    p: noop,\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n    }\n  };\n}\n\n// (64:4) {#if pluginState}\nfunction create_if_block$4(ctx) {\n  let treeview;\n  let current;\n  treeview = new TreeView({\n    props: {\n      data: /*pluginState*/ctx[3],\n      showLogButton: true,\n      showCopyButton: true,\n      recursionOpts: /*recursionOpts*/ctx[2]\n    }\n  });\n  return {\n    c() {\n      create_component(treeview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(treeview, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const treeview_changes = {};\n      if (dirty & /*pluginState*/8) treeview_changes.data = /*pluginState*/ctx[3];\n      if (dirty & /*recursionOpts*/4) treeview_changes.recursionOpts = /*recursionOpts*/ctx[2];\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(treeview, detaching);\n    }\n  };\n}\n\n// (52:2) \nfunction create_right_slot$3(ctx) {\n  let div;\n  let t;\n  let current_block_type_index;\n  let if_block1;\n  let current;\n  let if_block0 = /*pluginState*/ctx[3] && create_if_block_1$2(ctx);\n  const if_block_creators = [create_if_block$4, create_else_block$4];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*pluginState*/ctx[3]) return 0;\n    return 1;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  return {\n    c() {\n      div = element(\"div\");\n      if (if_block0) if_block0.c();\n      t = space();\n      if_block1.c();\n      attr(div, \"slot\", \"right\");\n      attr(div, \"class\", \"right-panel svelte-9l897d\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n      if (if_block0) if_block0.m(div, null);\n      append(div, t);\n      if_blocks[current_block_type_index].m(div, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      if ( /*pluginState*/ctx[3]) {\n        if (if_block0) {\n          if_block0.p(ctx, dirty);\n          if (dirty & /*pluginState*/8) {\n            transition_in(if_block0, 1);\n          }\n        } else {\n          if_block0 = create_if_block_1$2(ctx);\n          if_block0.c();\n          transition_in(if_block0, 1);\n          if_block0.m(div, t);\n        }\n      } else if (if_block0) {\n        group_outros();\n        transition_out(if_block0, 1, 1, () => {\n          if_block0 = null;\n        });\n        check_outros();\n      }\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index === previous_block_index) {\n        if_blocks[current_block_type_index].p(ctx, dirty);\n      } else {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block1 = if_blocks[current_block_type_index];\n        if (!if_block1) {\n          if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block1.c();\n        } else {\n          if_block1.p(ctx, dirty);\n        }\n        transition_in(if_block1, 1);\n        if_block1.m(div, null);\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(if_block0);\n      transition_in(if_block1);\n      current = true;\n    },\n    o(local) {\n      transition_out(if_block0);\n      transition_out(if_block1);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n      if (if_block0) if_block0.d();\n      if_blocks[current_block_type_index].d();\n    }\n  };\n}\nfunction create_fragment$8(ctx) {\n  let splitview;\n  let current;\n  splitview = new SplitView({\n    props: {\n      $$slots: {\n        right: [create_right_slot$3],\n        left: [create_left_slot$2]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      create_component(splitview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(splitview, target, anchor);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const splitview_changes = {};\n      if (dirty & /*$$scope, pluginState, recursionOpts, expandPluginState, listItems, selectedPlugin*/2079) {\n        splitview_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      splitview.$set(splitview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(splitview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(splitview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(splitview, detaching);\n    }\n  };\n}\nfunction instance$8($$self, $$props, $$invalidate) {\n  let pluginState;\n  let listItems;\n  const {\n    view\n  } = getContext('editor-view');\n  let expandPluginState = false;\n  let recursionOpts = {\n    maxDepth: 10,\n    stopCircularRecursion: true,\n    shouldExpandNode: () => expandPluginState\n  };\n  let editorState = view.state;\n  let plugins = editorState.plugins;\n  let selectedPlugin = plugins[0];\n  latestEntry.subscribe(e => {\n    if (!e) return;\n    $$invalidate(8, editorState = e.state);\n    $$invalidate(9, plugins = editorState.plugins);\n    $$invalidate(0, selectedPlugin = plugins.find(p => p.key === (selectedPlugin === null || selectedPlugin === void 0 ? void 0 : selectedPlugin.key)));\n  });\n  function handlePluginSelect(item) {\n    $$invalidate(0, selectedPlugin = plugins.find(p => p.key === item.key));\n  }\n  function handleToggleExpand() {\n    $$invalidate(1, expandPluginState = !expandPluginState);\n    $$invalidate(2, recursionOpts = Object.assign(Object.assign({}, recursionOpts), {\n      shouldExpandNode: () => expandPluginState\n    }));\n  }\n  function handleLogState() {\n    window._plugin = [selectedPlugin, pluginState];\n    console.info('%c [prosemirror-dev-toolkit]: Property added to window._plugin', 'color: #b8e248');\n    console.log(selectedPlugin);\n    console.log(pluginState);\n  }\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*selectedPlugin, editorState*/257) {\n      // I don't know how, but I've found in one editor plugin did not have getState method\n      $$invalidate(3, pluginState = (selectedPlugin === null || selectedPlugin === void 0 ? void 0 : selectedPlugin.getState) ? selectedPlugin.getState(editorState) : undefined);\n    }\n    if ($$self.$$.dirty & /*plugins, editorState*/768) {\n      $$invalidate(4, listItems = plugins.map(p => ({\n        key: p.key,\n        value: p.key.toUpperCase(),\n        empty: !(p.getState && p.getState(editorState))\n      })));\n    }\n  };\n  return [selectedPlugin, expandPluginState, recursionOpts, pluginState, listItems, handlePluginSelect, handleToggleExpand, handleLogState, editorState, plugins];\n}\nclass PluginsTab extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$8, create_fragment$8, safe_not_equal, {}, add_css$8);\n  }\n}\n\n/* src/tabs/SchemaTab.svelte generated by Svelte v4.2.15 */\nfunction add_css$7(target) {\n  append_styles(target, \"svelte-1u2reu1\", \".top-row.svelte-1u2reu1{align-items:center;display:flex;justify-content:space-between}.left-panel[slot=left].svelte-1u2reu1{overflow:scroll;padding:1em}.right-panel[slot=right].svelte-1u2reu1{border-left:1px solid rgba(255, 162, 177, 0.2);overflow:scroll;padding:1em}\");\n}\n\n// (14:6) <Button class=\"hidden\">\nfunction create_default_slot_1$1(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (11:2) \nfunction create_left_slot$1(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let treeview;\n  let current;\n  button = new Button({\n    props: {\n      class: \"hidden\",\n      $$slots: {\n        default: [create_default_slot_1$1]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*nodes*/ctx[0],\n      showLogButton: true,\n      showCopyButton: true,\n      recursionOpts: {\n        stopCircularRecursion: true\n      }\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Nodes\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview.$$.fragment);\n      attr(div0, \"class\", \"top-row svelte-1u2reu1\");\n      attr(div1, \"slot\", \"left\");\n      attr(div1, \"class\", \"left-panel svelte-1u2reu1\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(treeview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/8) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(treeview);\n    }\n  };\n}\n\n// (29:6) <Button class=\"hidden\">\nfunction create_default_slot$1(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (26:2) \nfunction create_right_slot$2(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let treeview;\n  let current;\n  button = new Button({\n    props: {\n      class: \"hidden\",\n      $$slots: {\n        default: [create_default_slot$1]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  treeview = new TreeView({\n    props: {\n      class: \"tree-view\",\n      data: /*marks*/ctx[1],\n      showLogButton: true,\n      showCopyButton: true,\n      recursionOpts: {\n        stopCircularRecursion: true\n      }\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Marks\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview.$$.fragment);\n      attr(div0, \"class\", \"top-row svelte-1u2reu1\");\n      attr(div1, \"slot\", \"right\");\n      attr(div1, \"class\", \"right-panel svelte-1u2reu1\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(treeview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/8) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(treeview);\n    }\n  };\n}\nfunction create_fragment$7(ctx) {\n  let splitview;\n  let current;\n  splitview = new SplitView({\n    props: {\n      $$slots: {\n        right: [create_right_slot$2],\n        left: [create_left_slot$1]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      create_component(splitview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(splitview, target, anchor);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const splitview_changes = {};\n      if (dirty & /*$$scope*/8) {\n        splitview_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      splitview.$set(splitview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(splitview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(splitview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(splitview, detaching);\n    }\n  };\n}\nfunction instance$7($$self) {\n  const {\n    view\n  } = getContext('editor-view');\n  let nodes = view.state.schema.nodes;\n  let marks = view.state.schema.marks;\n  return [nodes, marks];\n}\nclass SchemaTab extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$7, create_fragment$7, safe_not_equal, {}, add_css$7);\n  }\n}\n\n/* src/tabs/structure/DocNode.svelte generated by Svelte v4.2.15 */\nfunction add_css$6(target) {\n  append_styles(target, \"svelte-1un819s\", \".doc-node.svelte-1un819s{border-left:1px solid #363755;border-right:1px solid #363755;display:flex;flex-direction:column;padding:0 12px}.doc-node.root.svelte-1un819s{border:0;padding:0}.doc-node-body.svelte-1un819s{background:#363755;color:#222;display:flex;font-size:13px;margin-top:3px}.number-box.svelte-1un819s{padding:3px 6px;background:rgba(255, 255, 255, 0.3)}.node-name.svelte-1un819s{width:100%}button.svelte-1un819s{align-items:center;background:transparent;border:0;color:#222;cursor:pointer;display:flex;height:100%;white-space:pre;width:100%}button.svelte-1un819s:hover{background:rgba(255, 162, 177, 0.4);color:#fff}button.selected.svelte-1un819s{background:rgba(255, 162, 177, 0.4)}ul.svelte-1un819s{list-style:none;margin:0;padding:0}ul.show-borders.svelte-1un819s{border-left:1px solid rgb(96, 76, 104);border-right:1px solid rgb(96, 76, 104)}.inline-children.svelte-1un819s{border-left:1px solid rgb(96, 76, 104);border-right:1px solid rgb(96, 76, 104);display:flex;flex-wrap:wrap;padding:0 12px}.inline-children.svelte-1un819s>.doc-node{flex-grow:1;padding:0}\");\n}\nfunction get_each_context$1(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[15] = list[i];\n  child_ctx[17] = i;\n  return child_ctx;\n}\n\n// (45:4) {#each fragment.content as child, i}\nfunction create_each_block$1(ctx) {\n  let docnode;\n  let current;\n  docnode = new DocNode({\n    props: {\n      node: /*child*/ctx[15],\n      startPos: /*startPositions*/ctx[5][/*i*/ctx[17]],\n      depth: /*depth*/ctx[1] + 1\n    }\n  });\n  return {\n    c() {\n      create_component(docnode.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(docnode, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const docnode_changes = {};\n      if (dirty & /*fragment*/4) docnode_changes.node = /*child*/ctx[15];\n      if (dirty & /*startPositions*/32) docnode_changes.startPos = /*startPositions*/ctx[5][/*i*/ctx[17]];\n      if (dirty & /*depth*/2) docnode_changes.depth = /*depth*/ctx[1] + 1;\n      docnode.$set(docnode_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(docnode.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(docnode.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(docnode, detaching);\n    }\n  };\n}\nfunction create_fragment$6(ctx) {\n  let li;\n  let div3;\n  let div0;\n  let t0;\n  let t1;\n  let div1;\n  let button;\n  let t2;\n  let t3;\n  let div2;\n  let t4;\n  let div3_style_value;\n  let t5;\n  let ul;\n  let li_class_value;\n  let current;\n  let mounted;\n  let dispose;\n  let each_value = ensure_array_like( /*fragment*/ctx[2].content);\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i));\n  }\n  const out = i => transition_out(each_blocks[i], 1, 1, () => {\n    each_blocks[i] = null;\n  });\n  return {\n    c() {\n      li = element(\"li\");\n      div3 = element(\"div\");\n      div0 = element(\"div\");\n      t0 = text( /*startPos*/ctx[0]);\n      t1 = space();\n      div1 = element(\"div\");\n      button = element(\"button\");\n      t2 = text( /*name*/ctx[6]);\n      t3 = space();\n      div2 = element(\"div\");\n      t4 = text( /*endPos*/ctx[4]);\n      t5 = space();\n      ul = element(\"ul\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(div0, \"class\", \"number-box svelte-1un819s\");\n      attr(button, \"aria-label\", \"Show node info button\");\n      attr(button, \"class\", \"svelte-1un819s\");\n      toggle_class(button, \"selected\", false);\n      attr(div1, \"class\", \"node-name svelte-1un819s\");\n      attr(div2, \"class\", \"number-box svelte-1un819s\");\n      attr(div3, \"class\", \"doc-node-body svelte-1un819s\");\n      attr(div3, \"style\", div3_style_value = \"background: \".concat( /*color*/ctx[7]));\n      attr(ul, \"class\", \"svelte-1un819s\");\n      toggle_class(ul, \"inline-children\", /*inlineChildren*/ctx[3]);\n      toggle_class(ul, \"show-borders\", /*depth*/ctx[1] >= 1);\n      attr(li, \"class\", li_class_value = \"\" + (null_to_empty(\"\".concat( /*$$props*/ctx[11].class || '', \" doc-node\")) + \" svelte-1un819s\"));\n      toggle_class(li, \"root\", /*isRoot*/ctx[8]);\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      append(li, div3);\n      append(div3, div0);\n      append(div0, t0);\n      append(div3, t1);\n      append(div3, div1);\n      append(div1, button);\n      append(button, t2);\n      append(div3, t3);\n      append(div3, div2);\n      append(div2, t4);\n      append(li, t5);\n      append(li, ul);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(ul, null);\n        }\n      }\n      current = true;\n      if (!mounted) {\n        dispose = [listen(button, \"click\", /*handleNameClick*/ctx[9]), listen(button, \"dblclick\", /*handleNameDblClick*/ctx[10])];\n        mounted = true;\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (!current || dirty & /*startPos*/1) set_data(t0, /*startPos*/ctx[0]);\n      if (!current || dirty & /*name*/64) set_data(t2, /*name*/ctx[6]);\n      if (!current || dirty & /*endPos*/16) set_data(t4, /*endPos*/ctx[4]);\n      if (!current || dirty & /*color*/128 && div3_style_value !== (div3_style_value = \"background: \".concat( /*color*/ctx[7]))) {\n        attr(div3, \"style\", div3_style_value);\n      }\n      if (dirty & /*fragment, startPositions, depth*/38) {\n        each_value = ensure_array_like( /*fragment*/ctx[2].content);\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context$1(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n            transition_in(each_blocks[i], 1);\n          } else {\n            each_blocks[i] = create_each_block$1(child_ctx);\n            each_blocks[i].c();\n            transition_in(each_blocks[i], 1);\n            each_blocks[i].m(ul, null);\n          }\n        }\n        group_outros();\n        for (i = each_value.length; i < each_blocks.length; i += 1) {\n          out(i);\n        }\n        check_outros();\n      }\n      if (!current || dirty & /*inlineChildren*/8) {\n        toggle_class(ul, \"inline-children\", /*inlineChildren*/ctx[3]);\n      }\n      if (!current || dirty & /*depth*/2) {\n        toggle_class(ul, \"show-borders\", /*depth*/ctx[1] >= 1);\n      }\n      if (!current || dirty & /*$$props*/2048 && li_class_value !== (li_class_value = \"\" + (null_to_empty(\"\".concat( /*$$props*/ctx[11].class || '', \" doc-node\")) + \" svelte-1un819s\"))) {\n        attr(li, \"class\", li_class_value);\n      }\n      if (!current || dirty & /*$$props, isRoot*/2304) {\n        toggle_class(li, \"root\", /*isRoot*/ctx[8]);\n      }\n    },\n    i(local) {\n      if (current) return;\n      for (let i = 0; i < each_value.length; i += 1) {\n        transition_in(each_blocks[i]);\n      }\n      current = true;\n    },\n    o(local) {\n      each_blocks = each_blocks.filter(Boolean);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        transition_out(each_blocks[i]);\n      }\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n      }\n      destroy_each(each_blocks, detaching);\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction instance$6($$self, $$props, $$invalidate) {\n  let fragment;\n  let color;\n  let name;\n  let startPositions;\n  let endPos;\n  let inlineChildren;\n  const {\n    colors,\n    handleNodeClick\n  } = getContext('doc-view');\n  let {\n    node,\n    startPos,\n    depth\n  } = $$props;\n  const isRoot = depth === 0;\n  function handleNameClick() {\n    handleNodeClick(node, startPos);\n  }\n  function handleNameDblClick() {\n    handleNodeClick(node, startPos, true);\n  }\n  $$self.$$set = $$new_props => {\n    $$invalidate(11, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));\n    if ('node' in $$new_props) $$invalidate(12, node = $$new_props.node);\n    if ('startPos' in $$new_props) $$invalidate(0, startPos = $$new_props.startPos);\n    if ('depth' in $$new_props) $$invalidate(1, depth = $$new_props.depth);\n  };\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*node*/4096) {\n      $$invalidate(2, fragment = node.content);\n    }\n    if ($$self.$$.dirty & /*node*/4096) {\n      $$invalidate(7, color = colors[node.type.name]);\n    }\n    if ($$self.$$.dirty & /*node*/4096) {\n      $$invalidate(6, name = node.isText && node.marks.length > 0 ? \"\".concat(node.type.name, \" - [\").concat(node.marks.map(m => m.type.name).join(', '), \"]\") : node.type.name);\n    }\n    if ($$self.$$.dirty & /*node, startPos*/4097) {\n      $$invalidate(5, startPositions = Array(node.childCount).fill(undefined).reduce((acc, _, idx) => {\n        if (idx === 0) {\n          return [isRoot ? 0 : startPos + 1];\n        }\n        let prev = acc[idx - 1];\n        let cur = node.child(idx - 1);\n        return [...acc, prev + cur.nodeSize];\n      }, []));\n    }\n    if ($$self.$$.dirty & /*startPos, node*/4097) {\n      $$invalidate(4, endPos = startPos + node.nodeSize);\n    }\n    if ($$self.$$.dirty & /*fragment*/4) {\n      $$invalidate(3, inlineChildren = fragment.content.every(n => n.isInline));\n    }\n  };\n  $$props = exclude_internal_props($$props);\n  return [startPos, depth, fragment, inlineChildren, endPos, startPositions, name, color, isRoot, handleNameClick, handleNameDblClick, $$props, node];\n}\nclass DocNode extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$6, create_fragment$6, safe_not_equal, {\n      node: 12,\n      startPos: 0,\n      depth: 1\n    }, add_css$6);\n  }\n}\n\nconst nodeColors = [\n    '#EA7C7F', // red\n    '#67B0C6', // cyan 400\n    '#94BB7F', // green\n    '#CA9EDB', // deep purple\n    '#DCDC5D', // lime\n    '#B9CC7C', // light green\n    '#DD97D8', // purple\n    '#FFB761', // orange\n    '#4D8FD1', // light blue\n    '#F36E98', // pink\n    '#E45F44', // deep orange\n    '#A6A4AE', // blue grey\n    '#FCC047', // yellow\n    '#FFC129', // amber\n    '#D3929C', // can can\n    '#4CBCD4', // cyan\n    '#8D7BC0' // indigo\n];\nfunction calculateSafeIndex(index, total) {\n    const quotient = index / total;\n    return Math.round(total * (quotient - Math.floor(quotient)));\n}\nfunction buildColors(schema) {\n    return Object.keys(schema.nodes).reduce((acc, node, index) => {\n        const safeIndex = index >= nodeColors.length ? calculateSafeIndex(index, nodeColors.length) : index;\n        acc[node] = nodeColors[safeIndex];\n        return acc;\n    }, {});\n}\n\n/* src/tabs/structure/DocView.svelte generated by Svelte v4.2.15 */\nfunction add_css$5(target) {\n  append_styles(target, \"svelte-is7zuw\", \"ul.svelte-is7zuw{list-style:none;margin:0;padding:0}\");\n}\nfunction create_fragment$5(ctx) {\n  let ul;\n  let docnode;\n  let current;\n  docnode = new DocNode({\n    props: {\n      class: /*$$props*/ctx[1].class,\n      node: /*doc*/ctx[0],\n      startPos: 0,\n      depth: 0\n    }\n  });\n  return {\n    c() {\n      ul = element(\"ul\");\n      create_component(docnode.$$.fragment);\n      attr(ul, \"class\", \"svelte-is7zuw\");\n    },\n    m(target, anchor) {\n      insert(target, ul, anchor);\n      mount_component(docnode, ul, null);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const docnode_changes = {};\n      if (dirty & /*$$props*/2) docnode_changes.class = /*$$props*/ctx[1].class;\n      if (dirty & /*doc*/1) docnode_changes.node = /*doc*/ctx[0];\n      docnode.$set(docnode_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(docnode.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(docnode.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(ul);\n      }\n      destroy_component(docnode);\n    }\n  };\n}\nfunction instance$5($$self, $$props, $$invalidate) {\n  let {\n    doc,\n    schema,\n    selected = {\n      type: '',\n      start: 0,\n      end: 0\n    },\n    handleNodeSelect\n  } = $$props;\n  setContext('doc-view', {\n    selected,\n    colors: buildColors(schema),\n    handleNodeClick: handleNodeSelect\n  });\n  $$self.$$set = $$new_props => {\n    $$invalidate(1, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props)));\n    if ('doc' in $$new_props) $$invalidate(0, doc = $$new_props.doc);\n    if ('schema' in $$new_props) $$invalidate(2, schema = $$new_props.schema);\n    if ('selected' in $$new_props) $$invalidate(3, selected = $$new_props.selected);\n    if ('handleNodeSelect' in $$new_props) $$invalidate(4, handleNodeSelect = $$new_props.handleNodeSelect);\n  };\n  $$props = exclude_internal_props($$props);\n  return [doc, $$props, schema, selected, handleNodeSelect];\n}\nclass DocView extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$5, create_fragment$5, safe_not_equal, {\n      doc: 0,\n      schema: 2,\n      selected: 3,\n      handleNodeSelect: 4\n    }, add_css$5);\n  }\n}\n\n/* src/tabs/structure/StructureTab.svelte generated by Svelte v4.2.15 */\nfunction add_css$4(target) {\n  append_styles(target, \"svelte-15i66m0\", \".top-row.svelte-15i66m0{align-items:center;display:flex;justify-content:space-between}.right-panel[slot=right].svelte-15i66m0{border-left:1px solid rgba(255, 162, 177, 0.2);flex-grow:0;min-width:220px;width:220px}.split-view .m-top{margin-top:0.75em}\");\n}\n\n// (99:6) <Button class=\"hidden\">\nfunction create_default_slot_1(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (96:2) \nfunction create_left_slot(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let docview;\n  let current;\n  button = new Button({\n    props: {\n      class: \"hidden\",\n      $$slots: {\n        default: [create_default_slot_1]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  docview = new DocView({\n    props: {\n      class: \"m-top\",\n      doc: /*doc*/ctx[0],\n      schema: /*schema*/ctx[2],\n      handleNodeSelect: /*handleNodeSelect*/ctx[3]\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Current doc\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(docview.$$.fragment);\n      attr(div0, \"class\", \"top-row svelte-15i66m0\");\n      attr(div1, \"slot\", \"left\");\n      attr(div1, \"class\", \"left-panel\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(docview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/256) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      const docview_changes = {};\n      if (dirty & /*doc*/1) docview_changes.doc = /*doc*/ctx[0];\n      docview.$set(docview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(docview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(docview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(docview);\n    }\n  };\n}\n\n// (106:6) <Button on:click={handleClickLogNode}>\nfunction create_default_slot(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"log\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (103:2) \nfunction create_right_slot$1(ctx) {\n  let div1;\n  let div0;\n  let h2;\n  let t1;\n  let button;\n  let t2;\n  let treeview;\n  let current;\n  button = new Button({\n    props: {\n      $$slots: {\n        default: [create_default_slot]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  button.$on(\"click\", /*handleClickLogNode*/ctx[4]);\n  treeview = new TreeView({\n    props: {\n      class: \"m-top\",\n      data: /*jsonNode*/ctx[1],\n      recursionOpts: {\n        shouldExpandNode: func\n      }\n    }\n  });\n  return {\n    c() {\n      div1 = element(\"div\");\n      div0 = element(\"div\");\n      h2 = element(\"h2\");\n      h2.textContent = \"Node info\";\n      t1 = space();\n      create_component(button.$$.fragment);\n      t2 = space();\n      create_component(treeview.$$.fragment);\n      attr(div0, \"class\", \"top-row svelte-15i66m0\");\n      attr(div1, \"slot\", \"right\");\n      attr(div1, \"class\", \"right-panel svelte-15i66m0\");\n    },\n    m(target, anchor) {\n      insert(target, div1, anchor);\n      append(div1, div0);\n      append(div0, h2);\n      append(div0, t1);\n      mount_component(button, div0, null);\n      append(div1, t2);\n      mount_component(treeview, div1, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const button_changes = {};\n      if (dirty & /*$$scope*/256) {\n        button_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      button.$set(button_changes);\n      const treeview_changes = {};\n      if (dirty & /*jsonNode*/2) treeview_changes.data = /*jsonNode*/ctx[1];\n      treeview.$set(treeview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(button.$$.fragment, local);\n      transition_in(treeview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(button.$$.fragment, local);\n      transition_out(treeview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div1);\n      }\n      destroy_component(button);\n      destroy_component(treeview);\n    }\n  };\n}\nfunction create_fragment$4(ctx) {\n  let splitview;\n  let current;\n  splitview = new SplitView({\n    props: {\n      $$slots: {\n        right: [create_right_slot$1],\n        left: [create_left_slot]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      create_component(splitview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(splitview, target, anchor);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const splitview_changes = {};\n      if (dirty & /*$$scope, jsonNode, doc*/259) {\n        splitview_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      splitview.$set(splitview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(splitview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(splitview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(splitview, detaching);\n    }\n  };\n}\nfunction getScrollableParent(el) {\n  if (!el || el === document.body) return undefined;else if (el.scrollHeight !== el.clientHeight) return el;\n  return getScrollableParent(el.parentElement);\n}\nconst func = n => n.type !== 'array' || n.value.length <= 50;\nfunction instance$4($$self, $$props, $$invalidate) {\n  let jsonNode;\n  const {\n    view\n  } = getContext('editor-view');\n  let doc = view.state.doc;\n  let selected = {\n    node: view.state.doc,\n    pos: 0\n  };\n  let schema = view.state.schema;\n  let timer;\n  latestEntry.subscribe(e => {\n    if (!e) return;\n    e.trs.forEach(tr => {\n      $$invalidate(5, selected.pos = tr.mapping.map(selected.pos), selected);\n    });\n    clearTimeout(timer);\n    timer = setTimeout(() => {\n      $$invalidate(0, doc = e.state.doc);\n      const pos = selected.pos;\n      try {\n        // Must try-catch incase dev-tools is unmounted and editorView destroyed\n        const node = doc.nodeAt(pos);\n        $$invalidate(5, selected = {\n          node: node || doc,\n          pos: node ? pos : 0\n        });\n      } catch (err) {}\n    }, 100);\n  });\n  function handleNodeSelect(node, startPos) {\n    let scroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var _a;\n    $$invalidate(5, selected = {\n      node,\n      pos: startPos\n    });\n    if (!scroll) return;\n\n    /**\n    * Some high order black magic right here for scrolling the node into view.\n    *\n    * First, we need to ensure the node is visible within a scrollable element.\n    * Meaning that if there's a parent element with overflow: scroll/auto we have to\n    * scroll the element into view.\n    */\n    let nodeDom = view.nodeDOM(startPos);\n\n    // Text nodes don't have offsetTop property so we have to find a parent which has\n    while (nodeDom && !(nodeDom instanceof HTMLElement)) {\n      nodeDom = nodeDom.parentElement;\n    }\n\n    // We'll omit hidden nodes since it might be more obvious that there's nothing to scroll into\n    if (!nodeDom || getComputedStyle(nodeDom).display === 'none') return;\n    const parentWithScrollbar = getScrollableParent(view.dom);\n    if (parentWithScrollbar) {\n      const alreadyScrolled = parentWithScrollbar.scrollTop;\n\n      // So this is probably the most magic part. Basically if the parent has been scrolled over\n      // in the viewport (meaning it's below the absolute position of the current viewport top),\n      // we must offset the boundingRect's top as they are calculated from the viewport's top,\n      // not where the parent element actually is. Otherwise we would scroll downwards even though\n      // the node's top would already be enough to be shown. Real PITA to wrap your head around.\n      // Hopefully nobody has to ever fix this 😅\n      const parentOffset = parentWithScrollbar.offsetTop - window.scrollY;\n      const parentTop = parentWithScrollbar.getBoundingClientRect().top - parentOffset;\n      const nodeTop = nodeDom.getBoundingClientRect().top - parentOffset;\n\n      // clientHeight / 2 seems to work as a carefully crafted heurestic..\n      const halfwayParent = parentWithScrollbar.clientHeight / 2;\n      parentWithScrollbar.scroll(0, alreadyScrolled + parentTop + nodeTop - halfwayParent);\n    }\n\n    /**\n    * After that, incase the window has a scrollbar as well we want to scroll the\n    * element just above the dock\n    */\n    const nodeTop = view.coordsAtPos(startPos).top;\n    const dockHeight = ((_a = document.querySelector('.floating-dock')) === null || _a === void 0 ? void 0 : _a.clientHeight) || 0;\n    window.scroll(0, nodeTop - dockHeight + nodeDom.clientHeight + window.scrollY);\n  }\n  function handleClickLogNode() {\n    console.log(selected);\n    window._node = selected;\n    console.info('%c [prosemirror-dev-toolkit]: Property added to window._node', 'color: #b8e248');\n  }\n  $$self.$$.update = () => {\n    if ($$self.$$.dirty & /*selected*/32) {\n      $$invalidate(1, jsonNode = selected.node.toJSON());\n    }\n  };\n  return [doc, jsonNode, schema, handleNodeSelect, handleClickLogNode, selected];\n}\nclass StructureTab extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$4, create_fragment$4, safe_not_equal, {}, add_css$4);\n  }\n}\n\n/* src/tabs/snapshots/SnapshotsList.svelte generated by Svelte v4.2.15 */\nfunction add_css$3(target) {\n  append_styles(target, \"svelte-969ox4\", \"ul.svelte-969ox4.svelte-969ox4{color:#fff;list-style:none;margin:0;padding:0;height:100%;width:100%}li.svelte-969ox4+li.svelte-969ox4{border-top:1px solid rgb(96, 76, 104)}li.svelte-969ox4.svelte-969ox4{align-items:center;display:flex;font-family:monospace;padding:6px 18px}input.svelte-969ox4.svelte-969ox4{background:transparent;border:0;color:#fff;height:100%;margin:0;padding:2px;width:100%}.unstyled-btn.svelte-969ox4.svelte-969ox4{background:transparent;border:0;color:#fff;cursor:pointer;display:block;font-family:monospace;margin:0;padding:0;text-align:start;width:100%}.snapshot-btn.svelte-969ox4.svelte-969ox4{background:transparent;border:0;border-radius:3px;color:#d3d3d9;cursor:pointer;display:flex;font-size:11px;padding:6px 18px;text-transform:uppercase}.snapshot-btn.svelte-969ox4.svelte-969ox4:hover{background:rgba(255, 162, 177, 0.4);color:#fff}.ml-2.svelte-969ox4.svelte-969ox4{margin-left:1rem}\");\n}\nfunction get_each_context(ctx, list, i) {\n  const child_ctx = ctx.slice();\n  child_ctx[23] = list[i];\n  return child_ctx;\n}\n\n// (66:6) {:else}\nfunction create_else_block_2(ctx) {\n  let button;\n  let t_value = /*snap*/ctx[23].name + \"\";\n  let t;\n  let mounted;\n  let dispose;\n  function dblclick_handler() {\n    return /*dblclick_handler*/ctx[16]( /*snap*/ctx[23]);\n  }\n  return {\n    c() {\n      button = element(\"button\");\n      t = text(t_value);\n      attr(button, \"class\", \"unstyled-btn svelte-969ox4\");\n      attr(button, \"aria-label\", \"Edit snapshot name button\");\n    },\n    m(target, anchor) {\n      insert(target, button, anchor);\n      append(button, t);\n      if (!mounted) {\n        dispose = listen(button, \"dblclick\", dblclick_handler);\n        mounted = true;\n      }\n    },\n    p(new_ctx, dirty) {\n      ctx = new_ctx;\n      if (dirty & /*snapshots*/1 && t_value !== (t_value = /*snap*/ctx[23].name + \"\")) set_data(t, t_value);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(button);\n      }\n      mounted = false;\n      dispose();\n    }\n  };\n}\n\n// (60:6) {#if editedSnap && editedSnap.timestamp === snap.timestamp}\nfunction create_if_block_2$1(ctx) {\n  let input;\n  let input_value_value;\n  let mounted;\n  let dispose;\n  return {\n    c() {\n      input = element(\"input\");\n      input.value = input_value_value = /*editedSnap*/ctx[2].name;\n      attr(input, \"class\", \"svelte-969ox4\");\n    },\n    m(target, anchor) {\n      insert(target, input, anchor);\n      if (!mounted) {\n        dispose = [listen(input, \"input\", /*handleNameChange*/ctx[5]), listen(input, \"keypress\", /*handleNameKeyPress*/ctx[6])];\n        mounted = true;\n      }\n    },\n    p(ctx, dirty) {\n      if (dirty & /*editedSnap*/4 && input_value_value !== (input_value_value = /*editedSnap*/ctx[2].name) && input.value !== input_value_value) {\n        input.value = input_value_value;\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(input);\n      }\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\n\n// (76:8) {:else}\nfunction create_else_block_1(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"Show\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (74:8) {#if selectedSnapshot?.timestamp === snap.timestamp}\nfunction create_if_block_1$1(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"Hide\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (85:8) {:else}\nfunction create_else_block$3(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"Delete\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (83:8) {#if deleteSnap?.timestamp === snap.timestamp}\nfunction create_if_block$3(ctx) {\n  let t;\n  return {\n    c() {\n      t = text(\"Confirm Delete\");\n    },\n    m(target, anchor) {\n      insert(target, t, anchor);\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(t);\n      }\n    }\n  };\n}\n\n// (58:2) {#each snapshots as snap}\nfunction create_each_block(ctx) {\n  let li;\n  let t0;\n  let button0;\n  let t1;\n  let button1;\n  let t3;\n  let button2;\n  let t5;\n  let button3;\n  let t6;\n  let mounted;\n  let dispose;\n  function select_block_type(ctx, dirty) {\n    if ( /*editedSnap*/ctx[2] && /*editedSnap*/ctx[2].timestamp === /*snap*/ctx[23].timestamp) return create_if_block_2$1;\n    return create_else_block_2;\n  }\n  let current_block_type = select_block_type(ctx);\n  let if_block0 = current_block_type(ctx);\n  function select_block_type_1(ctx, dirty) {\n    var _ctx$;\n    if ( /*selectedSnapshot*/((_ctx$ = ctx[1]) === null || _ctx$ === void 0 ? void 0 : _ctx$.timestamp) === /*snap*/ctx[23].timestamp) return create_if_block_1$1;\n    return create_else_block_1;\n  }\n  let current_block_type_1 = select_block_type_1(ctx);\n  let if_block1 = current_block_type_1(ctx);\n  function click_handler() {\n    return /*click_handler*/ctx[17]( /*snap*/ctx[23]);\n  }\n  function click_handler_1() {\n    return /*click_handler_1*/ctx[18]( /*snap*/ctx[23]);\n  }\n  function click_handler_2() {\n    return /*click_handler_2*/ctx[19]( /*snap*/ctx[23]);\n  }\n  function select_block_type_2(ctx, dirty) {\n    var _ctx$2;\n    if ( /*deleteSnap*/((_ctx$2 = ctx[3]) === null || _ctx$2 === void 0 ? void 0 : _ctx$2.timestamp) === /*snap*/ctx[23].timestamp) return create_if_block$3;\n    return create_else_block$3;\n  }\n  let current_block_type_2 = select_block_type_2(ctx);\n  let if_block2 = current_block_type_2(ctx);\n  function click_handler_3() {\n    return /*click_handler_3*/ctx[20]( /*snap*/ctx[23]);\n  }\n  return {\n    c() {\n      li = element(\"li\");\n      if_block0.c();\n      t0 = space();\n      button0 = element(\"button\");\n      if_block1.c();\n      t1 = space();\n      button1 = element(\"button\");\n      button1.textContent = \"Restore\";\n      t3 = space();\n      button2 = element(\"button\");\n      button2.textContent = \"Export\";\n      t5 = space();\n      button3 = element(\"button\");\n      if_block2.c();\n      t6 = space();\n      attr(button0, \"class\", \"snapshot-btn ml-2 svelte-969ox4\");\n      attr(button1, \"class\", \"snapshot-btn svelte-969ox4\");\n      attr(button2, \"class\", \"snapshot-btn svelte-969ox4\");\n      attr(button3, \"class\", \"snapshot-btn svelte-969ox4\");\n      attr(li, \"class\", \"svelte-969ox4\");\n    },\n    m(target, anchor) {\n      insert(target, li, anchor);\n      if_block0.m(li, null);\n      append(li, t0);\n      append(li, button0);\n      if_block1.m(button0, null);\n      append(li, t1);\n      append(li, button1);\n      append(li, t3);\n      append(li, button2);\n      append(li, t5);\n      append(li, button3);\n      if_block2.m(button3, null);\n      append(li, t6);\n      if (!mounted) {\n        dispose = [listen(button0, \"click\", click_handler), listen(button1, \"click\", click_handler_1), listen(button2, \"click\", click_handler_2), listen(button3, \"click\", click_handler_3)];\n        mounted = true;\n      }\n    },\n    p(new_ctx, dirty) {\n      ctx = new_ctx;\n      if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block0) {\n        if_block0.p(ctx, dirty);\n      } else {\n        if_block0.d(1);\n        if_block0 = current_block_type(ctx);\n        if (if_block0) {\n          if_block0.c();\n          if_block0.m(li, t0);\n        }\n      }\n      if (current_block_type_1 !== (current_block_type_1 = select_block_type_1(ctx))) {\n        if_block1.d(1);\n        if_block1 = current_block_type_1(ctx);\n        if (if_block1) {\n          if_block1.c();\n          if_block1.m(button0, null);\n        }\n      }\n      if (current_block_type_2 !== (current_block_type_2 = select_block_type_2(ctx))) {\n        if_block2.d(1);\n        if_block2 = current_block_type_2(ctx);\n        if (if_block2) {\n          if_block2.c();\n          if_block2.m(button3, null);\n        }\n      }\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(li);\n      }\n      if_block0.d();\n      if_block1.d();\n      if_block2.d();\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction create_fragment$3(ctx) {\n  let ul;\n  let each_value = ensure_array_like( /*snapshots*/ctx[0]);\n  let each_blocks = [];\n  for (let i = 0; i < each_value.length; i += 1) {\n    each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));\n  }\n  return {\n    c() {\n      ul = element(\"ul\");\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        each_blocks[i].c();\n      }\n      attr(ul, \"class\", \"svelte-969ox4\");\n    },\n    m(target, anchor) {\n      insert(target, ul, anchor);\n      for (let i = 0; i < each_blocks.length; i += 1) {\n        if (each_blocks[i]) {\n          each_blocks[i].m(ul, null);\n        }\n      }\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      if (dirty & /*handleClickDelete, snapshots, deleteSnap, handleExportClick, handleRestoreClick, handleClickView, selectedSnapshot, editedSnap, handleNameChange, handleNameKeyPress, handleSnapDoubleclick*/2047) {\n        each_value = ensure_array_like( /*snapshots*/ctx[0]);\n        let i;\n        for (i = 0; i < each_value.length; i += 1) {\n          const child_ctx = get_each_context(ctx, each_value, i);\n          if (each_blocks[i]) {\n            each_blocks[i].p(child_ctx, dirty);\n          } else {\n            each_blocks[i] = create_each_block(child_ctx);\n            each_blocks[i].c();\n            each_blocks[i].m(ul, null);\n          }\n        }\n        for (; i < each_blocks.length; i += 1) {\n          each_blocks[i].d(1);\n        }\n        each_blocks.length = each_value.length;\n      }\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(ul);\n      }\n      destroy_each(each_blocks, detaching);\n    }\n  };\n}\nfunction instance$3($$self, $$props, $$invalidate) {\n  let {\n    snapshots = [],\n    selectedSnapshot = undefined,\n    onUpdate,\n    onView,\n    onRestore,\n    onExport,\n    onDelete\n  } = $$props;\n  let editedSnap;\n  let deleteSnap;\n  let timer;\n  const debounceUpdate = () => {\n    clearTimeout(timer);\n    timer = setTimeout(() => {\n      onUpdate(editedSnap);\n    }, 150);\n  };\n  function handleSnapDoubleclick(snap) {\n    $$invalidate(2, editedSnap = snap);\n    $$invalidate(3, deleteSnap = undefined);\n  }\n  function handleNameChange(evt) {\n    if (editedSnap) {\n      $$invalidate(2, editedSnap.name = evt.currentTarget.value, editedSnap);\n      debounceUpdate();\n    }\n  }\n  function handleNameKeyPress(evt) {\n    if (evt.key === 'Enter' && editedSnap) {\n      onUpdate(editedSnap);\n      clearTimeout(timer);\n      $$invalidate(2, editedSnap = undefined);\n      $$invalidate(3, deleteSnap = undefined);\n    }\n  }\n  function handleClickView(snap) {\n    if ((selectedSnapshot === null || selectedSnapshot === void 0 ? void 0 : selectedSnapshot.timestamp) === snap.timestamp) {\n      onView();\n    } else {\n      onView(snap);\n    }\n    $$invalidate(3, deleteSnap = undefined);\n  }\n  function handleRestoreClick(snap) {\n    onRestore(snap);\n    $$invalidate(3, deleteSnap = undefined);\n  }\n  function handleExportClick(snap) {\n    onExport(snap);\n    $$invalidate(3, deleteSnap = undefined);\n  }\n  function handleClickDelete(snap) {\n    if (!deleteSnap || deleteSnap.timestamp !== snap.timestamp) {\n      $$invalidate(3, deleteSnap = snap);\n    } else {\n      onDelete(snap);\n      $$invalidate(3, deleteSnap = undefined);\n    }\n  }\n  const dblclick_handler = snap => handleSnapDoubleclick(snap);\n  const click_handler = snap => handleClickView(snap);\n  const click_handler_1 = snap => handleRestoreClick(snap);\n  const click_handler_2 = snap => handleExportClick(snap);\n  const click_handler_3 = snap => handleClickDelete(snap);\n  $$self.$$set = $$props => {\n    if ('snapshots' in $$props) $$invalidate(0, snapshots = $$props.snapshots);\n    if ('selectedSnapshot' in $$props) $$invalidate(1, selectedSnapshot = $$props.selectedSnapshot);\n    if ('onUpdate' in $$props) $$invalidate(11, onUpdate = $$props.onUpdate);\n    if ('onView' in $$props) $$invalidate(12, onView = $$props.onView);\n    if ('onRestore' in $$props) $$invalidate(13, onRestore = $$props.onRestore);\n    if ('onExport' in $$props) $$invalidate(14, onExport = $$props.onExport);\n    if ('onDelete' in $$props) $$invalidate(15, onDelete = $$props.onDelete);\n  };\n  return [snapshots, selectedSnapshot, editedSnap, deleteSnap, handleSnapDoubleclick, handleNameChange, handleNameKeyPress, handleClickView, handleRestoreClick, handleExportClick, handleClickDelete, onUpdate, onView, onRestore, onExport, onDelete, dblclick_handler, click_handler, click_handler_1, click_handler_2, click_handler_3];\n}\nclass SnapshotsList extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$3, create_fragment$3, safe_not_equal, {\n      snapshots: 0,\n      selectedSnapshot: 1,\n      onUpdate: 11,\n      onView: 12,\n      onRestore: 13,\n      onExport: 14,\n      onDelete: 15\n    }, add_css$3);\n  }\n}\n\n/* src/tabs/snapshots/SnapshotsTab.svelte generated by Svelte v4.2.15 */\nfunction add_css$2(target) {\n  append_styles(target, \"svelte-3jdj5c\", \".right-panel[slot=right].svelte-3jdj5c{padding:0}.no-snapshots.svelte-3jdj5c{align-items:center;color:rgb(255, 162, 177);display:flex;font-size:14px;height:100%;justify-content:center;width:100%}\");\n}\n\n// (17:4) {:else}\nfunction create_else_block$2(ctx) {\n  let snapshotslist;\n  let current;\n  snapshotslist = new SnapshotsList({\n    props: {\n      snapshots: /*$snapshots*/ctx[0],\n      selectedSnapshot: /*$selectedSnapshot*/ctx[1],\n      onUpdate: updateSnapshot,\n      onView: /*func*/ctx[4],\n      onRestore: /*handleRestoreSnapshot*/ctx[3],\n      onExport: exportSnapshot,\n      onDelete: deleteSnapshot\n    }\n  });\n  return {\n    c() {\n      create_component(snapshotslist.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(snapshotslist, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const snapshotslist_changes = {};\n      if (dirty & /*$snapshots*/1) snapshotslist_changes.snapshots = /*$snapshots*/ctx[0];\n      if (dirty & /*$selectedSnapshot*/2) snapshotslist_changes.selectedSnapshot = /*$selectedSnapshot*/ctx[1];\n      snapshotslist.$set(snapshotslist_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(snapshotslist.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(snapshotslist.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(snapshotslist, detaching);\n    }\n  };\n}\n\n// (15:4) {#if $snapshots.length === 0}\nfunction create_if_block$2(ctx) {\n  let div;\n  return {\n    c() {\n      div = element(\"div\");\n      div.textContent = \"Save snapshots by clicking \\\"Save\\\" button.\";\n      attr(div, \"class\", \"no-snapshots svelte-3jdj5c\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n    },\n    p: noop,\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n    }\n  };\n}\n\n// (14:2) \nfunction create_right_slot(ctx) {\n  let div;\n  let current_block_type_index;\n  let if_block;\n  let current;\n  const if_block_creators = [create_if_block$2, create_else_block$2];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*$snapshots*/ctx[0].length === 0) return 0;\n    return 1;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  return {\n    c() {\n      div = element(\"div\");\n      if_block.c();\n      attr(div, \"slot\", \"right\");\n      attr(div, \"class\", \"right-panel svelte-3jdj5c\");\n    },\n    m(target, anchor) {\n      insert(target, div, anchor);\n      if_blocks[current_block_type_index].m(div, null);\n      current = true;\n    },\n    p(ctx, dirty) {\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index === previous_block_index) {\n        if_blocks[current_block_type_index].p(ctx, dirty);\n      } else {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block = if_blocks[current_block_type_index];\n        if (!if_block) {\n          if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block.c();\n        } else {\n          if_block.p(ctx, dirty);\n        }\n        transition_in(if_block, 1);\n        if_block.m(div, null);\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(if_block);\n      current = true;\n    },\n    o(local) {\n      transition_out(if_block);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div);\n      }\n      if_blocks[current_block_type_index].d();\n    }\n  };\n}\nfunction create_fragment$2(ctx) {\n  let splitview;\n  let current;\n  splitview = new SplitView({\n    props: {\n      $$slots: {\n        right: [create_right_slot]\n      },\n      $$scope: {\n        ctx\n      }\n    }\n  });\n  return {\n    c() {\n      create_component(splitview.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(splitview, target, anchor);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      const splitview_changes = {};\n      if (dirty & /*$$scope, $snapshots, $selectedSnapshot*/35) {\n        splitview_changes.$$scope = {\n          dirty,\n          ctx\n        };\n      }\n      splitview.$set(splitview_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(splitview.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(splitview.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(splitview, detaching);\n    }\n  };\n}\nfunction instance$2($$self, $$props, $$invalidate) {\n  let $snapshots;\n  let $selectedSnapshot;\n  component_subscribe($$self, snapshots, $$value => $$invalidate(0, $snapshots = $$value));\n  component_subscribe($$self, selectedSnapshot, $$value => $$invalidate(1, $selectedSnapshot = $$value));\n  const {\n    view\n  } = getContext('editor-view');\n  function handleRestoreSnapshot(snapshot) {\n    restoreSnapshot(view, snapshot);\n    resetHistory();\n  }\n  const func = snap => toggleViewSnapshot(view, snap);\n  return [$snapshots, $selectedSnapshot, view, handleRestoreSnapshot, func];\n}\nclass SnapshotsTab extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$2, create_fragment$2, safe_not_equal, {}, add_css$2);\n  }\n}\n\n/* src/components/FloatingDock.svelte generated by Svelte v4.2.15 */\nfunction add_css$1(target) {\n  append_styles(target, \"svelte-1quf800\", \".floating-dock-wrapper.svelte-1quf800{position:fixed;width:0px;height:0px;top:0px;left:0px;z-index:99999999}.floating-dock.svelte-1quf800{background-color:#363755;position:fixed;z-index:1;box-shadow:rgba(34, 34, 34, 0.3) 0px 0px 4px 0px;left:0px;top:50%;width:100%;height:50%}.resizing-div.svelte-1quf800{position:absolute;z-index:2;opacity:0;top:-5px;height:10px;left:0px;width:100%;cursor:row-resize}.floating-dock-body.svelte-1quf800{height:100%}button.svelte-1quf800{background:rgba(255, 162, 177, 0.6);border:0;border-radius:3px;color:#fff;cursor:pointer;font-size:12px;height:24px;line-height:25px;padding:0 6px;position:absolute}button.svelte-1quf800:hover{background:rgba(255, 162, 177, 0.8)}.copy-btn.svelte-1quf800{right:173px;top:-28px}.save-btn.svelte-1quf800{right:129px;top:-28px}.import-btn.svelte-1quf800{right:79px;top:-28px}.paste-btn.svelte-1quf800{right:32px;top:-28px}.close-btn.svelte-1quf800{font-size:var(--font-medium);right:4px;top:-28px;width:24px}\");\n}\n\n// (116:6) {:else}\nfunction create_else_block$1(ctx) {\n  let p;\n  return {\n    c() {\n      p = element(\"p\");\n      p.textContent = \"nuting here\";\n    },\n    m(target, anchor) {\n      insert(target, p, anchor);\n    },\n    i: noop,\n    o: noop,\n    d(detaching) {\n      if (detaching) {\n        detach(p);\n      }\n    }\n  };\n}\n\n// (114:40) \nfunction create_if_block_5(ctx) {\n  let snapshotstab;\n  let current;\n  snapshotstab = new SnapshotsTab({});\n  return {\n    c() {\n      create_component(snapshotstab.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(snapshotstab, target, anchor);\n      current = true;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(snapshotstab.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(snapshotstab.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(snapshotstab, detaching);\n    }\n  };\n}\n\n// (112:40) \nfunction create_if_block_4(ctx) {\n  let structuretab;\n  let current;\n  structuretab = new StructureTab({});\n  return {\n    c() {\n      create_component(structuretab.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(structuretab, target, anchor);\n      current = true;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(structuretab.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(structuretab.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(structuretab, detaching);\n    }\n  };\n}\n\n// (110:37) \nfunction create_if_block_3(ctx) {\n  let schematab;\n  let current;\n  schematab = new SchemaTab({});\n  return {\n    c() {\n      create_component(schematab.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(schematab, target, anchor);\n      current = true;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(schematab.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(schematab.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(schematab, detaching);\n    }\n  };\n}\n\n// (108:38) \nfunction create_if_block_2(ctx) {\n  let pluginstab;\n  let current;\n  pluginstab = new PluginsTab({});\n  return {\n    c() {\n      create_component(pluginstab.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(pluginstab, target, anchor);\n      current = true;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(pluginstab.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(pluginstab.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(pluginstab, detaching);\n    }\n  };\n}\n\n// (106:38) \nfunction create_if_block_1(ctx) {\n  let historytab;\n  let current;\n  historytab = new HistoryTab({});\n  return {\n    c() {\n      create_component(historytab.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(historytab, target, anchor);\n      current = true;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(historytab.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(historytab.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(historytab, detaching);\n    }\n  };\n}\n\n// (104:6) {#if openTab === 'state'}\nfunction create_if_block$1(ctx) {\n  let statetab;\n  let current;\n  statetab = new StateTab({});\n  return {\n    c() {\n      create_component(statetab.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(statetab, target, anchor);\n      current = true;\n    },\n    i(local) {\n      if (current) return;\n      transition_in(statetab.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(statetab.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(statetab, detaching);\n    }\n  };\n}\nfunction create_fragment$1(ctx) {\n  let div4;\n  let pastemodal;\n  let t0;\n  let div3;\n  let div0;\n  let t1;\n  let div2;\n  let div1;\n  let button0;\n  let t3;\n  let button1;\n  let t5;\n  let button2;\n  let t7;\n  let button3;\n  let t9;\n  let button4;\n  let t11;\n  let input;\n  let t12;\n  let tabsmenu;\n  let t13;\n  let current_block_type_index;\n  let if_block;\n  let div3_style_value;\n  let current;\n  let mounted;\n  let dispose;\n  pastemodal = new PasteModal({\n    props: {\n      isOpen: /*modalOpen*/ctx[5]\n    }\n  });\n  pastemodal.$on(\"submit\", /*handlePasteSubmit*/ctx[12]);\n  pastemodal.$on(\"close\", /*handleCloseModal*/ctx[11]);\n  tabsmenu = new TabsMenu({\n    props: {\n      onClickTab: /*handleClickTab*/ctx[14],\n      active: /*openTab*/ctx[1]\n    }\n  });\n  const if_block_creators = [create_if_block$1, create_if_block_1, create_if_block_2, create_if_block_3, create_if_block_4, create_if_block_5, create_else_block$1];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*openTab*/ctx[1] === 'state') return 0;\n    if ( /*openTab*/ctx[1] === 'history') return 1;\n    if ( /*openTab*/ctx[1] === 'plugins') return 2;\n    if ( /*openTab*/ctx[1] === 'schema') return 3;\n    if ( /*openTab*/ctx[1] === 'structure') return 4;\n    if ( /*openTab*/ctx[1] === 'snapshots') return 5;\n    return 6;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  return {\n    c() {\n      div4 = element(\"div\");\n      create_component(pastemodal.$$.fragment);\n      t0 = space();\n      div3 = element(\"div\");\n      div0 = element(\"div\");\n      t1 = space();\n      div2 = element(\"div\");\n      div1 = element(\"div\");\n      button0 = element(\"button\");\n      button0.textContent = \"Copy\";\n      t3 = space();\n      button1 = element(\"button\");\n      button1.textContent = \"Save\";\n      t5 = space();\n      button2 = element(\"button\");\n      button2.textContent = \"Import\";\n      t7 = space();\n      button3 = element(\"button\");\n      button3.textContent = \"Paste\";\n      t9 = space();\n      button4 = element(\"button\");\n      button4.textContent = \"X\";\n      t11 = space();\n      input = element(\"input\");\n      t12 = space();\n      create_component(tabsmenu.$$.fragment);\n      t13 = space();\n      if_block.c();\n      attr(div0, \"class\", \"resizing-div svelte-1quf800\");\n      attr(div0, \"role\", \"button\");\n      attr(div0, \"tabindex\", \"-1\");\n      attr(button0, \"class\", \"copy-btn svelte-1quf800\");\n      attr(button1, \"class\", \"save-btn svelte-1quf800\");\n      attr(button2, \"class\", \"import-btn svelte-1quf800\");\n      attr(button3, \"class\", \"paste-btn svelte-1quf800\");\n      attr(button4, \"class\", \"close-btn svelte-1quf800\");\n      attr(button4, \"aria-label\", \"Close dev-toolkit\");\n      set_style(input, \"display\", \"none\");\n      attr(input, \"type\", \"file\");\n      attr(input, \"accept\", \".json\");\n      input.multiple = true;\n      attr(div2, \"class\", \"floating-dock-body svelte-1quf800\");\n      attr(div3, \"class\", \"floating-dock svelte-1quf800\");\n      attr(div3, \"style\", div3_style_value = \"top: \".concat( /*dockTop*/ctx[2], \"%; height: \").concat( /*dockHeight*/ctx[3], \"%;\"));\n      attr(div4, \"class\", \"floating-dock-wrapper svelte-1quf800\");\n    },\n    m(target, anchor) {\n      insert(target, div4, anchor);\n      mount_component(pastemodal, div4, null);\n      append(div4, t0);\n      append(div4, div3);\n      append(div3, div0);\n      append(div3, t1);\n      append(div3, div2);\n      append(div2, div1);\n      append(div1, button0);\n      append(div1, t3);\n      append(div1, button1);\n      append(div1, t5);\n      append(div1, button2);\n      append(div1, t7);\n      append(div1, button3);\n      append(div1, t9);\n      append(div1, button4);\n      append(div2, t11);\n      append(div2, input);\n      /*input_binding*/\n      ctx[15](input);\n      append(div2, t12);\n      mount_component(tabsmenu, div2, null);\n      append(div2, t13);\n      if_blocks[current_block_type_index].m(div2, null);\n      current = true;\n      if (!mounted) {\n        dispose = [listen(div0, \"mousedown\", /*handleResizeMouseDown*/ctx[6]), listen(button0, \"click\", /*handleCopyDoc*/ctx[7]), listen(button1, \"click\", /*handleSaveSnapshot*/ctx[8]), listen(button2, \"click\", /*handleImportSnapshot*/ctx[9]), listen(button3, \"click\", /*handlePasteSnapshot*/ctx[10]), listen(button4, \"click\", function () {\n          if (is_function( /*onClose*/ctx[0])) /*onClose*/ctx[0].apply(this, arguments);\n        }), listen(input, \"change\", /*handleFileSelected*/ctx[13])];\n        mounted = true;\n      }\n    },\n    p(new_ctx, _ref) {\n      let [dirty] = _ref;\n      ctx = new_ctx;\n      const pastemodal_changes = {};\n      if (dirty & /*modalOpen*/32) pastemodal_changes.isOpen = /*modalOpen*/ctx[5];\n      pastemodal.$set(pastemodal_changes);\n      const tabsmenu_changes = {};\n      if (dirty & /*openTab*/2) tabsmenu_changes.active = /*openTab*/ctx[1];\n      tabsmenu.$set(tabsmenu_changes);\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index !== previous_block_index) {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block = if_blocks[current_block_type_index];\n        if (!if_block) {\n          if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block.c();\n        }\n        transition_in(if_block, 1);\n        if_block.m(div2, null);\n      }\n      if (!current || dirty & /*dockTop, dockHeight*/12 && div3_style_value !== (div3_style_value = \"top: \".concat( /*dockTop*/ctx[2], \"%; height: \").concat( /*dockHeight*/ctx[3], \"%;\"))) {\n        attr(div3, \"style\", div3_style_value);\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(pastemodal.$$.fragment, local);\n      transition_in(tabsmenu.$$.fragment, local);\n      transition_in(if_block);\n      current = true;\n    },\n    o(local) {\n      transition_out(pastemodal.$$.fragment, local);\n      transition_out(tabsmenu.$$.fragment, local);\n      transition_out(if_block);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(div4);\n      }\n      destroy_component(pastemodal);\n      /*input_binding*/\n      ctx[15](null);\n      destroy_component(tabsmenu);\n      if_blocks[current_block_type_index].d();\n      mounted = false;\n      run_all(dispose);\n    }\n  };\n}\nfunction instance$1($$self, $$props, $$invalidate) {\n  let {\n    onClose\n  } = $$props;\n  const {\n    view\n  } = getContext('editor-view');\n  let openTab = 'state',\n    dockTop = 50,\n    dockHeight = 50,\n    fileinput,\n    modalOpen = false;\n  onDestroy(() => {\n    document.removeEventListener('mousemove', dragMove);\n    document.removeEventListener('mouseup', dragEnd);\n  });\n  function handleResizeMouseDown() {\n    document.addEventListener('mousemove', dragMove);\n    document.addEventListener('mouseup', dragEnd);\n  }\n  function dragMove(evt) {\n    evt.preventDefault();\n    $$invalidate(2, dockTop = 100 * evt.clientY / window.innerHeight);\n    $$invalidate(3, dockHeight = 100 * (1 - evt.clientY / window.innerHeight));\n  }\n  function dragEnd(evt) {\n    evt.preventDefault();\n    document.removeEventListener('mousemove', dragMove);\n    document.removeEventListener('mouseup', dragEnd);\n  }\n  function handleCopyDoc() {\n    navigator.clipboard.writeText(JSON.stringify(view.state.doc.toJSON()));\n  }\n  function handleSaveSnapshot() {\n    const defaultName = new Date().toLocaleString('sv');\n    const snapshotName = prompt('Enter snapshot name', defaultName);\n    if (snapshotName) {\n      saveSnapshot(snapshotName, view.state.doc.toJSON());\n    }\n  }\n  function handleImportSnapshot() {\n    fileinput.click();\n  }\n  function handlePasteSnapshot() {\n    $$invalidate(5, modalOpen = !modalOpen);\n  }\n  function handleCloseModal() {\n    $$invalidate(5, modalOpen = false);\n  }\n  function handlePasteSubmit(e) {\n    const snap = saveSnapshot(new Date().toLocaleString('sv'), e.detail.doc);\n    restoreSnapshot(view, snap);\n    $$invalidate(5, modalOpen = false);\n  }\n  function handleFileSelected(e) {\n    Array.from(e.currentTarget.files || []).forEach(file => {\n      const reader = new FileReader();\n      reader.readAsText(file);\n      reader.onload = e => {\n        var _a, _b;\n        const data = typeof ((_a = e.target) === null || _a === void 0 ? void 0 : _a.result) === 'string' ? (_b = e.target) === null || _b === void 0 ? void 0 : _b.result : '';\n        try {\n          const json = JSON.parse(data);\n          if (!json || typeof json !== 'object') {\n            throw Error('Imported snapshot was not a JSON object' + json);\n          }\n          const name = file.name.slice(0, file.name.lastIndexOf('.'));\n          importSnapshot(name, json, view.state.schema);\n        } catch (err) {\n          console.error('Failed to import snapshot: ' + err);\n        }\n      };\n    });\n  }\n  function handleClickTab(tab) {\n    $$invalidate(1, openTab = tab);\n  }\n  function input_binding($$value) {\n    binding_callbacks[$$value ? 'unshift' : 'push'](() => {\n      fileinput = $$value;\n      $$invalidate(4, fileinput);\n    });\n  }\n  $$self.$$set = $$props => {\n    if ('onClose' in $$props) $$invalidate(0, onClose = $$props.onClose);\n  };\n  return [onClose, openTab, dockTop, dockHeight, fileinput, modalOpen, handleResizeMouseDown, handleCopyDoc, handleSaveSnapshot, handleImportSnapshot, handlePasteSnapshot, handleCloseModal, handlePasteSubmit, handleFileSelected, handleClickTab, input_binding];\n}\nclass FloatingDock extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance$1, create_fragment$1, safe_not_equal, {\n      onClose: 0\n    }, add_css$1);\n  }\n}\n\n/* src/components/DevTools.svelte generated by Svelte v4.2.15 */\nfunction add_css(target) {\n  append_styles(target, \"svelte-pr6kw9\", \".dev-tools.svelte-pr6kw9{font-family:var(--font-sans);font-size:var(--font-medium);font-weight:400;--font-sans:Helvetica Neue, Calibri Light, Roboto, sans-serif;--font-small:11px;--font-medium:13px;--font-large:16px;--height-tabs-menu:48px;--tree-view-font-family:\\\"Helvetica Neue\\\", \\\"Calibri Light\\\", Roboto, sans-serif;--tree-view-font-size:13px;--tree-view-left-indent:0.875em;--tree-view-line-height:1.1;--tree-view-key-margin-right:0.5em;--tree-view-base00:#363755;--tree-view-base01:#604d49;--tree-view-base02:#6d5a55;--tree-view-base03:#d1929b;--tree-view-base04:#b79f8d;--tree-view-base05:#f9f8f2;--tree-view-base06:#f7f4f1;--tree-view-base07:#faf8f5;--tree-view-base08:#fa3e7e;--tree-view-base09:#fd993c;--tree-view-base0A:#f6bf81;--tree-view-base0B:#b8e248;--tree-view-base0C:#b4efe4;--tree-view-base0D:#85d9ef;--tree-view-base0E:#be87ff;--tree-view-base0F:#d6724c}.dev-tools.svelte-pr6kw9 .svelte-tree-view *{box-sizing:border-box}.dev-tools.svelte-pr6kw9 .hidden{opacity:0;visibility:hidden}\");\n}\n\n// (42:2) {:else}\nfunction create_else_block(ctx) {\n  let floatingbtn;\n  let current;\n  floatingbtn = new FloatingBtn({\n    props: {\n      buttonPosition: /*buttonPosition*/ctx[1]\n    }\n  });\n  floatingbtn.$on(\"click\", /*handleFloatingBtnClick*/ctx[2]);\n  return {\n    c() {\n      create_component(floatingbtn.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(floatingbtn, target, anchor);\n      current = true;\n    },\n    p(ctx, dirty) {\n      const floatingbtn_changes = {};\n      if (dirty & /*buttonPosition*/2) floatingbtn_changes.buttonPosition = /*buttonPosition*/ctx[1];\n      floatingbtn.$set(floatingbtn_changes);\n    },\n    i(local) {\n      if (current) return;\n      transition_in(floatingbtn.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(floatingbtn.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(floatingbtn, detaching);\n    }\n  };\n}\n\n// (40:2) {#if devToolsExpanded}\nfunction create_if_block(ctx) {\n  let floatingdock;\n  let current;\n  floatingdock = new FloatingDock({\n    props: {\n      onClose: /*handleFloatingDockClose*/ctx[3]\n    }\n  });\n  return {\n    c() {\n      create_component(floatingdock.$$.fragment);\n    },\n    m(target, anchor) {\n      mount_component(floatingdock, target, anchor);\n      current = true;\n    },\n    p: noop,\n    i(local) {\n      if (current) return;\n      transition_in(floatingdock.$$.fragment, local);\n      current = true;\n    },\n    o(local) {\n      transition_out(floatingdock.$$.fragment, local);\n      current = false;\n    },\n    d(detaching) {\n      destroy_component(floatingdock, detaching);\n    }\n  };\n}\nfunction create_fragment(ctx) {\n  let section;\n  let current_block_type_index;\n  let if_block;\n  let current;\n  const if_block_creators = [create_if_block, create_else_block];\n  const if_blocks = [];\n  function select_block_type(ctx, dirty) {\n    if ( /*devToolsExpanded*/ctx[0]) return 0;\n    return 1;\n  }\n  current_block_type_index = select_block_type(ctx);\n  if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n  return {\n    c() {\n      section = element(\"section\");\n      if_block.c();\n      attr(section, \"class\", \"dev-tools svelte-pr6kw9\");\n    },\n    m(target, anchor) {\n      insert(target, section, anchor);\n      if_blocks[current_block_type_index].m(section, null);\n      current = true;\n    },\n    p(ctx, _ref) {\n      let [dirty] = _ref;\n      let previous_block_index = current_block_type_index;\n      current_block_type_index = select_block_type(ctx);\n      if (current_block_type_index === previous_block_index) {\n        if_blocks[current_block_type_index].p(ctx, dirty);\n      } else {\n        group_outros();\n        transition_out(if_blocks[previous_block_index], 1, 1, () => {\n          if_blocks[previous_block_index] = null;\n        });\n        check_outros();\n        if_block = if_blocks[current_block_type_index];\n        if (!if_block) {\n          if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);\n          if_block.c();\n        } else {\n          if_block.p(ctx, dirty);\n        }\n        transition_in(if_block, 1);\n        if_block.m(section, null);\n      }\n    },\n    i(local) {\n      if (current) return;\n      transition_in(if_block);\n      current = true;\n    },\n    o(local) {\n      transition_out(if_block);\n      current = false;\n    },\n    d(detaching) {\n      if (detaching) {\n        detach(section);\n      }\n      if_blocks[current_block_type_index].d();\n    }\n  };\n}\nfunction instance($$self, $$props, $$invalidate) {\n  let {\n    view,\n    devToolsExpanded = false,\n    buttonPosition = 'bottom-right'\n  } = $$props;\n  setContext('editor-view', {\n    view,\n    execCmd(cmd) {\n      cmd(view.state, view.dispatch);\n    },\n    replaceEditorContent(state) {\n      const tr = view.state.tr;\n      tr.replaceWith(0, view.state.doc.nodeSize - 2, state.doc.content);\n      view.dispatch(tr);\n    }\n  });\n  onMount(() => {\n    const html = document && document.querySelector('html');\n    if (devToolsExpanded && html) {\n      html.style.paddingBottom = '341px';\n    }\n  });\n  function handleFloatingBtnClick() {\n    $$invalidate(0, devToolsExpanded = true);\n    const html = document && document.querySelector('html');\n    if (html) {\n      html.style.paddingBottom = '341px';\n    }\n  }\n  function handleFloatingDockClose() {\n    $$invalidate(0, devToolsExpanded = false);\n    const html = document && document.querySelector('html');\n    if (html) {\n      html.style.paddingBottom = '';\n    }\n  }\n  $$self.$$set = $$props => {\n    if ('view' in $$props) $$invalidate(4, view = $$props.view);\n    if ('devToolsExpanded' in $$props) $$invalidate(0, devToolsExpanded = $$props.devToolsExpanded);\n    if ('buttonPosition' in $$props) $$invalidate(1, buttonPosition = $$props.buttonPosition);\n  };\n  return [devToolsExpanded, buttonPosition, handleFloatingBtnClick, handleFloatingDockClose, view];\n}\nclass DevTools extends SvelteComponent {\n  constructor(options) {\n    super();\n    init(this, options, instance, create_fragment, safe_not_equal, {\n      view: 4,\n      devToolsExpanded: 0,\n      buttonPosition: 1\n    }, add_css);\n  }\n}\n\nlet active = false, resetDispatch = undefined;\n/**\n * Handler for dispatchTransaction that pushes trs to history and monkey patches applyTransaction\n *\n * Incase the editor already has a `dispatchTransaction` prop, oldDispatchFn is called but because\n * that function would also call state.apply we'd run apply multiple times, causing plugins to see\n * transactions often twice. So we monkey patch the `applyTransaction` method and apply some reflection\n * magic to maintain this-context as well as remove the patch if the transaction is somehow different\n * from the original.\n *\n * Why we have to monkey patch the method here and not once globally, is because the method is reset\n * to the original by ProseMirror at times so the function would not get called. Proxying `view.state.applyTransaction`\n * didn't also work.\n *\n * The other option is to use Plugins to store the transactions https://github.com/TeemuKoivisto/prosemirror-dev-toolkit/pull/15\n * which we'll revert to incase this one doesn't cover all the cases.\n * @param view\n * @param oldDispatchFn\n * @returns\n */\nconst handleDispatch = (view, oldDispatchFn) => (tr) => {\n    const stateBeforeDispatch = view.state;\n    const applied = view.state.applyTransaction(tr);\n    if (oldDispatchFn) {\n        const oldFn = view.state.applyTransaction.bind(view.state);\n        view.state.applyTransaction = function (trr) {\n            if (trr !== tr) {\n                view.state.applyTransaction = oldFn;\n                return Reflect.apply(oldFn, view.state, arguments);\n            }\n            return applied;\n        };\n        oldDispatchFn(tr);\n    }\n    else {\n        view.updateState(applied.state);\n    }\n    // If a plugin filtered a transaction, this would be an empty array\n    if (active && applied.transactions.length > 0) {\n        appendNewHistoryEntry(applied.transactions, view.state, stateBeforeDispatch);\n    }\n};\nfunction subscribeToDispatchTransaction(view) {\n    var _a;\n    active = true;\n    // People at times do all kinds of crazy things with EditorView eg extending it with a custom class.\n    // This can cause various bugs, for example it can override props setter. Because I don't get points from\n    // being right I'll just save them from their own silliness by checking also private _props\n    // @ts-ignore\n    const oldDispatchFn = (_a = (view.props || view._props).dispatchTransaction) === null || _a === void 0 ? void 0 : _a.bind(view);\n    view.setProps({\n        dispatchTransaction: handleDispatch(view, oldDispatchFn)\n    });\n    resetDispatch = () => view.setProps({ dispatchTransaction: oldDispatchFn });\n}\nfunction unsubscribeDispatchTransaction() {\n    active = false;\n    resetDispatch && resetDispatch();\n    resetDispatch = undefined;\n}\n\nconst DEVTOOLS_CSS_CLASS = '__prosemirror-dev-toolkit__';\nfunction createOrFindPlace() {\n    let place = document.querySelector(`.${DEVTOOLS_CSS_CLASS}`);\n    if (!place) {\n        place = document.createElement('div');\n        place.className = DEVTOOLS_CSS_CLASS;\n        document.body.appendChild(place);\n    }\n    return place;\n}\n\n// Inspired by https://www.colorglare.com/svelte-components-as-web-components-b400d1253504\n// Using a web component allows toolkit to encapsulate its DOM and CSS styles without affecting\n// the site or being affected by its global stylesheets\nclass ProseMirrorDevToolkit extends HTMLElement {\n    constructor() {\n        super();\n        const shadowRoot = this.attachShadow({ mode: 'open' });\n        this.addEventListener('init-dev-toolkit', (event) => {\n            const { detail: { view, opts } } = event;\n            this.component = new DevTools({\n                target: shadowRoot,\n                props: Object.assign({ view }, opts)\n            });\n        });\n    }\n    disconnectedCallback() {\n        var _a;\n        (_a = this.component) === null || _a === void 0 ? void 0 : _a.$destroy();\n    }\n}\n\n// Register the fancy web component wrapper but don't crash if it's already defined\nif (!customElements.get('prosemirror-dev-toolkit')) {\n    customElements.define('prosemirror-dev-toolkit', ProseMirrorDevToolkit);\n}\n// Make the dev tools available globally for testing and other use\nif (typeof window !== 'undefined')\n    window.applyDevTools = applyDevTools;\nlet removeCallback;\n/**\n * Applies devTools to the given EditorView.\n *\n * Will remove previous devTools instance first, then subscribes to the view's\n * transactions by adding a dispatchTransaction prop. If previous dispatchTransaction\n * prop exists, passes the transaction to it. Otherwise updates the state as normal.\n * Will destroy itself whenever view is destroyed or removeDevTools() is called.\n * @param view\n * @param opts\n */\nfunction applyDevTools(view, opts = {}) {\n    const place = createOrFindPlace();\n    removeDevTools();\n    // Sometimes when applyDevTools is run with hot module reload, it's accidentally executed on already destroyed EditorViews\n    if (view.isDestroyed)\n        return;\n    let comp;\n    const { disableWebComponent } = opts, filteredOpts = __rest(opts, [\"disableWebComponent\"]);\n    if (disableWebComponent) {\n        // Mainly for testing purposes since shadow DOM quite annoyingly hides all of its contents in the test snapshots\n        comp = new DevTools({\n            target: place,\n            props: Object.assign({ view }, filteredOpts)\n        });\n    }\n    else {\n        const newTools = document.createElement('prosemirror-dev-toolkit');\n        newTools.dispatchEvent(new CustomEvent('init-dev-toolkit', {\n            detail: { view, opts: filteredOpts }\n        }));\n        place.appendChild(newTools);\n    }\n    if (typeof window !== 'undefined') {\n        // Add editorView to the window for testing and debugging purposes\n        window.editorView = view;\n        // Also a helper method to execute commands\n        window.pmCmd = (cmd) => {\n            const state = view.state;\n            return cmd(state, view.dispatch, view);\n        };\n    }\n    // Bind the component's life-cycle to the editorView to automatically unmount the devTools\n    const oldDestroyFn = view.destroy.bind(view);\n    view.destroy = () => {\n        // DevTools must always be removed before view as the resetDispatch requires view to be still present\n        removeDevTools();\n        oldDestroyFn();\n    };\n    subscribeToDispatchTransaction(view);\n    removeCallback = () => {\n        resetHistory();\n        unsubscribeDispatchTransaction();\n        comp === null || comp === void 0 ? void 0 : comp.$destroy();\n        const el = place.firstChild;\n        el && place.removeChild(el);\n    };\n}\nfunction removeDevTools() {\n    removeCallback && removeCallback();\n    removeCallback = undefined;\n}\n\nexport { applyDevTools, removeDevTools };\n//# sourceMappingURL=index.js.map\n","import { applyDevTools, removeDevTools } from 'prosemirror-dev-toolkit';\n\nimport { CommandFactories, type CoreEditor, Extension } from '@kerebron/editor';\nimport { CommandShortcuts } from '@kerebron/editor/commands';\nimport { EditorView } from 'prosemirror-view';\n\nexport interface DevToolkitConfig {\n}\n\nexport class ExtensionDevToolkit extends Extension {\n  name = 'dev_toolkit';\n\n  private visible = false;\n\n  constructor(public override config: DevToolkitConfig = {}) {\n    super(config);\n  }\n\n  override getCommandFactories(editor: CoreEditor): Partial<CommandFactories> {\n    const commands: CommandFactories = {\n      toggleDevToolkit: () => () => {\n        if (this.visible) {\n          removeDevTools();\n          this.visible = !this.visible;\n        } else {\n          if (editor.view instanceof EditorView) {\n            applyDevTools(editor.view, { devToolsExpanded: true });\n            this.visible = !this.visible;\n          }\n        }\n        return true;\n      },\n    };\n    return commands;\n  }\n\n  override getKeyboardShortcuts(): Partial<CommandShortcuts> {\n    const shortcuts: CommandShortcuts = {\n      'Ctrl-`': 'toggleDevToolkit',\n    };\n    return shortcuts;\n  }\n}\n","import { IconSpec } from './menu.ts';\n\nconst SVG = 'http://www.w3.org/2000/svg';\nconst XLINK = 'http://www.w3.org/1999/xlink';\n\nconst prefix = 'kb-icon';\n\ntype PathSpec = string | { d: string; fill?: string };\n\nfunction hashPath(path: string | PathSpec[]): string {\n  const pathStr = Array.isArray(path)\n    ? path.map((p) => typeof p === 'string' ? p : p.d + (p.fill || '')).join('')\n    : path;\n  let hash = 0;\n  for (let i = 0; i < pathStr.length; i++) {\n    hash = (((hash << 5) - hash) + pathStr.charCodeAt(i)) | 0;\n  }\n  return hash.toString(16);\n}\n\nexport function getIcon(\n  root: Document | ShadowRoot,\n  icon: { path: string | PathSpec[]; width: number; height: number } | {\n    text: string;\n    css?: string;\n  } | { dom: Node },\n): HTMLElement {\n  let doc = (root.nodeType == 9 ? root as Document : root.ownerDocument) ||\n    document;\n  let node = doc.createElement('div');\n  node.className = prefix;\n  if ((icon as any).path) {\n    let { path, width, height } = icon as {\n      path: string | PathSpec[];\n      width: number;\n      height: number;\n    };\n    let name = 'pm-icon-' + hashPath(path);\n    if (!doc.getElementById(name)) {\n      buildSVG(\n        root,\n        name,\n        icon as { path: string | PathSpec[]; width: number; height: number },\n      );\n    }\n    let svg = node.appendChild(doc.createElementNS(SVG, 'svg'));\n    svg.style.width = (width / height) + 'em';\n    let use = svg.appendChild(doc.createElementNS(SVG, 'use'));\n    use.setAttributeNS(\n      XLINK,\n      'href',\n      /([^#]*)/.exec(doc.location.toString())![1] + '#' + name,\n    );\n  } else if ((icon as any).dom) {\n    node.appendChild((icon as any).dom.cloneNode(true));\n  } else {\n    let { text, css } = icon as { text: string; css?: string };\n    node.appendChild(doc.createElement('span')).textContent = text || '';\n    if (css) (node.firstChild as HTMLElement).style.cssText = css;\n  }\n  return node;\n}\n\nfunction buildSVG(\n  root: Document | ShadowRoot,\n  name: string,\n  data: { width: number; height: number; path: string | PathSpec[] },\n) {\n  let [doc, top] = root.nodeType == 9\n    ? [root as Document, (root as Document).body]\n    : [root.ownerDocument || document, root];\n  let collection = doc.getElementById(prefix + '-collection') as Element;\n  if (!collection) {\n    collection = doc.createElementNS(SVG, 'svg');\n    collection.id = prefix + '-collection';\n    (collection as HTMLElement).style.display = 'none';\n    top.insertBefore(collection, top.firstChild);\n  }\n  let sym = doc.createElementNS(SVG, 'symbol');\n  sym.id = name;\n  sym.setAttribute('viewBox', '0 0 ' + data.width + ' ' + data.height);\n\n  const paths = Array.isArray(data.path) ? data.path : [data.path];\n  for (const pathSpec of paths) {\n    let pathEl = sym.appendChild(doc.createElementNS(SVG, 'path'));\n    if (typeof pathSpec === 'string') {\n      pathEl.setAttribute('d', pathSpec);\n    } else {\n      pathEl.setAttribute('d', pathSpec.d);\n      if (pathSpec.fill) {\n        pathEl.setAttribute('fill', pathSpec.fill);\n      }\n    }\n  }\n\n  collection.appendChild(sym);\n}\n\n/// A set of basic editor-related icons. Contains the properties\n/// `join`, `lift`, `selectParentNode`, `undo`, `redo`, `strong`, `em`,\n/// `code`, `link`, `bulletList`, `orderedList`, and `blockquote`, each\n/// holding an object that can be used as the `icon` option to\n/// `MenuItem`.\nexport const icons: { [name: string]: IconSpec } = {\n  join: {\n    width: 24,\n    height: 24,\n    path: 'M16 13h-3V3h-2v10H8l4 4 4-4zM4 19v2h16v-2H4z',\n  },\n  lift: {\n    width: 24,\n    height: 24,\n    path:\n      'M11 4H3v2h8V4zm0 4H3v2h8V8zm0 4H3v2h8v-2zm3-3l-3 3 3 3v-2h4v-2h-4V9zm6 6H11v2h9v-2z',\n  },\n  selectParentNode: {\n    width: 24,\n    height: 24,\n    path:\n      'M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2z',\n  },\n  undo: {\n    width: 24,\n    height: 24,\n    path:\n      'M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z',\n  },\n  redo: {\n    width: 24,\n    height: 24,\n    path:\n      'M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z',\n  },\n  strong: {\n    width: 24,\n    height: 24,\n    path:\n      'M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z',\n  },\n  em: {\n    width: 24,\n    height: 24,\n    path: 'M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z',\n  },\n  underline: {\n    width: 24,\n    height: 24,\n    path:\n      'M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z',\n  },\n  code: {\n    width: 24,\n    height: 24,\n    path:\n      'M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z',\n  },\n  link: {\n    width: 24,\n    height: 24,\n    path:\n      'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z',\n  },\n  bulletList: {\n    width: 24,\n    height: 24,\n    path:\n      'M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z',\n  },\n  orderedList: {\n    width: 24,\n    height: 24,\n    path:\n      'M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z',\n  },\n  taskList: {\n    width: 24,\n    height: 24,\n    path:\n      'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z',\n  },\n  blockquote: {\n    width: 24,\n    height: 24,\n    path: 'M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z',\n  },\n  insert: {\n    width: 24,\n    height: 24,\n    path: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\n  },\n  type: {\n    width: 24,\n    height: 24,\n    path: 'M5 4v3h5.5v12h3V7H19V4H5z',\n  },\n  table: {\n    width: 24,\n    height: 24,\n    path:\n      'M3 3v18h18V3H3zm8 16H5v-6h6v6zm0-8H5V5h6v6zm8 8h-6v-6h6v6zm0-8h-6V5h6v6z',\n  },\n  image: {\n    width: 24,\n    height: 24,\n    path:\n      'M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z',\n  },\n  horizontalRule: {\n    width: 24,\n    height: 24,\n    path: 'M4 11h16v2H4z',\n  },\n  heading: {\n    width: 24,\n    height: 24,\n    path: 'M6 4v16h2v-7h8v7h2V4h-2v7H8V4H6z',\n  },\n  strike: {\n    width: 24,\n    height: 24,\n    path: 'M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z',\n  },\n  highlight: {\n    width: 24,\n    height: 24,\n    path: [\n      'M17.75 7L14 3.25l-10 10V17h3.75l10-10zm2.96-2.96a.996.996 0 0 0 0-1.41L18.37.29a.996.996 0 0 0-1.41 0L15 2.25 18.75 6l1.96-1.96z',\n      { d: 'M2 20h20v4H2z', fill: '#FFEB3B' },\n    ],\n  },\n  indent: {\n    width: 24,\n    height: 24,\n    path:\n      'M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z',\n  },\n  outdent: {\n    width: 24,\n    height: 24,\n    path:\n      'M3 21h18v-2H3v2zM7 8v8l-4-4 4-4zm4 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z',\n  },\n  superscript: {\n    width: 24,\n    height: 24,\n    path:\n      'M22 7h-2v1h3v1h-4V7c0-.55.45-1 1-1h2V5h-3V4h3c.55 0 1 .45 1 1v1c0 .55-.45 1-1 1zM5.88 20h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 6h-2.68l-3.07 4.99h-.12L8.87 6H6.19l4.32 6.73L5.88 20z',\n  },\n  subscript: {\n    width: 24,\n    height: 24,\n    path:\n      'M22 18h-2v1h3v1h-4v-2c0-.55.45-1 1-1h2v-1h-3v-1h3c.55 0 1 .45 1 1v1c0 .55-.45 1-1 1zM5.88 18h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 4h-2.68l-3.07 4.99h-.12L8.87 4H6.19l4.32 6.73L5.88 18z',\n  },\n  alignLeft: {\n    width: 24,\n    height: 24,\n    path:\n      'M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z',\n  },\n  alignCenter: {\n    width: 24,\n    height: 24,\n    path:\n      'M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z',\n  },\n  alignRight: {\n    width: 24,\n    height: 24,\n    path:\n      'M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z',\n  },\n  alignJustify: {\n    width: 24,\n    height: 24,\n    path:\n      'M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z',\n  },\n  folderOpen: {\n    width: 24,\n    height: 24,\n    path:\n      'M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z',\n  },\n};\n","import { EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { getIcon } from './icons.ts';\n\n/// The types defined in this module aren't the only thing you can\n/// display in your menu. Anything that conforms to this interface can\n/// be put into a menu structure.\nexport interface MenuElement {\n  /// Render the element for display in the menu. Must return a DOM\n  /// element and a function that can be used to update the element to\n  /// a new state. The `update` function must return false if the\n  /// update hid the entire element.\n  render(\n    pm: EditorView,\n  ): { dom: HTMLElement; update: (state: EditorState) => boolean };\n}\n\n/// An icon or label that, when clicked, executes a command.\nexport class MenuItem implements MenuElement {\n  CSS_PREFIX = 'kb-menu__button';\n\n  /// Create a menu item.\n  constructor(\n    /// The spec used to create this item.\n    readonly spec: MenuItemSpec,\n  ) {}\n\n  /// Renders the icon according to its [display\n  /// spec](#menu.MenuItemSpec.display), and adds an event handler which\n  /// executes the command when the representation is clicked.\n  render(view: EditorView) {\n    let spec = this.spec;\n    let dom = spec.render ? spec.render(view) : null;\n    if (!dom) {\n      // Create a proper button element for better accessibility\n      dom = document.createElement('button');\n      dom.setAttribute('type', 'button');\n\n      // Add our new CSS classes while maintaining backward compatibility\n      dom.classList.add(this.CSS_PREFIX);\n\n      if (spec.icon) {\n        const icon = getIcon(view.root, spec.icon);\n        dom.appendChild(icon);\n        dom.classList.add(this.CSS_PREFIX + '--icon-only');\n      }\n\n      if (spec.label) {\n        const labelSpan = document.createElement('span');\n        labelSpan.appendChild(\n          document.createTextNode(translate(view, spec.label)),\n        );\n        dom.appendChild(labelSpan);\n        if (spec.icon) {\n          dom.classList.remove(this.CSS_PREFIX + '--icon-only');\n        }\n      }\n\n      if (!spec.icon && !spec.label) {\n        throw new RangeError('MenuItem without icon or label property');\n      }\n    }\n\n    if (spec.title) {\n      const title = typeof spec.title === 'function'\n        ? spec.title(view.state)\n        : spec.title;\n      dom.setAttribute('title', translate(view, title));\n      dom.setAttribute('aria-label', translate(view, title));\n    }\n\n    if (spec.class) dom.classList.add(spec.class);\n    if (spec.css) dom.style.cssText += spec.css;\n\n    dom.addEventListener('mousedown', (e) => {\n      e.preventDefault();\n      if (!dom!.classList.contains(this.CSS_PREFIX + '--disabled')) {\n        spec.run(view.state, view.dispatch);\n      }\n    });\n\n    const update = (state: EditorState) => {\n      if (spec.select) {\n        let selected = spec.select(state);\n        dom!.style.display = selected ? '' : 'none';\n        if (!selected) return false;\n      }\n      let enabled = true;\n      if (spec.enable) {\n        enabled = spec.enable(state) || false;\n        setClass(dom!, this.CSS_PREFIX + '--disabled', !enabled);\n        dom!.setAttribute('aria-disabled', (!enabled).toString());\n      }\n      if (spec.active) {\n        let active = enabled && spec.active(state) || false;\n        setClass(dom!, this.CSS_PREFIX + '--active', active);\n        dom!.setAttribute('aria-pressed', active.toString());\n      }\n      return true;\n    };\n\n    return { dom, update };\n  }\n}\n\nfunction translate(view: EditorView, text: string): string {\n  return (view as any)._props.translate\n    ? (view as any)._props.translate(text)\n    : text;\n}\n\n/// Specifies an icon. May be either an SVG icon, in which case its\n/// `path` property should be an [SVG path\n/// spec](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d),\n/// and `width` and `height` should provide the viewbox in which that\n/// path exists. Alternatively, it may have a `text` property\n/// specifying a string of text that makes up the icon, with an\n/// optional `css` property giving additional CSS styling for the\n/// text. _Or_ it may contain `dom` property containing a DOM node.\ntype PathSpec = string | { d: string; fill?: string };\nexport type IconSpec =\n  | { path: string | PathSpec[]; width: number; height: number }\n  | {\n    text: string;\n    css?: string;\n  }\n  | { dom: Node };\n\n/// The configuration object passed to the `MenuItem` constructor.\nexport interface MenuItemSpec {\n  /// The function to execute when the menu item is activated.\n  run: (\n    state: EditorState,\n    dispatch: (tr: Transaction) => void,\n  ) => boolean | Promise<boolean>;\n\n  /// Optional function that is used to determine whether the item is\n  /// appropriate at the moment. Deselected items will be hidden.\n  select?: (state: EditorState) => boolean;\n\n  /// Function that is used to determine if the item is enabled. If\n  /// given and returning false, the item will be given a disabled\n  /// styling.\n  enable?: (state: EditorState) => boolean;\n\n  /// A predicate function to determine whether the item is 'active' (for\n  /// example, the item for toggling the strong mark might be active then\n  /// the cursor is in strong text).\n  active?: (state: EditorState) => boolean;\n\n  /// A function that renders the item. You must provide either this,\n  /// [`icon`](#menu.MenuItemSpec.icon), or [`label`](#MenuItemSpec.label).\n  render?: (view: EditorView) => HTMLElement;\n\n  /// Describes an icon to show for this item.\n  icon?: IconSpec;\n\n  /// Makes the item show up as a text label. Mostly useful for items\n  /// wrapped in a [drop-down](#menu.Dropdown) or similar menu. The object\n  /// should have a `label` property providing the text to display.\n  label?: string;\n\n  /// Defines DOM title (mouseover) text for the item.\n  title?: string | ((state: EditorState) => string);\n\n  /// Optionally adds a CSS class to the item's DOM representation.\n  class?: string;\n\n  /// Optionally adds a string of inline CSS to the item's DOM\n  /// representation.\n  css?: string;\n}\n\nlet lastMenuEvent: { time: number; node: null | Node } = {\n  time: 0,\n  node: null,\n};\nfunction markMenuEvent(e: Event) {\n  lastMenuEvent.time = Date.now();\n  lastMenuEvent.node = e.target as Node;\n}\nfunction isMenuEvent(wrapper: HTMLElement) {\n  return Date.now() - 100 < lastMenuEvent.time &&\n    lastMenuEvent.node && wrapper.contains(lastMenuEvent.node);\n}\n\n/// A drop-down menu, displayed as a label with a downwards-pointing\n/// triangle to the right of it.\nexport class Dropdown implements MenuElement {\n  CSS_PREFIX = 'kb-dropdown';\n  /// @internal\n  content: readonly MenuElement[];\n\n  /// Create a dropdown wrapping the elements.\n  constructor(\n    content: readonly MenuElement[] | MenuElement,\n    /// @internal\n    readonly options: {\n      /// The label to show on the drop-down control.\n      label?: string;\n\n      /// Describes an icon to show for this dropdown.\n      icon?: IconSpec;\n\n      /// Sets the\n      /// [`title`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title)\n      /// attribute given to the menu control.\n      title?: string;\n\n      /// When given, adds an extra CSS class to the menu control.\n      class?: string;\n\n      /// When given, adds an extra set of CSS styles to the menu control.\n      css?: string;\n    } = {},\n  ) {\n    this.options = options || {};\n    this.content = Array.isArray(content) ? content : [content];\n  }\n\n  /// Render the dropdown menu and sub-items.\n  render(view: EditorView) {\n    let content = renderDropdownItems(this.content, view);\n    let win = view.dom.ownerDocument.defaultView;\n\n    // Create a button element instead of div for better accessibility\n    let label = document.createElement('button');\n    label.setAttribute('type', 'button');\n    label.classList.add(this.CSS_PREFIX + '__label');\n    if (this.options.class) {\n      label.classList.add(this.options.class);\n    }\n    if (this.options.css) label.setAttribute('style', this.options.css);\n\n    // Add icon if specified\n    if (this.options.icon) {\n      const icon = getIcon(view.root, this.options.icon);\n      label.appendChild(icon);\n    }\n\n    // Add text label (hidden by CSS in toolbar, visible in title/aria-label)\n    const labelText = translate(view, this.options.label || '');\n    if (labelText) {\n      const textSpan = document.createElement('span');\n      textSpan.classList.add(this.CSS_PREFIX + '__label-text');\n      textSpan.textContent = labelText;\n      label.appendChild(textSpan);\n    }\n\n    // Set title from explicit title option, or use label as fallback\n    const titleText = this.options.title\n      ? translate(view, this.options.title)\n      : labelText;\n    if (titleText) {\n      label.setAttribute('title', titleText);\n      label.setAttribute('aria-label', titleText);\n    }\n\n    // Set ARIA attributes for accessibility\n    label.setAttribute('aria-haspopup', 'true');\n    label.setAttribute('aria-expanded', 'false');\n\n    let wrap = document.createElement('div');\n    wrap.classList.add(this.CSS_PREFIX);\n    wrap.appendChild(label);\n    let open: { close: () => boolean; node: HTMLElement } | null = null;\n    let listeningOnClose: (() => void) | null = null;\n    let close = () => {\n      if (open && open.close()) {\n        open = null;\n        win?.removeEventListener('mousedown', listeningOnClose!);\n      }\n    };\n    label.addEventListener('mousedown', (e) => {\n      e.preventDefault();\n      markMenuEvent(e);\n      if (open) {\n        close();\n        wrap.classList.remove('kb-dropdown--open');\n      } else {\n        open = this.expand(wrap, content.dom);\n        wrap.classList.add('kb-dropdown--open');\n        win?.addEventListener(\n          'mousedown',\n          listeningOnClose = () => {\n            if (!isMenuEvent(wrap)) close();\n          },\n        );\n      }\n    });\n\n    function update(state: EditorState) {\n      let inner = content.update(state);\n      wrap.style.display = inner ? '' : 'none';\n      return inner;\n    }\n\n    return { dom: wrap, update };\n  }\n\n  /// @internal\n  expand(dom: HTMLElement, items: readonly Node[]) {\n    const menuDOM = document.createElement('div');\n    menuDOM.classList.add('kb-dropdown__menu');\n    menuDOM.setAttribute('role', 'menu');\n\n    if (this.options.class) {\n      menuDOM.classList.add(this.options.class);\n    }\n    items.forEach((item) => menuDOM.appendChild(item));\n    let done = false;\n    function close(): boolean {\n      if (done) return false;\n      done = true;\n      dom.removeChild(menuDOM);\n      return true;\n    }\n    dom.appendChild(menuDOM);\n    return { close, node: menuDOM };\n  }\n}\n\nfunction renderDropdownItems(items: readonly MenuElement[], view: EditorView) {\n  let rendered = [], updates = [];\n  for (let i = 0; i < items.length; i++) {\n    let { dom, update } = items[i].render(view);\n    const item = document.createElement('div');\n    item.classList.add('kb-dropdown__item');\n    item.appendChild(dom);\n    rendered.push(item);\n    updates.push(update);\n  }\n  return { dom: rendered, update: combineUpdates(updates, rendered) };\n}\n\nfunction combineUpdates(\n  updates: readonly ((state: EditorState) => boolean)[],\n  nodes: readonly HTMLElement[],\n) {\n  return (state: EditorState) => {\n    let something = false;\n    for (let i = 0; i < updates.length; i++) {\n      let up = updates[i](state);\n      nodes[i].style.display = up ? '' : 'none';\n      if (up) something = true;\n    }\n    return something;\n  };\n}\n\n/// Represents a submenu wrapping a group of elements that start\n/// hidden and expand to the right when hovered over or tapped.\nexport class DropdownSubmenu implements MenuElement {\n  /// @internal\n  content: readonly MenuElement[];\n\n  /// Creates a submenu for the given group of menu elements. The\n  /// following options are recognized:\n  constructor(\n    content: readonly MenuElement[] | MenuElement,\n    /// @internal\n    readonly options: {\n      /// The label to show on the submenu.\n      label?: string;\n    } = {},\n  ) {\n    this.content = Array.isArray(content) ? content : [content];\n  }\n\n  /// Renders the submenu.\n  render(view: EditorView) {\n    const CSS_PREFIX = 'kb-submenu';\n\n    const items = renderDropdownItems(this.content, view);\n    const win = view.dom.ownerDocument.defaultView;\n\n    const wrap = document.createElement('div');\n    wrap.classList.add(CSS_PREFIX);\n\n    const label = document.createElement('div');\n    label.classList.add(CSS_PREFIX + '__label');\n    label.appendChild(\n      document.createTextNode(translate(view, this.options.label || '')),\n    );\n    wrap.appendChild(label);\n\n    const submenu = document.createElement('div');\n    submenu.classList.add(CSS_PREFIX + '__content');\n    items.dom.forEach((item) => submenu.appendChild(item));\n    wrap.appendChild(submenu);\n\n    let listeningOnClose: (() => void) | null = null;\n    label.addEventListener('mousedown', (e) => {\n      e.preventDefault();\n      markMenuEvent(e);\n      const isOpen = wrap.classList.contains(CSS_PREFIX + '--open');\n      setClass(wrap, CSS_PREFIX + '--open', !isOpen);\n      if (!isOpen && !listeningOnClose) {\n        win?.addEventListener(\n          'mousedown',\n          listeningOnClose = () => {\n            if (!isMenuEvent(wrap)) {\n              wrap.classList.remove(CSS_PREFIX + '--open');\n              win?.removeEventListener('mousedown', listeningOnClose!);\n              listeningOnClose = null;\n            }\n          },\n        );\n      }\n    });\n\n    function update(state: EditorState) {\n      let inner = items.update(state);\n      wrap.style.display = inner ? '' : 'none';\n      return inner;\n    }\n    return { dom: wrap, update };\n  }\n}\n\n/// Render the given, possibly nested, array of menu elements into a\n/// document fragment, placing separators between them (and ensuring no\n/// superfluous separators appear when some of the groups turn out to\n/// be empty).\nexport function renderGrouped(\n  view: EditorView,\n  content: readonly (readonly MenuElement[])[],\n) {\n  let result = document.createDocumentFragment();\n  let updates: ((state: EditorState) => boolean)[] = [],\n    separators: HTMLElement[] = [];\n  for (let i = 0; i < content.length; i++) {\n    let items = content[i], localUpdates = [], localNodes = [];\n    for (let j = 0; j < items.length; j++) {\n      let { dom, update } = items[j].render(view);\n      let span = document.createElement('span');\n      span.classList.add('kb-menu__item');\n      span.appendChild(dom);\n      result.appendChild(span);\n      localNodes.push(span);\n      localUpdates.push(update);\n    }\n    if (localUpdates.length) {\n      updates.push(combineUpdates(localUpdates, localNodes));\n      if (i < content.length - 1) {\n        separators.push(result.appendChild(separator()));\n      }\n    }\n  }\n\n  function update(state: EditorState) {\n    let something = false, needSep = false;\n    for (let i = 0; i < updates.length; i++) {\n      let hasContent = updates[i](state);\n      if (i) {\n        separators[i - 1].style.display = needSep && hasContent ? '' : 'none';\n      }\n      needSep = hasContent;\n      if (hasContent) something = true;\n    }\n    return something;\n  }\n  return { dom: result, update };\n}\n\nfunction separator() {\n  const elem = document.createElement('div');\n  elem.classList.add('kb-menu__separator');\n  return elem;\n}\n\n// Work around classList.toggle being broken in IE11\nfunction setClass(dom: HTMLElement, cls: string, on: boolean) {\n  if (on) dom.classList.add(cls);\n  else dom.classList.remove(cls);\n}\n","import { Attrs } from 'prosemirror-model';\n\nconst CSS_PREFIX = 'kb-prompt';\n\nexport function openPrompt(options: {\n  title: string;\n  fields: { [name: string]: Field };\n  callback: (attrs: Attrs) => void;\n}) {\n  // Create a backdrop to capture clicks outside the modal\n  let backdrop = document.body.appendChild(document.createElement('div'));\n  backdrop.className = CSS_PREFIX + '-backdrop';\n\n  let wrapper = document.body.appendChild(document.createElement('div'));\n  wrapper.className = CSS_PREFIX;\n\n  let close = () => {\n    if (backdrop.parentNode) backdrop.parentNode.removeChild(backdrop);\n    if (wrapper.parentNode) wrapper.parentNode.removeChild(wrapper);\n  };\n\n  // Click on backdrop closes the modal\n  backdrop.addEventListener('click', (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    close();\n  });\n\n  let domFields: HTMLElement[] = [];\n  for (let name in options.fields) {\n    domFields.push(options.fields[name].render());\n  }\n\n  let submitButton = document.createElement('button');\n  submitButton.type = 'submit';\n  submitButton.className = CSS_PREFIX + '--submit';\n  submitButton.textContent = 'OK';\n  let cancelButton = document.createElement('button');\n  cancelButton.type = 'button';\n  cancelButton.className = CSS_PREFIX + '--cancel';\n  cancelButton.textContent = 'Cancel';\n  // Use click event - mousedown caused issues with events falling through to toolbar\n  cancelButton.addEventListener('click', (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    close();\n  });\n\n  let form = wrapper.appendChild(document.createElement('form'));\n  if (options.title) {\n    form.appendChild(document.createElement('h5')).textContent = options.title;\n  }\n  domFields.forEach((field) => {\n    form.appendChild(document.createElement('div')).appendChild(field);\n  });\n  let buttons = form.appendChild(document.createElement('div'));\n  buttons.className = CSS_PREFIX + '__buttons';\n  buttons.appendChild(submitButton);\n  buttons.appendChild(document.createTextNode(' '));\n  buttons.appendChild(cancelButton);\n\n  let box = wrapper.getBoundingClientRect();\n  wrapper.style.top = ((globalThis.innerHeight - box.height) / 2) + 'px';\n  wrapper.style.left = ((globalThis.innerWidth - box.width) / 2) + 'px';\n\n  let submit = () => {\n    let params = getValues(options.fields, domFields);\n    if (params) {\n      close();\n      options.callback(params);\n    }\n  };\n\n  form.addEventListener('submit', (e) => {\n    e.preventDefault();\n    submit();\n  });\n\n  form.addEventListener('keydown', (e) => {\n    if (e.keyCode == 27) {\n      e.preventDefault();\n      close();\n    } else if (e.keyCode == 13 && !(e.ctrlKey || e.metaKey || e.shiftKey)) {\n      e.preventDefault();\n      submit();\n    } else if (e.keyCode == 9) {\n      globalThis.setTimeout(() => {\n        if (!wrapper.contains(document.activeElement)) close();\n      }, 500);\n    }\n  });\n\n  let input = form.elements[0] as HTMLElement;\n  if (input) input.focus();\n}\n\nfunction getValues(\n  fields: { [name: string]: Field },\n  domFields: readonly HTMLElement[],\n) {\n  let result = Object.create(null), i = 0;\n  for (let name in fields) {\n    let field = fields[name], dom = domFields[i++];\n    let value = field.read(dom), bad = field.validate(value);\n    if (bad) {\n      reportInvalid(dom, bad);\n      return null;\n    }\n    result[name] = field.clean(value);\n  }\n  return result;\n}\n\nfunction reportInvalid(dom: HTMLElement, message: string) {\n  // FIXME this is awful and needs a lot more work\n  let parent = dom.parentNode!;\n  let msg = parent.appendChild(document.createElement('div'));\n  msg.style.left = (dom.offsetLeft + dom.offsetWidth + 2) + 'px';\n  msg.style.top = (dom.offsetTop - 5) + 'px';\n  msg.className = 'kb-invalid';\n  msg.textContent = message;\n  setTimeout(() => parent.removeChild(msg), 1500);\n}\n\n/// The type of field that `openPrompt` expects to be passed to it.\nexport abstract class Field {\n  /// Create a field with the given options. Options support by all\n  /// field types are:\n  constructor(\n    /// @internal\n    readonly options: {\n      /// The starting value for the field.\n      value?: any;\n\n      /// The label for the field.\n      label: string;\n\n      /// Whether the field is required.\n      required?: boolean;\n\n      /// A function to validate the given value. Should return an\n      /// error message if it is not valid.\n      validate?: (value: any) => string | null;\n\n      /// A cleanup function for field values.\n      clean?: (value: any) => any;\n    },\n  ) {}\n\n  /// Render the field to the DOM. Should be implemented by all subclasses.\n  abstract render(): HTMLElement;\n\n  /// Read the field's value from its DOM node.\n  read(dom: HTMLElement) {\n    return (dom as any).value;\n  }\n\n  /// A field-type-specific validation function.\n  validateType(value: any): string | null {\n    return null;\n  }\n\n  /// @internal\n  validate(value: any): string | null {\n    if (!value && this.options.required) {\n      return 'Required field';\n    }\n    return this.validateType(value) ||\n      (this.options.validate ? this.options.validate(value) : null);\n  }\n\n  clean(value: any): any {\n    return this.options.clean ? this.options.clean(value) : value;\n  }\n}\n\n/// A field class for single-line text fields.\nexport class TextField extends Field {\n  render() {\n    let input = document.createElement('input');\n    input.type = 'text';\n    input.placeholder = this.options.label;\n    input.value = this.options.value || '';\n    input.autocomplete = 'off';\n    return input;\n  }\n}\n\n/// A field class for dropdown fields based on a plain `<select>`\n/// tag. Expects an option `options`, which should be an array of\n/// `{value: string, label: string}` objects, or a function taking a\n/// `ProseMirror` instance and returning such an array.\nexport class SelectField extends Field {\n  render() {\n    let select = document.createElement('select');\n    ((this.options as any).options as { value: string; label: string }[])\n      .forEach((o) => {\n        let opt = select.appendChild(document.createElement('option'));\n        opt.value = o.value;\n        opt.selected = o.value == this.options.value;\n        opt.label = o.label;\n      });\n    return select;\n  }\n}\n\n/// A field class for file/image upload fields.\n/// Uses a file input with browse button. Converts selected file to a data URL.\nexport class FileField extends Field {\n  private dataUrl: string = '';\n\n  render() {\n    const wrapper = document.createElement('div');\n    wrapper.className = CSS_PREFIX + '__file-field';\n\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = (this.options as any).accept || 'image/*';\n    input.className = CSS_PREFIX + '__file-input';\n\n    const label = document.createElement('label');\n    label.className = CSS_PREFIX + '__file-label';\n    label.textContent = this.options.label;\n\n    const fileName = document.createElement('span');\n    fileName.className = CSS_PREFIX + '__file-name';\n    fileName.textContent = 'No file selected';\n\n    // If there's an existing value (URL), show it\n    if (this.options.value) {\n      this.dataUrl = this.options.value;\n      fileName.textContent = 'Current image';\n    }\n\n    input.addEventListener('change', () => {\n      const file = input.files?.[0];\n      if (file) {\n        fileName.textContent = file.name;\n        // Convert to data URL for embedding\n        const reader = new FileReader();\n        reader.onload = (e) => {\n          this.dataUrl = e.target?.result as string;\n          // Store on wrapper for read() to access\n          (wrapper as any)._dataUrl = this.dataUrl;\n        };\n        reader.readAsDataURL(file);\n      }\n    });\n\n    wrapper.appendChild(label);\n    wrapper.appendChild(input);\n    wrapper.appendChild(fileName);\n\n    // Store reference for reading\n    (wrapper as any)._dataUrl = this.dataUrl;\n\n    return wrapper;\n  }\n\n  read(dom: HTMLElement) {\n    return (dom as any)._dataUrl || '';\n  }\n\n  validateType(value: any): string | null {\n    if (this.options.required && !value) {\n      return 'Please select a file';\n    }\n    return null;\n  }\n}\n","import { Command, EditorState, NodeSelection } from 'prosemirror-state';\nimport { Attrs, MarkType, NodeType, Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { type CoreEditor } from '@kerebron/editor';\n\nimport {\n  Dropdown,\n  DropdownSubmenu,\n  type MenuElement,\n  MenuItem,\n  type MenuItemSpec,\n} from './menu.ts';\nimport { icons } from './icons.ts';\nimport { FileField, openPrompt, TextField } from './prompt.ts';\n\nfunction canInsert(state: EditorState, nodeType: NodeType) {\n  let $from = state.selection.$from;\n  for (let d = $from.depth; d >= 0; d--) {\n    let index = $from.index(d);\n    if ($from.node(d).canReplaceWith(index, index, nodeType)) return true;\n  }\n  return false;\n}\n\nfunction cmdItem(cmd: Command, options: Partial<MenuItemSpec>) {\n  let passedOptions: MenuItemSpec = {\n    label: options.title as string | undefined,\n    run: cmd,\n  };\n  for (let prop in options) {\n    (passedOptions as any)[prop] = (options as any)[prop];\n  }\n  if (!options.enable && !options.select) {\n    passedOptions[options.enable ? 'enable' : 'select'] = (state) => cmd(state);\n  }\n\n  return new MenuItem(passedOptions);\n}\n\nfunction markActive(state: EditorState, type: MarkType) {\n  let { from, $from, to, empty } = state.selection;\n  if (empty) return !!type.isInSet(state.storedMarks || $from.marks());\n  else return state.doc.rangeHasMark(from, to, type);\n}\n\nconst cut = <T>(arr: T[]) => arr.filter((x) => x) as NonNullable<T>[];\n\nexport function buildMenu(editor: CoreEditor, schema: Schema): MenuElement[][] {\n  function markItem(markType: MarkType, options: Partial<MenuItemSpec>) {\n    let passedOptions: Partial<MenuItemSpec> = {\n      active(state) {\n        return markActive(state, markType);\n      },\n    };\n    for (let prop in options) {\n      (passedOptions as any)[prop] = (options as any)[prop];\n    }\n    return cmdItem(editor.commandFactories.toggleMark(markType), passedOptions);\n  }\n\n  function wrapItem(\n    nodeType: NodeType,\n    options: Partial<MenuItemSpec> & { attrs?: Attrs | null },\n  ) {\n    let passedOptions: MenuItemSpec = {\n      run(state, dispatch) {\n        return editor.commandFactories.wrapIn(nodeType, options.attrs).apply({\n          editor,\n        }, [state, dispatch]);\n      },\n      select(state) {\n        return editor.commandFactories.wrapIn(nodeType, options.attrs).apply({\n          editor,\n        }, [state]);\n      },\n    };\n    for (let prop in options) {\n      (passedOptions as any)[prop] = (options as any)[prop];\n    }\n    return new MenuItem(passedOptions);\n  }\n\n  function wrapListItem(nodeType: NodeType, options: Partial<MenuItemSpec>) {\n    return cmdItem(\n      editor.commandFactories.wrapInList(nodeType, (options as any).attrs),\n      options,\n    );\n  }\n\n  /// Build a menu item for changing the type of the textblock around the\n  /// selection to the given type. Provides `run`, `active`, and `select`\n  /// properties. Others must be given in `options`. `options.attrs` may\n  /// be an object to provide the attributes for the textblock node.\n  function blockTypeItem(\n    nodeType: NodeType,\n    options: Partial<MenuItemSpec> & { attrs?: Attrs | null },\n  ) {\n    let command = editor.commandFactories.setBlockType(nodeType, options.attrs);\n    let passedOptions: MenuItemSpec = {\n      run: command,\n      enable(state) {\n        return command.apply({ editor }, [state]);\n      },\n      active(state) {\n        let { $from, to, node } = state.selection as NodeSelection;\n        if (node) return node.hasMarkup(nodeType, options.attrs);\n        return to <= $from.end() &&\n          $from.parent.hasMarkup(nodeType, options.attrs);\n      },\n    };\n    for (let prop in options) {\n      (passedOptions as any)[prop] = (options as any)[prop];\n    }\n    return new MenuItem(passedOptions);\n  }\n\n  // Group 1: Undo/Redo\n  const undoRedoGroup: MenuElement[] = [];\n\n  // === 1. Undo ===\n  // Use a wrapper that dynamically gets the undo command from the editor\n  // This handles both history and y-prosemirror undo\n  undoRedoGroup.push(\n    new MenuItem({\n      title: 'Undo last change',\n      run: (state, dispatch) => {\n        const undoCmd = editor.commandFactories['undo']?.();\n        if (undoCmd) {\n          return undoCmd.apply({ editor }, [state, dispatch]);\n        }\n        return false;\n      },\n      enable: (state) => {\n        const undoCmd = editor.commandFactories['undo']?.();\n        if (undoCmd) {\n          return undoCmd.apply({ editor }, [state]);\n        }\n        return false;\n      },\n      icon: icons.undo,\n    }),\n  );\n\n  // === 2. Redo ===\n  // Use a wrapper that dynamically gets the redo command from the editor\n  undoRedoGroup.push(\n    new MenuItem({\n      title: 'Redo last undone change',\n      run: (state, dispatch) => {\n        const redoCmd = editor.commandFactories['redo']?.();\n        if (redoCmd) {\n          return redoCmd.apply({ editor }, [state, dispatch]);\n        }\n        return false;\n      },\n      enable: (state) => {\n        const redoCmd = editor.commandFactories['redo']?.();\n        if (redoCmd) {\n          return redoCmd.apply({ editor }, [state]);\n        }\n        return false;\n      },\n      icon: icons.redo,\n    }),\n  );\n\n  // Group 2: Structure tools (Type, Heading, Lift, Join, Blockquote)\n  const structureGroup: MenuElement[] = [];\n\n  // === Type dropdown (Plain, Code Block) ===\n  const typeMenu: MenuElement[] = [];\n  if (schema.nodes.paragraph) {\n    typeMenu.push(blockTypeItem(schema.nodes.paragraph, {\n      title: 'Change to paragraph',\n      label: 'Plain',\n    }));\n  }\n  if (schema.nodes.code_block) {\n    typeMenu.push(blockTypeItem(schema.nodes.code_block, {\n      title: 'Change to code block',\n      label: 'Code',\n    }));\n  }\n  if (typeMenu.length > 0) {\n    structureGroup.push(\n      new Dropdown(typeMenu, {\n        label: 'Type',\n        icon: icons.type,\n      }),\n    );\n  }\n\n  // === 3. Heading / Text style selector (the \"H\" dropdown) ===\n  if (schema.nodes.heading) {\n    const headingMenu = [];\n    for (let i = 1; i <= 6; i++) {\n      headingMenu.push(blockTypeItem(schema.nodes.heading, {\n        title: 'Change to heading ' + i,\n        label: 'Heading ' + i,\n        attrs: { level: i },\n      }));\n    }\n    structureGroup.push(\n      new Dropdown(headingMenu, {\n        label: 'Heading',\n        icon: icons.heading,\n      }),\n    );\n  }\n\n  // === Lists dropdown (moved here after Heading) ===\n  const listMenu: MenuElement[] = [];\n  if (schema.nodes.bullet_list) {\n    listMenu.push(\n      cmdItem(\n        editor.commandFactories.toggleBulletList(),\n        {\n          title: 'Wrap in bullet list',\n          label: 'Bullet List',\n          icon: icons.bulletList,\n        },\n      ),\n    );\n  }\n  if (schema.nodes.ordered_list) {\n    listMenu.push(\n      cmdItem(\n        editor.commandFactories.toggleOrderedList(),\n        {\n          title: 'Wrap in ordered list',\n          label: 'Ordered List',\n          icon: icons.orderedList,\n        },\n      ),\n    );\n  }\n  if (schema.nodes.task_list) {\n    listMenu.push(\n      cmdItem(\n        editor.commandFactories.toggleTaskList(),\n        {\n          title: 'Wrap in task list',\n          label: 'Task List',\n          icon: icons.taskList,\n        },\n      ),\n    );\n  }\n  if (listMenu.length > 0) {\n    structureGroup.push(\n      new Dropdown(listMenu, {\n        label: 'Lists',\n        icon: icons.bulletList,\n      }),\n    );\n  }\n\n  // === 4. Decrease indent (outdent) ===\n  structureGroup.push(\n    new MenuItem({\n      title: 'Lift out of enclosing block',\n      run: () => editor.chain().lift().run(),\n      select: () => editor.can().lift().run(),\n      icon: icons.outdent,\n    }),\n  );\n\n  // === 5. Block quote ===\n  if (schema.nodes.blockquote) {\n    structureGroup.push(wrapItem(schema.nodes.blockquote, {\n      title: 'Wrap in block quote',\n      icon: icons.blockquote,\n    }));\n  }\n\n  // Group 3: Text formatting (Bold through Link)\n  const formattingGroup: MenuElement[] = [];\n\n  // === 7. Bold ===\n  if (schema.marks.strong) {\n    formattingGroup.push(\n      new MenuItem({\n        title: 'Toggle bold',\n        run: () => editor.chain().toggleStrong().run(),\n        enable: (state) => editor.can().toggleStrong().run(),\n        icon: icons.strong,\n      }),\n    );\n  }\n\n  // === 8. Italic ===\n  if (schema.marks.em) {\n    formattingGroup.push(\n      new MenuItem({\n        title: 'Toggle italic',\n        run: () => editor.chain().toggleItalic().run(),\n        enable: (state) => editor.can().toggleItalic().run(),\n        icon: icons.em,\n      }),\n    );\n  }\n\n  // === 9. Strikethrough ===\n  if (schema.marks.strike) {\n    formattingGroup.push(markItem(schema.marks.strike, {\n      title: 'Toggle strikethrough',\n      icon: icons.strike,\n    }));\n  }\n\n  // === 10. Inline code ===\n  if (schema.marks.code) {\n    formattingGroup.push(markItem(schema.marks.code, {\n      title: 'Toggle code font',\n      icon: icons.code,\n    }));\n  }\n\n  // === 11. Underline ===\n  if (schema.marks.underline) {\n    formattingGroup.push(\n      new MenuItem({\n        title: 'Toggle underline',\n        run: () => editor.chain().toggleUnderline().run(),\n        enable: (state) => editor.can().toggleUnderline().run(),\n        icon: icons.underline,\n      }),\n    );\n  }\n\n  // === 12. Highlight / Text color ===\n  if (schema.marks.highlight) {\n    formattingGroup.push(markItem(schema.marks.highlight, {\n      title: 'Toggle highlight',\n      icon: icons.highlight,\n    }));\n  }\n\n  // === 13. Insert link ===\n  if (schema.marks.link) {\n    const markType = schema.marks.link;\n\n    formattingGroup.push(\n      new MenuItem({\n        title: 'Add or remove link',\n        icon: icons.link,\n        active(state) {\n          return markActive(state, markType);\n        },\n        enable(state) {\n          return !state.selection.empty;\n        },\n        run(state, dispatch) {\n          if (markActive(state, markType)) {\n            editor.commandFactories.toggleMark(markType).apply({ editor }, [\n              state,\n              dispatch,\n            ]);\n            return true;\n          }\n          openPrompt({\n            title: 'Create a link',\n            fields: {\n              href: new TextField({\n                label: 'Link target',\n                required: true,\n              }),\n              title: new TextField({ label: 'Title' }),\n            },\n            callback(attrs) {\n              editor.commandFactories.toggleMark(markType, attrs).apply({\n                editor,\n              }, [\n                editor.view.state,\n                editor.view.dispatch,\n              ]);\n              editor.view.focus();\n            },\n          });\n          return true;\n        },\n      }),\n    );\n  }\n\n  // Group 4: Superscript/Subscript\n  const scriptGroup: MenuElement[] = [];\n\n  // === 14. Superscript ===\n  if (schema.marks.superscript) {\n    scriptGroup.push(markItem(schema.marks.superscript, {\n      title: 'Toggle superscript',\n      icon: icons.superscript,\n    }));\n  }\n\n  // === 15. Subscript ===\n  if (schema.marks.subscript) {\n    scriptGroup.push(markItem(schema.marks.subscript, {\n      title: 'Toggle subscript',\n      icon: icons.subscript,\n    }));\n  }\n\n  // Group 5: Text alignment\n  const alignmentGroup: MenuElement[] = [];\n\n  // === 16-19. Text alignment ===\n  // Check if paragraph has textAlign attribute\n  if (schema.nodes.paragraph?.spec?.attrs?.textAlign !== undefined) {\n    alignmentGroup.push(\n      new MenuItem({\n        title: 'Align left',\n        icon: icons.alignLeft,\n        run: () => editor.chain().setTextAlignLeft().run(),\n        enable: () => editor.can().setTextAlignLeft().run(),\n      }),\n    );\n    alignmentGroup.push(\n      new MenuItem({\n        title: 'Align center',\n        icon: icons.alignCenter,\n        run: () => editor.chain().setTextAlignCenter().run(),\n        enable: () => editor.can().setTextAlignCenter().run(),\n      }),\n    );\n    alignmentGroup.push(\n      new MenuItem({\n        title: 'Align right',\n        icon: icons.alignRight,\n        run: () => editor.chain().setTextAlignRight().run(),\n        enable: () => editor.can().setTextAlignRight().run(),\n      }),\n    );\n    alignmentGroup.push(\n      new MenuItem({\n        title: 'Justify',\n        icon: icons.alignJustify,\n        run: () => editor.chain().setTextAlignJustify().run(),\n        enable: () => editor.can().setTextAlignJustify().run(),\n      }),\n    );\n  }\n\n  // Group 6: Insert tools (Image, Lists, HR, Table, Type)\n  const insertGroup: MenuElement[] = [];\n\n  // === 20. Insert image ===\n  if (schema.nodes.image) {\n    const nodeType = schema.nodes.image;\n    insertGroup.push(\n      new MenuItem({\n        title: 'Insert image',\n        icon: icons.image,\n        enable: (state) => canInsert(state, nodeType),\n        run(state, dispatch) {\n          let { from, to } = state.selection,\n            attrs = null;\n          if (\n            state.selection instanceof NodeSelection &&\n            state.selection.node.type == nodeType\n          ) {\n            attrs = state.selection.node.attrs;\n          }\n          openPrompt({\n            title: 'Insert image',\n            fields: {\n              src: new FileField({\n                label: 'Choose image',\n                required: true,\n                value: attrs && attrs.src,\n              }),\n              title: new TextField({\n                label: 'Title',\n                value: attrs && attrs.title,\n              }),\n              alt: new TextField({\n                label: 'Description',\n                value: attrs ? attrs.alt : state.doc.textBetween(from, to, ' '),\n              }),\n            },\n            callback(attrs) {\n              editor.view.dispatch(\n                editor.view.state.tr.replaceSelectionWith(\n                  nodeType.createAndFill(attrs)!,\n                ),\n              );\n              editor.view.focus();\n            },\n          });\n          return true;\n        },\n      }),\n    );\n  }\n\n  // === 22. Horizontal rule ===\n  if (schema.nodes.hr) {\n    insertGroup.push(\n      new MenuItem({\n        title: 'Insert horizontal rule',\n        icon: icons.horizontalRule,\n        run: () => editor.chain().setHorizontalRule().run(),\n        enable: (state) => editor.can().setHorizontalRule().run(),\n      }),\n    );\n  }\n\n  // === 23. Table dropdown (top-level) ===\n  if (schema.nodes.table) {\n    const item = (label: string, cmdName: string) => {\n      return new MenuItem({\n        label,\n        enable: () => editor.can()[cmdName]().run(),\n        run: () => editor.chain()[cmdName]().run(),\n      });\n    };\n    const tableMenu = [\n      item('Insert table', 'insertTable'),\n      item('Insert column before', 'addColumnBefore'),\n      item('Insert column after', 'addColumnAfter'),\n      item('Delete column', 'deleteColumn'),\n      item('Insert row before', 'addRowBefore'),\n      item('Insert row after', 'addRowAfter'),\n      item('Delete row', 'deleteRow'),\n      item('Delete table', 'deleteTable'),\n      item('Merge cells', 'mergeCells'),\n      item('Split cell', 'splitCell'),\n      item('Toggle header column', 'toggleHeaderColumn'),\n      item('Toggle header row', 'toggleHeaderRow'),\n      item('Toggle header cells', 'toggleHeaderCell'),\n    ];\n    insertGroup.push(\n      new Dropdown(tableMenu, { label: 'Table', icon: icons.table }),\n    );\n  }\n\n  // Type dropdown moved to structureGroup (before Heading)\n\n  // Group 7: Block menu (Select parent node)\n  const blockGroup: MenuElement[] = [];\n  blockGroup.push(\n    new MenuItem({\n      title: 'Select parent node',\n      run: () => editor.chain().selectParentNode().run(),\n      select: () => editor.can().selectParentNode().run(),\n      icon: icons.selectParentNode,\n    }),\n  );\n\n  // Return all groups - separators will be placed between non-empty groups\n  // Filter out empty groups to avoid unnecessary separators\n  const allGroups: MenuElement[][] = [\n    undoRedoGroup, // Undo, Redo\n    structureGroup, // Heading, Lift, Join, Blockquote\n    formattingGroup, // Bold, Italic, Strikethrough, Code, Underline, Highlight, Link\n    scriptGroup, // Superscript, Subscript\n    alignmentGroup, // Align left, center, right, Justify\n    insertGroup, // Image, Lists, HR, Table, Type\n    blockGroup, // Select parent node\n  ].filter((group) => group.length > 0);\n\n  return allGroups;\n}\n","// deno-lint-ignore-file no-window\n\nimport { EditorState, Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport type { CoreEditor } from '@kerebron/editor';\n\nimport type { MenuElement } from './menu.ts';\nimport { getIcon } from './icons.ts';\n\nconst CSS_PREFIX = 'kb-custom-menu';\nconst STORAGE_KEY = 'kb-custom-menu-order';\n// Minimum width for overflow toggle button + some padding\nconst OVERFLOW_BUTTON_WIDTH = 48;\n// Approximate width per toolbar item\nconst ITEM_WIDTH = 40;\n// Delay before drag starts (ms) - user must hold for 2 seconds before dragging activates\nconst DRAG_START_DELAY = 2000;\n\ninterface ToolItem {\n  id: string;\n  label: string;\n  element: MenuElement;\n  order: number;\n  groupIndex: number; // Track which group this tool belongs to\n}\n\nexport class CustomMenuView {\n  wrapper: HTMLElement;\n  toolbar: HTMLElement;\n  overflowMenu: HTMLElement;\n  pinnedDropdownMenu: HTMLElement | null = null;\n  tools: ToolItem[] = [];\n  root: Document | ShadowRoot;\n  private closeOverflowHandler: ((e: MouseEvent) => void) | null = null;\n  private closePinnedDropdownHandler: ((e: MouseEvent) => void) | null = null;\n  private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n  private submenuStack: Array<{ title: string; tools: ToolItem[] }> = [];\n  private pinnedDropdownStack: Array<\n    { title: string; tools: ToolItem[]; rootTool: ToolItem }\n  > = [];\n  private resizeObserver: ResizeObserver | null = null;\n\n  // Drag and drop state\n  private draggedItem: ToolItem | null = null;\n  private dragStartTimer: number | null = null;\n  private isDragging = false;\n  private isDraggingFromOverflow = false;\n  private dragPlaceholder: HTMLElement | null = null;\n  private dragGhost: HTMLElement | null = null;\n  private dragSourceWrapper: HTMLElement | null = null;\n\n  // Current overflow tools (calculated during render)\n  private currentOverflowTools: ToolItem[] = [];\n\n  // Default order of tools (stored on initialization)\n  private defaultOrder: string[] = [];\n\n  constructor(\n    readonly editorView: EditorView,\n    readonly editor: CoreEditor,\n    readonly content: readonly (readonly MenuElement[])[],\n  ) {\n    this.root = editorView.root;\n\n    // Create wrapper\n    this.wrapper = document.createElement('div');\n    this.wrapper.classList.add(CSS_PREFIX + '__wrapper');\n\n    // Create toolbar\n    this.toolbar = document.createElement('div');\n    this.toolbar.classList.add(CSS_PREFIX);\n    this.toolbar.setAttribute('role', 'toolbar');\n\n    // Mount toolbar before the editor DOM\n    this.wrapper.appendChild(this.toolbar);\n    if (editorView.dom.parentNode) {\n      editorView.dom.parentNode.replaceChild(this.wrapper, editorView.dom);\n    }\n\n    this.wrapper.appendChild(editorView.dom);\n\n    // Create overflow menu (initially hidden)\n    this.overflowMenu = document.createElement('div');\n    this.overflowMenu.classList.add(CSS_PREFIX + '__overflow-menu');\n    this.overflowMenu.style.display = 'none';\n    this.wrapper.insertBefore(this.overflowMenu, editorView.dom);\n    editorView.dom.classList.add('kb-custom-menu__editor');\n\n    // Initialize tools from content\n    this.initializeTools();\n\n    // Load order state from localStorage\n    this.loadOrderState();\n\n    // Initial render\n    this.render();\n\n    // Use ResizeObserver to dynamically show/hide items based on available width\n    if (typeof ResizeObserver !== 'undefined') {\n      this.resizeObserver = new ResizeObserver(() => {\n        this.render();\n      });\n      this.resizeObserver.observe(this.toolbar);\n    }\n\n    // Setup keyboard navigation for accessibility\n    this.setupKeyboardNavigation();\n  }\n\n  /**\n   * Close all open menus (overflow menu and pinned dropdowns).\n   * Optionally returns focus to a specific element.\n   */\n  private closeAllMenus(returnFocusTo?: HTMLElement) {\n    // Close overflow menu\n    if (this.overflowMenu.style.display !== 'none') {\n      this.overflowMenu.style.display = 'none';\n      this.submenuStack = [];\n      const overflowToggle = this.toolbar.querySelector(\n        '.' + CSS_PREFIX + '__overflow-toggle',\n      ) as HTMLElement;\n      if (overflowToggle) {\n        overflowToggle.setAttribute('aria-expanded', 'false');\n      }\n    }\n\n    // Close pinned dropdown\n    if (this.pinnedDropdownMenu) {\n      this.pinnedDropdownMenu.remove();\n      this.pinnedDropdownMenu = null;\n      this.pinnedDropdownStack = [];\n    }\n\n    // Return focus if specified\n    if (returnFocusTo) {\n      returnFocusTo.focus();\n    }\n  }\n\n  /**\n   * Get all focusable toolbar items (buttons).\n   */\n  private getToolbarButtons(): HTMLButtonElement[] {\n    const buttons: HTMLButtonElement[] = [];\n    const items = this.toolbar.querySelectorAll('.' + CSS_PREFIX + '__item');\n    items.forEach((item) => {\n      const button = item.querySelector('button') as HTMLButtonElement;\n      if (button) buttons.push(button);\n    });\n    // Add overflow toggle if present\n    const overflowToggle = this.toolbar.querySelector(\n      '.' + CSS_PREFIX + '__overflow-toggle',\n    ) as HTMLButtonElement;\n    if (overflowToggle) buttons.push(overflowToggle);\n    return buttons;\n  }\n\n  /**\n   * Setup keyboard navigation for toolbar (WCAG toolbar pattern).\n   * - Left/Right arrows move between items\n   * - Home/End jump to first/last item\n   * - Escape closes menus\n   */\n  private setupKeyboardNavigation() {\n    this.keydownHandler = (e: KeyboardEvent) => {\n      // Check if focus is within toolbar\n      const activeElement = document.activeElement as HTMLElement;\n      const isInToolbar = this.toolbar.contains(activeElement);\n      const isInOverflowMenu = this.overflowMenu.contains(activeElement);\n      const isInPinnedDropdown = this.pinnedDropdownMenu?.contains(\n        activeElement,\n      );\n\n      // Handle Escape key - close menus\n      if (e.key === 'Escape') {\n        if (isInPinnedDropdown || this.pinnedDropdownMenu) {\n          e.preventDefault();\n          const lastFocused = this.toolbar.querySelector(\n            '[data-last-focused=\"true\"]',\n          ) as HTMLElement;\n          this.closeAllMenus(lastFocused || undefined);\n          return;\n        }\n        if (isInOverflowMenu || this.overflowMenu.style.display !== 'none') {\n          e.preventDefault();\n          const overflowToggle = this.toolbar.querySelector(\n            '.' + CSS_PREFIX + '__overflow-toggle',\n          ) as HTMLElement;\n          this.closeAllMenus(overflowToggle || undefined);\n          return;\n        }\n      }\n\n      // Arrow key navigation within toolbar\n      if (isInToolbar && !isInOverflowMenu && !isInPinnedDropdown) {\n        const buttons = this.getToolbarButtons();\n        const currentIndex = buttons.indexOf(\n          activeElement as HTMLButtonElement,\n        );\n\n        if (e.key === 'ArrowRight') {\n          e.preventDefault();\n          const nextIndex = (currentIndex + 1) % buttons.length;\n          buttons[nextIndex]?.focus();\n        } else if (e.key === 'ArrowLeft') {\n          e.preventDefault();\n          const prevIndex = (currentIndex - 1 + buttons.length) %\n            buttons.length;\n          buttons[prevIndex]?.focus();\n        } else if (e.key === 'Home') {\n          e.preventDefault();\n          buttons[0]?.focus();\n        } else if (e.key === 'End') {\n          e.preventDefault();\n          buttons[buttons.length - 1]?.focus();\n        }\n      }\n\n      // Arrow key navigation within overflow menu\n      if (isInOverflowMenu) {\n        const focusableItems = Array.from(\n          this.overflowMenu.querySelectorAll(\n            'button, [role=\"menuitem\"], .' + CSS_PREFIX + '__overflow-item',\n          ),\n        ) as HTMLElement[];\n        const currentIndex = focusableItems.indexOf(activeElement);\n\n        if (e.key === 'ArrowDown') {\n          e.preventDefault();\n          const nextIndex = (currentIndex + 1) % focusableItems.length;\n          focusableItems[nextIndex]?.focus();\n        } else if (e.key === 'ArrowUp') {\n          e.preventDefault();\n          const prevIndex = (currentIndex - 1 + focusableItems.length) %\n            focusableItems.length;\n          focusableItems[prevIndex]?.focus();\n        }\n      }\n    };\n\n    document.addEventListener('keydown', this.keydownHandler);\n  }\n\n  private initializeTools() {\n    let orderIndex = 0;\n    this.content.forEach((group, groupIndex) => {\n      group.forEach((element) => {\n        const { dom, update } = element.render(this.editorView);\n\n        // For dropdowns, get the label from the element's options directly\n        let label: string;\n        const dropdown = element as any;\n        if (dropdown.options && dropdown.options.label) {\n          label = dropdown.options.label;\n        } else {\n          label = this.extractLabel(dom);\n        }\n\n        const id = this.generateStableId(label, dom);\n\n        this.tools.push({\n          id,\n          label,\n          element,\n          order: orderIndex++,\n          groupIndex,\n        });\n      });\n    });\n\n    // Store the default order (before any localStorage modifications)\n    this.defaultOrder = this.tools.map((t) => t.id);\n  }\n\n  /**\n   * Generate a stable ID from a label by converting it to a kebab-case slug.\n   * Falls back to a hash if the label is empty or contains only special characters.\n   */\n  private generateStableId(label: string, dom: HTMLElement): string {\n    // Try to use aria-label or data-id if available\n    const ariaLabel = dom.getAttribute('aria-label');\n    const dataId = dom.getAttribute('data-id');\n\n    if (dataId) return `tool-${dataId}`;\n\n    const baseLabel = ariaLabel || label;\n\n    // Convert label to kebab-case slug\n    const slug = baseLabel\n      .toLowerCase()\n      .trim()\n      .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with hyphens\n      .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens\n\n    // If slug is empty, generate a simple hash from the label\n    if (!slug) {\n      const hash = this.simpleHash(baseLabel);\n      return `tool-${hash}`;\n    }\n\n    return `tool-${slug}`;\n  }\n\n  /**\n   * Simple hash function for generating stable IDs from strings.\n   */\n  private simpleHash(str: string): string {\n    let hash = 0;\n    for (let i = 0; i < str.length; i++) {\n      const char = str.charCodeAt(i);\n      hash = ((hash << 5) - hash) + char;\n      hash = hash & hash; // Convert to 32-bit integer\n    }\n    return Math.abs(hash).toString(36);\n  }\n\n  private extractLabel(dom: HTMLElement): string {\n    // For menu buttons, prioritize the visible label text over title\n    const buttonText = dom.querySelector('span')?.textContent?.trim();\n    if (buttonText) return buttonText;\n\n    // For dropdowns, check the dropdown label\n    const dropdownLabel = dom.querySelector('.kb-dropdown__label')?.textContent\n      ?.trim();\n    if (dropdownLabel) return dropdownLabel;\n\n    // Try aria-label as fallback\n    const ariaLabel = dom.getAttribute('aria-label');\n    if (ariaLabel) return ariaLabel;\n\n    // Try title attribute\n    const title = dom.getAttribute('title');\n    if (title) return title;\n\n    // Fallback to looking at SVG title\n    const svgTitle = dom.querySelector('svg title')?.textContent?.trim();\n    if (svgTitle) return svgTitle;\n\n    return 'Unknown Tool';\n  }\n\n  private loadOrderState() {\n    try {\n      const saved = localStorage.getItem(STORAGE_KEY);\n      if (saved) {\n        const orderedIds = JSON.parse(saved) as string[];\n        // Apply saved order to tools\n        this.tools.forEach((tool) => {\n          const savedIndex = orderedIds.indexOf(tool.id);\n          if (savedIndex !== -1) {\n            tool.order = savedIndex;\n          } else {\n            // New tools get placed at the end\n            tool.order = orderedIds.length + tool.order;\n          }\n        });\n        // Sort tools by their order\n        this.tools.sort((a, b) => a.order - b.order);\n      }\n      // If no saved state, keep the default order from initialization\n    } catch (e) {\n      console.error('Failed to load order state:', e);\n      // Keep default order on error\n    }\n  }\n\n  private saveOrderState() {\n    try {\n      const orderedIds = this.tools.map((t) => t.id);\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(orderedIds));\n    } catch (e) {\n      console.error('Failed to save order state:', e);\n    }\n  }\n\n  /**\n   * Check if the current order differs from the default order.\n   */\n  private hasCustomOrder(): boolean {\n    const currentOrder = this.tools.map((t) => t.id);\n    if (currentOrder.length !== this.defaultOrder.length) return true;\n    return currentOrder.some((id, index) => id !== this.defaultOrder[index]);\n  }\n\n  /**\n   * Reset toolbar to default order, clearing any customizations.\n   */\n  private resetToDefault() {\n    // Clear localStorage\n    try {\n      localStorage.removeItem(STORAGE_KEY);\n    } catch (e) {\n      console.error('Failed to clear order state:', e);\n    }\n\n    // Reset tool order based on default order\n    this.tools.forEach((tool) => {\n      const defaultIndex = this.defaultOrder.indexOf(tool.id);\n      if (defaultIndex !== -1) {\n        tool.order = defaultIndex;\n      }\n    });\n\n    // Sort tools by their order\n    this.tools.sort((a, b) => a.order - b.order);\n\n    // Close overflow menu\n    this.closeAllMenus();\n\n    // Re-render\n    this.render();\n  }\n\n  /**\n   * Create a reset button element.\n   * @param iconOnly - If true, show only the icon (for toolbar); if false, show icon + text (for overflow menu)\n   */\n  private createResetButton(iconOnly: boolean): HTMLButtonElement {\n    const resetButton = document.createElement('button');\n    resetButton.type = 'button';\n    resetButton.classList.add(CSS_PREFIX + '__reset-button');\n    if (iconOnly) {\n      resetButton.classList.add(CSS_PREFIX + '__reset-button--icon-only');\n      // In toolbar, use button role\n      resetButton.setAttribute('role', 'button');\n    } else {\n      // In overflow menu, use menuitem role\n      resetButton.setAttribute('role', 'menuitem');\n    }\n    resetButton.setAttribute('tabindex', '0');\n    resetButton.setAttribute('aria-label', 'Reset toolbar to default order');\n    resetButton.title = 'Reset toolbar to default order';\n\n    const svg =\n      `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n      <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n      <path d=\"M3 3v5h5\"/>\n    </svg>`;\n\n    if (iconOnly) {\n      resetButton.innerHTML = svg;\n    } else {\n      resetButton.innerHTML = `${svg}<span>Reset to Default</span>`;\n    }\n\n    resetButton.addEventListener('click', (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n      this.resetToDefault();\n    });\n    resetButton.addEventListener('keydown', (e: KeyboardEvent) => {\n      if (e.key === 'Enter' || e.key === ' ') {\n        e.preventDefault();\n        e.stopPropagation();\n        this.resetToDefault();\n      }\n    });\n\n    return resetButton;\n  }\n\n  private showSubmenu(tool: ToolItem) {\n    const dropdown = tool.element as any;\n    if (!dropdown.content) return;\n\n    // Extract sub-items from dropdown\n    const subItems: ToolItem[] = dropdown.content.map(\n      (element: MenuElement, index: number) => {\n        const { dom } = element.render(this.editorView);\n\n        // For nested dropdowns, get the label from options directly\n        let label: string;\n        const nestedDropdown = element as any;\n        if (nestedDropdown.options && nestedDropdown.options.label) {\n          label = nestedDropdown.options.label;\n        } else {\n          label = this.extractLabel(dom);\n        }\n\n        return {\n          id: `${tool.id}-sub-${index}`,\n          label,\n          element,\n          isPinned: false,\n        };\n      },\n    );\n\n    // Save current state to stack\n    this.submenuStack.push({\n      title: tool.label,\n      tools: subItems,\n    });\n\n    // Re-render to show submenu\n    this.renderOverflowMenu();\n  }\n\n  private goBack() {\n    // Remove last submenu from stack\n    this.submenuStack.pop();\n\n    // Re-render\n    this.renderOverflowMenu();\n  }\n\n  private showPinnedDropdown(tool: ToolItem, triggerElement: HTMLElement) {\n    // Close overflow menu if open (ensure only one menu is open at a time)\n    if (this.overflowMenu.style.display !== 'none') {\n      this.overflowMenu.style.display = 'none';\n      this.submenuStack = [];\n      const overflowToggle = this.toolbar.querySelector(\n        '.' + CSS_PREFIX + '__overflow-toggle',\n      ) as HTMLElement;\n      if (overflowToggle) {\n        overflowToggle.setAttribute('aria-expanded', 'false');\n      }\n    }\n\n    // Close any existing pinned dropdown\n    if (this.pinnedDropdownMenu) {\n      this.pinnedDropdownMenu.remove();\n      this.pinnedDropdownMenu = null;\n    }\n\n    // Mark trigger as last focused for focus return on Escape\n    this.toolbar.querySelectorAll('[data-last-focused]').forEach((el) => {\n      el.removeAttribute('data-last-focused');\n    });\n    triggerElement.setAttribute('data-last-focused', 'true');\n\n    const dropdown = tool.element as any;\n    if (!dropdown.content) return;\n\n    // Extract sub-items from dropdown\n    const subItems: ToolItem[] = dropdown.content.map(\n      (element: MenuElement, index: number) => {\n        const { dom } = element.render(this.editorView);\n        let label: string;\n        const nestedDropdown = element as any;\n        if (nestedDropdown.options && nestedDropdown.options.label) {\n          label = nestedDropdown.options.label;\n        } else {\n          label = this.extractLabel(dom);\n        }\n\n        return {\n          id: `${tool.id}-sub-${index}`,\n          label,\n          element,\n          isPinned: false,\n        };\n      },\n    );\n\n    // Initialize stack with root menu\n    this.pinnedDropdownStack = [{\n      title: tool.label,\n      tools: subItems,\n      rootTool: tool,\n    }];\n\n    // Render the dropdown\n    this.renderPinnedDropdown(triggerElement);\n  }\n\n  private pinnedDropdownGoBack() {\n    // Remove last item from stack\n    this.pinnedDropdownStack.pop();\n\n    // If stack is empty, close the dropdown\n    if (this.pinnedDropdownStack.length === 0) {\n      if (this.pinnedDropdownMenu) {\n        this.pinnedDropdownMenu.remove();\n        this.pinnedDropdownMenu = null;\n      }\n      return;\n    }\n\n    // Re-render with previous menu\n    const triggerElement = this.toolbar.querySelector(\n      `[data-tool-id=\"${this.pinnedDropdownStack[0].rootTool.id}\"]`,\n    ) as HTMLElement;\n    if (triggerElement) {\n      this.renderPinnedDropdown(triggerElement);\n    }\n  }\n\n  private pinnedDropdownShowSubmenu(\n    tool: ToolItem,\n    triggerElement: HTMLElement,\n  ) {\n    const dropdown = tool.element as any;\n    if (!dropdown.content) return;\n\n    // Extract sub-items\n    const subItems: ToolItem[] = dropdown.content.map(\n      (element: MenuElement, index: number) => {\n        const { dom } = element.render(this.editorView);\n        let label: string;\n        const nestedDropdown = element as any;\n        if (nestedDropdown.options && nestedDropdown.options.label) {\n          label = nestedDropdown.options.label;\n        } else {\n          label = this.extractLabel(dom);\n        }\n\n        return {\n          id: `${tool.id}-sub-${index}`,\n          label,\n          element,\n          isPinned: false,\n        };\n      },\n    );\n\n    // Add to stack\n    this.pinnedDropdownStack.push({\n      title: tool.label,\n      tools: subItems,\n      rootTool: this.pinnedDropdownStack[0].rootTool,\n    });\n\n    // Re-render\n    this.renderPinnedDropdown(triggerElement);\n  }\n\n  private renderPinnedDropdown(triggerElement: HTMLElement) {\n    // Remove existing dropdown\n    if (this.pinnedDropdownMenu) {\n      this.pinnedDropdownMenu.remove();\n    }\n\n    const currentLevel =\n      this.pinnedDropdownStack[this.pinnedDropdownStack.length - 1];\n    const isSubmenu = this.pinnedDropdownStack.length > 1;\n\n    // Create dropdown menu\n    this.pinnedDropdownMenu = document.createElement('div');\n    this.pinnedDropdownMenu.classList.add(CSS_PREFIX + '__pinned-dropdown');\n    this.pinnedDropdownMenu.setAttribute('role', 'menu');\n    this.pinnedDropdownMenu.setAttribute('aria-label', currentLevel.title);\n\n    // Position it below the trigger element\n    const rect = triggerElement.getBoundingClientRect();\n    this.pinnedDropdownMenu.style.position = 'absolute';\n    this.pinnedDropdownMenu.style.top = `${rect.bottom + 4}px`;\n    this.pinnedDropdownMenu.style.left = `${rect.left}px`;\n\n    // Create scrollable content container\n    const overflowContent = document.createElement('div');\n    overflowContent.classList.add(CSS_PREFIX + '__overflow-content');\n\n    // Add back button if in submenu\n    if (isSubmenu) {\n      const header = document.createElement('div');\n      header.classList.add(CSS_PREFIX + '__overflow-submenu-header');\n\n      const backButton = document.createElement('button');\n      backButton.type = 'button';\n      backButton.classList.add(CSS_PREFIX + '__overflow-back-button');\n      backButton.setAttribute('aria-label', 'Go back to ' + currentLevel.title);\n      backButton.innerHTML =\n        '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M15 19l-7-7 7-7\"/></svg>';\n      backButton.addEventListener('click', (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        this.pinnedDropdownGoBack();\n      });\n\n      const title = document.createElement('span');\n      title.classList.add(CSS_PREFIX + '__overflow-submenu-title');\n      title.textContent = currentLevel.title;\n\n      header.appendChild(backButton);\n      header.appendChild(title);\n      overflowContent.appendChild(header);\n    }\n\n    // Render menu items\n    currentLevel.tools.forEach((subTool) => {\n      const isNestedDropdown = (subTool.element as any).content !== undefined;\n      const wrapper = document.createElement('div');\n      wrapper.classList.add(CSS_PREFIX + '__overflow-item');\n      wrapper.setAttribute('data-tool-id', subTool.id);\n      wrapper.setAttribute('role', 'menuitem');\n      wrapper.setAttribute('tabindex', '0');\n\n      if (isNestedDropdown) {\n        // For nested dropdowns, show label and chevron\n        const label = document.createElement('span');\n        label.classList.add(CSS_PREFIX + '__overflow-item-label');\n        label.textContent = subTool.label;\n        wrapper.appendChild(label);\n\n        const chevron = document.createElement('span');\n        chevron.classList.add(CSS_PREFIX + '__overflow-item-chevron');\n        chevron.innerHTML =\n          '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 5l7 7-7 7\"/></svg>';\n        wrapper.appendChild(chevron);\n\n        wrapper.addEventListener('click', (e) => {\n          e.preventDefault();\n          e.stopPropagation();\n          this.pinnedDropdownShowSubmenu(subTool, triggerElement);\n        });\n      } else {\n        // Regular menu item\n        const { dom } = subTool.element.render(this.editorView);\n\n        // Hide button's internal label\n        const spans = dom.querySelectorAll('span');\n        spans.forEach((span) => {\n          const isInsideIcon = span.closest('.kb-icon') !== null;\n          const isDirectChild = span.parentElement === dom;\n          if (\n            span.textContent && span.textContent.trim() &&\n            !isInsideIcon &&\n            isDirectChild &&\n            !span.querySelector('svg') &&\n            !span.classList.contains('kb-icon')\n          ) {\n            span.style.display = 'none';\n          }\n        });\n\n        // Add label\n        const label = document.createElement('span');\n        label.classList.add(CSS_PREFIX + '__overflow-item-label');\n        label.textContent = subTool.label;\n\n        wrapper.appendChild(dom);\n        wrapper.appendChild(label);\n\n        // Make wrapper clickable\n        wrapper.addEventListener('mousedown', (e) => {\n          if (e.target !== dom) {\n            e.preventDefault();\n            const mousedownEvent = new MouseEvent('mousedown', {\n              bubbles: true,\n              cancelable: true,\n              view: window,\n            });\n            dom.dispatchEvent(mousedownEvent);\n          }\n\n          // Close dropdown after click\n          if (this.pinnedDropdownMenu) {\n            this.pinnedDropdownMenu.remove();\n            this.pinnedDropdownMenu = null;\n            this.pinnedDropdownStack = [];\n          }\n        });\n      }\n\n      overflowContent.appendChild(wrapper);\n    });\n\n    // Add content to dropdown\n    this.pinnedDropdownMenu.appendChild(overflowContent);\n\n    // Add to document\n    document.body.appendChild(this.pinnedDropdownMenu);\n\n    // Close on click outside\n    const doc = this.editorView.dom.ownerDocument || document;\n    setTimeout(() => {\n      if (this.closePinnedDropdownHandler) {\n        doc.removeEventListener('click', this.closePinnedDropdownHandler);\n      }\n      this.closePinnedDropdownHandler = (e: MouseEvent) => {\n        const target = e.target as Node;\n        if (\n          this.pinnedDropdownMenu &&\n          !this.pinnedDropdownMenu.contains(target) &&\n          !triggerElement.contains(target)\n        ) {\n          this.pinnedDropdownMenu.remove();\n          this.pinnedDropdownMenu = null;\n          this.pinnedDropdownStack = [];\n          if (this.closePinnedDropdownHandler) {\n            doc.removeEventListener('click', this.closePinnedDropdownHandler);\n          }\n        }\n      };\n      doc.addEventListener('click', this.closePinnedDropdownHandler);\n    }, 0);\n  }\n\n  private renderOverflowMenu() {\n    // Clear overflow menu\n    this.overflowMenu.innerHTML = '';\n\n    // Set ARIA attributes for overflow menu\n    this.overflowMenu.setAttribute('role', 'menu');\n    this.overflowMenu.setAttribute('aria-label', 'More tools');\n\n    // Check if we're showing a submenu\n    const isSubmenu = this.submenuStack.length > 0;\n    const currentSubmenu = isSubmenu\n      ? this.submenuStack[this.submenuStack.length - 1]\n      : null;\n\n    // Create scrollable content container - use grid layout for Google Docs style\n    const overflowContent = document.createElement('div');\n    overflowContent.classList.add(CSS_PREFIX + '__overflow-content');\n    // Apply flex-wrap style for Google Docs-like icon layout\n    if (!isSubmenu) {\n      overflowContent.classList.add(CSS_PREFIX + '__overflow-content--grid');\n    }\n\n    if (isSubmenu && currentSubmenu) {\n      // Render submenu header with back button\n      const header = document.createElement('div');\n      header.classList.add(CSS_PREFIX + '__overflow-submenu-header');\n\n      const backButton = document.createElement('button');\n      backButton.type = 'button';\n      backButton.classList.add(CSS_PREFIX + '__overflow-back-button');\n      backButton.setAttribute(\n        'aria-label',\n        'Go back to previous menu',\n      );\n      backButton.innerHTML =\n        '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M15 19l-7-7 7-7\"/></svg>';\n      backButton.addEventListener('click', (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        this.goBack();\n      });\n\n      const title = document.createElement('span');\n      title.classList.add(CSS_PREFIX + '__overflow-submenu-title');\n      title.textContent = currentSubmenu.title;\n\n      header.appendChild(backButton);\n      header.appendChild(title);\n      overflowContent.appendChild(header);\n\n      // Render submenu items\n      currentSubmenu.tools.forEach((tool) => {\n        // Check if this is a nested dropdown\n        const isDropdown = (tool.element as any).content !== undefined;\n\n        const wrapper = document.createElement('div');\n        wrapper.classList.add(CSS_PREFIX + '__overflow-item');\n        wrapper.setAttribute('role', 'menuitem');\n        wrapper.setAttribute('tabindex', '0');\n\n        if (isDropdown) {\n          // For nested dropdowns, just show label and chevron (no icon/button)\n          wrapper.setAttribute('aria-haspopup', 'true');\n          // Add label\n          const label = document.createElement('span');\n          label.classList.add(CSS_PREFIX + '__overflow-item-label');\n          label.textContent = tool.label;\n          wrapper.appendChild(label);\n\n          // Add chevron to indicate submenu\n          const chevron = document.createElement('span');\n          chevron.classList.add(CSS_PREFIX + '__overflow-item-chevron');\n          chevron.setAttribute('aria-hidden', 'true');\n          chevron.innerHTML =\n            '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 5l7 7-7 7\"/></svg>';\n          wrapper.appendChild(chevron);\n\n          // Click and keyboard handler for nested dropdown - navigate deeper\n          const handleActivate = (e: Event) => {\n            e.preventDefault();\n            e.stopPropagation();\n            this.showSubmenu(tool);\n          };\n          wrapper.addEventListener('click', handleActivate);\n          wrapper.addEventListener('keydown', (e: KeyboardEvent) => {\n            if (e.key === 'Enter' || e.key === ' ') {\n              handleActivate(e);\n            }\n          });\n        } else {\n          // Regular menu item\n          const { dom, update } = tool.element.render(this.editorView);\n\n          // Hide the button's internal label to avoid duplication\n          const internalLabel = dom.querySelector('span');\n          if (internalLabel) {\n            internalLabel.style.display = 'none';\n          }\n\n          // Add our own label to the item\n          const label = document.createElement('span');\n          label.classList.add(CSS_PREFIX + '__overflow-item-label');\n          label.textContent = tool.label;\n\n          // Restructure the DOM to show icon + label\n          wrapper.appendChild(dom);\n          wrapper.appendChild(label);\n\n          // Make the entire wrapper clickable by dispatching mousedown to the button\n          wrapper.addEventListener('mousedown', (e) => {\n            if (e.target !== dom) {\n              e.preventDefault();\n              const mousedownEvent = new MouseEvent('mousedown', {\n                bubbles: true,\n                cancelable: true,\n                view: window,\n              });\n              dom.dispatchEvent(mousedownEvent);\n            }\n          });\n\n          // Add keyboard support for Enter/Space\n          wrapper.addEventListener('keydown', (e: KeyboardEvent) => {\n            if (e.key === 'Enter' || e.key === ' ') {\n              e.preventDefault();\n              const mousedownEvent = new MouseEvent('mousedown', {\n                bubbles: true,\n                cancelable: true,\n                view: window,\n              });\n              dom.dispatchEvent(mousedownEvent);\n            }\n          });\n        }\n\n        overflowContent.appendChild(wrapper);\n      });\n    } else {\n      // Render main overflow menu - use the stored overflow tools from render()\n      const allOverflowItems = this.currentOverflowTools;\n\n      // Render all overflow tools as icon grid (Google Docs style)\n      allOverflowItems.forEach((tool) => {\n        // Skip tools with empty or invalid labels\n        if (\n          !tool.label || tool.label.trim() === '' ||\n          tool.label === 'Unknown Tool'\n        ) {\n          return;\n        }\n\n        // Check if this is a dropdown with sub-items\n        const isDropdown = (tool.element as any).content !== undefined;\n\n        const wrapper = document.createElement('div');\n        wrapper.classList.add(CSS_PREFIX + '__overflow-item');\n        wrapper.classList.add(CSS_PREFIX + '__overflow-item--grid');\n        wrapper.setAttribute('title', tool.label); // Tooltip on hover\n        wrapper.setAttribute('role', 'menuitem');\n        wrapper.setAttribute('tabindex', '0');\n        wrapper.setAttribute('aria-label', tool.label);\n\n        if (isDropdown) {\n          // For dropdowns, create a custom button with dropdown indicator\n          wrapper.classList.add(CSS_PREFIX + '__overflow-item--dropdown');\n          wrapper.setAttribute('aria-haspopup', 'true');\n\n          const button = document.createElement('button');\n          button.type = 'button';\n          button.classList.add('kb-menu__button');\n          button.setAttribute('tabindex', '-1'); // Parent is focusable\n          button.setAttribute('aria-hidden', 'true');\n\n          // Get the icon from the dropdown's options\n          const dropdown = tool.element as any;\n          if (dropdown.options?.icon) {\n            const icon = getIcon(this.root, dropdown.options.icon);\n            button.appendChild(icon);\n          }\n\n          wrapper.appendChild(button);\n\n          // Add small dropdown indicator\n          const indicator = document.createElement('span');\n          indicator.classList.add(CSS_PREFIX + '__overflow-item-indicator');\n          indicator.setAttribute('aria-hidden', 'true');\n          // CSS creates the triangle using borders\n          wrapper.appendChild(indicator);\n\n          // Click handler for dropdown - navigate to submenu\n          wrapper.addEventListener('click', (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            this.showSubmenu(tool);\n          });\n\n          // Add keyboard support for Enter/Space\n          wrapper.addEventListener('keydown', (e: KeyboardEvent) => {\n            if (e.key === 'Enter' || e.key === ' ') {\n              e.preventDefault();\n              e.stopPropagation();\n              this.showSubmenu(tool);\n            }\n          });\n        } else {\n          // Regular menu item - show icon only with tooltip\n          const { dom, update } = tool.element.render(this.editorView);\n\n          // Hide any text labels, keep only icons\n          const spans = dom.querySelectorAll('span');\n          spans.forEach((span) => {\n            const isInsideIcon = span.closest('.kb-icon') !== null;\n            if (!isInsideIcon && !span.querySelector('svg')) {\n              span.style.display = 'none';\n            }\n          });\n\n          // Disable pointer events on the button itself - wrapper handles clicks\n          dom.style.pointerEvents = 'none';\n\n          wrapper.appendChild(dom);\n\n          // Add keyboard support for Enter/Space\n          wrapper.addEventListener('keydown', (e: KeyboardEvent) => {\n            if (e.key === 'Enter' || e.key === ' ') {\n              e.preventDefault();\n              // Close the overflow menu FIRST\n              this.closeAllMenus();\n              // Then trigger the action after menu is closed\n              requestAnimationFrame(() => {\n                const menuItem = tool.element as any;\n                if (menuItem.spec && typeof menuItem.spec.run === 'function') {\n                  menuItem.spec.run(\n                    this.editorView.state,\n                    this.editorView.dispatch,\n                  );\n                }\n              });\n            }\n          });\n        }\n\n        // Add drag handlers for overflow items (only in main menu, not submenus)\n        // Skip dropdowns - they have their own click handlers for submenu navigation\n        // and shouldn't be draggable to the toolbar\n        if (!isSubmenu && !isDropdown) {\n          this.setupOverflowDragHandlers(wrapper, tool);\n        }\n\n        overflowContent.appendChild(wrapper);\n      });\n    }\n\n    // Add the scrollable content to overflow menu\n    this.overflowMenu.appendChild(overflowContent);\n\n    // Add \"Reset to Default\" button if order has been customized (only in main menu, not submenus)\n    if (!isSubmenu && this.hasCustomOrder()) {\n      const footer = document.createElement('div');\n      footer.classList.add(CSS_PREFIX + '__overflow-footer');\n\n      const resetButton = this.createResetButton(false);\n      footer.appendChild(resetButton);\n      this.overflowMenu.appendChild(footer);\n    }\n  }\n\n  private render() {\n    // Skip render if currently dragging (to avoid interference)\n    if (this.isDragging) return;\n\n    // Clear toolbar and overflow menu\n    this.toolbar.innerHTML = '';\n    this.overflowMenu.innerHTML = '';\n\n    // Get available width for toolbar items\n    const toolbarWidth = this.toolbar.offsetWidth || this.wrapper.offsetWidth;\n    const availableWidth = toolbarWidth - OVERFLOW_BUTTON_WIDTH - 16; // Reserve space for overflow button + padding\n\n    // First pass: render all items to measure their widths\n    const renderedItems: Array<{\n      tool: ToolItem;\n      wrapper: HTMLElement;\n      width: number;\n    }> = [];\n\n    this.tools.forEach((tool) => {\n      const wrapper = document.createElement('span');\n      wrapper.classList.add(CSS_PREFIX + '__item');\n      wrapper.setAttribute('data-tool-id', tool.id);\n      wrapper.setAttribute('draggable', 'false');\n\n      const isDropdown = (tool.element as any).content !== undefined;\n\n      if (isDropdown) {\n        const { dom } = tool.element.render(this.editorView);\n        const dropdownMenu = dom.querySelector('.kb-dropdown__content');\n        if (dropdownMenu) {\n          (dropdownMenu as HTMLElement).style.display = 'none';\n        }\n        wrapper.appendChild(dom);\n      } else {\n        const { dom } = tool.element.render(this.editorView);\n        wrapper.appendChild(dom);\n      }\n\n      // Temporarily add to toolbar to measure\n      this.toolbar.appendChild(wrapper);\n      const width = wrapper.getBoundingClientRect().width;\n      renderedItems.push({ tool, wrapper, width });\n    });\n\n    // Second pass: determine which items fit\n    // Account for gaps between items (4px gap) and separators between groups\n    const GAP_SIZE = 4;\n    const SEPARATOR_WIDTH = 9; // 1px width + 4px margin on each side\n    let usedWidth = 0;\n    let previousGroupIndex: number | undefined = undefined;\n    const visibleItems: typeof renderedItems = [];\n    const overflowItems: typeof renderedItems = [];\n\n    for (const item of renderedItems) {\n      // Calculate extra width needed for gap and potentially a separator\n      let extraWidth = 0;\n      if (visibleItems.length > 0) {\n        extraWidth += GAP_SIZE; // Gap between items\n        // Add separator width if group is changing\n        if (\n          previousGroupIndex !== undefined &&\n          item.tool.groupIndex !== previousGroupIndex\n        ) {\n          extraWidth += SEPARATOR_WIDTH + GAP_SIZE; // Separator + its gap\n        }\n      }\n\n      if (usedWidth + extraWidth + item.width <= availableWidth) {\n        visibleItems.push(item);\n        usedWidth += extraWidth + item.width;\n        previousGroupIndex = item.tool.groupIndex;\n      } else {\n        overflowItems.push(item);\n      }\n    }\n\n    // Clear toolbar again and re-render only visible items\n    this.toolbar.innerHTML = '';\n\n    // Track previous group index for inserting separators between groups\n    let prevGroupIndex: number | undefined = undefined;\n\n    // Render visible tools in toolbar with proper event handlers\n    visibleItems.forEach(({ tool, wrapper }) => {\n      // Insert separator if group changed (and not first item)\n      if (\n        prevGroupIndex !== undefined &&\n        tool.groupIndex !== prevGroupIndex\n      ) {\n        const separator = document.createElement('div');\n        separator.classList.add(CSS_PREFIX + '__separator');\n        this.toolbar.appendChild(separator);\n      }\n      prevGroupIndex = tool.groupIndex;\n\n      const isDropdown = (tool.element as any).content !== undefined;\n\n      if (isDropdown) {\n        const button = wrapper.querySelector('button') as\n          | HTMLButtonElement\n          | null;\n        const label = wrapper.querySelector('.kb-dropdown__label') as\n          | HTMLElement\n          | null;\n\n        const clickHandler = (e: Event) => {\n          // Don't open dropdown if we were dragging\n          if (this.isDragging) {\n            e.preventDefault();\n            e.stopPropagation();\n            e.stopImmediatePropagation();\n            return;\n          }\n          e.preventDefault();\n          e.stopPropagation();\n          e.stopImmediatePropagation();\n          this.showPinnedDropdown(tool, wrapper);\n        };\n\n        // Mousedown handler - prevents built-in dropdown from opening\n        // but allows our drag handler on the wrapper to work\n        const mousedownHandler = (e: MouseEvent) => {\n          // Stop the built-in dropdown's mousedown handler from firing\n          // This prevents the double-menu issue\n          e.stopImmediatePropagation();\n\n          // If dragging, also stop propagation\n          if (this.isDragging) {\n            e.stopPropagation();\n          }\n          // Note: We don't call preventDefault() so the wrapper's\n          // capture-phase drag handler can still work\n        };\n\n        if (button) {\n          button.addEventListener('click', clickHandler, { capture: true });\n          button.addEventListener('mousedown', mousedownHandler, {\n            capture: true,\n          });\n        }\n        if (label) {\n          label.addEventListener('click', clickHandler, { capture: true });\n          label.addEventListener('mousedown', mousedownHandler, {\n            capture: true,\n          });\n        }\n      }\n\n      // Add drag-and-drop handlers\n      this.setupDragHandlers(wrapper, tool);\n      this.toolbar.appendChild(wrapper);\n    });\n\n    // Store overflow tools for the overflow menu\n    this.currentOverflowTools = overflowItems.map((item) => item.tool);\n\n    // Add separator before overflow button if there are overflow items\n    if (this.currentOverflowTools.length > 0) {\n      const separator = document.createElement('div');\n      separator.classList.add(CSS_PREFIX + '__separator');\n      this.toolbar.appendChild(separator);\n    }\n\n    // Add overflow toggle button if there are overflow items\n    if (this.currentOverflowTools.length > 0) {\n      const overflowToggle = document.createElement('button');\n      overflowToggle.type = 'button';\n      overflowToggle.className = CSS_PREFIX + '__overflow-toggle';\n      overflowToggle.setAttribute('aria-haspopup', 'menu');\n      overflowToggle.setAttribute('aria-expanded', 'false');\n      overflowToggle.setAttribute('aria-label', 'More tools');\n      overflowToggle.title = 'More tools';\n      overflowToggle.innerHTML = `\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n          <circle cx=\"5\" cy=\"12\" r=\"2\"/>\n          <circle cx=\"12\" cy=\"12\" r=\"2\"/>\n          <circle cx=\"19\" cy=\"12\" r=\"2\"/>\n        </svg>\n      `;\n\n      overflowToggle.addEventListener('click', (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        // Close any open pinned dropdown first (only one menu open at a time)\n        if (this.pinnedDropdownMenu) {\n          this.pinnedDropdownMenu.remove();\n          this.pinnedDropdownMenu = null;\n          this.pinnedDropdownStack = [];\n        }\n\n        const isOpen = this.overflowMenu.style.display !== 'none';\n        this.overflowMenu.style.display = isOpen ? 'none' : 'block';\n        overflowToggle.setAttribute('aria-expanded', String(!isOpen));\n\n        // Add/remove close handler based on open state\n        const doc = this.editorView.dom.ownerDocument || document;\n        if (!isOpen) {\n          // Opening - reset submenu stack to show main menu\n          this.submenuStack = [];\n          this.renderOverflowMenu();\n\n          // Opening - add close handler after a short delay\n          setTimeout(() => {\n            if (this.closeOverflowHandler) {\n              doc.removeEventListener('click', this.closeOverflowHandler);\n            }\n            this.closeOverflowHandler = (e: MouseEvent) => {\n              // Don't interfere with editor clicks\n              const target = e.target as Node;\n              const editorDom = this.editorView.dom;\n\n              // Check if click is inside editor\n              if (editorDom.contains(target)) {\n                return; // Let editor handle it\n              }\n\n              if (\n                !this.overflowMenu.contains(target) &&\n                !this.toolbar.contains(target)\n              ) {\n                this.overflowMenu.style.display = 'none';\n                overflowToggle.setAttribute('aria-expanded', 'false');\n                // Clear submenu stack when closing\n                this.submenuStack = [];\n                if (this.closeOverflowHandler) {\n                  doc.removeEventListener('click', this.closeOverflowHandler);\n                }\n              }\n            };\n            doc.addEventListener('click', this.closeOverflowHandler);\n          }, 0);\n        } else {\n          // Closing - remove close handler and clear submenu stack\n          if (this.closeOverflowHandler) {\n            doc.removeEventListener('click', this.closeOverflowHandler);\n          }\n          this.submenuStack = [];\n        }\n      });\n\n      this.toolbar.appendChild(overflowToggle);\n    } else if (this.hasCustomOrder()) {\n      // No overflow items but order has been customized - show reset button in toolbar\n      const separator = document.createElement('div');\n      separator.classList.add(CSS_PREFIX + '__separator');\n      this.toolbar.appendChild(separator);\n\n      const resetButton = this.createResetButton(true);\n      this.toolbar.appendChild(resetButton);\n    }\n\n    // Render overflow menu content\n    this.renderOverflowMenu();\n  }\n\n  private setupDragHandlers(wrapper: HTMLElement, tool: ToolItem) {\n    let startX = 0;\n    let startY = 0;\n\n    const onMouseDown = (e: MouseEvent) => {\n      // Only handle left mouse button\n      if (e.button !== 0) return;\n\n      startX = e.clientX;\n      startY = e.clientY;\n\n      // Start a timer for delayed drag initiation\n      this.dragStartTimer = setTimeout(() => {\n        this.startDrag(wrapper, tool, e);\n      }, DRAG_START_DELAY);\n\n      // Listen for mouse up to cancel if released early\n      const onMouseUp = () => {\n        if (this.dragStartTimer) {\n          clearTimeout(this.dragStartTimer);\n          this.dragStartTimer = null;\n        }\n        document.removeEventListener('mouseup', onMouseUp);\n        document.removeEventListener('mousemove', onEarlyMove);\n      };\n\n      // If mouse moves too much before timer, cancel drag start\n      const onEarlyMove = (moveEvent: MouseEvent) => {\n        const dx = Math.abs(moveEvent.clientX - startX);\n        const dy = Math.abs(moveEvent.clientY - startY);\n        // Allow some tolerance for slight movement\n        if (dx > 5 || dy > 5) {\n          if (this.dragStartTimer) {\n            clearTimeout(this.dragStartTimer);\n            this.dragStartTimer = null;\n          }\n        }\n      };\n\n      document.addEventListener('mouseup', onMouseUp);\n      document.addEventListener('mousemove', onEarlyMove);\n    };\n\n    // Use capture phase to ensure we get events from child elements (like dropdown buttons)\n    wrapper.addEventListener('mousedown', onMouseDown, { capture: true });\n  }\n\n  /**\n   * Set up drag handlers for overflow menu items.\n   * Long-hold initiates drag to toolbar, short click activates the item.\n   */\n  private setupOverflowDragHandlers(wrapper: HTMLElement, tool: ToolItem) {\n    let startX = 0;\n    let startY = 0;\n    let dragInitiated = false;\n\n    const onMouseDown = (e: MouseEvent) => {\n      // Only handle left mouse button\n      if (e.button !== 0) return;\n\n      startX = e.clientX;\n      startY = e.clientY;\n      dragInitiated = false;\n\n      // Prevent default to stop button action from firing immediately\n      e.preventDefault();\n\n      // Start a timer for delayed drag initiation\n      this.dragStartTimer = setTimeout(() => {\n        dragInitiated = true;\n        this.startOverflowDrag(wrapper, tool, e);\n      }, DRAG_START_DELAY);\n\n      // Listen for mouse up to cancel if released early (allows normal click)\n      const onMouseUp = () => {\n        if (this.dragStartTimer) {\n          clearTimeout(this.dragStartTimer);\n          this.dragStartTimer = null;\n        }\n\n        // If drag wasn't initiated, this was a short click - trigger the button action\n        if (!dragInitiated) {\n          // Close the overflow menu FIRST to prevent it from capturing modal events\n          this.closeAllMenus();\n\n          // Then trigger the action after the menu is closed\n          // Use requestAnimationFrame to ensure DOM is updated\n          requestAnimationFrame(() => {\n            // Call the spec's run method directly instead of dispatching DOM events\n            const menuItem = tool.element as any;\n            if (menuItem.spec && typeof menuItem.spec.run === 'function') {\n              menuItem.spec.run(\n                this.editorView.state,\n                this.editorView.dispatch,\n              );\n            }\n          });\n        }\n\n        document.removeEventListener('mouseup', onMouseUp);\n        document.removeEventListener('mousemove', onEarlyMove);\n      };\n\n      // If mouse moves too much before timer, cancel drag start\n      const onEarlyMove = (moveEvent: MouseEvent) => {\n        const dx = Math.abs(moveEvent.clientX - startX);\n        const dy = Math.abs(moveEvent.clientY - startY);\n        // Allow some tolerance for slight movement\n        if (dx > 5 || dy > 5) {\n          if (this.dragStartTimer) {\n            clearTimeout(this.dragStartTimer);\n            this.dragStartTimer = null;\n          }\n        }\n      };\n\n      document.addEventListener('mouseup', onMouseUp);\n      document.addEventListener('mousemove', onEarlyMove);\n    };\n\n    // Use capture phase and stop propagation to prevent other handlers\n    wrapper.addEventListener('mousedown', onMouseDown, { capture: true });\n  }\n\n  /**\n   * Start dragging an item from the overflow menu to the toolbar.\n   */\n  private startOverflowDrag(\n    wrapper: HTMLElement,\n    tool: ToolItem,\n    e: MouseEvent,\n  ) {\n    this.isDragging = true;\n    this.isDraggingFromOverflow = true;\n    this.draggedItem = tool;\n    this.dragSourceWrapper = wrapper;\n\n    // Add dragging class to wrapper\n    wrapper.classList.add(CSS_PREFIX + '__overflow-item--dragging');\n    this.wrapper.classList.add(CSS_PREFIX + '__wrapper--dragging');\n\n    // Close the overflow menu to allow dropping on toolbar\n    this.closeOverflowMenu();\n\n    // Create a ghost element for visual feedback\n    const rect = wrapper.getBoundingClientRect();\n    this.dragGhost = wrapper.cloneNode(true) as HTMLElement;\n    this.dragGhost.classList.add(CSS_PREFIX + '__drag-ghost');\n    this.dragGhost.style.position = 'fixed';\n    this.dragGhost.style.left = `${rect.left}px`;\n    this.dragGhost.style.top = `${rect.top}px`;\n    this.dragGhost.style.width = `${rect.width}px`;\n    this.dragGhost.style.height = `${rect.height}px`;\n    this.dragGhost.style.pointerEvents = 'none';\n    this.dragGhost.style.zIndex = '10000';\n    document.body.appendChild(this.dragGhost);\n\n    // Create a placeholder to show where the item will be dropped\n    this.dragPlaceholder = document.createElement('span');\n    this.dragPlaceholder.classList.add(CSS_PREFIX + '__drop-placeholder');\n\n    const onMouseMove = (moveEvent: MouseEvent) => {\n      if (!this.isDragging || !this.dragGhost) return;\n\n      // Update ghost position\n      const ghostRect = this.dragGhost.getBoundingClientRect();\n      this.dragGhost.style.left = `${\n        moveEvent.clientX - ghostRect.width / 2\n      }px`;\n      this.dragGhost.style.top = `${\n        moveEvent.clientY - ghostRect.height / 2\n      }px`;\n\n      // Check if we're over the toolbar area\n      const toolbarRect = this.toolbar.getBoundingClientRect();\n      const isOverToolbar = moveEvent.clientY >= toolbarRect.top &&\n        moveEvent.clientY <= toolbarRect.bottom &&\n        moveEvent.clientX >= toolbarRect.left &&\n        moveEvent.clientX <= toolbarRect.right;\n\n      // Find the toolbar item we're hovering over\n      const toolbarItems = Array.from(\n        this.toolbar.querySelectorAll('.' + CSS_PREFIX + '__item'),\n      ) as HTMLElement[];\n      let insertBefore: HTMLElement | null = null;\n\n      if (isOverToolbar) {\n        for (let i = 0; i < toolbarItems.length; i++) {\n          const item = toolbarItems[i];\n          const itemRect = item.getBoundingClientRect();\n          const itemCenter = itemRect.left + itemRect.width / 2;\n\n          if (moveEvent.clientX < itemCenter && insertBefore === null) {\n            insertBefore = item;\n          }\n        }\n      }\n\n      // Remove existing placeholder\n      if (this.dragPlaceholder && this.dragPlaceholder.parentNode) {\n        this.dragPlaceholder.remove();\n      }\n\n      // Only show placeholder if over toolbar\n      if (isOverToolbar && this.dragPlaceholder) {\n        if (insertBefore) {\n          insertBefore.parentNode?.insertBefore(\n            this.dragPlaceholder,\n            insertBefore,\n          );\n        } else {\n          // Insert at end (before separator or overflow toggle)\n          const separator = this.toolbar.querySelector(\n            '.' + CSS_PREFIX + '__separator',\n          );\n          if (separator) {\n            separator.parentNode?.insertBefore(this.dragPlaceholder, separator);\n          } else {\n            const overflowToggle = this.toolbar.querySelector(\n              '.' + CSS_PREFIX + '__overflow-toggle',\n            );\n            if (overflowToggle) {\n              overflowToggle.parentNode?.insertBefore(\n                this.dragPlaceholder,\n                overflowToggle,\n              );\n            } else {\n              this.toolbar.appendChild(this.dragPlaceholder);\n            }\n          }\n        }\n      }\n    };\n\n    const onMouseUp = (_upEvent: MouseEvent) => {\n      if (!this.isDragging) return;\n\n      // Calculate new position based on placeholder\n      if (this.dragPlaceholder && this.dragPlaceholder.parentNode) {\n        // Count toolbar items before the placeholder to determine insert position\n        let insertAtIndex = 0;\n        for (let i = 0; i < this.toolbar.children.length; i++) {\n          const child = this.toolbar.children[i];\n          if (child === this.dragPlaceholder) break;\n          if (child.classList.contains(CSS_PREFIX + '__item')) {\n            insertAtIndex++;\n          }\n        }\n\n        // Find the tool's current index in the tools array\n        const currentToolIndex = this.tools.indexOf(tool);\n\n        if (currentToolIndex !== -1) {\n          // Remove the tool from its current position\n          this.tools.splice(currentToolIndex, 1);\n\n          // Insert at new position (at the target index)\n          this.tools.splice(insertAtIndex, 0, tool);\n\n          // Update order values\n          this.tools.forEach((t, i) => {\n            t.order = i;\n          });\n\n          // Save to localStorage\n          this.saveOrderState();\n        }\n      }\n\n      // Clean up\n      this.cleanupOverflowDrag();\n\n      document.removeEventListener('mousemove', onMouseMove);\n      document.removeEventListener('mouseup', onMouseUp);\n\n      // Re-render after a short delay\n      setTimeout(() => {\n        this.render();\n      }, 0);\n    };\n\n    document.addEventListener('mousemove', onMouseMove);\n    document.addEventListener('mouseup', onMouseUp);\n  }\n\n  /**\n   * Close the overflow menu programmatically.\n   */\n  private closeOverflowMenu() {\n    if (this.overflowMenu) {\n      this.overflowMenu.style.display = 'none';\n    }\n\n    // Update the overflow toggle button state\n    const overflowToggle = this.toolbar.querySelector(\n      '.' + CSS_PREFIX + '__overflow-toggle',\n    );\n    if (overflowToggle) {\n      overflowToggle.setAttribute('aria-expanded', 'false');\n    }\n\n    // Clear submenu stack\n    this.submenuStack = [];\n\n    // Remove close handler\n    const doc = this.editorView.dom.ownerDocument || document;\n    if (this.closeOverflowHandler) {\n      doc.removeEventListener('click', this.closeOverflowHandler);\n      this.closeOverflowHandler = null;\n    }\n  }\n\n  private cleanupOverflowDrag() {\n    this.isDragging = false;\n    this.isDraggingFromOverflow = false;\n    this.draggedItem = null;\n\n    if (this.dragSourceWrapper) {\n      this.dragSourceWrapper.classList.remove(\n        CSS_PREFIX + '__overflow-item--dragging',\n      );\n      this.dragSourceWrapper = null;\n    }\n\n    this.wrapper.classList.remove(CSS_PREFIX + '__wrapper--dragging');\n\n    if (this.dragGhost) {\n      this.dragGhost.remove();\n      this.dragGhost = null;\n    }\n\n    // Also clean up any orphaned ghost elements (fallback)\n    const orphanedGhost = document.querySelector(\n      '.' + CSS_PREFIX + '__drag-ghost',\n    );\n    if (orphanedGhost) {\n      orphanedGhost.remove();\n    }\n\n    if (this.dragPlaceholder) {\n      this.dragPlaceholder.remove();\n      this.dragPlaceholder = null;\n    }\n\n    if (this.dragStartTimer) {\n      clearTimeout(this.dragStartTimer);\n      this.dragStartTimer = null;\n    }\n  }\n\n  private startDrag(wrapper: HTMLElement, tool: ToolItem, e: MouseEvent) {\n    this.isDragging = true;\n    this.draggedItem = tool;\n\n    // Add dragging class to wrapper\n    wrapper.classList.add(CSS_PREFIX + '__item--dragging');\n    this.wrapper.classList.add(CSS_PREFIX + '__wrapper--dragging');\n\n    // Create a ghost element for visual feedback\n    const rect = wrapper.getBoundingClientRect();\n    this.dragGhost = wrapper.cloneNode(true) as HTMLElement;\n    this.dragGhost.classList.add(CSS_PREFIX + '__drag-ghost');\n    this.dragGhost.style.position = 'fixed';\n    this.dragGhost.style.left = `${rect.left}px`;\n    this.dragGhost.style.top = `${rect.top}px`;\n    this.dragGhost.style.width = `${rect.width}px`;\n    this.dragGhost.style.height = `${rect.height}px`;\n    this.dragGhost.style.pointerEvents = 'none';\n    this.dragGhost.style.zIndex = '10000';\n    document.body.appendChild(this.dragGhost);\n\n    // Create a placeholder to show where the item will be dropped\n    this.dragPlaceholder = document.createElement('span');\n    this.dragPlaceholder.classList.add(CSS_PREFIX + '__drop-placeholder');\n\n    const onMouseMove = (moveEvent: MouseEvent) => {\n      if (!this.isDragging || !this.dragGhost) return;\n\n      // Update ghost position\n      const ghostRect = this.dragGhost.getBoundingClientRect();\n      this.dragGhost.style.left = `${\n        moveEvent.clientX - ghostRect.width / 2\n      }px`;\n      this.dragGhost.style.top = `${\n        moveEvent.clientY - ghostRect.height / 2\n      }px`;\n\n      // Find the toolbar item we're hovering over\n      const toolbarItems = Array.from(\n        this.toolbar.querySelectorAll('.' + CSS_PREFIX + '__item'),\n      ) as HTMLElement[];\n      let insertBefore: HTMLElement | null = null;\n      let insertIndex = -1;\n\n      for (let i = 0; i < toolbarItems.length; i++) {\n        const item = toolbarItems[i];\n        if (item === wrapper) continue; // Skip the dragged item itself\n\n        const itemRect = item.getBoundingClientRect();\n        const itemCenter = itemRect.left + itemRect.width / 2;\n\n        if (moveEvent.clientX < itemCenter && insertBefore === null) {\n          insertBefore = item;\n          insertIndex = i;\n        }\n      }\n\n      // Remove existing placeholder\n      if (this.dragPlaceholder && this.dragPlaceholder.parentNode) {\n        this.dragPlaceholder.remove();\n      }\n\n      // Insert placeholder at the appropriate position\n      if (insertBefore && this.dragPlaceholder) {\n        insertBefore.parentNode?.insertBefore(\n          this.dragPlaceholder,\n          insertBefore,\n        );\n      } else if (this.dragPlaceholder) {\n        // Insert at end (before separator or overflow toggle)\n        const separator = this.toolbar.querySelector(\n          '.' + CSS_PREFIX + '__separator',\n        );\n        if (separator) {\n          separator.parentNode?.insertBefore(this.dragPlaceholder, separator);\n        } else {\n          const overflowToggle = this.toolbar.querySelector(\n            '.' + CSS_PREFIX + '__overflow-toggle',\n          );\n          if (overflowToggle) {\n            overflowToggle.parentNode?.insertBefore(\n              this.dragPlaceholder,\n              overflowToggle,\n            );\n          } else {\n            this.toolbar.appendChild(this.dragPlaceholder);\n          }\n        }\n      }\n    };\n\n    const onMouseUp = (upEvent: MouseEvent) => {\n      if (!this.isDragging) return;\n\n      // Calculate new position based on placeholder\n      if (this.dragPlaceholder && this.dragPlaceholder.parentNode) {\n        const toolbarItems = Array.from(\n          this.toolbar.querySelectorAll('.' + CSS_PREFIX + '__item'),\n        );\n        const placeholderIndex = Array.from(this.toolbar.children).indexOf(\n          this.dragPlaceholder,\n        );\n        const draggedIndex = toolbarItems.indexOf(wrapper);\n\n        // Calculate target index in visible items\n        let visibleTargetIndex = 0;\n        for (let i = 0; i < this.toolbar.children.length; i++) {\n          const child = this.toolbar.children[i];\n          if (child === this.dragPlaceholder) break;\n          if (child.classList.contains(CSS_PREFIX + '__item')) {\n            visibleTargetIndex++;\n          }\n        }\n\n        // Find the tool's current index in the tools array\n        const currentToolIndex = this.tools.indexOf(tool);\n\n        if (\n          currentToolIndex !== -1 && visibleTargetIndex !== currentToolIndex\n        ) {\n          // Remove the tool from its current position\n          this.tools.splice(currentToolIndex, 1);\n\n          // Insert at new position\n          const insertAtIndex = visibleTargetIndex > currentToolIndex\n            ? visibleTargetIndex - 1\n            : visibleTargetIndex;\n          this.tools.splice(insertAtIndex, 0, tool);\n\n          // Update order values\n          this.tools.forEach((t, i) => {\n            t.order = i;\n          });\n\n          // Save to localStorage\n          this.saveOrderState();\n        }\n      }\n\n      // Clean up\n      this.cleanupDrag(wrapper);\n\n      document.removeEventListener('mousemove', onMouseMove);\n      document.removeEventListener('mouseup', onMouseUp);\n\n      // Re-render after a short delay\n      setTimeout(() => {\n        this.render();\n      }, 0);\n    };\n\n    document.addEventListener('mousemove', onMouseMove);\n    document.addEventListener('mouseup', onMouseUp);\n  }\n\n  private cleanupDrag(wrapper: HTMLElement) {\n    this.isDragging = false;\n    this.draggedItem = null;\n\n    wrapper.classList.remove(CSS_PREFIX + '__item--dragging');\n    this.wrapper.classList.remove(CSS_PREFIX + '__wrapper--dragging');\n\n    if (this.dragGhost) {\n      this.dragGhost.remove();\n      this.dragGhost = null;\n    }\n\n    // Also clean up any orphaned ghost elements (fallback)\n    const orphanedGhost = document.querySelector(\n      '.' + CSS_PREFIX + '__drag-ghost',\n    );\n    if (orphanedGhost) {\n      orphanedGhost.remove();\n    }\n\n    if (this.dragPlaceholder) {\n      this.dragPlaceholder.remove();\n      this.dragPlaceholder = null;\n    }\n\n    if (this.dragStartTimer) {\n      clearTimeout(this.dragStartTimer);\n      this.dragStartTimer = null;\n    }\n  }\n\n  update(view: EditorView, prevState: EditorState) {\n    // Re-render tools to update their state (original approach)\n    // Note: This is less efficient but more reliable than storing update functions\n    this.tools.forEach((tool) => {\n      tool.element.render(this.editorView);\n    });\n  }\n\n  destroy() {\n    // Clean up event listeners\n    const doc = this.editorView.dom.ownerDocument || document;\n    if (this.closeOverflowHandler) {\n      doc.removeEventListener('click', this.closeOverflowHandler);\n      this.closeOverflowHandler = null;\n    }\n\n    if (this.closePinnedDropdownHandler) {\n      doc.removeEventListener('click', this.closePinnedDropdownHandler);\n      this.closePinnedDropdownHandler = null;\n    }\n\n    // Clean up keyboard handler\n    if (this.keydownHandler) {\n      document.removeEventListener('keydown', this.keydownHandler);\n      this.keydownHandler = null;\n    }\n\n    // Clean up ResizeObserver\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n\n    // Clean up pinned dropdown\n    if (this.pinnedDropdownMenu) {\n      this.pinnedDropdownMenu.remove();\n      this.pinnedDropdownMenu = null;\n    }\n\n    // Clean up drag state\n    if (this.dragGhost) {\n      this.dragGhost.remove();\n      this.dragGhost = null;\n    }\n    if (this.dragPlaceholder) {\n      this.dragPlaceholder.remove();\n      this.dragPlaceholder = null;\n    }\n    if (this.dragStartTimer) {\n      clearTimeout(this.dragStartTimer);\n      this.dragStartTimer = null;\n    }\n\n    // Clean up DOM\n    if (this.wrapper.parentNode) {\n      this.wrapper.parentNode.replaceChild(this.editorView.dom, this.wrapper);\n    }\n  }\n}\n\nexport interface CustomMenuOptions {\n  /// Provides the content of the menu\n  content: readonly (readonly MenuElement[])[];\n}\n\nexport class CustomMenuPlugin extends Plugin {\n  constructor(editor: CoreEditor, options: CustomMenuOptions) {\n    super({\n      key: new PluginKey('custom-menu'),\n      view(editorView) {\n        return new CustomMenuView(editorView, editor, options.content);\n      },\n    });\n  }\n}\n","import { Plugin } from 'prosemirror-state';\n\nimport { Extension } from '@kerebron/editor';\nimport { type MenuElement } from './menu.ts';\nimport { buildMenu } from './buildMenu.ts';\nimport { CustomMenuPlugin } from './CustomMenuPlugin.ts';\n\nexport interface MenuConfig {\n  modifyMenu?(menus: MenuElement[][]): MenuElement[][];\n}\n\n/// Extension for a customizable menu with pinned items\nexport class ExtensionCustomMenu extends Extension {\n  name = 'customMenu';\n\n  constructor(public override config: MenuConfig = {}) {\n    super(config);\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    if (!this.editor.config.element) {\n      return [];\n    }\n    let content = buildMenu(this.editor, this.editor.schema);\n    if (this.config.modifyMenu) {\n      content = this.config.modifyMenu(content);\n    }\n\n    return [\n      new CustomMenuPlugin(this.editor, {\n        content,\n      }),\n    ];\n  }\n}\n","import { Extension } from '@kerebron/editor';\nimport { OverLayer } from '@kerebron/extension-ui/OverLayer';\n\nexport class ExtensionUi extends Extension {\n  name = 'ui';\n\n  override created(): void {\n    this.editor.ci.register('overlayer', new OverLayer());\n  }\n}\n","export class OverLayer {\n  overLayerContainer: HTMLElement;\n\n  stack: HTMLElement[] = [];\n\n  constructor(container?: HTMLElement) {\n    if (!container) {\n      container = document.createElement('div');\n      document.body.appendChild(container);\n      container.classList.add('kb--top-layer');\n    }\n\n    this.overLayerContainer = container;\n  }\n\n  private removeStacked(start: number) {\n    for (let i = this.stack.length - 1; i >= start; i--) {\n      if (this.overLayerContainer.contains(this.stack[i])) {\n        this.overLayerContainer.removeChild(this.stack[i]);\n      }\n    }\n    this.stack.splice(start, this.stack.length - start);\n  }\n\n  createElement<T extends HTMLElement>(\n    type: string,\n    ancestor?: HTMLElement,\n  ): T {\n    const element = document.createElement(type);\n    this.overLayerContainer.appendChild(element);\n\n    const observer = new MutationObserver((mutations) => {\n      if (!element.isConnected) {\n        observer.disconnect();\n        const idx = this.stack.findIndex((item) => item === element);\n        if (idx > -1) {\n          this.removeStacked(idx);\n        }\n        element.dispatchEvent(new CustomEvent('removed'));\n      }\n    });\n\n    if (ancestor) {\n      const idx = this.stack.findIndex((item) => item === ancestor);\n      if (idx > -1) {\n        this.removeStacked(idx + 1);\n      }\n    } else {\n      this.removeStacked(0);\n    }\n\n    this.stack.push(element);\n\n    observer.observe(this.overLayerContainer, {\n      childList: true,\n    });\n\n    return element as T;\n  }\n}\n\nexport interface AnchorParams {\n  container?: HTMLElement;\n  above?: boolean;\n}\n\nexport function anchorElement(\n  popover: HTMLElement,\n  anchorSelector: string,\n  params?: AnchorParams,\n) {\n  let rafId: number | null = null;\n\n  popover.style.position = 'fixed';\n  popover.setAttribute('data-anchor-selector', anchorSelector);\n\n  function update() {\n    rafId = null;\n\n    const container: HTMLElement = params?.container || document.body;\n    const anchor = container.querySelector(anchorSelector);\n\n    if (anchor) {\n      const rect = anchor.getBoundingClientRect();\n\n      if (params?.above) {\n        popover.style.left = `${rect.left}px`;\n        popover.style.top = `${rect.top - popover.clientHeight}px`;\n      } else {\n        popover.style.left = `${rect.left}px`;\n        popover.style.top = `${rect.bottom}px`;\n      }\n\n      popover.style.display = '';\n    } else {\n      const ids = [];\n      const nodes = container.querySelectorAll('[data-decoration-id]');\n      nodes.forEach((n) => ids.push(n.getAttribute('data-decoration-id')));\n\n      // console.debug('!anchorSelector', anchorSelector, ids);\n      popover.style.display = 'none';\n      scheduleUpdate();\n    }\n  }\n\n  function scheduleUpdate() {\n    if (!rafId) {\n      rafId = requestAnimationFrame(update);\n    }\n  }\n\n  update();\n\n  // const resizeObserver = new ResizeObserver(scheduleUpdate);\n  // resizeObserver.observe(anchor);\n\n  // const moveObserver = new IntersectionObserver(scheduleUpdate);\n  // moveObserver.observe(anchor);\n\n  if (params?.container) {\n    const observer = new MutationObserver((mutations) => {\n      scheduleUpdate();\n    });\n\n    observer.observe(params?.container, {\n      childList: true,\n      characterData: true,\n      subtree: true,\n    });\n  }\n\n  window.addEventListener('resize', scheduleUpdate, true);\n  document.addEventListener('scroll', scheduleUpdate, true);\n\n  popover.addEventListener('removed', () => {\n    // resizeObserver.disconnect();\n    // moveObserver.disconnect();\n    window.removeEventListener('resize', scheduleUpdate, true);\n    document.removeEventListener('scroll', scheduleUpdate, true);\n\n    if (rafId) {\n      cancelAnimationFrame(rafId);\n      rafId = null;\n    }\n  });\n}\n","import { CoreEditor } from '@kerebron/editor';\nimport {\n  AutocompleteRenderer,\n  SuggestionKeyDownProps,\n  SuggestionProps,\n} from './types.ts';\nimport { anchorElement, OverLayer } from '../overlayer/mod.ts';\n\nconst CSS_PREFIX = 'kb-autocomplete';\n\nexport class DefaultRenderer<Item> extends EventTarget\n  implements AutocompleteRenderer {\n  command: (props: any) => void;\n  wrapper: HTMLElement | undefined;\n  list: HTMLElement | undefined;\n  items: Array<Item> = [];\n  pos: number = -1;\n  props: SuggestionProps<Item, any> | undefined;\n  readonly keyDownHandler: (this: HTMLElement, ev: KeyboardEvent) => any;\n  overlayer: OverLayer;\n  anchor?: string;\n\n  constructor(private editor: CoreEditor) {\n    super();\n\n    this.overlayer = this.editor.ci.resolve('overlayer');\n\n    this.command = () => {};\n\n    this.keyDownHandler = (event) => {\n      if (this.onKeyDown({ event })) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    };\n  }\n\n  setCommand(command: (props: any) => void) {\n    this.command = command;\n    this.refresh();\n  }\n\n  setResponse() {\n    this.refresh();\n  }\n\n  onUpdate(props: SuggestionProps<Item>) {\n    this.items.splice(0, this.items.length, ...props.items);\n    this.props = props;\n    this.refresh();\n  }\n\n  destroy() {\n    document.body.removeEventListener('keydown', this.keyDownHandler, {\n      capture: true,\n    });\n    if (this.wrapper) {\n      this.wrapper.parentNode?.removeChild(this.wrapper);\n      this.wrapper = undefined;\n      this.dispatchEvent(new Event('close'));\n    }\n    this.pos = -1;\n  }\n\n  onKeyDown(props: SuggestionKeyDownProps) {\n    if (!this.wrapper) {\n      return false;\n    }\n    if (this.items.length === 0) {\n      return false;\n    }\n\n    if (props.event.key === 'Escape') {\n      if (this.wrapper) {\n        this.wrapper.parentNode?.removeChild(this.wrapper);\n        this.wrapper = undefined;\n        return true;\n      }\n    }\n    if (props.event.key === 'ArrowUp') {\n      if (this.pos > -1) {\n        this.pos = this.pos - 1;\n        this.refresh();\n        return true;\n      }\n    }\n\n    if (props.event.key === 'ArrowDown') {\n      if (this.pos < this.items.length - 1) {\n        this.pos++;\n        this.refresh();\n        return true;\n      }\n    }\n\n    if (props.event.key === 'Enter') {\n      if (this.pos > -1 && this.pos < this.items.length) {\n        const item = this.items[this.pos];\n        this.items.splice(0, this.items.length);\n        this.destroy();\n        this.command(item);\n        return true;\n      }\n    }\n    return false;\n  }\n\n  createListItem(item: Item, cnt: number) { // override\n    const li = document.createElement('li');\n    if (cnt === this.pos) {\n      li.classList.add('active');\n    }\n    li.innerText = '' + item; // TODO item to string and item formatting\n    li.style.cursor = 'pointer';\n    li.addEventListener('click', () => {\n      this.destroy();\n      this.command(item);\n    });\n    return li;\n  }\n\n  refresh() {\n    if (!this.wrapper) {\n      this.wrapper = this.overlayer.createElement('div');\n      this.wrapper.classList.add(CSS_PREFIX + '__wrapper');\n\n      this.list = document.createElement('ul');\n      this.wrapper.appendChild(this.list);\n    }\n\n    document.body.removeEventListener('keydown', this.keyDownHandler, {\n      capture: true,\n    });\n\n    if (!this.list) {\n      return;\n    }\n\n    this.list.innerHTML = '';\n    for (let cnt = 0; cnt < this.items.length; cnt++) {\n      const item = this.items[cnt];\n      this.list.appendChild(this.createListItem(item, cnt));\n    }\n\n    if (this.items.length > 0) {\n      document.body.addEventListener('keydown', this.keyDownHandler, {\n        capture: true,\n      });\n    }\n\n    let visible = false;\n    if (this.items.length === 0) {\n      // this.wrapper.style.display = 'none';\n    } else {\n      visible = true;\n      // this.wrapper.style.display = '';\n    }\n\n    if (this.anchor) {\n      anchorElement(this.wrapper, this.anchor, {\n        container: this.editor.config.element,\n      });\n    } else {\n      visible = false;\n    }\n\n    //   if (visible) {\n    //     if (!this.wrapper.matches(':popover-open')) {\n    //       const el = document.activeElement;\n    //       const previousFocus = el instanceof HTMLElement ? el : null;\n    //       this.wrapper.showPopover();\n    //       requestAnimationFrame(() => {\n    //         if (previousFocus && previousFocus.isConnected) {\n    //           previousFocus.focus();\n    //         }\n    //       });\n    //     }\n    //   } else {\n    //     if (this.wrapper.matches(':popover-open')) {\n    //       this.wrapper.hidePopover();\n    //     }\n    //   }\n  }\n\n  setAnchorSelector(anchor: string): void {\n    this.anchor = anchor;\n    this.refresh();\n  }\n}\n","import { ResolvedPos } from 'prosemirror-model';\nimport { AutocompleteMatcher, SuggestionMatch } from './types.ts';\n\n// source: https://stackoverflow.com/a/6969486\nexport function escapeForRegEx(string: string): string {\n  return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nexport interface MatcherConfig {\n  char?: string;\n  allowSpaces?: boolean;\n  allowToIncludeChar?: boolean;\n  allowedPrefixes?: string[] | null;\n  startOfLine?: boolean;\n}\n\nexport function createDefaultMatcher(\n  config: MatcherConfig = {},\n): AutocompleteMatcher {\n  const char = config.char || '@';\n  const allowToIncludeChar = config.allowToIncludeChar || false;\n  const allowedPrefixes = config.allowedPrefixes || [' '];\n  const startOfLine = config.startOfLine || false;\n\n  return ($position: ResolvedPos): SuggestionMatch | undefined => {\n    const allowSpaces = config.allowSpaces && !allowToIncludeChar;\n\n    const escapedChar = escapeForRegEx(char);\n    const suffix = new RegExp(`\\\\s${escapedChar}$`);\n    const prefix = startOfLine ? '^' : '';\n    const finalEscapedChar = allowToIncludeChar ? '' : escapedChar;\n    const regexp = allowSpaces\n      ? new RegExp(\n        `${prefix}${escapedChar}.*?(?=\\\\s${finalEscapedChar}|$)`,\n        'gm',\n      )\n      : new RegExp(\n        `${prefix}(?:^)?${escapedChar}[^\\\\s${finalEscapedChar}]*`,\n        'gm',\n      );\n\n    const text = $position.nodeBefore?.isText && $position.nodeBefore.text;\n\n    if (!text) {\n      return undefined;\n    }\n\n    const textFrom = $position.pos - text.length;\n    const match = Array.from(text.matchAll(regexp)).pop();\n\n    if (!match || match.input === undefined || match.index === undefined) {\n      return undefined;\n    }\n\n    // JavaScript doesn't have lookbehinds. This hacks a check that first character\n    // is a space or the start of the line\n    const matchPrefix = match.input.slice(\n      Math.max(0, match.index - 1),\n      match.index,\n    );\n    const matchPrefixIsAllowed = new RegExp(\n      `^[${allowedPrefixes?.join('')}\\0]?$`,\n    )\n      .test(matchPrefix);\n\n    if (allowedPrefixes !== null && !matchPrefixIsAllowed) {\n      return undefined;\n    }\n\n    // The absolute position of the match in the document\n    const from = textFrom + match.index;\n    let to = from + match[0].length;\n\n    // Edge case handling; if spaces are allowed and we're directly in between\n    // two triggers\n    if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {\n      match[0] += ' ';\n      to += 1;\n    }\n\n    // If the $position is located within the matched substring, return that range\n    if (from < $position.pos && to >= $position.pos) {\n      return {\n        range: {\n          from,\n          to,\n        },\n        query: match[0],\n      };\n    }\n\n    return undefined;\n  };\n}\n","import { Plugin, PluginKey, Selection, Transaction } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nimport { type CoreEditor } from '@kerebron/editor';\n\nimport { debounce } from '@kerebron/editor/utilities';\n\nimport {\n  AutocompleteConfig,\n  AutocompleteMatcher,\n  AutocompleteProps,\n  AutocompleteRenderer,\n  AutocompleteSource,\n  MatchedSource,\n  SuggestionMatch,\n  SuggestionProps,\n} from './types.ts';\nimport { DefaultRenderer } from './DefaultRenderer.ts';\nimport { createDefaultMatcher } from './createDefaultMatcher.ts';\n\n// type AutoCompleteStatexx =\n//   | { type: \"Idle\" }\n//   | { type: \"Matched\"; match: SuggestionMatch; source: AutocompleteSource }\n//   | { type: \"Suggesting\"; text: string };\n\ninterface AutocompleteMeta {\n  addAutocompleteSource?: {\n    autocompleteSource: AutocompleteSource;\n  };\n\n  trigger?: {\n    manual: boolean;\n  };\n  setRequest?: {\n    match: SuggestionMatch;\n    source: AutocompleteSource;\n    // renderer: AutocompleteRenderer;\n  };\n  setResponse?: {\n    items: any[];\n  };\n\n  clearRequest?: boolean;\n}\n\nclass AutoCompleteState {\n  idGenerator = 1;\n\n  autocompleteSources: AutocompleteSource[] = [];\n  manual: boolean = false;\n\n  request?: {\n    id: number;\n\n    decorationId: string;\n\n    match: SuggestionMatch;\n    source: AutocompleteSource;\n    renderer: AutocompleteRenderer;\n  };\n\n  response?: {\n    items: any[];\n  };\n\n  composing: boolean = false;\n\n  matchSource: typeof this.matchSourceImpl;\n\n  constructor(private editor: CoreEditor) {\n    this.matchSource = debounce(this.matchSourceImpl.bind(this), 200);\n  }\n\n  destroy() {\n    if (this.request) {\n      this.request.renderer.destroy();\n    }\n  }\n\n  include(from: number) {\n    if (!this.request) {\n      return false;\n    }\n\n    if (from < this.request.match.range.from) return false;\n    if (from > this.request.match.range.to) return false;\n\n    return true;\n  }\n\n  addSource(source: AutocompleteSource) {\n    if (!source.matchers && source.triggerKeys?.length === 1) {\n      source.matchers = [\n        createDefaultMatcher({ char: source.triggerKeys[0] }),\n      ];\n    }\n    this.autocompleteSources.push(\n      source,\n    );\n  }\n\n  clearRequest() {\n    if (this.request) {\n      this.request.renderer.destroy();\n      this.request = undefined;\n    }\n    this.response = undefined;\n  }\n\n  handleSource(matched?: MatchedSource) {\n    // If we found a match, update the current state to show it\n    if (\n      matched && (!matched.source.allow || matched.source.allow({\n        range: matched.match.range,\n        isActive: !!this.request,\n      }))\n    ) {\n      const { source, match } = matched;\n\n      if (match) {\n        this.dispatchMeta({\n          setRequest: {\n            match,\n            source,\n          },\n        });\n      }\n    } else {\n      this.clearRequest();\n    }\n  }\n\n  docChanged() {\n    this.matchSource({ manual: false });\n    // for (const source of sources) {\n    //   if (!source.matchers) {\n    //     continue;\n    //   }\n    //   const matchers: AutocompleteMatcher[] = source.matchers;\n\n    //   if (\n    //     !['code_blocxk'].includes(parentNode.type.name)\n    //   ) {\n    //     for (const matcher of matchers) {\n    //       const match = matcher(selection.$from);\n    //       if (match) {\n    //         matched = {\n    //           source,\n    //           match,\n    //         };\n\n    //         this.handleSource(matched);\n    //         break;\n    //         // return matched;\n    //       }\n\n    //     }\n\n    //   }\n    // }\n    // throw new Error('Method not implemented.');\n  }\n\n  private matchSourceImpl({ manual }: { manual: boolean }): void {\n    this.manual = manual;\n\n    const selection: Selection = this.editor.state.selection;\n\n    const sources: AutocompleteSource[] = this.autocompleteSources;\n    let matched: MatchedSource | undefined = undefined;\n    const parentNode = selection.$anchor.parent;\n\n    for (const source of sources) {\n      if (!source.matchers) {\n        continue;\n      }\n      const matchers: AutocompleteMatcher[] = source.matchers;\n\n      if (\n        !['code_blocxk'].includes(parentNode.type.name)\n      ) {\n        for (const matcher of matchers) {\n          const match = matcher(selection.$from);\n          console.log('matchSourceImpl', source, match);\n          if (match) {\n            matched = {\n              source,\n              match,\n            };\n\n            this.handleSource(matched);\n            break;\n            // return matched;\n          }\n        }\n      }\n    }\n\n    if (!matched) {\n      this.dispatchMeta({ clearRequest: true });\n    }\n\n    return undefined;\n  }\n\n  handleCommands(\n    pluginMeta: AutocompleteMeta | undefined,\n    transaction: Transaction,\n  ) {\n    if (!pluginMeta) {\n      return false;\n    }\n\n    if (pluginMeta?.addAutocompleteSource) {\n      this.addSource({\n        ...pluginMeta.addAutocompleteSource.autocompleteSource,\n      });\n      return true;\n    }\n\n    if (pluginMeta?.trigger) {\n      const { selection } = transaction;\n\n      this.matchSource(pluginMeta?.trigger);\n\n      return true;\n    }\n\n    if (pluginMeta?.setRequest) {\n      const id = this.idGenerator++;\n      const decorationId = `id_${Math.floor(Math.random() * 0xffffffff)}`;\n\n      let renderer = this.request?.renderer;\n      if (this.request?.source !== pluginMeta.setRequest.source) {\n        if (renderer) {\n          renderer.destroy();\n          renderer = undefined;\n        }\n      }\n      if (!renderer) {\n        renderer = new DefaultRenderer(this.editor);\n        renderer.setAnchorSelector(`[data-decoration-id=\"${decorationId}\"]`);\n\n        if (this.request) {\n          const onSelect = this.request.source.onSelect;\n          renderer.setCommand((selected) => {\n            console.log('COM', selected);\n            if (!this.request) {\n              return;\n            }\n            return onSelect(selected, this.request.match.range);\n          });\n        }\n        renderer.addEventListener('close', () => {\n          this.dispatchMeta({\n            clearRequest: true,\n          });\n        });\n      }\n\n      this.request = {\n        id,\n        decorationId,\n        match: pluginMeta.setRequest.match,\n        source: pluginMeta.setRequest.source,\n        renderer,\n      };\n\n      const request = this.request;\n\n      const go = async () => {\n        const ctx = {\n          range: request.match.range,\n          isActive: !!request,\n        };\n        const items = await request.source.getItems(\n          request.match.query,\n          ctx,\n        );\n\n        this.dispatchMeta({\n          setResponse: {\n            items,\n          },\n        });\n      };\n      go();\n\n      return true;\n    }\n\n    if (pluginMeta?.setResponse && this.request) {\n      this.response = {\n        ...pluginMeta?.setResponse,\n      };\n\n      const props: SuggestionProps = {\n        match: this.request.match,\n        items: this.response.items,\n        // anchor: ,\n        // decorationNode,\n        // virtual node for popper.js or tippy.js\n        // this can be used for building popups without a DOM node\n        // clientRect: () => {\n        //   // because of `items` can be asynchrounous we’ll search for the current decoration node\n        //   const { decorationId } = next; // eslint-disable-line\n        //   const currentDecorationNode = view.dom.querySelector(\n        //     `[data-decoration-id=\"${decorationId}\"]`,\n        //   );\n\n        //   return currentDecorationNode?.getBoundingClientRect() ||\n        //     null;\n        // },\n      };\n\n      this.request?.renderer.onUpdate(props);\n\n      return true;\n    }\n\n    if (pluginMeta?.clearRequest) {\n      this.clearRequest();\n      return true;\n    }\n\n    return false;\n  }\n\n  dispatchMeta(meta: AutocompleteMeta) {\n    const tr = this.editor.state.tr;\n    tr.setMeta(AutocompletePluginKey, meta);\n    this.editor.dispatchTransaction(tr);\n  }\n}\n\nexport const AutocompletePluginKey = new PluginKey<AutoCompleteState>(\n  'autocomplete',\n);\n\nexport class AutocompletePlugin<Item, TSelected>\n  extends Plugin<AutoCompleteState> {\n  constructor(config: AutocompleteConfig, editor: CoreEditor) {\n    super({\n      key: AutocompletePluginKey,\n      state: {\n        init() {\n          return new AutoCompleteState(editor);\n        },\n\n        apply(transaction, value: AutoCompleteState, prevState, state) {\n          const pluginMeta: AutocompleteMeta | undefined = transaction.getMeta(\n            AutocompletePluginKey,\n          );\n\n          const nextAutocompleteState = value;\n\n          if (!pluginMeta && !transaction.isGeneric) {\n            // return next;\n          }\n\n          const { editable, composing } = editor.view;\n          const { selection } = transaction;\n\n          nextAutocompleteState.composing = composing;\n\n          if (!editable) {\n            nextAutocompleteState.clearRequest();\n            return nextAutocompleteState;\n          }\n\n          if (!selection.empty && !editor.view.composing) {\n            nextAutocompleteState.clearRequest();\n            return nextAutocompleteState;\n          }\n\n          if (nextAutocompleteState.handleCommands(pluginMeta, transaction)) {\n            return nextAutocompleteState;\n          }\n\n          if (transaction.docChanged) {\n            nextAutocompleteState.docChanged();\n            // nextAutocompleteState.clearActive();\n          }\n\n          // Reset active state if we just left the previous suggestion range\n          if (!composing && !nextAutocompleteState.include(selection.from)) {\n            nextAutocompleteState.clearRequest();\n            return nextAutocompleteState;\n          }\n\n          if (transaction.getMeta('isCommand')) {\n            return nextAutocompleteState;\n          }\n\n          nextAutocompleteState.matchSource({ manual: false });\n\n          return nextAutocompleteState;\n        },\n      },\n\n      view(editorView) {\n        return {\n          update: async (view, prevState) => {\n            const prev: AutoCompleteState = this.key?.getState(prevState);\n            const next: AutoCompleteState = this.key?.getState(view.state);\n            const pluginState = next;\n\n            if (next.request?.decorationId) {\n              const decorationNode = view.dom.querySelector(\n                `[data-decoration-id=\"${next.request.decorationId}\"]`,\n              );\n            }\n\n            const moved = prev.request && next.request &&\n              prev.request.match.range.from !== next.request.match.range.from;\n            const started = !prev.request?.match && next.request?.match;\n            const stopped = prev.request?.match && !next.request?.match;\n            const changed = !started && !stopped &&\n              prev.request?.match.query !== next.request?.match.query;\n\n            if (stopped && prev.request) {\n              prev.request.renderer.destroy();\n              return;\n            }\n\n            if (next.activexxx) {\n              for (const source of next.autocompleteSources) {\n                if (!source.triggerKeys) {\n                  pluginState.dispatchMeta({\n                    trigger: {\n                      manual: false,\n                    },\n                  });\n                  return false;\n                }\n              }\n\n              const changedQuery =\n                prev.request?.match.query !== next.request.match.query;\n\n              if (changedQuery || moved) {\n                const decorationNode = view.dom.querySelector(\n                  `[data-decoration-id=\"${next.request.decorationId}\"]`,\n                );\n\n                const props: SuggestionProps = {\n                  match: next.request.match,\n                  items: [],\n                  // anchor: ,\n                  // decorationNode,\n                  // virtual node for popper.js or tippy.js\n                  // this can be used for building popups without a DOM node\n                  // clientRect: () => {\n                  //   // because of `items` can be asynchrounous we’ll search for the current decoration node\n                  //   const { decorationId } = next; // eslint-disable-line\n                  //   const currentDecorationNode = view.dom.querySelector(\n                  //     `[data-decoration-id=\"${decorationId}\"]`,\n                  //   );\n\n                  //   return currentDecorationNode?.getBoundingClientRect() ||\n                  //     null;\n                  // },\n                };\n\n                next.request.renderer.onUpdate(props);\n\n                try {\n                  const ctx = {\n                    range: next.request.match.range,\n                    isActive: !!next.request,\n                  };\n                  const items = await next.request.source.getItems(\n                    next.request.match.query,\n                    ctx,\n                  );\n                  next.request.renderer.onUpdate({ ...props, items });\n                } catch (err: any) {\n                  if (err.isLSP) {\n                    console.error(\n                      'LSP error config.getItems()',\n                      err.message,\n                      next.request.source.getItems,\n                    );\n                  } else {\n                    throw err;\n                  }\n                }\n              }\n            }\n\n            const handleStart = started || (moved && changed);\n            const handleChange = changed || moved;\n            const handleExit = stopped || (moved && changed);\n\n            if (!handleStart && !handleChange && !handleExit) {\n              return;\n            }\n\n            const state = handleExit && !handleStart ? prev : next;\n\n            // const active = state.active;\n          },\n\n          destroy: () => {\n            const pluginState = AutocompletePluginKey.getState(editor.state);\n            if (!pluginState) {\n              return;\n            }\n\n            pluginState.destroy();\n          },\n        };\n      },\n\n      props: {\n        // Call the keydown hook if suggestion is active.\n        handleKeyDown(view, event) {\n          const pluginState = this.getState(view.state) as AutoCompleteState;\n          const { autocompleteSources } = pluginState;\n\n          for (const source of autocompleteSources) {\n            if (source.triggerKeys) {\n              const triggerKeys: string[] = source.triggerKeys;\n              for (const origKey of triggerKeys) {\n                let key = origKey.toLowerCase();\n                if (key.startsWith('ctrl+')) {\n                  if (!event.ctrlKey) {\n                    continue;\n                  }\n                  key = key.substring('ctrl+'.length);\n                }\n\n                if (key === event.key) {\n                  pluginState.dispatchMeta({\n                    trigger: {\n                      manual: true,\n                    },\n                  });\n                  return false;\n                }\n              }\n            }\n          }\n\n          return false;\n        },\n\n        // Setup decorator on the currently active suggestion.\n        decorations(state) {\n          const { request, response } = this.getState(state) || {};\n\n          if (!request) {\n            return null;\n          }\n\n          const anchor = document.createElement('span');\n          anchor.className = config.decorationClass || 'kb-autocomplete--decor';\n          anchor.setAttribute('data-decoration-id', request.decorationId);\n\n          return DecorationSet.create(state.doc, [\n            Decoration.inline(\n              request.match.range.from,\n              request.match.range.to,\n              {\n                class: config.decorationClass || 'kb-autocomplete--decor',\n                'data-decoration-id': request.decorationId,\n                decorationId: request.decorationId,\n              },\n            ),\n            // Decoration.widget(active.match.range.from, anchor, {\n            //   class: anchor.className,\n            //   decorationId,\n            //   // refresh: () => active.renderer.refresh(),\n            // }),\n          ]);\n        },\n      },\n    });\n  }\n}\n","import type { EditorState, Plugin, Transaction } from 'prosemirror-state';\n\nimport { CommandFactories, Extension } from '@kerebron/editor';\nimport { CommandFactory } from '@kerebron/editor/commands';\n\nimport {\n  AutocompletePlugin,\n  AutocompletePluginKey,\n} from './AutocompletePlugin.ts';\nimport { AutocompleteConfig, AutocompleteSource } from './types.ts';\n\nexport class ExtensionAutocomplete extends Extension {\n  name = 'autocomplete';\n\n  public constructor(\n    public override config: AutocompleteConfig = {},\n  ) {\n    super(config);\n  }\n\n  override getCommandFactories(): Partial<CommandFactories> {\n    const addAutocompleteSource: CommandFactory = (\n      autocompleteSource: AutocompleteSource,\n    ) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n        tr.setMeta(AutocompletePluginKey, {\n          addAutocompleteSource: { autocompleteSource },\n        });\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return true;\n      };\n    };\n\n    return {\n      addAutocompleteSource,\n    };\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      new AutocompletePlugin(this.config, this.editor),\n    ];\n  }\n}\n","import { CoreEditor } from '@kerebron/editor';\nimport { anchorElement, type OverLayer } from '../overlayer/mod.ts';\n\nconst CSS_PREFIX = 'kb-hover';\n\nexport interface AnchorOpts {\n  above?: boolean;\n}\n\nexport class MarkdownRenderer extends EventTarget {\n  overlayer: OverLayer;\n  wrapper: HTMLElement | undefined;\n  anchor?: { selector: string; opts: AnchorOpts };\n  text: string | undefined;\n\n  constructor(private editor: CoreEditor) {\n    super();\n\n    this.overlayer = this.editor.ci.resolve('overlayer');\n  }\n\n  setResponse({ text }: { text: string | undefined }) {\n    this.text = text;\n    this.refresh();\n  }\n\n  refresh() {\n    if (!this.text) {\n      if (this.wrapper) {\n        this.wrapper.style.display = 'none';\n      }\n      return;\n    }\n\n    console.log('MarkdownRenderer this.wrapper', this.wrapper);\n\n    if (!this.wrapper) {\n      this.wrapper = this.overlayer.createElement('div');\n      this.wrapper.classList.add(CSS_PREFIX + '__wrapper');\n    }\n\n    this.wrapper.innerText = this.text;\n    this.wrapper.style.display = '';\n\n    if (this.anchor) {\n      console.log('anchorElement', this.anchor.selector);\n      anchorElement(this.wrapper, this.anchor.selector, {\n        container: this.editor.config.element,\n        above: this.anchor.opts.above,\n      });\n    }\n  }\n\n  destroy() {\n    if (this.wrapper) {\n      this.wrapper.parentNode?.removeChild(this.wrapper);\n      this.wrapper.dispatchEvent(new CustomEvent('removed'));\n      this.wrapper = undefined;\n      this.dispatchEvent(new Event('close'));\n    }\n  }\n\n  setAnchorSelector(selector: string, opts: AnchorOpts): void {\n    console.log('setAnchorSelector', selector);\n    this.anchor = { selector, opts };\n    this.refresh();\n  }\n}\n","import { Node as PmNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, Selection, Transaction } from 'prosemirror-state';\nimport { Decoration, DecorationSet, EditorView } from 'prosemirror-view';\n\nimport { type CoreEditor, TextRange } from '@kerebron/editor';\nimport { debounce } from '@kerebron/editor/utilities';\n\nimport { HoverConfig, HoverMatch, HoverSource, HoverTrigger } from './types.ts';\nimport { MarkdownRenderer } from './MarkdownRenderer.ts';\n\nexport const HoverPluginKey = new PluginKey<HoverState>(\n  'hover',\n);\n\ninterface HoverMeta {\n  addHoverSource?: {\n    hoverSource: HoverSource;\n  };\n  trigger?: HoverTrigger;\n  setRequest?: HoverMatch;\n  setResponse?: {\n    id: number;\n    text: string;\n  };\n  clearRequest?: boolean;\n}\n\nclass HoverState {\n  idGenerator = 1;\n\n  hoverSources: HoverSource[] = [];\n\n  request?: {\n    decorationId: string;\n    id: number;\n    range: TextRange;\n    trigger: HoverTrigger;\n    uri?: string;\n    source: HoverSource;\n    renderer: MarkdownRenderer;\n  };\n\n  response?: {\n    id: number;\n    text: string;\n  };\n\n  constructor(private editor: CoreEditor) {\n    this.onMouseMove = debounce(this.onMouseMove.bind(this), 200);\n    this.onMouseLeave = debounce(this.onMouseLeave.bind(this), 200);\n    this.matchSource = debounce(this.matchSource.bind(this), 200);\n  }\n\n  clearActive() {\n    if (this.request) {\n      this.request.renderer.destroy();\n      this.request = undefined;\n    }\n    this.response = undefined;\n  }\n\n  private matchSource(trigger: HoverTrigger): void {\n    const sources: HoverSource[] = this.hoverSources;\n    let matched: HoverMatch | undefined = undefined;\n    const parentNode = trigger.node;\n\n    // if (parentNode && !parentNode.isTextblock && !parentNode.isText) { //\n    //   console.trace('!parentNode', trigger);\n    //   return;\n    // }\n\n    for (const source of sources) {\n      if (!source.match) {\n        continue;\n      }\n\n      const match = source.match(trigger);\n      if (match) {\n        matched = match;\n\n        this.handleSource(match, trigger);\n        break;\n      }\n    }\n\n    if (!matched) {\n      this.dispatchMeta({ clearRequest: true });\n    }\n\n    return undefined;\n  }\n\n  handleSource(match: HoverMatch, trigger: HoverTrigger) {\n    this.dispatchMeta({\n      setRequest: {\n        source: match.source,\n        range: match.range,\n        text: match.text,\n        uri: match.uri,\n        trigger,\n      },\n    });\n  }\n\n  onMouseLeave(view: EditorView, event: Event | undefined) {\n    this.dispatchMeta({\n      clearRequest: true,\n    });\n  }\n\n  onMouseMove(view: EditorView, event: MouseEvent) {\n    const coords = {\n      left: event.clientX,\n      top: event.clientY,\n    };\n\n    const result = view.posAtCoords(coords);\n\n    if (!result) return;\n    if (result.inside === -1) return;\n\n    const pos = result.pos;\n    const node = view.state.doc.nodeAt(pos) || undefined;\n\n    if (!node) {\n      console.error('NO NODE at', pos);\n    }\n\n    // Handle nodeview for code_block\n    const dom = view.nodeDOM(pos);\n    if (dom instanceof HTMLElement) {\n      const editorElement = dom.querySelector('[data-uri]');\n      const uri =\n        (editorElement ? editorElement.getAttribute('data-uri') : undefined) ||\n        undefined;\n\n      if (uri && editorElement) {\n        const range = getNodeRange(event);\n        if (range) {\n          const offset = getOffsetWithinElement(editorElement, range);\n\n          result.inside = offset;\n          if (result.inside === -1) return;\n\n          this.dispatchMeta({\n            trigger: {\n              pos: result.pos,\n              inside: result.inside,\n              node,\n              uri,\n            },\n          });\n        }\n        return;\n      }\n    }\n\n    if (!node) {\n      return;\n    }\n\n    // avoid redundant updates\n    // if (this.request?.range.from === result.range.from && this.request?.range.to === result.inside) return;\n\n    this.dispatchMeta({\n      trigger: {\n        pos: result.pos,\n        inside: result.inside,\n        node,\n        uri: undefined,\n      },\n    });\n  }\n\n  handleCommands(pluginMeta: HoverMeta | undefined, transaction: Transaction) {\n    if (!pluginMeta) {\n      return false;\n    }\n\n    if (pluginMeta.addHoverSource) {\n      this.hoverSources.push(pluginMeta.addHoverSource.hoverSource);\n      return true;\n    }\n\n    if (pluginMeta.trigger) {\n      this.matchSource(pluginMeta?.trigger);\n      return true;\n    }\n\n    if (pluginMeta?.setRequest) {\n      const id = this.idGenerator++;\n      const decorationId = `id_${Math.floor(Math.random() * 0xffffffff)}`;\n\n      let renderer = this.request?.renderer;\n      if (this.request?.source !== pluginMeta.setRequest.source) {\n        if (renderer) {\n          renderer.destroy();\n          renderer = undefined;\n        }\n      }\n      if (!renderer) {\n        renderer = new MarkdownRenderer(this.editor);\n        renderer.addEventListener('close', () => {\n          this.dispatchMeta({\n            clearRequest: true,\n          });\n        });\n      }\n\n      renderer.setAnchorSelector(`[data-decoration-id=\"${decorationId}\"]`, {\n        above: true,\n      });\n\n      this.request = {\n        id,\n        decorationId,\n        range: pluginMeta.setRequest.range,\n        uri: pluginMeta.setRequest.uri,\n        source: pluginMeta.setRequest.source,\n        trigger: pluginMeta.setRequest.trigger,\n        renderer,\n      };\n\n      const request = this.request;\n\n      const go = async () => {\n        const item = await request.source.getItem(\n          request.range,\n          request.trigger,\n        );\n        if (!item) {\n          return;\n        }\n\n        this.dispatchMeta({\n          setResponse: {\n            id,\n            text: item.text,\n          },\n        });\n      };\n      go();\n\n      return true;\n    }\n\n    if (pluginMeta?.setResponse && this.request) {\n      this.response = {\n        id: pluginMeta?.setResponse.id,\n        text: pluginMeta?.setResponse.text,\n      };\n\n      this.request?.renderer.setResponse({ text: this.response.text });\n\n      return true;\n    }\n\n    if (pluginMeta.clearRequest) {\n      this.clearRequest();\n      return true;\n    }\n\n    return false;\n  }\n\n  clearRequest() {\n    if (this.request) {\n      this.request.renderer.destroy();\n      this.request = undefined;\n    }\n    this.response = undefined;\n  }\n\n  dispatchMeta(meta: HoverMeta) {\n    const tr = this.editor.state.tr;\n    tr.setMeta(HoverPluginKey, meta);\n    this.editor.dispatchTransaction(tr);\n  }\n}\n\nfunction getNodeRange(\n  { clientX, clientY }: { clientX: number; clientY: number },\n) {\n  let range;\n\n  if (document.caretPositionFromPoint) {\n    const pos = document.caretPositionFromPoint(clientX, clientY);\n    if (!pos) return;\n    range = document.createRange();\n    range.setStart(pos.offsetNode, pos.offset);\n  } else if (document.caretRangeFromPoint) {\n    range = document.caretRangeFromPoint(clientX, clientY);\n  }\n\n  return range;\n}\n\nfunction getOffsetWithinElement(element: Node, range: Range): number {\n  const container = range.startContainer;\n  const offsetInNode = range.startOffset;\n\n  if (container === element) {\n    const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);\n    const firstText = walker.nextNode();\n    if (!firstText) return offsetInNode;\n    let total = 0;\n    let node: Text | null = firstText as Text;\n    while (node) {\n      if (node === container) return total + offsetInNode;\n      total += node.nodeValue?.length ?? 0;\n      node = walker.nextNode() as Text | null;\n    }\n    return total;\n  }\n\n  const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);\n  let total = 0;\n  let textNode = walker.nextNode() as Text | null;\n  while (textNode) {\n    if (textNode === container) {\n      return total + offsetInNode;\n    }\n    total += textNode.nodeValue?.length ?? 0;\n    textNode = walker.nextNode() as Text | null;\n  }\n  return -1;\n}\n\n// function matchSource(selection: Selection, sources: HoverSource[]) {\n//   let matched: MatchedSource | undefined = undefined;\n//   const parentNode = selection.$anchor.parent;\n\n//   for (const source of sources) {\n//     if (!source.match) {\n//       continue;\n//     }\n\n//     const trigger: HoverTrigger = {\n//       pos: 0,\n//       inside: 0,\n//       node: parentNode,\n//       uri: parentNode.attrs.uri\n//     };\n\n//     const match = source.match(trigger);\n//     if (match) {\n//       matched = match;\n//       return matched;\n//     }\n//   }\n//   return undefined;\n// }\n\nexport class HoverPlugin<Item, TSelected> extends Plugin<HoverState> {\n  constructor(config: HoverConfig, editor: CoreEditor) {\n    super({\n      key: HoverPluginKey,\n      state: {\n        init() {\n          const prevState = HoverPluginKey.getState(editor.state);\n          if (prevState) { // preserve config after loadDocument\n            return prevState;\n          }\n          return new HoverState(editor);\n        },\n\n        apply(transaction, nextHoverState: HoverState, prevState, state) {\n          if (transaction.docChanged) {\n            nextHoverState.dispatchMeta({ clearRequest: true });\n          }\n\n          if (transaction.isGeneric) {\n            return nextHoverState;\n          }\n\n          const pluginMeta: HoverMeta | undefined = transaction.getMeta(\n            HoverPluginKey,\n          );\n\n          if (nextHoverState.handleCommands(pluginMeta, transaction)) {\n            return nextHoverState;\n          }\n\n          return nextHoverState;\n        },\n      },\n\n      view() {\n        return {\n          update: async (view, prevState) => {\n            return;\n          },\n\n          destroy: () => {\n            const pluginState = HoverPluginKey.getState(editor.state);\n            if (!pluginState) {\n              return;\n            }\n\n            if (pluginState.request) {\n              pluginState.request.renderer.destroy();\n            }\n          },\n        };\n      },\n\n      props: {\n        handleDOMEvents: {\n          mousemove: (view, event) => {\n            const pluginState = HoverPluginKey.getState(editor.state);\n            if (!pluginState) {\n              return;\n            }\n            pluginState.onMouseMove(view, event);\n            return;\n          },\n          mouseleave: (view, event) => {\n            const pluginState = HoverPluginKey.getState(editor.state);\n            if (!pluginState) {\n              return;\n            }\n            pluginState.onMouseLeave(view, event);\n            return;\n          },\n        },\n\n        decorations(state) {\n          const { request } = this.getState(state) || {};\n\n          if (!request) {\n            return null;\n          }\n\n          const attrs = {\n            class: config.decorationClass || 'kb-hover--decor',\n            'data-decoration-id': request.decorationId,\n          };\n\n          if (request.range.from === request.range.to) {\n            return DecorationSet.create(state.doc, [\n              Decoration.widget(request.range.from, () => {\n                const widgetNode = document.createElement('span');\n                widgetNode.className = attrs.class;\n                for (const [k, v] of Object.entries(attrs)) {\n                  widgetNode.setAttribute(k, v);\n                }\n                return widgetNode;\n              }, attrs),\n            ]);\n          } else {\n            return DecorationSet.create(state.doc, [\n              Decoration.inline(request.range.from, request.range.to, {\n                ...attrs,\n              }),\n            ]);\n          }\n        },\n      },\n    });\n  }\n}\n","import type { EditorState, Plugin, Transaction } from 'prosemirror-state';\n\nimport { CommandFactories, Extension } from '@kerebron/editor';\nimport { CommandFactory } from '@kerebron/editor/commands';\n\nimport { HoverPlugin, HoverPluginKey } from './HoverPlugin.ts';\nimport { HoverConfig, HoverSource } from './types.ts';\n\nexport class ExtensionHover extends Extension {\n  name = 'hover';\n\n  public constructor(\n    public override config: HoverConfig = {},\n  ) {\n    super(config);\n  }\n\n  override getCommandFactories(): Partial<CommandFactories> {\n    const addHoverSource: CommandFactory = (\n      hoverSource: HoverSource,\n    ) => {\n      return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        const tr = state.tr;\n        tr.setMeta(HoverPluginKey, {\n          addHoverSource: { hoverSource },\n        });\n\n        if (dispatch) {\n          dispatch(tr);\n        }\n\n        return true;\n      };\n    };\n\n    return {\n      addHoverSource,\n    };\n  }\n\n  override getProseMirrorPlugins(): Plugin[] {\n    return [\n      new HoverPlugin(this.config, this.editor),\n    ];\n  }\n}\n"],"x_google_ignoreList":[0,1,2,3,4,75,96,123,172,173],"mappings":"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ACxB,IAAU,CAAE,KAAM,KAAM,CAC1B,EAEI,eAAiB,CACnB,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EAAK,KACL,EAAK,KACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,KACL,EA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"}