@b9g/revise 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/edit.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"edit.cjs","sources":["../src/_subseq.ts","../src/edit.ts"],"sourcesContent":["/*\n * This module provides utility functions for building and operating on\n * “subsequences.” Subsequences are created by taking zero or more elements\n * from a sequence while preserving the order of the remaining elements. While\n * this specific module does not care about what those sequences actually are,\n * for the purposes of this library, sequences are always strings, measured in\n * UTF-16 code units, and subsequences can be used to represent operations over\n * the entire string like insertions and deletions.\n *\n * We define subsequences as arrays of numbers, where each number represents\n * the length of a continguous segment from the original sequence. These number\n * alternate between representing excluded and included segments from the\n * original sequence, with the first number representing the length of an\n * excluded segment. In other words, the first segment represents an excluded\n * segment, the second included, the third excluded, etc.\n *\n * Given the string sequence \"abcdefgh\", the following subsequence arrays\n * represent the indicated strings.\n *\n * [0, 4, 4] = \"abcd\"\n * [4, 4] = \"efgh\"\n * [0, 2, 2, 2, 2] = \"ab\" \"ef\"\n * [2, 2, 2, 2] = \"cd\" \"gh\"\n * [0, 1, 6, 1] = \"a\" \"h\"\n * [1, 1, 1, 1, 1, 1, 1, 1] = \"b\" \"d\" \"f\" \"h\"\n *\n * Because the first segment is always excluded, a subsequence array will start\n * with a 0 if the subsequence to indicate that the first element of the\n * sequence is included. No other 0s will appear in a well-constructed\n * subsequence array.\n *\n * This module is private to the revise package and separate from \"./edit.js\"\n * for testing purposes.\n */\nexport type Subseq = Array<number>;\n\nexport function measure(\n\tsubseq: Subseq,\n): {length: number; includedLength: number; excludedLength: number} {\n\tlet length = 0,\n\t\tincludedLength = 0,\n\t\texcludedLength = 0;\n\tfor (let i = 0; i < subseq.length; i++) {\n\t\tconst s = subseq[i];\n\t\tlength += s;\n\t\tif (i % 2 === 0) {\n\t\t\texcludedLength += s;\n\t\t} else {\n\t\t\tincludedLength += s;\n\t\t}\n\t}\n\n\treturn {length, includedLength, excludedLength};\n}\n\nexport function pushSegment(\n\tsubseq: Subseq,\n\tlength: number,\n\tincluded: boolean,\n): void {\n\tif (length < 0) {\n\t\tthrow new RangeError(\"Negative length\");\n\t} else if (length === 0) {\n\t\treturn;\n\t} else if (!subseq.length) {\n\t\tif (included) {\n\t\t\tsubseq.push(0, length);\n\t\t} else {\n\t\t\tsubseq.push(length);\n\t\t}\n\t} else {\n\t\tconst included1 = subseq.length % 2 === 0;\n\t\tif (included === included1) {\n\t\t\tsubseq[subseq.length - 1] += length;\n\t\t} else {\n\t\t\tsubseq.push(length);\n\t\t}\n\t}\n}\n\n///** A utility method to debug subseqs. */\n//function print(subseq: Subseq): string {\n//\tlet result = \"\";\n//\tfor (let i = 0; i < subseq.length; i++) {\n//\t\tif (i % 2 === 0) {\n//\t\t\tresult += \"=\".repeat(subseq[i]);\n//\t\t} else {\n//\t\t\tresult += \"+\".repeat(subseq[i]);\n//\t\t}\n//\t}\n//\n//\treturn result;\n//}\n\nexport function contains(subseq: Subseq, index: number): boolean {\n\tif (index < 0) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < subseq.length; i++) {\n\t\tindex -= subseq[i];\n\t\tif (index < 0) {\n\t\t\treturn i % 2 === 1;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function clear(subseq: Subseq): Subseq {\n\tconst {length} = measure(subseq);\n\treturn length ? [length] : [];\n}\n\nexport function fill(subseq: Subseq): Subseq {\n\tconst {length} = measure(subseq);\n\treturn length ? [0, length] : [];\n}\n\nexport function complement(subseq: Subseq): Subseq {\n\treturn subseq[0] === 0 ? subseq.slice(1) : [0, ...subseq];\n}\n\nexport function align(\n\tsubseq1: Subseq,\n\tsubseq2: Subseq,\n): Array<[number, boolean, boolean]> {\n\tif (measure(subseq1).length !== measure(subseq2).length) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Array<[number, boolean, boolean]> = [];\n\tfor (\n\t\tlet i1 = 0,\n\t\t\ti2 = 0,\n\t\t\tlength1 = 0,\n\t\t\tlength2 = 0,\n\t\t\tincluded1 = true,\n\t\t\tincluded2 = true;\n\t\ti1 < subseq1.length || i2 < subseq2.length;\n\n\t) {\n\t\tif (length1 === 0) {\n\t\t\tif (i1 >= subseq1.length) {\n\t\t\t\tthrow new Error(\"Length mismatch\");\n\t\t\t}\n\n\t\t\tlength1 = subseq1[i1++];\n\t\t\tincluded1 = !included1;\n\t\t}\n\n\t\tif (length2 === 0) {\n\t\t\tif (i2 >= subseq2.length) {\n\t\t\t\tthrow new Error(\"Size mismatch\");\n\t\t\t}\n\n\t\t\tlength2 = subseq2[i2++];\n\t\t\tincluded2 = !included2;\n\t\t}\n\n\t\tif (length1 < length2) {\n\t\t\tif (length1) {\n\t\t\t\tresult.push([length1, included1, included2]);\n\t\t\t}\n\n\t\t\tlength2 = length2 - length1;\n\t\t\tlength1 = 0;\n\t\t} else if (length1 > length2) {\n\t\t\tif (length2) {\n\t\t\t\tresult.push([length2, included1, included2]);\n\t\t\t}\n\n\t\t\tlength1 = length1 - length2;\n\t\t\tlength2 = 0;\n\t\t} else {\n\t\t\tif (length1) {\n\t\t\t\tresult.push([length1, included1, included2]);\n\t\t\t}\n\n\t\t\tlength1 = length2 = 0;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function union(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 || included2);\n\t}\n\n\treturn result;\n}\n\nexport function intersection(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 && included2);\n\t}\n\n\treturn result;\n}\n\nexport function difference(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Array<number> = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 && !included2);\n\t}\n\n\treturn result;\n}\n\nexport function shrink(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tif (measure(subseq1).length !== measure(subseq2).length) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tif (!included2) {\n\t\t\tpushSegment(result, length, included1);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function expand(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tif (measure(subseq1).length !== measure(subseq2).excludedLength) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Array<number> = [];\n\tfor (\n\t\tlet i1 = 0, i2 = 0, length1 = 0, included1 = true, included2 = true;\n\t\ti2 < subseq2.length;\n\t\ti2++\n\t) {\n\t\tlet length2 = subseq2[i2];\n\t\tincluded2 = !included2;\n\t\tif (included2) {\n\t\t\tpushSegment(result, length2, false);\n\t\t} else {\n\t\t\twhile (length2) {\n\t\t\t\tif (length1 === 0) {\n\t\t\t\t\tlength1 = subseq1[i1++];\n\t\t\t\t\tincluded1 = !included1;\n\t\t\t\t}\n\n\t\t\t\tconst minLength = Math.min(length1, length2);\n\t\t\t\tpushSegment(result, minLength, included1);\n\t\t\t\tlength1 -= minLength;\n\t\t\t\tlength2 -= minLength;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function interleave(subseq1: Subseq, subseq2: Subseq): [Subseq, Subseq] {\n\tif (measure(subseq1).excludedLength !== measure(subseq2).excludedLength) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result1: Array<number> = [];\n\tconst result2: Array<number> = [];\n\tfor (\n\t\tlet i1 = 0,\n\t\t\ti2 = 0,\n\t\t\tlength1 = 0,\n\t\t\tlength2 = 0,\n\t\t\tincluded1 = true,\n\t\t\tincluded2 = true;\n\t\ti1 < subseq1.length || i2 < subseq2.length;\n\n\t) {\n\t\tif (length1 === 0 && i1 < subseq1.length) {\n\t\t\tlength1 = subseq1[i1++];\n\t\t\tincluded1 = !included1;\n\t\t}\n\n\t\tif (length2 === 0 && i2 < subseq2.length) {\n\t\t\tlength2 = subseq2[i2++];\n\t\t\tincluded2 = !included2;\n\t\t}\n\n\t\tif (included1 && included2) {\n\t\t\tpushSegment(result1, length1, true);\n\t\t\tpushSegment(result1, length2, false);\n\t\t\tpushSegment(result2, length1, false);\n\t\t\tpushSegment(result2, length2, true);\n\t\t\tlength1 = length2 = 0;\n\t\t} else if (included1) {\n\t\t\tpushSegment(result1, length1, true);\n\t\t\tpushSegment(result2, length1, false);\n\t\t\tlength1 = 0;\n\t\t} else if (included2) {\n\t\t\tpushSegment(result1, length2, false);\n\t\t\tpushSegment(result2, length2, true);\n\t\t\tlength2 = 0;\n\t\t} else {\n\t\t\tconst minLength = Math.min(length1, length2);\n\t\t\tpushSegment(result1, minLength, false);\n\t\t\tpushSegment(result2, minLength, false);\n\t\t\tlength1 -= minLength;\n\t\t\tlength2 -= minLength;\n\t\t}\n\t}\n\n\treturn [result1, result2];\n}\n","import * as S from \"./_subseq.js\";\nimport type {Subseq} from \"./_subseq.js\";\n\nexport interface InsertOperation {\n\ttype: \"insert\";\n\tstart: number;\n\tvalue: string;\n}\n\nexport interface RetainOperation {\n\ttype: \"retain\";\n\tstart: number;\n\tend: number;\n}\n\nexport interface DeleteOperation {\n\ttype: \"delete\";\n\tstart: number;\n\tend: number;\n\tvalue: string | undefined;\n}\n\nexport type Operation = RetainOperation | DeleteOperation | InsertOperation;\n\nexport interface EditBuilder {\n\tretain(length: number): EditBuilder;\n\n\tdelete(length: number): EditBuilder;\n\n\tinsert(value: string): EditBuilder;\n\n\tconcat(edit: Edit): EditBuilder;\n\n\tbuild(): Edit;\n}\n\n/** A compact data structure for representing changes to strings. */\nexport class Edit {\n\t/**\n\t * An array of strings and integers representing operations.\n\t *\n\t * Strings represent insertions, and pairs of integers represent the start\n\t * and end indices of retained segments. Deletions are implied by gaps\n\t * between the retained segments.\n\t *\n\t * Examples:\n\t *\n\t * [0, 3, 7, 10]\n\t * retain 0-3, delete 3-7, retain 7-10\n\t *\n\t * [\"hello\", 0, 10]\n\t * insert \"hello\", retain 0-10\n\t *\n\t * [0, 5, \" \", 6, 10]\n\t * retain 0-5, insert \" \", delete 5-6, retain 6-10\n\t *\n\t * If the edit includes a delete operation at its end, this is signified by\n\t * an extra number signifying the length. Therefore, regardless of whether or\n\t * not the last character of the string is retained, the last number will\n\t * always represent the length of the original string.\n\t *\n\t * // retain 0-10, delete 10-11\n\t * [0, 10, 11]\n\t *\n\t * An edit that is only retains will contain a single number representing the\n\t * length of the string.\n\t */\n\tdeclare parts: Array<string | number>;\n\n\t/**\n\t * A string which represents a concatenation of all deletions.\n\t *\n\t * This property is optional, but required if you want to invert the edit.\n\t */\n\tdeclare deleted: string | undefined;\n\n\tconstructor(parts: Array<string | number>, deleted?: string) {\n\t\tthis.parts = parts;\n\t\tthis.deleted = deleted;\n\t}\n\n\t/** A string which represents a concatenation of all insertions. */\n\tget inserted(): string {\n\t\tlet text = \"\";\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tif (typeof this.parts[i] === \"string\") {\n\t\t\t\ttext += this.parts[i];\n\t\t\t}\n\t\t}\n\n\t\treturn text;\n\t}\n\n\t/**\n\t * Returns an array of operations, which is more readable than the parts\n\t * array.\n\t *\n\t * new Edit([0, 1, \" \", 2], \"x\").operations();\n\t * [\n\t * {type: \"retain\", start: 0, end: 1},\n\t * {type: \"insert\", start: 1, value: \" \"},\n\t * {type: \"delete\", start: 1, end: 2, value: \"x\"},\n\t * ]\n\t *\n\t * When insertions and deletions happen at the same index, insertions will\n\t * always appear before deletions in the operations array.\n\t */\n\toperations(): Array<Operation> {\n\t\tconst operations: Array<Operation> = [];\n\t\tlet retaining = false;\n\t\tlet index = 0;\n\t\tlet deleteStart = 0;\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tconst part = this.parts[i];\n\t\t\tif (typeof part === \"number\") {\n\t\t\t\tif (part < index) {\n\t\t\t\t\tthrow new TypeError(\"Malformed edit\");\n\t\t\t\t} else if (part > index) {\n\t\t\t\t\tif (retaining) {\n\t\t\t\t\t\toperations.push({type: \"retain\", start: index, end: part});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof this.deleted === \"undefined\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: this.deleted.slice(deleteStart, part);\n\t\t\t\t\t\toperations.push({\n\t\t\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\t\t\tstart: index,\n\t\t\t\t\t\t\tend: part,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdeleteStart = part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = part;\n\t\t\t\tretaining = !retaining;\n\t\t\t} else {\n\t\t\t\toperations.push({type: \"insert\", start: index, value: part});\n\t\t\t}\n\t\t}\n\n\t\treturn operations;\n\t}\n\n\tapply(text: string): string {\n\t\tlet text1 = \"\";\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"retain\":\n\t\t\t\t\ttext1 += text.slice(op.start, op.end);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"insert\":\n\t\t\t\t\ttext1 += op.value;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn text1;\n\t}\n\n\t/** Composes two consecutive edits. */\n\tcompose(that: Edit): Edit {\n\t\tlet [insertSeq1, inserted1, deleteSeq1, deleted1] = factor(this);\n\t\tlet [insertSeq2, inserted2, deleteSeq2, deleted2] = factor(that);\n\t\t// Expand all subseqs so that they share the same coordinate space.\n\t\tdeleteSeq1 = S.expand(deleteSeq1, insertSeq1);\n\t\tdeleteSeq2 = S.expand(deleteSeq2, deleteSeq1);\n\t\t[deleteSeq1, insertSeq2] = S.interleave(deleteSeq1, insertSeq2);\n\t\tdeleteSeq2 = S.expand(deleteSeq2, insertSeq2);\n\t\tinsertSeq1 = S.expand(insertSeq1, insertSeq2);\n\n\t\t{\n\t\t\t// Find insertions which have been deleted and remove them.\n\t\t\tconst toggleSeq = S.intersection(insertSeq1, deleteSeq2);\n\t\t\tif (S.measure(toggleSeq).includedLength) {\n\t\t\t\tdeleteSeq1 = S.shrink(deleteSeq1, toggleSeq);\n\t\t\t\tinserted1 = erase(insertSeq1, inserted1, toggleSeq);\n\t\t\t\tinsertSeq1 = S.shrink(insertSeq1, toggleSeq);\n\t\t\t\tdeleteSeq2 = S.shrink(deleteSeq2, toggleSeq);\n\t\t\t\tinsertSeq2 = S.shrink(insertSeq2, toggleSeq);\n\t\t\t}\n\t\t}\n\n\t\tconst insertSeq = S.union(insertSeq1, insertSeq2);\n\t\tconst inserted = consolidate(insertSeq1, inserted1, insertSeq2, inserted2);\n\t\tconst deleteSeq = S.shrink(S.union(deleteSeq1, deleteSeq2), insertSeq);\n\t\tconst deleted =\n\t\t\tdeleted1 != null && deleted2 != null\n\t\t\t\t? consolidate(deleteSeq1, deleted1, deleteSeq2, deleted2)\n\t\t\t\t: undefined;\n\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted).normalize();\n\t}\n\n\tinvert(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Edit is not invertible\");\n\t\t}\n\n\t\tlet [insertSeq, inserted, deleteSeq, deleted] = factor(this);\n\t\tdeleteSeq = S.expand(deleteSeq, insertSeq);\n\t\tinsertSeq = S.shrink(insertSeq, deleteSeq);\n\t\treturn synthesize(deleteSeq, deleted!, insertSeq, inserted);\n\t}\n\n\tnormalize(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Edit is not normalizable\");\n\t\t}\n\n\t\tconst insertSeq: Array<number> = [];\n\t\tconst deleteSeq: Array<number> = [];\n\t\tlet inserted = \"\";\n\t\tlet deleted = \"\";\n\t\tlet insertion: string | undefined;\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tinsertion = op.value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"retain\": {\n\t\t\t\t\tif (insertion !== undefined) {\n\t\t\t\t\t\tS.pushSegment(insertSeq, insertion.length, true);\n\t\t\t\t\t\tinserted += insertion;\n\t\t\t\t\t\tinsertion = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tS.pushSegment(insertSeq, op.end - op.start, false);\n\t\t\t\t\tS.pushSegment(deleteSeq, op.end - op.start, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tconst length = op.end - op.start;\n\t\t\t\t\tconst deletion = op.value!;\n\t\t\t\t\tlet prefix = 0;\n\t\t\t\t\tlet suffix = 0;\n\t\t\t\t\tif (insertion !== undefined) {\n\t\t\t\t\t\tif (insertion === deletion) {\n\t\t\t\t\t\t\tprefix = deletion.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprefix = commonPrefixLength(insertion, deletion);\n\t\t\t\t\t\t\tsuffix = commonSuffixLength(\n\t\t\t\t\t\t\t\tinsertion.slice(prefix),\n\t\t\t\t\t\t\t\tdeletion.slice(prefix),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tS.pushSegment(insertSeq, prefix, false);\n\t\t\t\t\t\tS.pushSegment(insertSeq, insertion.length - prefix - suffix, true);\n\t\t\t\t\t\tinserted += insertion.slice(prefix, insertion.length - suffix);\n\t\t\t\t\t}\n\n\t\t\t\t\tdeleted += deletion.slice(prefix, deletion.length - suffix);\n\t\t\t\t\tS.pushSegment(deleteSeq, prefix, false);\n\t\t\t\t\t// TODO: This line is throwing for some reason\n\t\t\t\t\tS.pushSegment(deleteSeq, length - prefix - suffix, true);\n\t\t\t\t\tS.pushSegment(deleteSeq, suffix, false);\n\n\t\t\t\t\tS.pushSegment(insertSeq, length - prefix - suffix, false);\n\t\t\t\t\tS.pushSegment(insertSeq, suffix, false);\n\t\t\t\t\tinsertion = undefined;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (insertion !== undefined) {\n\t\t\tS.pushSegment(insertSeq, insertion.length, true);\n\t\t\tinserted += insertion;\n\t\t}\n\n\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t}\n\n\thasChangesBetween(start: number, end: number): boolean {\n\t\tconst ops = this.operations();\n\t\tfor (const op of ops) {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(start <= op.start && op.start <= end) ||\n\t\t\t\t\t\t(start <= op.end && op.end <= end)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tif (start <= op.start && op.start <= end) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tstatic builder(value?: string | undefined): EditBuilder {\n\t\tlet index = 0;\n\t\tlet inserted = \"\";\n\t\tlet deleted: string | undefined = undefined;\n\t\tconst insertSeq: Subseq = [];\n\t\tconst deleteSeq: Subseq = [];\n\n\t\treturn {\n\t\t\tretain(length: number) {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tlength = Math.min(value.length - index, length);\n\t\t\t\t}\n\n\t\t\t\tindex += length;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, false);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tdelete(length: number) {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tlength = Math.min(value.length - index, length);\n\t\t\t\t\tdeleted = (deleted || \"\") + value.slice(index, index + length);\n\t\t\t\t}\n\n\t\t\t\tindex += length;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, true);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tinsert(value: string) {\n\t\t\t\tS.pushSegment(insertSeq, value.length, true);\n\t\t\t\tinserted += value;\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tconcat(edit: Edit) {\n\t\t\t\tconst ops = edit.operations();\n\t\t\t\tfor (const op of ops) {\n\t\t\t\t\tswitch (op.type) {\n\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\tthis.delete(op.end - op.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\t\tthis.insert(op.value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"retain\":\n\t\t\t\t\t\t\tthis.retain(op.end - op.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value != null && index > value.length) {\n\t\t\t\t\tthrow new RangeError(\"Edit is longer than original value\");\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tbuild(): Edit {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tdeleted = deleted || \"\";\n\t\t\t\t\tif (index < value.length) {\n\t\t\t\t\t\tS.pushSegment(insertSeq, value.length - index, false);\n\t\t\t\t\t\tS.pushSegment(deleteSeq, value.length - index, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Given two strings, this method finds an edit which can be applied to the\n\t * first string to result in the second.\n\t *\n\t * @param startHint - An optional hint can be provided to disambiguate edits\n\t * which cannot be inferred by comparing the text alone. For example,\n\t * inserting \"a\" into the string \"aaaa\" to make it \"aaaaa\" could be an\n\t * insertion at any index in the string. This value should be the smaller of\n\t * the start indices of the selection from before and after the edit.\n\t */\n\tstatic diff(text1: string, text2: string, startHint?: number): Edit {\n\t\tlet prefix = commonPrefixLength(text1, text2);\n\t\tlet suffix = commonSuffixLength(text1, text2);\n\t\t// prefix and suffix overlap when edits are in runs of the same character.\n\t\tif (prefix + suffix > Math.min(text1.length, text2.length)) {\n\t\t\tif (startHint != null && startHint >= 0) {\n\t\t\t\tprefix = Math.min(prefix, startHint);\n\t\t\t}\n\n\t\t\t// TODO: We can probably avoid the commonSuffixLength() call here in\n\t\t\t// favor of arithmetic but I’m too dumb to figure it out.\n\t\t\tsuffix = commonSuffixLength(text1.slice(prefix), text2.slice(prefix));\n\t\t}\n\n\t\treturn Edit.builder(text1)\n\t\t\t.retain(prefix)\n\t\t\t.insert(text2.slice(prefix, text2.length - suffix))\n\t\t\t.delete(text1.length - prefix - suffix)\n\t\t\t.retain(suffix)\n\t\t\t.build();\n\t}\n}\n\nfunction synthesize(\n\tinsertSeq: Subseq,\n\tinserted: string,\n\tdeleteSeq: Subseq,\n\tdeleted?: string | undefined,\n): Edit {\n\tif (S.measure(insertSeq).includedLength !== inserted.length) {\n\t\tthrow new Error(\"insertSeq and inserted string do not match in length\");\n\t} else if (\n\t\tdeleted !== undefined &&\n\t\tS.measure(deleteSeq).includedLength !== deleted.length\n\t) {\n\t\tthrow new Error(\"deleteSeq and deleted string do not match in length\");\n\t}\n\n\tconst parts: Array<string | number> = [];\n\tlet insertIndex = 0;\n\tlet retainIndex = 0;\n\tlet needsLength = true;\n\tfor (const [length, deleting, inserting] of S.align(\n\t\tS.expand(deleteSeq, insertSeq),\n\t\tinsertSeq,\n\t)) {\n\t\tif (inserting) {\n\t\t\tconst insertion = inserted.slice(insertIndex, insertIndex + length);\n\t\t\tif (parts.length && typeof parts[parts.length - 1] === \"string\") {\n\t\t\t\tparts[parts.length - 1] += insertion;\n\t\t\t} else {\n\t\t\t\tparts.push(insertion);\n\t\t\t}\n\n\t\t\tinsertIndex += length;\n\t\t} else {\n\t\t\tif (!deleting) {\n\t\t\t\tparts.push(retainIndex, retainIndex + length);\n\t\t\t}\n\n\t\t\tretainIndex += length;\n\t\t\tneedsLength = deleting;\n\t\t}\n\t}\n\n\tif (needsLength) {\n\t\tparts.push(retainIndex);\n\t}\n\n\treturn new Edit(parts, deleted);\n}\n\nfunction factor(edit: Edit): [Subseq, string, Subseq, string | undefined] {\n\tconst insertSeq: Array<number> = [];\n\tconst deleteSeq: Array<number> = [];\n\tlet inserted = \"\";\n\tconst operations = edit.operations();\n\tfor (let i = 0; i < operations.length; i++) {\n\t\tconst op = operations[i];\n\t\tswitch (op.type) {\n\t\t\tcase \"retain\": {\n\t\t\t\tconst length = op.end - op.start;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tconst length = op.end - op.start;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, true);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"insert\":\n\t\t\t\tS.pushSegment(insertSeq, op.value.length, true);\n\t\t\t\tinserted += op.value;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn [insertSeq, inserted, deleteSeq, edit.deleted];\n}\n\n/**\n * Given two subseqs and strings which are represented by the included segments\n * of the subseqs, this function combines the two strings so that they overlap\n * according to the positions of the included segments of subseqs.\n *\n * The subseqs must have the same length, and the included segments of these\n * subseqs may not overlap.\n */\nfunction consolidate(\n\tsubseq1: Subseq,\n\ttext1: string,\n\tsubseq2: Subseq,\n\ttext2: string,\n): string {\n\tlet i1 = 0;\n\tlet i2 = 0;\n\tlet result = \"\";\n\tfor (const [length, included1, included2] of S.align(subseq1, subseq2)) {\n\t\tif (included1 && included2) {\n\t\t\tthrow new Error(\"Overlapping subseqs\");\n\t\t} else if (included1) {\n\t\t\tresult += text1.slice(i1, i1 + length);\n\t\t\ti1 += length;\n\t\t} else if (included2) {\n\t\t\tresult += text2.slice(i2, i2 + length);\n\t\t\ti2 += length;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Given two subseqs as well a string which is represented by the included\n * segments of the first subseq, this function returns the result of removing\n * the included segments of the second subseq from the first subseq.\n *\n * The subseqs must have the same length, and the included segments of the second\n * subseq must overlap with the first subseq’s included segments.\n */\nfunction erase(subseq1: Subseq, str: string, subseq2: Subseq): string {\n\tlet i = 0;\n\tlet result = \"\";\n\tfor (const [length, included1, included2] of S.align(subseq1, subseq2)) {\n\t\tif (included1) {\n\t\t\tif (!included2) {\n\t\t\t\tresult += str.slice(i, i + length);\n\t\t\t}\n\n\t\t\ti += length;\n\t\t} else if (included2) {\n\t\t\tthrow new Error(\"Non-overlapping subseqs\");\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/** @returns The length of the common prefix between two strings. */\nfunction commonPrefixLength(text1: string, text2: string) {\n\tconst length = Math.min(text1.length, text2.length);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (text1[i] !== text2[i]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn length;\n}\n\n/** @returns The length of the common suffix between two strings. */\nfunction commonSuffixLength(text1: string, text2: string) {\n\tconst length1 = text1.length;\n\tconst length2 = text2.length;\n\tconst length = Math.min(length1, length2);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (text1[length1 - i - 1] !== text2[length2 - i - 1]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn length;\n}\n"],"names":["S.expand","S.interleave","S.intersection","S.measure","S.shrink","S.union","S.pushSegment","S.align"],"mappings":";;;;AAoCM,SAAU,OAAO,CACtB,MAAc,EAAA;IAEd,IAAI,MAAM,GAAG,CAAC,EACb,cAAc,GAAG,CAAC,EAClB,cAAc,GAAG,CAAC,CAAC;AACpB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,CAAC,CAAC;AACZ,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAChB,cAAc,IAAI,CAAC,CAAC;AACpB,SAAA;AAAM,aAAA;YACN,cAAc,IAAI,CAAC,CAAC;AACpB,SAAA;AACD,KAAA;AAED,IAAA,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,cAAc,EAAC,CAAC;AACjD,CAAC;SAEe,WAAW,CAC1B,MAAc,EACd,MAAc,EACd,QAAiB,EAAA;IAEjB,IAAI,MAAM,GAAG,CAAC,EAAE;AACf,QAAA,MAAM,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxC,KAAA;SAAM,IAAI,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO;AACP,KAAA;AAAM,SAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAC1B,QAAA,IAAI,QAAQ,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACvB,SAAA;AAAM,aAAA;AACN,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpB,SAAA;AACD,KAAA;AAAM,SAAA;QACN,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;AACpC,SAAA;AAAM,aAAA;AACN,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpB,SAAA;AACD,KAAA;AACF,CAAC;AA6Ce,SAAA,KAAK,CACpB,OAAe,EACf,OAAe,EAAA;AAEf,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AACxD,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,MAAM,GAAsC,EAAE,CAAC;AACrD,IAAA,KACC,IAAI,EAAE,GAAG,CAAC,EACT,EAAE,GAAG,CAAC,EACN,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,EACX,SAAS,GAAG,IAAI,EAChB,SAAS,GAAG,IAAI,EACjB,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAEzC;QACD,IAAI,OAAO,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,OAAO,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACjC,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,OAAO,GAAG,OAAO,EAAE;AACtB,YAAA,IAAI,OAAO,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;aAAM,IAAI,OAAO,GAAG,OAAO,EAAE;AAC7B,YAAA,IAAI,OAAO,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA;AACN,YAAA,IAAI,OAAO,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;AACtB,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,KAAK,CAAC,OAAe,EAAE,OAAe,EAAA;IACrD,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACrE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;AACpD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,YAAY,CAAC,OAAe,EAAE,OAAe,EAAA;IAC5D,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACrE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;AACpD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAWe,SAAA,MAAM,CAAC,OAAe,EAAE,OAAe,EAAA;AACtD,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AACxD,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACrE,IAAI,CAAC,SAAS,EAAE;AACf,YAAA,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,MAAM,CAAC,OAAe,EAAE,OAAe,EAAA;AACtD,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;AAChE,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;AACjC,IAAA,KACC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EACnE,EAAE,GAAG,OAAO,CAAC,MAAM,EACnB,EAAE,EAAE,EACH;AACD,QAAA,IAAI,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,QAAA,IAAI,SAAS,EAAE;AACd,YAAA,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACpC,SAAA;AAAM,aAAA;AACN,YAAA,OAAO,OAAO,EAAE;gBACf,IAAI,OAAO,KAAK,CAAC,EAAE;AAClB,oBAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,iBAAA;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,gBAAA,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC1C,OAAO,IAAI,SAAS,CAAC;gBACrB,OAAO,IAAI,SAAS,CAAC;AACrB,aAAA;AACD,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,UAAU,CAAC,OAAe,EAAE,OAAe,EAAA;AAC1D,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;AACxE,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAkB,EAAE,CAAC;AAClC,IAAA,KACC,IAAI,EAAE,GAAG,CAAC,EACT,EAAE,GAAG,CAAC,EACN,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,EACX,SAAS,GAAG,IAAI,EAChB,SAAS,GAAG,IAAI,EACjB,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAEzC;QACD,IAAI,OAAO,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;AACzC,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,OAAO,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;AACzC,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,SAAS,IAAI,SAAS,EAAE;AAC3B,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;AACtB,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;AACrB,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;AACrB,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACpC,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA;YACN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,YAAA,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACvC,YAAA,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACvC,OAAO,IAAI,SAAS,CAAC;YACrB,OAAO,IAAI,SAAS,CAAC;AACrB,SAAA;AACD,KAAA;AAED,IAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3B;;ACpRA;MACa,IAAI,CAAA;IAuChB,WAAY,CAAA,KAA6B,EAAE,OAAgB,EAAA;AAC1D,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACvB;;AAGD,IAAA,IAAI,QAAQ,GAAA;QACX,IAAI,IAAI,GAAG,EAAE,CAAC;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACtC,gBAAA,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,aAAA;AACD,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACZ;AAED;;;;;;;;;;;;;AAaG;IACH,UAAU,GAAA;QACT,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC7B,IAAI,IAAI,GAAG,KAAK,EAAE;AACjB,oBAAA,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC;AACtC,iBAAA;qBAAM,IAAI,IAAI,GAAG,KAAK,EAAE;AACxB,oBAAA,IAAI,SAAS,EAAE;AACd,wBAAA,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC,CAAC;AAC3D,qBAAA;AAAM,yBAAA;AACN,wBAAA,MAAM,KAAK,GACV,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW;AAClC,8BAAE,SAAS;8BACT,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;wBAC1C,UAAU,CAAC,IAAI,CAAC;AACf,4BAAA,IAAI,EAAE,QAAQ;AACd,4BAAA,KAAK,EAAE,KAAK;AACZ,4BAAA,GAAG,EAAE,IAAI;4BACT,KAAK;AACL,yBAAA,CAAC,CAAC;wBACH,WAAW,GAAG,IAAI,CAAC;AACnB,qBAAA;AACD,iBAAA;gBAED,KAAK,GAAG,IAAI,CAAC;gBACb,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,aAAA;AAAM,iBAAA;AACN,gBAAA,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;AAC7D,aAAA;AACD,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KAClB;AAED,IAAA,KAAK,CAAC,IAAY,EAAA;QACjB,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAA,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACzB,QAAQ,EAAE,CAAC,IAAI;AACd,gBAAA,KAAK,QAAQ;AACZ,oBAAA,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;oBACtC,MAAM;AACP,gBAAA,KAAK,QAAQ;AACZ,oBAAA,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC;oBAClB,MAAM;AACP,aAAA;AACD,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACb;;AAGD,IAAA,OAAO,CAAC,IAAU,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;;QAEjE,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9C,QAAA,CAAC,UAAU,EAAE,UAAU,CAAC,GAAGC,UAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChE,UAAU,GAAGD,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAE9C,QAAA;;YAEC,MAAM,SAAS,GAAGE,YAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACzD,IAAIC,OAAS,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE;gBACxC,UAAU,GAAGC,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC7C,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACpD,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC7C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC7C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAC7C,aAAA;AACD,SAAA;QAED,MAAM,SAAS,GAAGC,KAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAClD,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC3E,QAAA,MAAM,SAAS,GAAGD,MAAQ,CAACC,KAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;QACvE,MAAM,OAAO,GACZ,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;cACjC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;cACvD,SAAS,CAAC;AACd,QAAA,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;KACvE;IAED,MAAM,GAAA;AACL,QAAA,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC1C,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,SAAS,GAAGL,MAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,SAAS,GAAGI,MAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO,UAAU,CAAC,SAAS,EAAE,OAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;KAC5D;IAED,SAAS,GAAA;AACR,QAAA,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC5C,SAAA;QAED,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,QAAA,IAAI,SAA6B,CAAC;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAA,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACzB,QAAQ,EAAE,CAAC,IAAI;gBACd,KAAK,QAAQ,EAAE;AACd,oBAAA,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC;oBACrB,MAAM;AACN,iBAAA;gBAED,KAAK,QAAQ,EAAE;oBACd,IAAI,SAAS,KAAK,SAAS,EAAE;wBAC5BE,WAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;wBACjD,QAAQ,IAAI,SAAS,CAAC;wBACtB,SAAS,GAAG,SAAS,CAAC;AACtB,qBAAA;AAED,oBAAAA,WAAa,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnD,oBAAAA,WAAa,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBACnD,MAAM;AACN,iBAAA;gBAED,KAAK,QAAQ,EAAE;oBACd,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;AACjC,oBAAA,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAM,CAAC;oBAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;oBACf,IAAI,MAAM,GAAG,CAAC,CAAC;oBACf,IAAI,SAAS,KAAK,SAAS,EAAE;wBAC5B,IAAI,SAAS,KAAK,QAAQ,EAAE;AAC3B,4BAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACzB,yBAAA;AAAM,6BAAA;AACN,4BAAA,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACjD,4BAAA,MAAM,GAAG,kBAAkB,CAC1B,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EACvB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CACtB,CAAC;AACF,yBAAA;wBAEDA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxC,wBAAAA,WAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;AACnE,wBAAA,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAC/D,qBAAA;AAED,oBAAA,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;oBAC5DA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;;AAExC,oBAAAA,WAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;oBACzDA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAExC,oBAAAA,WAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC1DA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBACxC,SAAS,GAAG,SAAS,CAAC;oBACtB,MAAM;AACN,iBAAA;AACD,aAAA;AACD,SAAA;QAED,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5BA,WAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjD,QAAQ,IAAI,SAAS,CAAC;AACtB,SAAA;QAED,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC3D;IAED,iBAAiB,CAAC,KAAa,EAAE,GAAW,EAAA;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9B,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;YACrB,QAAQ,EAAE,CAAC,IAAI;gBACd,KAAK,QAAQ,EAAE;AACd,oBAAA,IACC,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG;AACrC,yBAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EACjC;AACD,wBAAA,OAAO,IAAI,CAAC;AACZ,qBAAA;oBAED,MAAM;AACN,iBAAA;gBACD,KAAK,QAAQ,EAAE;oBACd,IAAI,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,EAAE;AACzC,wBAAA,OAAO,IAAI,CAAC;AACZ,qBAAA;oBAED,MAAM;AACN,iBAAA;AACD,aAAA;AACD,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACb;IAED,OAAO,OAAO,CAAC,KAA0B,EAAA;QACxC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAuB,SAAS,CAAC;QAC5C,MAAM,SAAS,GAAW,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAW,EAAE,CAAC;QAE7B,OAAO;AACN,YAAA,MAAM,CAAC,MAAc,EAAA;gBACpB,IAAI,KAAK,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;AAChD,iBAAA;gBAED,KAAK,IAAI,MAAM,CAAC;gBAChBA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxC,gBAAA,OAAO,IAAI,CAAC;aACZ;AAED,YAAA,MAAM,CAAC,MAAc,EAAA;gBACpB,IAAI,KAAK,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;AAChD,oBAAA,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAC/D,iBAAA;gBAED,KAAK,IAAI,MAAM,CAAC;gBAChBA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACvC,gBAAA,OAAO,IAAI,CAAC;aACZ;AAED,YAAA,MAAM,CAAC,KAAa,EAAA;gBACnBA,WAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7C,QAAQ,IAAI,KAAK,CAAC;AAClB,gBAAA,OAAO,IAAI,CAAC;aACZ;AAED,YAAA,MAAM,CAAC,IAAU,EAAA;AAChB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9B,gBAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;oBACrB,QAAQ,EAAE,CAAC,IAAI;AACd,wBAAA,KAAK,QAAQ;4BACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;4BAC/B,MAAM;AACP,wBAAA,KAAK,QAAQ;AACZ,4BAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;4BACtB,MAAM;AACP,wBAAA,KAAK,QAAQ;4BACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;4BAC/B,MAAM;AACP,qBAAA;AACD,iBAAA;gBAED,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE;AAC1C,oBAAA,MAAM,IAAI,UAAU,CAAC,oCAAoC,CAAC,CAAC;AAC3D,iBAAA;AAED,gBAAA,OAAO,IAAI,CAAC;aACZ;YAED,KAAK,GAAA;gBACJ,IAAI,KAAK,IAAI,IAAI,EAAE;AAClB,oBAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,oBAAA,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE;AACzB,wBAAAA,WAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,wBAAAA,WAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,qBAAA;AACD,iBAAA;gBAED,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;aAC3D;SACD,CAAC;KACF;AAED;;;;;;;;;AASG;AACH,IAAA,OAAO,IAAI,CAAC,KAAa,EAAE,KAAa,EAAE,SAAkB,EAAA;QAC3D,IAAI,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;AAE9C,QAAA,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;AAC3D,YAAA,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE;gBACxC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACrC,aAAA;;;AAID,YAAA,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;aACxB,MAAM,CAAC,MAAM,CAAC;AACd,aAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;aAClD,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;aACtC,MAAM,CAAC,MAAM,CAAC;AACd,aAAA,KAAK,EAAE,CAAC;KACV;AACD,CAAA;AAED,SAAS,UAAU,CAClB,SAAiB,EACjB,QAAgB,EAChB,SAAiB,EACjB,OAA4B,EAAA;AAE5B,IAAA,IAAIH,OAAS,CAAC,SAAS,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC,MAAM,EAAE;AAC5D,QAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AACxE,KAAA;SAAM,IACN,OAAO,KAAK,SAAS;QACrBA,OAAS,CAAC,SAAS,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,MAAM,EACrD;AACD,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACvE,KAAA;IAED,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAII,KAAO,CAClDP,MAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,EAC9B,SAAS,CACT,EAAE;AACF,QAAA,IAAI,SAAS,EAAE;AACd,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;AACpE,YAAA,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE;gBAChE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;AACrC,aAAA;AAAM,iBAAA;AACN,gBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACtB,aAAA;YAED,WAAW,IAAI,MAAM,CAAC;AACtB,SAAA;AAAM,aAAA;YACN,IAAI,CAAC,QAAQ,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;AAC9C,aAAA;YAED,WAAW,IAAI,MAAM,CAAC;YACtB,WAAW,GAAG,QAAQ,CAAC;AACvB,SAAA;AACD,KAAA;AAED,IAAA,IAAI,WAAW,EAAE;AAChB,QAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACxB,KAAA;AAED,IAAA,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,IAAU,EAAA;IACzB,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,EAAE,CAAC;AAClB,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,QAAA,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,QAAQ,EAAE,CAAC,IAAI;YACd,KAAK,QAAQ,EAAE;gBACd,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;gBACjCM,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxC,MAAM;AACN,aAAA;YACD,KAAK,QAAQ,EAAE;gBACd,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;gBACjCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBACvC,MAAM;AACN,aAAA;AACD,YAAA,KAAK,QAAQ;AACZ,gBAAAA,WAAa,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChD,gBAAA,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC;gBACrB,MAAM;AACP,SAAA;AACD,KAAA;IAED,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;AAOG;AACH,SAAS,WAAW,CACnB,OAAe,EACf,KAAa,EACb,OAAe,EACf,KAAa,EAAA;IAEb,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAIC,KAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACvE,IAAI,SAAS,IAAI,SAAS,EAAE;AAC3B,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACvC,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC;YACvC,EAAE,IAAI,MAAM,CAAC;AACb,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC;YACvC,EAAE,IAAI,MAAM,CAAC;AACb,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;AAOG;AACH,SAAS,KAAK,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAA;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAIA,KAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;AACvE,QAAA,IAAI,SAAS,EAAE;YACd,IAAI,CAAC,SAAS,EAAE;gBACf,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AACnC,aAAA;YAED,CAAC,IAAI,MAAM,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC3C,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;AACA,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAa,EAAA;AACvD,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAChC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAA,OAAO,CAAC,CAAC;AACT,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;AACA,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAa,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAChC,QAAA,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACtD,YAAA,OAAO,CAAC,CAAC;AACT,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf;;;;"}
1
+ {"version":3,"file":"edit.cjs","sources":["../src/_subseq.ts","../src/edit.ts"],"sourcesContent":["/*\n * This module provides utility functions for building and operating on\n * “subsequences.” Subsequences are created by taking zero or more elements\n * from a sequence while preserving the order of the remaining elements. While\n * this specific module does not care about what those sequences actually are,\n * for the purposes of this library, sequences are always strings, measured in\n * UTF-16 code units, and subsequences can be used to represent operations over\n * the entire string like insertions and deletions.\n *\n * We define subsequences as arrays of numbers, where each number represents\n * the length of a continguous segment from the original sequence. These number\n * alternate between representing excluded and included segments from the\n * original sequence, with the first number representing the length of an\n * excluded segment. In other words, the first segment represents an excluded\n * segment, the second included, the third excluded, etc.\n *\n * Given the string sequence \"abcdefgh\", the following subsequence arrays\n * represent the indicated strings.\n *\n * [0, 4, 4] = \"abcd\"\n * [4, 4] = \"efgh\"\n * [0, 2, 2, 2, 2] = \"ab\" \"ef\"\n * [2, 2, 2, 2] = \"cd\" \"gh\"\n * [0, 1, 6, 1] = \"a\" \"h\"\n * [1, 1, 1, 1, 1, 1, 1, 1] = \"b\" \"d\" \"f\" \"h\"\n *\n * Because the first segment is always excluded, a subsequence array will start\n * with a 0 if the subsequence to indicate that the first element of the\n * sequence is included. No other 0s will appear in a well-constructed\n * subsequence array.\n *\n * This module is private to the revise package and separate from \"./edit.js\"\n * for testing purposes.\n */\nexport type Subseq = Array<number>;\n\nexport function measure(\n\tsubseq: Subseq,\n): {length: number; includedLength: number; excludedLength: number} {\n\tlet length = 0,\n\t\tincludedLength = 0,\n\t\texcludedLength = 0;\n\tfor (let i = 0; i < subseq.length; i++) {\n\t\tconst s = subseq[i];\n\t\tlength += s;\n\t\tif (i % 2 === 0) {\n\t\t\texcludedLength += s;\n\t\t} else {\n\t\t\tincludedLength += s;\n\t\t}\n\t}\n\n\treturn {length, includedLength, excludedLength};\n}\n\nexport function pushSegment(\n\tsubseq: Subseq,\n\tlength: number,\n\tincluded: boolean,\n): void {\n\tif (length < 0) {\n\t\tthrow new RangeError(\"Negative length\");\n\t} else if (length === 0) {\n\t\treturn;\n\t} else if (!subseq.length) {\n\t\tif (included) {\n\t\t\tsubseq.push(0, length);\n\t\t} else {\n\t\t\tsubseq.push(length);\n\t\t}\n\t} else {\n\t\tconst included1 = subseq.length % 2 === 0;\n\t\tif (included === included1) {\n\t\t\tsubseq[subseq.length - 1] += length;\n\t\t} else {\n\t\t\tsubseq.push(length);\n\t\t}\n\t}\n}\n\n///** A utility method to debug subseqs. */\n//function print(subseq: Subseq): string {\n//\tlet result = \"\";\n//\tfor (let i = 0; i < subseq.length; i++) {\n//\t\tif (i % 2 === 0) {\n//\t\t\tresult += \"=\".repeat(subseq[i]);\n//\t\t} else {\n//\t\t\tresult += \"+\".repeat(subseq[i]);\n//\t\t}\n//\t}\n//\n//\treturn result;\n//}\n\nexport function contains(subseq: Subseq, index: number): boolean {\n\tif (index < 0) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < subseq.length; i++) {\n\t\tindex -= subseq[i];\n\t\tif (index < 0) {\n\t\t\treturn i % 2 === 1;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function clear(subseq: Subseq): Subseq {\n\tconst {length} = measure(subseq);\n\treturn length ? [length] : [];\n}\n\nexport function fill(subseq: Subseq): Subseq {\n\tconst {length} = measure(subseq);\n\treturn length ? [0, length] : [];\n}\n\nexport function complement(subseq: Subseq): Subseq {\n\treturn subseq[0] === 0 ? subseq.slice(1) : [0, ...subseq];\n}\n\nexport function align(\n\tsubseq1: Subseq,\n\tsubseq2: Subseq,\n): Array<[number, boolean, boolean]> {\n\tif (measure(subseq1).length !== measure(subseq2).length) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Array<[number, boolean, boolean]> = [];\n\tfor (\n\t\tlet i1 = 0,\n\t\t\ti2 = 0,\n\t\t\tlength1 = 0,\n\t\t\tlength2 = 0,\n\t\t\tincluded1 = true,\n\t\t\tincluded2 = true;\n\t\ti1 < subseq1.length || i2 < subseq2.length;\n\n\t) {\n\t\tif (length1 === 0) {\n\t\t\tif (i1 >= subseq1.length) {\n\t\t\t\tthrow new Error(\"Length mismatch\");\n\t\t\t}\n\n\t\t\tlength1 = subseq1[i1++];\n\t\t\tincluded1 = !included1;\n\t\t}\n\n\t\tif (length2 === 0) {\n\t\t\tif (i2 >= subseq2.length) {\n\t\t\t\tthrow new Error(\"Size mismatch\");\n\t\t\t}\n\n\t\t\tlength2 = subseq2[i2++];\n\t\t\tincluded2 = !included2;\n\t\t}\n\n\t\tif (length1 < length2) {\n\t\t\tif (length1) {\n\t\t\t\tresult.push([length1, included1, included2]);\n\t\t\t}\n\n\t\t\tlength2 = length2 - length1;\n\t\t\tlength1 = 0;\n\t\t} else if (length1 > length2) {\n\t\t\tif (length2) {\n\t\t\t\tresult.push([length2, included1, included2]);\n\t\t\t}\n\n\t\t\tlength1 = length1 - length2;\n\t\t\tlength2 = 0;\n\t\t} else {\n\t\t\tif (length1) {\n\t\t\t\tresult.push([length1, included1, included2]);\n\t\t\t}\n\n\t\t\tlength1 = length2 = 0;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function union(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 || included2);\n\t}\n\n\treturn result;\n}\n\nexport function intersection(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 && included2);\n\t}\n\n\treturn result;\n}\n\nexport function difference(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Array<number> = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 && !included2);\n\t}\n\n\treturn result;\n}\n\nexport function shrink(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tif (measure(subseq1).length !== measure(subseq2).length) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tif (!included2) {\n\t\t\tpushSegment(result, length, included1);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function expand(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tif (measure(subseq1).length !== measure(subseq2).excludedLength) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Array<number> = [];\n\tfor (\n\t\tlet i1 = 0, i2 = 0, length1 = 0, included1 = true, included2 = true;\n\t\ti2 < subseq2.length;\n\t\ti2++\n\t) {\n\t\tlet length2 = subseq2[i2];\n\t\tincluded2 = !included2;\n\t\tif (included2) {\n\t\t\tpushSegment(result, length2, false);\n\t\t} else {\n\t\t\twhile (length2) {\n\t\t\t\tif (length1 === 0) {\n\t\t\t\t\tlength1 = subseq1[i1++];\n\t\t\t\t\tincluded1 = !included1;\n\t\t\t\t}\n\n\t\t\t\tconst minLength = Math.min(length1, length2);\n\t\t\t\tpushSegment(result, minLength, included1);\n\t\t\t\tlength1 -= minLength;\n\t\t\t\tlength2 -= minLength;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function interleave(subseq1: Subseq, subseq2: Subseq): [Subseq, Subseq] {\n\tif (measure(subseq1).excludedLength !== measure(subseq2).excludedLength) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result1: Array<number> = [];\n\tconst result2: Array<number> = [];\n\tfor (\n\t\tlet i1 = 0,\n\t\t\ti2 = 0,\n\t\t\tlength1 = 0,\n\t\t\tlength2 = 0,\n\t\t\tincluded1 = true,\n\t\t\tincluded2 = true;\n\t\ti1 < subseq1.length || i2 < subseq2.length;\n\n\t) {\n\t\tif (length1 === 0 && i1 < subseq1.length) {\n\t\t\tlength1 = subseq1[i1++];\n\t\t\tincluded1 = !included1;\n\t\t}\n\n\t\tif (length2 === 0 && i2 < subseq2.length) {\n\t\t\tlength2 = subseq2[i2++];\n\t\t\tincluded2 = !included2;\n\t\t}\n\n\t\tif (included1 && included2) {\n\t\t\tpushSegment(result1, length1, true);\n\t\t\tpushSegment(result1, length2, false);\n\t\t\tpushSegment(result2, length1, false);\n\t\t\tpushSegment(result2, length2, true);\n\t\t\tlength1 = length2 = 0;\n\t\t} else if (included1) {\n\t\t\tpushSegment(result1, length1, true);\n\t\t\tpushSegment(result2, length1, false);\n\t\t\tlength1 = 0;\n\t\t} else if (included2) {\n\t\t\tpushSegment(result1, length2, false);\n\t\t\tpushSegment(result2, length2, true);\n\t\t\tlength2 = 0;\n\t\t} else {\n\t\t\tconst minLength = Math.min(length1, length2);\n\t\t\tpushSegment(result1, minLength, false);\n\t\t\tpushSegment(result2, minLength, false);\n\t\t\tlength1 -= minLength;\n\t\t\tlength2 -= minLength;\n\t\t}\n\t}\n\n\treturn [result1, result2];\n}\n","import * as S from \"./_subseq.js\";\nimport type {Subseq} from \"./_subseq.js\";\n\nexport interface InsertOperation {\n\ttype: \"insert\";\n\tstart: number;\n\tvalue: string;\n}\n\nexport interface RetainOperation {\n\ttype: \"retain\";\n\tstart: number;\n\tend: number;\n}\n\nexport interface DeleteOperation {\n\ttype: \"delete\";\n\tstart: number;\n\tend: number;\n\tvalue: string | undefined;\n}\n\nexport type Operation = RetainOperation | DeleteOperation | InsertOperation;\n\nexport interface EditBuilder {\n\tretain(length: number): EditBuilder;\n\n\tdelete(length: number): EditBuilder;\n\n\tinsert(value: string): EditBuilder;\n\n\tconcat(edit: Edit): EditBuilder;\n\n\tbuild(): Edit;\n}\n\n/** A compact data structure for representing changes to strings. */\nexport class Edit {\n\t/**\n\t * An array of strings and integers representing operations.\n\t *\n\t * Strings represent insertions, and pairs of integers represent the start\n\t * and end indices of retained segments. Deletions are implied by gaps\n\t * between the retained segments.\n\t *\n\t * Examples:\n\t *\n\t * [0, 3, 7, 10]\n\t * retain 0-3, delete 3-7, retain 7-10\n\t *\n\t * [\"hello\", 0, 10]\n\t * insert \"hello\", retain 0-10\n\t *\n\t * [0, 5, \" \", 6, 10]\n\t * retain 0-5, insert \" \", delete 5-6, retain 6-10\n\t *\n\t * If the edit includes a delete operation at its end, this is signified by\n\t * an extra number signifying the length. Therefore, regardless of whether or\n\t * not the last character of the string is retained, the last number will\n\t * always represent the length of the original string.\n\t *\n\t * // retain 0-10, delete 10-11\n\t * [0, 10, 11]\n\t *\n\t * An edit that is only retains will contain a single number representing the\n\t * length of the string.\n\t */\n\tdeclare parts: Array<string | number>;\n\n\t/**\n\t * A string which represents a concatenation of all deletions.\n\t *\n\t * This property is optional, but required if you want to invert the edit.\n\t */\n\tdeclare deleted: string | undefined;\n\n\tconstructor(parts: Array<string | number>, deleted?: string) {\n\t\tthis.parts = parts;\n\t\tthis.deleted = deleted;\n\t}\n\n\t/** A string which represents a concatenation of all insertions. */\n\tget inserted(): string {\n\t\tlet text = \"\";\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tif (typeof this.parts[i] === \"string\") {\n\t\t\t\ttext += this.parts[i];\n\t\t\t}\n\t\t}\n\n\t\treturn text;\n\t}\n\n\t/**\n\t * Returns an array of operations, which is more readable than the parts\n\t * array.\n\t *\n\t * new Edit([0, 1, \" \", 2], \"x\").operations();\n\t * [\n\t * {type: \"retain\", start: 0, end: 1},\n\t * {type: \"insert\", start: 1, value: \" \"},\n\t * {type: \"delete\", start: 1, end: 2, value: \"x\"},\n\t * ]\n\t *\n\t * When insertions and deletions happen at the same index, insertions will\n\t * always appear before deletions in the operations array.\n\t */\n\toperations(): Array<Operation> {\n\t\tconst operations: Array<Operation> = [];\n\t\tlet retaining = false;\n\t\tlet index = 0;\n\t\tlet deleteStart = 0;\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tconst part = this.parts[i];\n\t\t\tif (typeof part === \"number\") {\n\t\t\t\tif (part < index) {\n\t\t\t\t\tthrow new TypeError(\"Malformed edit\");\n\t\t\t\t} else if (part > index) {\n\t\t\t\t\tif (retaining) {\n\t\t\t\t\t\toperations.push({type: \"retain\", start: index, end: part});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof this.deleted === \"undefined\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: this.deleted.slice(deleteStart, part);\n\t\t\t\t\t\toperations.push({\n\t\t\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\t\t\tstart: index,\n\t\t\t\t\t\t\tend: part,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdeleteStart = part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = part;\n\t\t\t\tretaining = !retaining;\n\t\t\t} else {\n\t\t\t\toperations.push({type: \"insert\", start: index, value: part});\n\t\t\t}\n\t\t}\n\n\t\treturn operations;\n\t}\n\n\tapply(text: string): string {\n\t\tlet text1 = \"\";\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"retain\":\n\t\t\t\t\ttext1 += text.slice(op.start, op.end);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"insert\":\n\t\t\t\t\ttext1 += op.value;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn text1;\n\t}\n\n\t/** Composes two consecutive edits. */\n\tcompose(that: Edit): Edit {\n\t\tlet [insertSeq1, inserted1, deleteSeq1, deleted1] = factor(this);\n\t\tlet [insertSeq2, inserted2, deleteSeq2, deleted2] = factor(that);\n\t\t// Expand all subseqs so that they share the same coordinate space.\n\t\tdeleteSeq1 = S.expand(deleteSeq1, insertSeq1);\n\t\tdeleteSeq2 = S.expand(deleteSeq2, deleteSeq1);\n\t\t[deleteSeq1, insertSeq2] = S.interleave(deleteSeq1, insertSeq2);\n\t\tdeleteSeq2 = S.expand(deleteSeq2, insertSeq2);\n\t\tinsertSeq1 = S.expand(insertSeq1, insertSeq2);\n\n\t\t{\n\t\t\t// Find insertions which have been deleted and remove them.\n\t\t\tconst toggleSeq = S.intersection(insertSeq1, deleteSeq2);\n\t\t\tif (S.measure(toggleSeq).includedLength) {\n\t\t\t\tdeleteSeq1 = S.shrink(deleteSeq1, toggleSeq);\n\t\t\t\tinserted1 = erase(insertSeq1, inserted1, toggleSeq);\n\t\t\t\tinsertSeq1 = S.shrink(insertSeq1, toggleSeq);\n\t\t\t\tdeleteSeq2 = S.shrink(deleteSeq2, toggleSeq);\n\t\t\t\tinsertSeq2 = S.shrink(insertSeq2, toggleSeq);\n\t\t\t}\n\t\t}\n\n\t\tconst insertSeq = S.union(insertSeq1, insertSeq2);\n\t\tconst inserted = consolidate(insertSeq1, inserted1, insertSeq2, inserted2);\n\t\tconst deleteSeq = S.shrink(S.union(deleteSeq1, deleteSeq2), insertSeq);\n\t\tconst deleted =\n\t\t\tdeleted1 != null && deleted2 != null\n\t\t\t\t? consolidate(deleteSeq1, deleted1, deleteSeq2, deleted2)\n\t\t\t\t: undefined;\n\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted).normalize();\n\t}\n\n\tinvert(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Edit is not invertible\");\n\t\t}\n\n\t\tlet [insertSeq, inserted, deleteSeq, deleted] = factor(this);\n\t\tdeleteSeq = S.expand(deleteSeq, insertSeq);\n\t\tinsertSeq = S.shrink(insertSeq, deleteSeq);\n\t\treturn synthesize(deleteSeq, deleted!, insertSeq, inserted);\n\t}\n\n\tnormalize(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Edit is not normalizable\");\n\t\t}\n\n\t\tconst insertSeq: Array<number> = [];\n\t\tconst deleteSeq: Array<number> = [];\n\t\tlet inserted = \"\";\n\t\tlet deleted = \"\";\n\t\tlet insertion: string | undefined;\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tinsertion = op.value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"retain\": {\n\t\t\t\t\tif (insertion !== undefined) {\n\t\t\t\t\t\tS.pushSegment(insertSeq, insertion.length, true);\n\t\t\t\t\t\tinserted += insertion;\n\t\t\t\t\t\tinsertion = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tS.pushSegment(insertSeq, op.end - op.start, false);\n\t\t\t\t\tS.pushSegment(deleteSeq, op.end - op.start, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tconst length = op.end - op.start;\n\t\t\t\t\tconst deletion = op.value!;\n\t\t\t\t\tlet prefix = 0;\n\t\t\t\t\tlet suffix = 0;\n\t\t\t\t\tif (insertion !== undefined) {\n\t\t\t\t\t\tif (insertion === deletion) {\n\t\t\t\t\t\t\tprefix = deletion.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprefix = commonPrefixLength(insertion, deletion);\n\t\t\t\t\t\t\tsuffix = commonSuffixLength(\n\t\t\t\t\t\t\t\tinsertion.slice(prefix),\n\t\t\t\t\t\t\t\tdeletion.slice(prefix),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tS.pushSegment(insertSeq, prefix, false);\n\t\t\t\t\t\tS.pushSegment(insertSeq, insertion.length - prefix - suffix, true);\n\t\t\t\t\t\tinserted += insertion.slice(prefix, insertion.length - suffix);\n\t\t\t\t\t}\n\n\t\t\t\t\tdeleted += deletion.slice(prefix, deletion.length - suffix);\n\t\t\t\t\tS.pushSegment(deleteSeq, prefix, false);\n\t\t\t\t\t// TODO: This line is throwing for some reason\n\t\t\t\t\tS.pushSegment(deleteSeq, length - prefix - suffix, true);\n\t\t\t\t\tS.pushSegment(deleteSeq, suffix, false);\n\n\t\t\t\t\tS.pushSegment(insertSeq, length - prefix - suffix, false);\n\t\t\t\t\tS.pushSegment(insertSeq, suffix, false);\n\t\t\t\t\tinsertion = undefined;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (insertion !== undefined) {\n\t\t\tS.pushSegment(insertSeq, insertion.length, true);\n\t\t\tinserted += insertion;\n\t\t}\n\n\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t}\n\n\thasChangesBetween(start: number, end: number): boolean {\n\t\tconst ops = this.operations();\n\t\tfor (const op of ops) {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(start <= op.start && op.start <= end) ||\n\t\t\t\t\t\t(start <= op.end && op.end <= end)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tif (start <= op.start && op.start <= end) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tstatic builder(value?: string | undefined): EditBuilder {\n\t\tlet index = 0;\n\t\tlet inserted = \"\";\n\t\tlet deleted: string | undefined = undefined;\n\t\tconst insertSeq: Subseq = [];\n\t\tconst deleteSeq: Subseq = [];\n\n\t\treturn {\n\t\t\tretain(length: number) {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tlength = Math.min(value.length - index, length);\n\t\t\t\t}\n\n\t\t\t\tindex += length;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, false);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tdelete(length: number) {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tlength = Math.min(value.length - index, length);\n\t\t\t\t\tdeleted = (deleted || \"\") + value.slice(index, index + length);\n\t\t\t\t}\n\n\t\t\t\tindex += length;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, true);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tinsert(value: string) {\n\t\t\t\tS.pushSegment(insertSeq, value.length, true);\n\t\t\t\tinserted += value;\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tconcat(edit: Edit) {\n\t\t\t\tconst ops = edit.operations();\n\t\t\t\tfor (const op of ops) {\n\t\t\t\t\tswitch (op.type) {\n\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\tthis.delete(op.end - op.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\t\tthis.insert(op.value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"retain\":\n\t\t\t\t\t\t\tthis.retain(op.end - op.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value != null && index > value.length) {\n\t\t\t\t\tthrow new RangeError(\"Edit is longer than original value\");\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tbuild(): Edit {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tdeleted = deleted || \"\";\n\t\t\t\t\tif (index < value.length) {\n\t\t\t\t\t\tS.pushSegment(insertSeq, value.length - index, false);\n\t\t\t\t\t\tS.pushSegment(deleteSeq, value.length - index, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Given two strings, this method finds an edit which can be applied to the\n\t * first string to result in the second.\n\t *\n\t * @param startHint - An optional hint can be provided to disambiguate edits\n\t * which cannot be inferred by comparing the text alone. For example,\n\t * inserting \"a\" into the string \"aaaa\" to make it \"aaaaa\" could be an\n\t * insertion at any index in the string. This value should be the smaller of\n\t * the start indices of the selection from before and after the edit.\n\t */\n\tstatic diff(text1: string, text2: string, startHint?: number): Edit {\n\t\tlet prefix = commonPrefixLength(text1, text2);\n\t\tlet suffix = commonSuffixLength(text1, text2);\n\t\t// prefix and suffix overlap when edits are in runs of the same character.\n\t\tif (prefix + suffix > Math.min(text1.length, text2.length)) {\n\t\t\tif (startHint != null && startHint >= 0) {\n\t\t\t\tprefix = Math.min(prefix, startHint);\n\t\t\t}\n\n\t\t\t// TODO: We can probably avoid the commonSuffixLength() call here in\n\t\t\t// favor of arithmetic but I’m too dumb to figure it out.\n\t\t\tsuffix = commonSuffixLength(text1.slice(prefix), text2.slice(prefix));\n\t\t}\n\n\t\treturn Edit.builder(text1)\n\t\t\t.retain(prefix)\n\t\t\t.insert(text2.slice(prefix, text2.length - suffix))\n\t\t\t.delete(text1.length - prefix - suffix)\n\t\t\t.retain(suffix)\n\t\t\t.build();\n\t}\n}\n\nfunction synthesize(\n\tinsertSeq: Subseq,\n\tinserted: string,\n\tdeleteSeq: Subseq,\n\tdeleted?: string | undefined,\n): Edit {\n\tif (S.measure(insertSeq).includedLength !== inserted.length) {\n\t\tthrow new Error(\"insertSeq and inserted string do not match in length\");\n\t} else if (\n\t\tdeleted !== undefined &&\n\t\tS.measure(deleteSeq).includedLength !== deleted.length\n\t) {\n\t\tthrow new Error(\"deleteSeq and deleted string do not match in length\");\n\t}\n\n\tconst parts: Array<string | number> = [];\n\tlet insertIndex = 0;\n\tlet retainIndex = 0;\n\tlet needsLength = true;\n\tfor (const [length, deleting, inserting] of S.align(\n\t\tS.expand(deleteSeq, insertSeq),\n\t\tinsertSeq,\n\t)) {\n\t\tif (inserting) {\n\t\t\tconst insertion = inserted.slice(insertIndex, insertIndex + length);\n\t\t\tif (parts.length && typeof parts[parts.length - 1] === \"string\") {\n\t\t\t\tparts[parts.length - 1] += insertion;\n\t\t\t} else {\n\t\t\t\tparts.push(insertion);\n\t\t\t}\n\n\t\t\tinsertIndex += length;\n\t\t} else {\n\t\t\tif (!deleting) {\n\t\t\t\tparts.push(retainIndex, retainIndex + length);\n\t\t\t}\n\n\t\t\tretainIndex += length;\n\t\t\tneedsLength = deleting;\n\t\t}\n\t}\n\n\tif (needsLength) {\n\t\tparts.push(retainIndex);\n\t}\n\n\treturn new Edit(parts, deleted);\n}\n\nfunction factor(edit: Edit): [Subseq, string, Subseq, string | undefined] {\n\tconst insertSeq: Array<number> = [];\n\tconst deleteSeq: Array<number> = [];\n\tlet inserted = \"\";\n\tconst operations = edit.operations();\n\tfor (let i = 0; i < operations.length; i++) {\n\t\tconst op = operations[i];\n\t\tswitch (op.type) {\n\t\t\tcase \"retain\": {\n\t\t\t\tconst length = op.end - op.start;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tconst length = op.end - op.start;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, true);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"insert\":\n\t\t\t\tS.pushSegment(insertSeq, op.value.length, true);\n\t\t\t\tinserted += op.value;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn [insertSeq, inserted, deleteSeq, edit.deleted];\n}\n\n/**\n * Given two subseqs and strings which are represented by the included segments\n * of the subseqs, this function combines the two strings so that they overlap\n * according to the positions of the included segments of subseqs.\n *\n * The subseqs must have the same length, and the included segments of these\n * subseqs may not overlap.\n */\nfunction consolidate(\n\tsubseq1: Subseq,\n\ttext1: string,\n\tsubseq2: Subseq,\n\ttext2: string,\n): string {\n\tlet i1 = 0;\n\tlet i2 = 0;\n\tlet result = \"\";\n\tfor (const [length, included1, included2] of S.align(subseq1, subseq2)) {\n\t\tif (included1 && included2) {\n\t\t\tthrow new Error(\"Overlapping subseqs\");\n\t\t} else if (included1) {\n\t\t\tresult += text1.slice(i1, i1 + length);\n\t\t\ti1 += length;\n\t\t} else if (included2) {\n\t\t\tresult += text2.slice(i2, i2 + length);\n\t\t\ti2 += length;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Given two subseqs as well a string which is represented by the included\n * segments of the first subseq, this function returns the result of removing\n * the included segments of the second subseq from the first subseq.\n *\n * The subseqs must have the same length, and the included segments of the second\n * subseq must overlap with the first subseq’s included segments.\n */\nfunction erase(subseq1: Subseq, str: string, subseq2: Subseq): string {\n\tlet i = 0;\n\tlet result = \"\";\n\tfor (const [length, included1, included2] of S.align(subseq1, subseq2)) {\n\t\tif (included1) {\n\t\t\tif (!included2) {\n\t\t\t\tresult += str.slice(i, i + length);\n\t\t\t}\n\n\t\t\ti += length;\n\t\t} else if (included2) {\n\t\t\tthrow new Error(\"Non-overlapping subseqs\");\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/** @returns The length of the common prefix between two strings. */\nfunction commonPrefixLength(text1: string, text2: string) {\n\tlet min = 0;\n\tlet max = Math.min(text1.length, text2.length);\n\tlet mid = max;\n\twhile (min < mid) {\n\t\tif (text1.slice(min, mid) === text2.slice(min, mid)) {\n\t\t\tmin = mid;\n\t\t} else {\n\t\t\tmax = mid;\n\t\t}\n\n\t\tmid = Math.floor((max - min) / 2 + min);\n\t}\n\n\treturn mid;\n}\n\n/** @returns The length of the common suffix between two strings. */\nfunction commonSuffixLength(text1: string, text2: string) {\n\tlet min = 0;\n\tlet max = Math.min(text1.length, text2.length);\n\tlet mid = max;\n\twhile (min < mid) {\n\t\tif (\n\t\t\ttext1.slice(text1.length - mid, text1.length - min) ===\n\t\t\ttext2.slice(text2.length - mid, text2.length - min)\n\t\t) {\n\t\t\tmin = mid;\n\t\t} else {\n\t\t\tmax = mid;\n\t\t}\n\n\t\tmid = Math.floor((max - min) / 2 + min);\n\t}\n\n\treturn mid;\n}\n"],"names":["S.expand","S.interleave","S.intersection","S.measure","S.shrink","S.union","S.pushSegment","S.align"],"mappings":"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"}
package/edit.js CHANGED
@@ -590,25 +590,36 @@ function erase(subseq1, str, subseq2) {
590
590
  }
591
591
  /** @returns The length of the common prefix between two strings. */
592
592
  function commonPrefixLength(text1, text2) {
593
- const length = Math.min(text1.length, text2.length);
594
- for (let i = 0; i < length; i++) {
595
- if (text1[i] !== text2[i]) {
596
- return i;
593
+ let min = 0;
594
+ let max = Math.min(text1.length, text2.length);
595
+ let mid = max;
596
+ while (min < mid) {
597
+ if (text1.slice(min, mid) === text2.slice(min, mid)) {
598
+ min = mid;
597
599
  }
600
+ else {
601
+ max = mid;
602
+ }
603
+ mid = Math.floor((max - min) / 2 + min);
598
604
  }
599
- return length;
605
+ return mid;
600
606
  }
601
607
  /** @returns The length of the common suffix between two strings. */
602
608
  function commonSuffixLength(text1, text2) {
603
- const length1 = text1.length;
604
- const length2 = text2.length;
605
- const length = Math.min(length1, length2);
606
- for (let i = 0; i < length; i++) {
607
- if (text1[length1 - i - 1] !== text2[length2 - i - 1]) {
608
- return i;
609
+ let min = 0;
610
+ let max = Math.min(text1.length, text2.length);
611
+ let mid = max;
612
+ while (min < mid) {
613
+ if (text1.slice(text1.length - mid, text1.length - min) ===
614
+ text2.slice(text2.length - mid, text2.length - min)) {
615
+ min = mid;
616
+ }
617
+ else {
618
+ max = mid;
609
619
  }
620
+ mid = Math.floor((max - min) / 2 + min);
610
621
  }
611
- return length;
622
+ return mid;
612
623
  }
613
624
 
614
625
  export { Edit };