{"version":3,"file":"module.js","sources":["../src/helpers.ts","../node_modules/diff-dom/dist/module.js","../src/virtual_dom.ts","../node_modules/dayjs/dayjs.min.js","../node_modules/dayjs/plugin/customParseFormat.js","../src/date.ts","../src/read_data.ts","../src/rows.ts","../src/columns.ts","../src/column_settings.ts","../src/templates.ts","../src/config.ts","../src/virtual_pager_dom.ts","../src/datatable.ts","../src/convert/csv.ts","../src/convert/json.ts","../src/export/csv.ts","../src/export/json.ts","../src/export/sql.ts","../src/export/txt.ts","../src/editing/config.ts","../src/editing/editor.ts","../src/column_filter/config.ts","../src/column_filter/column_filter.ts"],"sourcesContent":["import {\n    cellDataType,\n    cellType,\n    columnSettingsType,\n    inputCellType,\n    nodeType,\n    textNodeType\n} from \"./types\"\n\n/**\n * Check is item is object\n */\nexport const isObject = (val: (string | number | boolean | object | null | undefined )) => Object.prototype.toString.call(val) === \"[object Object]\"\n\n/**\n * Check for valid JSON string\n */\nexport const isJson = (str: string) => {\n    let t = !1\n    try {\n        t = JSON.parse(str)\n    } catch (e) {\n        return !1\n    }\n    return !(null === t || (!Array.isArray(t) && !isObject(t))) && t\n}\n\n/**\n * Create DOM element node\n */\nexport const createElement = (nodeName: string, attrs?: { [key: string]: string}) => {\n    const dom = document.createElement(nodeName)\n    if (attrs && \"object\" == typeof attrs) {\n        for (const attr in attrs) {\n            if (\"html\" === attr) {\n                dom.innerHTML = attrs[attr]\n            } else {\n                dom.setAttribute(attr, attrs[attr])\n            }\n        }\n    }\n    return dom\n}\n\nexport const objToText = (obj: nodeType) => {\n    if ([\"#text\", \"#comment\"].includes(obj.nodeName)) {\n        return (obj as textNodeType).data\n    }\n    if (obj.childNodes) {\n        return obj.childNodes.map((childNode: nodeType) => objToText(childNode)).join(\"\")\n    }\n    return \"\"\n}\n\nexport const cellToText = (obj: inputCellType | cellDataType | null | undefined): string => {\n    if (obj === null || obj === undefined) {\n        return \"\"\n    } else if (obj.hasOwnProperty(\"text\") || obj.hasOwnProperty(\"data\")) {\n        const cell = obj as cellType\n        return cell.text ?? cellToText(cell.data)\n    } else if (obj.hasOwnProperty(\"nodeName\")) {\n        return objToText(obj as nodeType)\n    }\n    return String(obj)\n}\n\n\nexport const escapeText = function(text: string) {\n    return text\n        .replace(/&/g, \"&amp;\")\n        .replace(/</g, \"&lt;\")\n        .replace(/>/g, \"&gt;\")\n        .replace(/\"/g, \"&quot;\")\n}\n\n\nexport const visibleToColumnIndex = function(visibleIndex: number, columns: columnSettingsType[]) {\n    let counter = 0\n    let columnIndex = 0\n    while (counter < (visibleIndex+1)) {\n        const columnSettings = columns[columnIndex]\n        if (!columnSettings.hidden) {\n            counter += 1\n        }\n        columnIndex += 1\n    }\n    return columnIndex-1\n}\n\nexport const columnToVisibleIndex = function(columnIndex: number, columns: columnSettingsType[]) {\n    let visibleIndex = columnIndex\n    let counter = 0\n    while (counter < columnIndex) {\n        const columnSettings = columns[counter]\n        if (columnSettings.hidden) {\n            visibleIndex -= 1\n        }\n        counter++\n    }\n    return visibleIndex\n}\n\n/**\n * Converts a [NamedNodeMap](https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap) into a normal object.\n *\n * @param map The `NamedNodeMap` to convert\n */\nexport const namedNodeMapToObject = function(map: NamedNodeMap) {\n    const obj = {}\n    if (map) {\n        for (const attr of map) {\n            obj[attr.name] = attr.value\n        }\n    }\n    return obj\n}\n\n/**\n * Convert class names to a CSS selector. Multiple classes should be separated by spaces.\n * Examples:\n *  - \"my-class\" -> \".my-class\"\n *  - \"my-class second-class\" -> \".my-class.second-class\"\n *\n * @param classNames The class names to convert. Can contain multiple classes separated by spaces.\n */\nexport const classNamesToSelector = (classNames: string) => {\n    if (!classNames) {\n        return null\n    }\n    return classNames.trim().split(\" \").map(className => `.${className}`).join(\"\")\n}\n\n/**\n * Check if the element contains all the classes. Multiple classes should be separated by spaces.\n *\n * @param element The element that will be checked\n * @param classes The classes that must be present in the element. Can contain multiple classes separated by spaces.\n */\nexport const containsClass = (element: Element, classes: string) => {\n    const hasMissingClass = classes?.split(\" \").some(className => !element.classList.contains(className))\n    return !hasMissingClass\n}\n\n/**\n * Join two strings with spaces. Null values are ignored.\n * Examples:\n *  - joinWithSpaces(\"a\", \"b\") -> \"a b\"\n *  - joinWithSpaces(\"a\", null) -> \"a\"\n *  - joinWithSpaces(null, \"b\") -> \"b\"\n *  - joinWithSpaces(\"a\", \"b c\") -> \"a b c\"\n *\n * @param first The first string to join\n * @param second The second string to join\n */\nexport const joinWithSpaces = (first: string | null | undefined, second: string | null | undefined) => {\n    if (first) {\n        if (second) {\n            return `${first} ${second}`\n        }\n        return first\n    } else if (second) {\n        return second\n    }\n    return \"\"\n}\n\n// Source: https://www.freecodecamp.org/news/javascript-debounce-example/\n\nexport const debounce = function(func: () => void, timeout = 300) {\n    let timer: number\n    return (..._args: any[]) => {\n        clearTimeout(timer)\n        timer = window.setTimeout(() => func(), timeout)\n    }\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\n        var arguments$1 = arguments;\n\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments$1[i];\r\n            for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p)) { t[p] = s[p]; } }\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) { for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) { ar = Array.prototype.slice.call(from, 0, i); }\r\n            ar[i] = from[i];\r\n        }\r\n    } }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar Diff = /** @class */ (function () {\n    function Diff(options) {\n        if (options === void 0) { options = {}; }\n        var _this = this;\n        Object.entries(options).forEach(function (_a) {\n            var key = _a[0], value = _a[1];\n            return (_this[key] = value);\n        });\n    }\n    Diff.prototype.toString = function () {\n        return JSON.stringify(this);\n    };\n    Diff.prototype.setValue = function (aKey, aValue) {\n        this[aKey] = aValue;\n        return this;\n    };\n    return Diff;\n}());\nfunction checkElementType(element) {\n    var arguments$1 = arguments;\n\n    var elementTypeNames = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        elementTypeNames[_i - 1] = arguments$1[_i];\n    }\n    if (typeof element === \"undefined\" || element === null) {\n        return false;\n    }\n    return elementTypeNames.some(function (elementTypeName) {\n        var _a, _b;\n        // We need to check if the specified type is defined\n        // because otherwise instanceof throws an exception.\n        return typeof ((_b = (_a = element === null || element === void 0 ? void 0 : element.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b[elementTypeName]) ===\n            \"function\" &&\n            element instanceof\n                element.ownerDocument.defaultView[elementTypeName];\n    });\n}\n\nfunction objToNode(objNode, insideSvg, options) {\n    var node;\n    if (objNode.nodeName === \"#text\") {\n        node = options.document.createTextNode(objNode.data);\n    }\n    else if (objNode.nodeName === \"#comment\") {\n        node = options.document.createComment(objNode.data);\n    }\n    else {\n        if (insideSvg) {\n            node = options.document.createElementNS(\"http://www.w3.org/2000/svg\", objNode.nodeName);\n            if (objNode.nodeName === \"foreignObject\") {\n                insideSvg = false;\n            }\n        }\n        else if (objNode.nodeName.toLowerCase() === \"svg\") {\n            node = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n            insideSvg = true;\n        }\n        else {\n            node = options.document.createElement(objNode.nodeName);\n        }\n        if (objNode.attributes) {\n            Object.entries(objNode.attributes).forEach(function (_a) {\n                var key = _a[0], value = _a[1];\n                return node.setAttribute(key, value);\n            });\n        }\n        if (objNode.childNodes) {\n            node = node;\n            objNode.childNodes.forEach(function (childNode) {\n                return node.appendChild(objToNode(childNode, insideSvg, options));\n            });\n        }\n        if (options.valueDiffing) {\n            if (objNode.value &&\n                checkElementType(node, \"HTMLButtonElement\", \"HTMLDataElement\", \"HTMLInputElement\", \"HTMLLIElement\", \"HTMLMeterElement\", \"HTMLOptionElement\", \"HTMLProgressElement\", \"HTMLParamElement\")) {\n                node.value = objNode.value;\n            }\n            if (objNode.checked && checkElementType(node, \"HTMLInputElement\")) {\n                node.checked = objNode.checked;\n            }\n            if (objNode.selected &&\n                checkElementType(node, \"HTMLOptionElement\")) {\n                node.selected = objNode.selected;\n            }\n        }\n    }\n    return node;\n}\n\n// ===== Apply a diff =====\nvar getFromRoute = function (node, route) {\n    route = route.slice();\n    while (route.length > 0) {\n        var c = route.splice(0, 1)[0];\n        node = node.childNodes[c];\n    }\n    return node;\n};\nfunction applyDiff(tree, diff, options) {\n    var action = diff[options._const.action];\n    var route = diff[options._const.route];\n    var node;\n    if (![options._const.addElement, options._const.addTextElement].includes(action)) {\n        // For adding nodes, we calculate the route later on. It's different because it includes the position of the newly added item.\n        node = getFromRoute(tree, route);\n    }\n    var newNode;\n    var reference;\n    var nodeArray;\n    // pre-diff hook\n    var info = {\n        diff: diff,\n        node: node\n    };\n    if (options.preDiffApply(info)) {\n        return true;\n    }\n    switch (action) {\n        case options._const.addAttribute:\n            if (!node || !checkElementType(node, \"Element\")) {\n                return false;\n            }\n            node.setAttribute(diff[options._const.name], diff[options._const.value]);\n            break;\n        case options._const.modifyAttribute:\n            if (!node || !checkElementType(node, \"Element\")) {\n                return false;\n            }\n            node.setAttribute(diff[options._const.name], diff[options._const.newValue]);\n            if (checkElementType(node, \"HTMLInputElement\") &&\n                diff[options._const.name] === \"value\") {\n                node.value = diff[options._const.newValue];\n            }\n            break;\n        case options._const.removeAttribute:\n            if (!node || !checkElementType(node, \"Element\")) {\n                return false;\n            }\n            node.removeAttribute(diff[options._const.name]);\n            break;\n        case options._const.modifyTextElement:\n            if (!node || !checkElementType(node, \"Text\")) {\n                return false;\n            }\n            options.textDiff(node, node.data, diff[options._const.oldValue], diff[options._const.newValue]);\n            if (checkElementType(node.parentNode, \"HTMLTextAreaElement\")) {\n                node.parentNode.value = diff[options._const.newValue];\n            }\n            break;\n        case options._const.modifyValue:\n            if (!node || typeof node.value === \"undefined\") {\n                return false;\n            }\n            node.value = diff[options._const.newValue];\n            break;\n        case options._const.modifyComment:\n            if (!node || !checkElementType(node, \"Comment\")) {\n                return false;\n            }\n            options.textDiff(node, node.data, diff[options._const.oldValue], diff[options._const.newValue]);\n            break;\n        case options._const.modifyChecked:\n            if (!node || typeof node.checked === \"undefined\") {\n                return false;\n            }\n            node.checked = diff[options._const.newValue];\n            break;\n        case options._const.modifySelected:\n            if (!node || typeof node.selected === \"undefined\") {\n                return false;\n            }\n            node.selected = diff[options._const.newValue];\n            break;\n        case options._const.replaceElement: {\n            var insideSvg = diff[options._const.newValue].nodeName.toLowerCase() === \"svg\" ||\n                node.parentNode.namespaceURI === \"http://www.w3.org/2000/svg\";\n            node.parentNode.replaceChild(objToNode(diff[options._const.newValue], insideSvg, options), node);\n            break;\n        }\n        case options._const.relocateGroup:\n            nodeArray = __spreadArray([], new Array(diff[options._const.groupLength]), true).map(function () {\n                return node.removeChild(node.childNodes[diff[options._const.from]]);\n            });\n            nodeArray.forEach(function (childNode, index) {\n                if (index === 0) {\n                    reference =\n                        node.childNodes[diff[options._const.to]];\n                }\n                node.insertBefore(childNode, reference || null);\n            });\n            break;\n        case options._const.removeElement:\n            node.parentNode.removeChild(node);\n            break;\n        case options._const.addElement: {\n            var parentRoute = route.slice();\n            var c = parentRoute.splice(parentRoute.length - 1, 1)[0];\n            node = getFromRoute(tree, parentRoute);\n            if (!checkElementType(node, \"Element\")) {\n                return false;\n            }\n            node.insertBefore(objToNode(diff[options._const.element], node.namespaceURI === \"http://www.w3.org/2000/svg\", options), node.childNodes[c] || null);\n            break;\n        }\n        case options._const.removeTextElement: {\n            if (!node || node.nodeType !== 3) {\n                return false;\n            }\n            var parentNode = node.parentNode;\n            parentNode.removeChild(node);\n            if (checkElementType(parentNode, \"HTMLTextAreaElement\")) {\n                parentNode.value = \"\";\n            }\n            break;\n        }\n        case options._const.addTextElement: {\n            var parentRoute = route.slice();\n            var c = parentRoute.splice(parentRoute.length - 1, 1)[0];\n            newNode = options.document.createTextNode(diff[options._const.value]);\n            node = getFromRoute(tree, parentRoute);\n            if (!node.childNodes) {\n                return false;\n            }\n            node.insertBefore(newNode, node.childNodes[c] || null);\n            if (checkElementType(node.parentNode, \"HTMLTextAreaElement\")) {\n                node.parentNode.value = diff[options._const.value];\n            }\n            break;\n        }\n        default:\n            console.log(\"unknown action\");\n    }\n    // if a new node was created, we might be interested in its\n    // post diff hook\n    options.postDiffApply({\n        diff: info.diff,\n        node: info.node,\n        newNode: newNode\n    });\n    return true;\n}\nfunction applyDOM(tree, diffs, options) {\n    return diffs.every(function (diff) {\n        return applyDiff(tree, diff, options);\n    });\n}\n\n// ===== Undo a diff =====\nfunction swap(obj, p1, p2) {\n    var tmp = obj[p1];\n    obj[p1] = obj[p2];\n    obj[p2] = tmp;\n}\nfunction undoDiff(tree, diff, options) {\n    switch (diff[options._const.action]) {\n        case options._const.addAttribute:\n            diff[options._const.action] = options._const.removeAttribute;\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.modifyAttribute:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.removeAttribute:\n            diff[options._const.action] = options._const.addAttribute;\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.modifyTextElement:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.modifyValue:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.modifyComment:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.modifyChecked:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.modifySelected:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.replaceElement:\n            swap(diff, options._const.oldValue, options._const.newValue);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.relocateGroup:\n            swap(diff, options._const.from, options._const.to);\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.removeElement:\n            diff[options._const.action] = options._const.addElement;\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.addElement:\n            diff[options._const.action] = options._const.removeElement;\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.removeTextElement:\n            diff[options._const.action] = options._const.addTextElement;\n            applyDiff(tree, diff, options);\n            break;\n        case options._const.addTextElement:\n            diff[options._const.action] = options._const.removeTextElement;\n            applyDiff(tree, diff, options);\n            break;\n        default:\n            console.log(\"unknown action\");\n    }\n}\nfunction undoDOM(tree, diffs, options) {\n    diffs = diffs.slice();\n    diffs.reverse();\n    diffs.forEach(function (diff) {\n        undoDiff(tree, diff, options);\n    });\n}\n\nvar elementDescriptors = function (el) {\n    var output = [];\n    output.push(el.nodeName);\n    if (el.nodeName !== \"#text\" && el.nodeName !== \"#comment\") {\n        el = el;\n        if (el.attributes) {\n            if (el.attributes[\"class\"]) {\n                output.push(\"\".concat(el.nodeName, \".\").concat(el.attributes[\"class\"].replace(/ /g, \".\")));\n            }\n            if (el.attributes.id) {\n                output.push(\"\".concat(el.nodeName, \"#\").concat(el.attributes.id));\n            }\n        }\n    }\n    return output;\n};\nvar findUniqueDescriptors = function (li) {\n    var uniqueDescriptors = {};\n    var duplicateDescriptors = {};\n    li.forEach(function (node) {\n        elementDescriptors(node).forEach(function (descriptor) {\n            var inUnique = descriptor in uniqueDescriptors;\n            var inDupes = descriptor in duplicateDescriptors;\n            if (!inUnique && !inDupes) {\n                uniqueDescriptors[descriptor] = true;\n            }\n            else if (inUnique) {\n                delete uniqueDescriptors[descriptor];\n                duplicateDescriptors[descriptor] = true;\n            }\n        });\n    });\n    return uniqueDescriptors;\n};\nvar uniqueInBoth = function (l1, l2) {\n    var l1Unique = findUniqueDescriptors(l1);\n    var l2Unique = findUniqueDescriptors(l2);\n    var inBoth = {};\n    Object.keys(l1Unique).forEach(function (key) {\n        if (l2Unique[key]) {\n            inBoth[key] = true;\n        }\n    });\n    return inBoth;\n};\nvar removeDone = function (tree) {\n    delete tree.outerDone;\n    delete tree.innerDone;\n    delete tree.valueDone;\n    if (tree.childNodes) {\n        return tree.childNodes.every(removeDone);\n    }\n    else {\n        return true;\n    }\n};\nvar cleanNode = function (diffNode) {\n    if (Object.prototype.hasOwnProperty.call(diffNode, \"data\")) {\n        var textNode = {\n            nodeName: diffNode.nodeName === \"#text\" ? \"#text\" : \"#comment\",\n            data: diffNode.data\n        };\n        return textNode;\n    }\n    else {\n        var elementNode = {\n            nodeName: diffNode.nodeName\n        };\n        diffNode = diffNode;\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"attributes\")) {\n            elementNode.attributes = __assign({}, diffNode.attributes);\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"checked\")) {\n            elementNode.checked = diffNode.checked;\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"value\")) {\n            elementNode.value = diffNode.value;\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"selected\")) {\n            elementNode.selected = diffNode.selected;\n        }\n        if (Object.prototype.hasOwnProperty.call(diffNode, \"childNodes\")) {\n            elementNode.childNodes = diffNode.childNodes.map(function (diffChildNode) {\n                return cleanNode(diffChildNode);\n            });\n        }\n        return elementNode;\n    }\n};\nvar isEqual = function (e1, e2) {\n    if (![\"nodeName\", \"value\", \"checked\", \"selected\", \"data\"].every(function (element) {\n        if (e1[element] !== e2[element]) {\n            return false;\n        }\n        return true;\n    })) {\n        return false;\n    }\n    if (Object.prototype.hasOwnProperty.call(e1, \"data\")) {\n        // Comment or Text\n        return true;\n    }\n    e1 = e1;\n    e2 = e2;\n    if (Boolean(e1.attributes) !== Boolean(e2.attributes)) {\n        return false;\n    }\n    if (Boolean(e1.childNodes) !== Boolean(e2.childNodes)) {\n        return false;\n    }\n    if (e1.attributes) {\n        var e1Attributes = Object.keys(e1.attributes);\n        var e2Attributes = Object.keys(e2.attributes);\n        if (e1Attributes.length !== e2Attributes.length) {\n            return false;\n        }\n        if (!e1Attributes.every(function (attribute) {\n            if (e1.attributes[attribute] !==\n                e2.attributes[attribute]) {\n                return false;\n            }\n            return true;\n        })) {\n            return false;\n        }\n    }\n    if (e1.childNodes) {\n        if (e1.childNodes.length !== e2.childNodes.length) {\n            return false;\n        }\n        if (!e1.childNodes.every(function (childNode, index) {\n            return isEqual(childNode, e2.childNodes[index]);\n        })) {\n            return false;\n        }\n    }\n    return true;\n};\nvar roughlyEqual = function (e1, e2, uniqueDescriptors, sameSiblings, preventRecursion) {\n    if (preventRecursion === void 0) { preventRecursion = false; }\n    if (!e1 || !e2) {\n        return false;\n    }\n    if (e1.nodeName !== e2.nodeName) {\n        return false;\n    }\n    if ([\"#text\", \"#comment\"].includes(e1.nodeName)) {\n        // Note that we initially don't care what the text content of a node is,\n        // the mere fact that it's the same tag and \"has text\" means it's roughly\n        // equal, and then we can find out the true text difference later.\n        return preventRecursion\n            ? true\n            : e1.data === e2.data;\n    }\n    e1 = e1;\n    e2 = e2;\n    if (e1.nodeName in uniqueDescriptors) {\n        return true;\n    }\n    if (e1.attributes && e2.attributes) {\n        if (e1.attributes.id) {\n            if (e1.attributes.id !== e2.attributes.id) {\n                return false;\n            }\n            else {\n                var idDescriptor = \"\".concat(e1.nodeName, \"#\").concat(e1.attributes.id);\n                if (idDescriptor in uniqueDescriptors) {\n                    return true;\n                }\n            }\n        }\n        if (e1.attributes[\"class\"] &&\n            e1.attributes[\"class\"] === e2.attributes[\"class\"]) {\n            var classDescriptor = \"\".concat(e1.nodeName, \".\").concat(e1.attributes[\"class\"].replace(/ /g, \".\"));\n            if (classDescriptor in uniqueDescriptors) {\n                return true;\n            }\n        }\n    }\n    if (sameSiblings) {\n        return true;\n    }\n    var nodeList1 = e1.childNodes ? e1.childNodes.slice().reverse() : [];\n    var nodeList2 = e2.childNodes ? e2.childNodes.slice().reverse() : [];\n    if (nodeList1.length !== nodeList2.length) {\n        return false;\n    }\n    if (preventRecursion) {\n        return nodeList1.every(function (element, index) {\n            return element.nodeName === nodeList2[index].nodeName;\n        });\n    }\n    else {\n        // note: we only allow one level of recursion at any depth. If 'preventRecursion'\n        // was not set, we must explicitly force it to true for child iterations.\n        var childUniqueDescriptors_1 = uniqueInBoth(nodeList1, nodeList2);\n        return nodeList1.every(function (element, index) {\n            return roughlyEqual(element, nodeList2[index], childUniqueDescriptors_1, true, true);\n        });\n    }\n};\n/**\n * based on https://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring#JavaScript\n */\nvar findCommonSubsets = function (c1, c2, marked1, marked2) {\n    var lcsSize = 0;\n    var index = [];\n    var c1Length = c1.length;\n    var c2Length = c2.length;\n    var // set up the matching table\n    matches = __spreadArray([], new Array(c1Length + 1), true).map(function () { return []; });\n    var uniqueDescriptors = uniqueInBoth(c1, c2);\n    var // If all of the elements are the same tag, id and class, then we can\n    // consider them roughly the same even if they have a different number of\n    // children. This will reduce removing and re-adding similar elements.\n    subsetsSame = c1Length === c2Length;\n    if (subsetsSame) {\n        c1.some(function (element, i) {\n            var c1Desc = elementDescriptors(element);\n            var c2Desc = elementDescriptors(c2[i]);\n            if (c1Desc.length !== c2Desc.length) {\n                subsetsSame = false;\n                return true;\n            }\n            c1Desc.some(function (description, i) {\n                if (description !== c2Desc[i]) {\n                    subsetsSame = false;\n                    return true;\n                }\n            });\n            if (!subsetsSame) {\n                return true;\n            }\n        });\n    }\n    // fill the matches with distance values\n    for (var c1Index = 0; c1Index < c1Length; c1Index++) {\n        var c1Element = c1[c1Index];\n        for (var c2Index = 0; c2Index < c2Length; c2Index++) {\n            var c2Element = c2[c2Index];\n            if (!marked1[c1Index] &&\n                !marked2[c2Index] &&\n                roughlyEqual(c1Element, c2Element, uniqueDescriptors, subsetsSame)) {\n                matches[c1Index + 1][c2Index + 1] = matches[c1Index][c2Index]\n                    ? matches[c1Index][c2Index] + 1\n                    : 1;\n                if (matches[c1Index + 1][c2Index + 1] >= lcsSize) {\n                    lcsSize = matches[c1Index + 1][c2Index + 1];\n                    index = [c1Index + 1, c2Index + 1];\n                }\n            }\n            else {\n                matches[c1Index + 1][c2Index + 1] = 0;\n            }\n        }\n    }\n    if (lcsSize === 0) {\n        return false;\n    }\n    return {\n        oldValue: index[0] - lcsSize,\n        newValue: index[1] - lcsSize,\n        length: lcsSize\n    };\n};\nvar makeBooleanArray = function (n, v) {\n    return __spreadArray([], new Array(n), true).map(function () { return v; });\n};\n/**\n * Generate arrays that indicate which node belongs to which subset,\n * or whether it's actually an orphan node, existing in only one\n * of the two trees, rather than somewhere in both.\n *\n * So if t1 = <img><canvas><br>, t2 = <canvas><br><img>.\n * The longest subset is \"<canvas><br>\" (length 2), so it will group 0.\n * The second longest is \"<img>\" (length 1), so it will be group 1.\n * gaps1 will therefore be [1,0,0] and gaps2 [0,0,1].\n *\n * If an element is not part of any group, it will stay being 'true', which\n * is the initial value. For example:\n * t1 = <img><p></p><br><canvas>, t2 = <b></b><br><canvas><img>\n *\n * The \"<p></p>\" and \"<b></b>\" do only show up in one of the two and will\n * therefore be marked by \"true\". The remaining parts are parts of the\n * groups 0 and 1:\n * gaps1 = [1, true, 0, 0], gaps2 = [true, 0, 0, 1]\n *\n */\nvar getGapInformation = function (t1, t2, stable) {\n    var gaps1 = t1.childNodes\n        ? makeBooleanArray(t1.childNodes.length, true)\n        : [];\n    var gaps2 = t2.childNodes\n        ? makeBooleanArray(t2.childNodes.length, true)\n        : [];\n    var group = 0;\n    // give elements from the same subset the same group number\n    stable.forEach(function (subset) {\n        var endOld = subset.oldValue + subset.length;\n        var endNew = subset.newValue + subset.length;\n        for (var j = subset.oldValue; j < endOld; j += 1) {\n            gaps1[j] = group;\n        }\n        for (var j = subset.newValue; j < endNew; j += 1) {\n            gaps2[j] = group;\n        }\n        group += 1;\n    });\n    return {\n        gaps1: gaps1,\n        gaps2: gaps2\n    };\n};\n/**\n * Find all matching subsets, based on immediate child differences only.\n */\nvar markBoth = function (marked1, marked2, subset, i) {\n    marked1[subset.oldValue + i] = true;\n    marked2[subset.newValue + i] = true;\n};\nvar markSubTrees = function (oldTree, newTree) {\n    // note: the child lists are views, and so update as we update old/newTree\n    var oldChildren = oldTree.childNodes ? oldTree.childNodes : [];\n    var newChildren = newTree.childNodes ? newTree.childNodes : [];\n    var marked1 = makeBooleanArray(oldChildren.length, false);\n    var marked2 = makeBooleanArray(newChildren.length, false);\n    var subsets = [];\n    var returnIndex = function () {\n        return arguments[1];\n    };\n    var foundAllSubsets = false;\n    var _loop_1 = function () {\n        var subset = findCommonSubsets(oldChildren, newChildren, marked1, marked2);\n        if (subset) {\n            subsets.push(subset);\n            var subsetArray = __spreadArray([], new Array(subset.length), true).map(returnIndex);\n            subsetArray.forEach(function (item) {\n                return markBoth(marked1, marked2, subset, item);\n            });\n        }\n        else {\n            foundAllSubsets = true;\n        }\n    };\n    while (!foundAllSubsets) {\n        _loop_1();\n    }\n    oldTree.subsets = subsets;\n    oldTree.subsetsAge = 100;\n    return subsets;\n};\nvar DiffTracker = /** @class */ (function () {\n    function DiffTracker() {\n        this.list = [];\n    }\n    DiffTracker.prototype.add = function (diffs) {\n        var _a;\n        (_a = this.list).push.apply(_a, diffs);\n    };\n    DiffTracker.prototype.forEach = function (fn) {\n        this.list.forEach(function (li) { return fn(li); });\n    };\n    return DiffTracker;\n}());\n\n// ===== Apply a virtual diff =====\nfunction getFromVirtualRoute(tree, route) {\n    var node = tree;\n    var parentNode;\n    var nodeIndex;\n    route = route.slice();\n    while (route.length > 0) {\n        nodeIndex = route.splice(0, 1)[0];\n        parentNode = node;\n        node = node.childNodes ? node.childNodes[nodeIndex] : undefined;\n    }\n    return {\n        node: node,\n        parentNode: parentNode,\n        nodeIndex: nodeIndex\n    };\n}\nfunction applyVirtualDiff(tree, diff, options) {\n    var _a;\n    var node, parentNode, nodeIndex;\n    if (![options._const.addElement, options._const.addTextElement].includes(diff[options._const.action])) {\n        // For adding nodes, we calculate the route later on. It's different because it includes the position of the newly added item.\n        var routeInfo = getFromVirtualRoute(tree, diff[options._const.route]);\n        node = routeInfo.node;\n        parentNode = routeInfo.parentNode;\n        nodeIndex = routeInfo.nodeIndex;\n    }\n    var newSubsets = [];\n    // pre-diff hook\n    var info = {\n        diff: diff,\n        node: node\n    };\n    if (options.preVirtualDiffApply(info)) {\n        return true;\n    }\n    var newNode;\n    var nodeArray;\n    var route;\n    switch (diff[options._const.action]) {\n        case options._const.addAttribute:\n            if (!node.attributes) {\n                node.attributes = {};\n            }\n            node.attributes[diff[options._const.name]] =\n                diff[options._const.value];\n            if (diff[options._const.name] === \"checked\") {\n                node.checked = true;\n            }\n            else if (diff[options._const.name] === \"selected\") {\n                node.selected = true;\n            }\n            else if (node.nodeName === \"INPUT\" &&\n                diff[options._const.name] === \"value\") {\n                node.value = diff[options._const.value];\n            }\n            break;\n        case options._const.modifyAttribute:\n            node.attributes[diff[options._const.name]] =\n                diff[options._const.newValue];\n            break;\n        case options._const.removeAttribute:\n            delete node.attributes[diff[options._const.name]];\n            if (Object.keys(node.attributes).length === 0) {\n                delete node.attributes;\n            }\n            if (diff[options._const.name] === \"checked\") {\n                node.checked = false;\n            }\n            else if (diff[options._const.name] === \"selected\") {\n                delete node.selected;\n            }\n            else if (node.nodeName === \"INPUT\" &&\n                diff[options._const.name] === \"value\") {\n                delete node.value;\n            }\n            break;\n        case options._const.modifyTextElement:\n            node.data = diff[options._const.newValue];\n            if (parentNode.nodeName === \"TEXTAREA\") {\n                parentNode.value = diff[options._const.newValue];\n            }\n            break;\n        case options._const.modifyValue:\n            node.value = diff[options._const.newValue];\n            break;\n        case options._const.modifyComment:\n            node.data = diff[options._const.newValue];\n            break;\n        case options._const.modifyChecked:\n            node.checked = diff[options._const.newValue];\n            break;\n        case options._const.modifySelected:\n            node.selected = diff[options._const.newValue];\n            break;\n        case options._const.replaceElement:\n            newNode = cleanNode(diff[options._const.newValue]);\n            parentNode.childNodes[nodeIndex] = newNode;\n            break;\n        case options._const.relocateGroup:\n            nodeArray = node.childNodes\n                .splice(diff[options._const.from], diff[options._const.groupLength])\n                .reverse();\n            nodeArray.forEach(function (movedNode) {\n                return node.childNodes.splice(diff[options._const.to], 0, movedNode);\n            });\n            if (node.subsets) {\n                node.subsets.forEach(function (map) {\n                    if (diff[options._const.from] < diff[options._const.to] &&\n                        map.oldValue <= diff[options._const.to] &&\n                        map.oldValue > diff[options._const.from]) {\n                        map.oldValue -= diff[options._const.groupLength];\n                        var splitLength = map.oldValue + map.length - diff[options._const.to];\n                        if (splitLength > 0) {\n                            // new insertion splits map.\n                            newSubsets.push({\n                                oldValue: diff[options._const.to] +\n                                    diff[options._const.groupLength],\n                                newValue: map.newValue + map.length - splitLength,\n                                length: splitLength\n                            });\n                            map.length -= splitLength;\n                        }\n                    }\n                    else if (diff[options._const.from] > diff[options._const.to] &&\n                        map.oldValue > diff[options._const.to] &&\n                        map.oldValue < diff[options._const.from]) {\n                        map.oldValue += diff[options._const.groupLength];\n                        var splitLength = map.oldValue + map.length - diff[options._const.to];\n                        if (splitLength > 0) {\n                            // new insertion splits map.\n                            newSubsets.push({\n                                oldValue: diff[options._const.to] +\n                                    diff[options._const.groupLength],\n                                newValue: map.newValue + map.length - splitLength,\n                                length: splitLength\n                            });\n                            map.length -= splitLength;\n                        }\n                    }\n                    else if (map.oldValue === diff[options._const.from]) {\n                        map.oldValue = diff[options._const.to];\n                    }\n                });\n            }\n            break;\n        case options._const.removeElement:\n            parentNode.childNodes.splice(nodeIndex, 1);\n            if (parentNode.subsets) {\n                parentNode.subsets.forEach(function (map) {\n                    if (map.oldValue > nodeIndex) {\n                        map.oldValue -= 1;\n                    }\n                    else if (map.oldValue === nodeIndex) {\n                        map[\"delete\"] = true;\n                    }\n                    else if (map.oldValue < nodeIndex &&\n                        map.oldValue + map.length > nodeIndex) {\n                        if (map.oldValue + map.length - 1 === nodeIndex) {\n                            map.length--;\n                        }\n                        else {\n                            newSubsets.push({\n                                newValue: map.newValue + nodeIndex - map.oldValue,\n                                oldValue: nodeIndex,\n                                length: map.length - nodeIndex + map.oldValue - 1\n                            });\n                            map.length = nodeIndex - map.oldValue;\n                        }\n                    }\n                });\n            }\n            node = parentNode;\n            break;\n        case options._const.addElement: {\n            route = diff[options._const.route].slice();\n            var c_1 = route.splice(route.length - 1, 1)[0];\n            node = (_a = getFromVirtualRoute(tree, route)) === null || _a === void 0 ? void 0 : _a.node;\n            newNode = cleanNode(diff[options._const.element]);\n            if (!node.childNodes) {\n                node.childNodes = [];\n            }\n            if (c_1 >= node.childNodes.length) {\n                node.childNodes.push(newNode);\n            }\n            else {\n                node.childNodes.splice(c_1, 0, newNode);\n            }\n            if (node.subsets) {\n                node.subsets.forEach(function (map) {\n                    if (map.oldValue >= c_1) {\n                        map.oldValue += 1;\n                    }\n                    else if (map.oldValue < c_1 &&\n                        map.oldValue + map.length > c_1) {\n                        var splitLength = map.oldValue + map.length - c_1;\n                        newSubsets.push({\n                            newValue: map.newValue + map.length - splitLength,\n                            oldValue: c_1 + 1,\n                            length: splitLength\n                        });\n                        map.length -= splitLength;\n                    }\n                });\n            }\n            break;\n        }\n        case options._const.removeTextElement:\n            parentNode.childNodes.splice(nodeIndex, 1);\n            if (parentNode.nodeName === \"TEXTAREA\") {\n                delete parentNode.value;\n            }\n            if (parentNode.subsets) {\n                parentNode.subsets.forEach(function (map) {\n                    if (map.oldValue > nodeIndex) {\n                        map.oldValue -= 1;\n                    }\n                    else if (map.oldValue === nodeIndex) {\n                        map[\"delete\"] = true;\n                    }\n                    else if (map.oldValue < nodeIndex &&\n                        map.oldValue + map.length > nodeIndex) {\n                        if (map.oldValue + map.length - 1 === nodeIndex) {\n                            map.length--;\n                        }\n                        else {\n                            newSubsets.push({\n                                newValue: map.newValue + nodeIndex - map.oldValue,\n                                oldValue: nodeIndex,\n                                length: map.length - nodeIndex + map.oldValue - 1\n                            });\n                            map.length = nodeIndex - map.oldValue;\n                        }\n                    }\n                });\n            }\n            node = parentNode;\n            break;\n        case options._const.addTextElement: {\n            route = diff[options._const.route].slice();\n            var c_2 = route.splice(route.length - 1, 1)[0];\n            newNode = {\n                nodeName: \"#text\",\n                data: diff[options._const.value]\n            };\n            node = getFromVirtualRoute(tree, route).node;\n            if (!node.childNodes) {\n                node.childNodes = [];\n            }\n            if (c_2 >= node.childNodes.length) {\n                node.childNodes.push(newNode);\n            }\n            else {\n                node.childNodes.splice(c_2, 0, newNode);\n            }\n            if (node.nodeName === \"TEXTAREA\") {\n                node.value = diff[options._const.newValue];\n            }\n            if (node.subsets) {\n                node.subsets.forEach(function (map) {\n                    if (map.oldValue >= c_2) {\n                        map.oldValue += 1;\n                    }\n                    if (map.oldValue < c_2 && map.oldValue + map.length > c_2) {\n                        var splitLength = map.oldValue + map.length - c_2;\n                        newSubsets.push({\n                            newValue: map.newValue + map.length - splitLength,\n                            oldValue: c_2 + 1,\n                            length: splitLength\n                        });\n                        map.length -= splitLength;\n                    }\n                });\n            }\n            break;\n        }\n        default:\n            console.log(\"unknown action\");\n    }\n    if (node.subsets) {\n        node.subsets = node.subsets.filter(function (map) { return !map[\"delete\"] && map.oldValue !== map.newValue; });\n        if (newSubsets.length) {\n            node.subsets = node.subsets.concat(newSubsets);\n        }\n    }\n    options.postVirtualDiffApply({\n        node: info.node,\n        diff: info.diff,\n        newNode: newNode\n    });\n    return;\n}\nfunction applyVirtual(tree, diffs, options) {\n    diffs.forEach(function (diff) {\n        applyVirtualDiff(tree, diff, options);\n    });\n    return true;\n}\n\nfunction nodeToObj(aNode, options) {\n    if (options === void 0) { options = { valueDiffing: true }; }\n    var objNode = {\n        nodeName: aNode.nodeName\n    };\n    if (checkElementType(aNode, \"Text\", \"Comment\")) {\n        objNode.data = aNode.data;\n    }\n    else {\n        if (aNode.attributes && aNode.attributes.length > 0) {\n            objNode.attributes = {};\n            var nodeArray = Array.prototype.slice.call(aNode.attributes);\n            nodeArray.forEach(function (attribute) {\n                return (objNode.attributes[attribute.name] = attribute.value);\n            });\n        }\n        if (aNode.childNodes && aNode.childNodes.length > 0) {\n            objNode.childNodes = [];\n            var nodeArray = Array.prototype.slice.call(aNode.childNodes);\n            nodeArray.forEach(function (childNode) {\n                return objNode.childNodes.push(nodeToObj(childNode, options));\n            });\n        }\n        if (options.valueDiffing) {\n            if (checkElementType(aNode, \"HTMLTextAreaElement\")) {\n                objNode.value = aNode.value;\n            }\n            if (checkElementType(aNode, \"HTMLInputElement\") &&\n                [\"radio\", \"checkbox\"].includes(aNode.type.toLowerCase()) &&\n                aNode.checked !== undefined) {\n                objNode.checked = aNode.checked;\n            }\n            else if (checkElementType(aNode, \"HTMLButtonElement\", \"HTMLDataElement\", \"HTMLInputElement\", \"HTMLLIElement\", \"HTMLMeterElement\", \"HTMLOptionElement\", \"HTMLProgressElement\", \"HTMLParamElement\")) {\n                objNode.value = aNode.value;\n            }\n            if (checkElementType(aNode, \"HTMLOptionElement\")) {\n                objNode.selected = aNode.selected;\n            }\n        }\n    }\n    return objNode;\n}\n\n// from html-parse-stringify (MIT)\nvar tagRE = /<\\s*\\/*[a-zA-Z:_][a-zA-Z0-9:_\\-.]*\\s*(?:\"[^\"]*\"['\"]*|'[^']*'['\"]*|[^'\"/>])*\\/*\\s*>|<!--(?:.|\\n|\\r)*?-->/g;\nvar attrRE = /\\s([^'\"/\\s><]+?)[\\s/>]|([^\\s=]+)=\\s?(\".*?\"|'.*?')/g;\nfunction unescape(string) {\n    return string\n        .replace(/&lt;/g, \"<\")\n        .replace(/&gt;/g, \">\")\n        .replace(/&amp;/g, \"&\");\n}\n// create optimized lookup object for\n// void elements as listed here:\n// https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\nvar lookup = {\n    area: true,\n    base: true,\n    br: true,\n    col: true,\n    embed: true,\n    hr: true,\n    img: true,\n    input: true,\n    keygen: true,\n    link: true,\n    menuItem: true,\n    meta: true,\n    param: true,\n    source: true,\n    track: true,\n    wbr: true\n};\nvar parseTag = function (tag, caseSensitive) {\n    var res = {\n        nodeName: \"\",\n        attributes: {}\n    };\n    var voidElement = false;\n    var type = \"tag\";\n    var tagMatch = tag.match(/<\\/?([^\\s]+?)[/\\s>]/);\n    if (tagMatch) {\n        res.nodeName =\n            caseSensitive || tagMatch[1] === \"svg\"\n                ? tagMatch[1]\n                : tagMatch[1].toUpperCase();\n        if (lookup[tagMatch[1]] || tag.charAt(tag.length - 2) === \"/\") {\n            voidElement = true;\n        }\n        // handle comment tag\n        if (res.nodeName.startsWith(\"!--\")) {\n            var endIndex = tag.indexOf(\"-->\");\n            return {\n                type: \"comment\",\n                node: {\n                    nodeName: \"#comment\",\n                    data: endIndex !== -1 ? tag.slice(4, endIndex) : \"\"\n                },\n                voidElement: voidElement\n            };\n        }\n    }\n    var reg = new RegExp(attrRE);\n    var result = null;\n    var done = false;\n    while (!done) {\n        result = reg.exec(tag);\n        if (result === null) {\n            done = true;\n        }\n        else if (result[0].trim()) {\n            if (result[1]) {\n                var attr = result[1].trim();\n                var arr = [attr, \"\"];\n                if (attr.indexOf(\"=\") > -1)\n                    { arr = attr.split(\"=\"); }\n                res.attributes[arr[0]] = arr[1];\n                reg.lastIndex--;\n            }\n            else if (result[2])\n                { res.attributes[result[2]] = result[3]\n                    .trim()\n                    .substring(1, result[3].length - 1); }\n        }\n    }\n    return {\n        type: type,\n        node: res,\n        voidElement: voidElement\n    };\n};\nvar stringToObj = function (html, options) {\n    if (options === void 0) { options = {\n        valueDiffing: true,\n        caseSensitive: false\n    }; }\n    var result = [];\n    var current;\n    var level = -1;\n    var arr = [];\n    var inComponent = false, insideSvg = false;\n    // handle text at top level\n    if (html.indexOf(\"<\") !== 0) {\n        var end = html.indexOf(\"<\");\n        result.push({\n            nodeName: \"#text\",\n            data: end === -1 ? html : html.substring(0, end)\n        });\n    }\n    html.replace(tagRE, function (tag, index) {\n        var isOpen = tag.charAt(1) !== \"/\";\n        var isComment = tag.startsWith(\"<!--\");\n        var start = index + tag.length;\n        var nextChar = html.charAt(start);\n        if (isComment) {\n            var comment = parseTag(tag, options.caseSensitive).node;\n            // if we're at root, push new base node\n            if (level < 0) {\n                result.push(comment);\n                return \"\";\n            }\n            var parent_1 = arr[level];\n            if (parent_1 && comment.nodeName) {\n                if (!parent_1.node.childNodes) {\n                    parent_1.node.childNodes = [];\n                }\n                parent_1.node.childNodes.push(comment);\n            }\n            return \"\";\n        }\n        if (isOpen) {\n            current = parseTag(tag, options.caseSensitive || insideSvg);\n            if (current.node.nodeName === \"svg\") {\n                insideSvg = true;\n            }\n            level++;\n            if (!current.voidElement &&\n                !inComponent &&\n                nextChar &&\n                nextChar !== \"<\") {\n                if (!current.node.childNodes) {\n                    current.node.childNodes = [];\n                }\n                var data = unescape(html.slice(start, html.indexOf(\"<\", start)));\n                current.node.childNodes.push({\n                    nodeName: \"#text\",\n                    data: data\n                });\n                if (options.valueDiffing &&\n                    current.node.nodeName === \"TEXTAREA\") {\n                    current.node.value = data;\n                }\n            }\n            // if we're at root, push new base node\n            if (level === 0 && current.node.nodeName) {\n                result.push(current.node);\n            }\n            var parent_2 = arr[level - 1];\n            if (parent_2 && current.node.nodeName) {\n                if (!parent_2.node.childNodes) {\n                    parent_2.node.childNodes = [];\n                }\n                parent_2.node.childNodes.push(current.node);\n            }\n            arr[level] = current;\n        }\n        if (!isOpen || current.voidElement) {\n            if (level > -1 &&\n                (current.voidElement ||\n                    (options.caseSensitive &&\n                        current.node.nodeName === tag.slice(2, -1)) ||\n                    (!options.caseSensitive &&\n                        current.node.nodeName.toUpperCase() ===\n                            tag.slice(2, -1).toUpperCase()))) {\n                level--;\n                // move current up a level to match the end tag\n                if (level > -1) {\n                    if (current.node.nodeName === \"svg\") {\n                        insideSvg = false;\n                    }\n                    current = arr[level];\n                }\n            }\n            if (nextChar !== \"<\" && nextChar) {\n                // trailing text node\n                // if we're at the root, push a base text node. otherwise add as\n                // a child to the current node.\n                var childNodes = level === -1 ? result : arr[level].node.childNodes || [];\n                // calculate correct end of the data slice in case there's\n                // no tag after the text node.\n                var end = html.indexOf(\"<\", start);\n                var data = unescape(html.slice(start, end === -1 ? undefined : end));\n                childNodes.push({\n                    nodeName: \"#text\",\n                    data: data\n                });\n            }\n        }\n        return \"\";\n    });\n    return result[0];\n};\n\n// ===== Create a diff =====\nvar DiffFinder = /** @class */ (function () {\n    function DiffFinder(t1Node, t2Node, options) {\n        this.options = options;\n        this.t1 = (typeof Element !== \"undefined\" &&\n            checkElementType(t1Node, \"Element\")\n            ? nodeToObj(t1Node, this.options)\n            : typeof t1Node === \"string\"\n                ? stringToObj(t1Node, this.options)\n                : JSON.parse(JSON.stringify(t1Node)));\n        this.t2 = (typeof Element !== \"undefined\" &&\n            checkElementType(t2Node, \"Element\")\n            ? nodeToObj(t2Node, this.options)\n            : typeof t2Node === \"string\"\n                ? stringToObj(t2Node, this.options)\n                : JSON.parse(JSON.stringify(t2Node)));\n        this.diffcount = 0;\n        this.foundAll = false;\n        if (this.debug) {\n            this.t1Orig =\n                typeof Element !== \"undefined\" &&\n                    checkElementType(t1Node, \"Element\")\n                    ? nodeToObj(t1Node, this.options)\n                    : typeof t1Node === \"string\"\n                        ? stringToObj(t1Node, this.options)\n                        : JSON.parse(JSON.stringify(t1Node));\n            this.t2Orig =\n                typeof Element !== \"undefined\" &&\n                    checkElementType(t2Node, \"Element\")\n                    ? nodeToObj(t2Node, this.options)\n                    : typeof t2Node === \"string\"\n                        ? stringToObj(t2Node, this.options)\n                        : JSON.parse(JSON.stringify(t2Node));\n        }\n        this.tracker = new DiffTracker();\n    }\n    DiffFinder.prototype.init = function () {\n        return this.findDiffs(this.t1, this.t2);\n    };\n    DiffFinder.prototype.findDiffs = function (t1, t2) {\n        var diffs;\n        do {\n            if (this.options.debug) {\n                this.diffcount += 1;\n                if (this.diffcount > this.options.diffcap) {\n                    throw new Error(\"surpassed diffcap:\".concat(JSON.stringify(this.t1Orig), \" -> \").concat(JSON.stringify(this.t2Orig)));\n                }\n            }\n            diffs = this.findNextDiff(t1, t2, []);\n            if (diffs.length === 0) {\n                // Last check if the elements really are the same now.\n                // If not, remove all info about being done and start over.\n                // Sometimes a node can be marked as done, but the creation of subsequent diffs means that it has to be changed again.\n                if (!isEqual(t1, t2)) {\n                    if (this.foundAll) {\n                        console.error(\"Could not find remaining diffs!\");\n                    }\n                    else {\n                        this.foundAll = true;\n                        removeDone(t1);\n                        diffs = this.findNextDiff(t1, t2, []);\n                    }\n                }\n            }\n            if (diffs.length > 0) {\n                this.foundAll = false;\n                this.tracker.add(diffs);\n                applyVirtual(t1, diffs, this.options);\n            }\n        } while (diffs.length > 0);\n        return this.tracker.list;\n    };\n    DiffFinder.prototype.findNextDiff = function (t1, t2, route) {\n        var diffs;\n        var fdiffs;\n        if (this.options.maxDepth && route.length > this.options.maxDepth) {\n            return [];\n        }\n        // outer differences?\n        if (!t1.outerDone) {\n            diffs = this.findOuterDiff(t1, t2, route);\n            if (this.options.filterOuterDiff) {\n                fdiffs = this.options.filterOuterDiff(t1, t2, diffs);\n                if (fdiffs)\n                    { diffs = fdiffs; }\n            }\n            if (diffs.length > 0) {\n                t1.outerDone = true;\n                return diffs;\n            }\n            else {\n                t1.outerDone = true;\n            }\n        }\n        if (Object.prototype.hasOwnProperty.call(t1, \"data\")) {\n            // Comment or Text\n            return [];\n        }\n        t1 = t1;\n        t2 = t2;\n        // inner differences?\n        if (!t1.innerDone) {\n            diffs = this.findInnerDiff(t1, t2, route);\n            if (diffs.length > 0) {\n                return diffs;\n            }\n            else {\n                t1.innerDone = true;\n            }\n        }\n        if (this.options.valueDiffing && !t1.valueDone) {\n            // value differences?\n            diffs = this.findValueDiff(t1, t2, route);\n            if (diffs.length > 0) {\n                t1.valueDone = true;\n                return diffs;\n            }\n            else {\n                t1.valueDone = true;\n            }\n        }\n        // no differences\n        return [];\n    };\n    DiffFinder.prototype.findOuterDiff = function (t1, t2, route) {\n        var diffs = [];\n        var attr;\n        var attr1;\n        var attr2;\n        var attrLength;\n        var pos;\n        var i;\n        if (t1.nodeName !== t2.nodeName) {\n            if (!route.length) {\n                throw new Error(\"Top level nodes have to be of the same kind.\");\n            }\n            return [\n                new Diff()\n                    .setValue(this.options._const.action, this.options._const.replaceElement)\n                    .setValue(this.options._const.oldValue, cleanNode(t1))\n                    .setValue(this.options._const.newValue, cleanNode(t2))\n                    .setValue(this.options._const.route, route) ];\n        }\n        if (route.length &&\n            this.options.diffcap <\n                Math.abs((t1.childNodes || []).length - (t2.childNodes || []).length)) {\n            return [\n                new Diff()\n                    .setValue(this.options._const.action, this.options._const.replaceElement)\n                    .setValue(this.options._const.oldValue, cleanNode(t1))\n                    .setValue(this.options._const.newValue, cleanNode(t2))\n                    .setValue(this.options._const.route, route) ];\n        }\n        if (Object.prototype.hasOwnProperty.call(t1, \"data\") &&\n            t1.data !== t2.data) {\n            // Comment or text node.\n            if (t1.nodeName === \"#text\") {\n                return [\n                    new Diff()\n                        .setValue(this.options._const.action, this.options._const.modifyTextElement)\n                        .setValue(this.options._const.route, route)\n                        .setValue(this.options._const.oldValue, t1.data)\n                        .setValue(this.options._const.newValue, t2.data) ];\n            }\n            else {\n                return [\n                    new Diff()\n                        .setValue(this.options._const.action, this.options._const.modifyComment)\n                        .setValue(this.options._const.route, route)\n                        .setValue(this.options._const.oldValue, t1.data)\n                        .setValue(this.options._const.newValue, t2.data) ];\n            }\n        }\n        t1 = t1;\n        t2 = t2;\n        attr1 = t1.attributes ? Object.keys(t1.attributes).sort() : [];\n        attr2 = t2.attributes ? Object.keys(t2.attributes).sort() : [];\n        attrLength = attr1.length;\n        for (i = 0; i < attrLength; i++) {\n            attr = attr1[i];\n            pos = attr2.indexOf(attr);\n            if (pos === -1) {\n                diffs.push(new Diff()\n                    .setValue(this.options._const.action, this.options._const.removeAttribute)\n                    .setValue(this.options._const.route, route)\n                    .setValue(this.options._const.name, attr)\n                    .setValue(this.options._const.value, t1.attributes[attr]));\n            }\n            else {\n                attr2.splice(pos, 1);\n                if (t1.attributes[attr] !== t2.attributes[attr]) {\n                    diffs.push(new Diff()\n                        .setValue(this.options._const.action, this.options._const.modifyAttribute)\n                        .setValue(this.options._const.route, route)\n                        .setValue(this.options._const.name, attr)\n                        .setValue(this.options._const.oldValue, t1.attributes[attr])\n                        .setValue(this.options._const.newValue, t2.attributes[attr]));\n                }\n            }\n        }\n        attrLength = attr2.length;\n        for (i = 0; i < attrLength; i++) {\n            attr = attr2[i];\n            diffs.push(new Diff()\n                .setValue(this.options._const.action, this.options._const.addAttribute)\n                .setValue(this.options._const.route, route)\n                .setValue(this.options._const.name, attr)\n                .setValue(this.options._const.value, t2.attributes[attr]));\n        }\n        return diffs;\n    };\n    DiffFinder.prototype.findInnerDiff = function (t1, t2, route) {\n        var t1ChildNodes = t1.childNodes ? t1.childNodes.slice() : [];\n        var t2ChildNodes = t2.childNodes ? t2.childNodes.slice() : [];\n        var last = Math.max(t1ChildNodes.length, t2ChildNodes.length);\n        var childNodesLengthDifference = Math.abs(t1ChildNodes.length - t2ChildNodes.length);\n        var diffs = [];\n        var index = 0;\n        if (!this.options.maxChildCount || last < this.options.maxChildCount) {\n            var cachedSubtrees = Boolean(t1.subsets && t1.subsetsAge--);\n            var subtrees = cachedSubtrees\n                ? t1.subsets\n                : t1.childNodes && t2.childNodes\n                    ? markSubTrees(t1, t2)\n                    : [];\n            if (subtrees.length > 0) {\n                /* One or more groups have been identified among the childnodes of t1\n                 * and t2.\n                 */\n                diffs = this.attemptGroupRelocation(t1, t2, subtrees, route, cachedSubtrees);\n                if (diffs.length > 0) {\n                    return diffs;\n                }\n            }\n        }\n        /* 0 or 1 groups of similar child nodes have been found\n         * for t1 and t2. 1 If there is 1, it could be a sign that the\n         * contents are the same. When the number of groups is below 2,\n         * t1 and t2 are made to have the same length and each of the\n         * pairs of child nodes are diffed.\n         */\n        for (var i = 0; i < last; i += 1) {\n            var e1 = t1ChildNodes[i];\n            var e2 = t2ChildNodes[i];\n            if (childNodesLengthDifference) {\n                /* t1 and t2 have different amounts of childNodes. Add\n                 * and remove as necessary to obtain the same length */\n                if (e1 && !e2) {\n                    if (e1.nodeName === \"#text\") {\n                        diffs.push(new Diff()\n                            .setValue(this.options._const.action, this.options._const.removeTextElement)\n                            .setValue(this.options._const.route, route.concat(index))\n                            .setValue(this.options._const.value, e1.data));\n                        index -= 1;\n                    }\n                    else {\n                        diffs.push(new Diff()\n                            .setValue(this.options._const.action, this.options._const.removeElement)\n                            .setValue(this.options._const.route, route.concat(index))\n                            .setValue(this.options._const.element, cleanNode(e1)));\n                        index -= 1;\n                    }\n                }\n                else if (e2 && !e1) {\n                    if (e2.nodeName === \"#text\") {\n                        diffs.push(new Diff()\n                            .setValue(this.options._const.action, this.options._const.addTextElement)\n                            .setValue(this.options._const.route, route.concat(index))\n                            .setValue(this.options._const.value, e2.data));\n                    }\n                    else {\n                        diffs.push(new Diff()\n                            .setValue(this.options._const.action, this.options._const.addElement)\n                            .setValue(this.options._const.route, route.concat(index))\n                            .setValue(this.options._const.element, cleanNode(e2)));\n                    }\n                }\n            }\n            /* We are now guaranteed that childNodes e1 and e2 exist,\n             * and that they can be diffed.\n             */\n            /* Diffs in child nodes should not affect the parent node,\n             * so we let these diffs be submitted together with other\n             * diffs.\n             */\n            if (e1 && e2) {\n                if (!this.options.maxChildCount ||\n                    last < this.options.maxChildCount) {\n                    diffs = diffs.concat(this.findNextDiff(e1, e2, route.concat(index)));\n                }\n                else if (!isEqual(e1, e2)) {\n                    if (t1ChildNodes.length > t2ChildNodes.length) {\n                        if (e1.nodeName === \"#text\") {\n                            diffs.push(new Diff()\n                                .setValue(this.options._const.action, this.options._const.removeTextElement)\n                                .setValue(this.options._const.route, route.concat(index))\n                                .setValue(this.options._const.value, e1.data));\n                        }\n                        else {\n                            diffs.push(new Diff()\n                                .setValue(this.options._const.action, this.options._const.removeElement)\n                                .setValue(this.options._const.element, cleanNode(e1))\n                                .setValue(this.options._const.route, route.concat(index)));\n                        }\n                        t1ChildNodes.splice(i, 1);\n                        i -= 1;\n                        index -= 1;\n                        childNodesLengthDifference -= 1;\n                    }\n                    else if (t1ChildNodes.length < t2ChildNodes.length) {\n                        diffs = diffs.concat([\n                            new Diff()\n                                .setValue(this.options._const.action, this.options._const.addElement)\n                                .setValue(this.options._const.element, cleanNode(e2))\n                                .setValue(this.options._const.route, route.concat(index)) ]);\n                        t1ChildNodes.splice(i, 0, cleanNode(e2));\n                        childNodesLengthDifference -= 1;\n                    }\n                    else {\n                        diffs = diffs.concat([\n                            new Diff()\n                                .setValue(this.options._const.action, this.options._const.replaceElement)\n                                .setValue(this.options._const.oldValue, cleanNode(e1))\n                                .setValue(this.options._const.newValue, cleanNode(e2))\n                                .setValue(this.options._const.route, route.concat(index)) ]);\n                    }\n                }\n            }\n            index += 1;\n        }\n        t1.innerDone = true;\n        return diffs;\n    };\n    DiffFinder.prototype.attemptGroupRelocation = function (t1, t2, subtrees, route, cachedSubtrees) {\n        /* Either t1.childNodes and t2.childNodes have the same length, or\n         * there are at least two groups of similar elements can be found.\n         * attempts are made at equalizing t1 with t2. First all initial\n         * elements with no group affiliation (gaps=true) are removed (if\n         * only in t1) or added (if only in t2). Then the creation of a group\n         * relocation diff is attempted.\n         */\n        var gapInformation = getGapInformation(t1, t2, subtrees);\n        var gaps1 = gapInformation.gaps1;\n        var gaps2 = gapInformation.gaps2;\n        var t1ChildNodes = t1.childNodes.slice();\n        var t2ChildNodes = t2.childNodes.slice();\n        var shortest = Math.min(gaps1.length, gaps2.length);\n        var destinationDifferent;\n        var toGroup;\n        var group;\n        var node;\n        var similarNode;\n        var diffs = [];\n        for (var index2 = 0, index1 = 0; index2 < shortest; index1 += 1, index2 += 1) {\n            if (cachedSubtrees &&\n                (gaps1[index2] === true || gaps2[index2] === true)) ;\n            else if (gaps1[index1] === true) {\n                node = t1ChildNodes[index1];\n                if (node.nodeName === \"#text\") {\n                    if (t2ChildNodes[index2].nodeName === \"#text\") {\n                        if (node.data !==\n                            t2ChildNodes[index2].data) {\n                            // Check whether a text node with the same value follows later on.\n                            var testI = index1;\n                            while (t1ChildNodes.length > testI + 1 &&\n                                t1ChildNodes[testI + 1].nodeName === \"#text\") {\n                                testI += 1;\n                                if (t2ChildNodes[index2]\n                                    .data ===\n                                    t1ChildNodes[testI]\n                                        .data) {\n                                    similarNode = true;\n                                    break;\n                                }\n                            }\n                            if (!similarNode) {\n                                diffs.push(new Diff()\n                                    .setValue(this.options._const.action, this.options._const\n                                    .modifyTextElement)\n                                    .setValue(this.options._const.route, route.concat(index1))\n                                    .setValue(this.options._const.oldValue, node.data)\n                                    .setValue(this.options._const.newValue, t2ChildNodes[index2].data));\n                            }\n                        }\n                    }\n                    else {\n                        diffs.push(new Diff()\n                            .setValue(this.options._const.action, this.options._const.removeTextElement)\n                            .setValue(this.options._const.route, route.concat(index1))\n                            .setValue(this.options._const.value, node.data));\n                        gaps1.splice(index1, 1);\n                        t1ChildNodes.splice(index1, 1);\n                        shortest = Math.min(gaps1.length, gaps2.length);\n                        index1 -= 1;\n                        index2 -= 1;\n                    }\n                }\n                else if (gaps2[index2] === true) {\n                    // both gaps1[index1] and gaps2[index2]  are true.\n                    // We replace one element with another.\n                    diffs.push(new Diff()\n                        .setValue(this.options._const.action, this.options._const.replaceElement)\n                        .setValue(this.options._const.oldValue, cleanNode(node))\n                        .setValue(this.options._const.newValue, cleanNode(t2ChildNodes[index2]))\n                        .setValue(this.options._const.route, route.concat(index1)));\n                    // t1ChildNodes at position index1 is not up-to-date, but that does not matter as\n                    // index1 will increase +1\n                }\n                else {\n                    diffs.push(new Diff()\n                        .setValue(this.options._const.action, this.options._const.removeElement)\n                        .setValue(this.options._const.route, route.concat(index1))\n                        .setValue(this.options._const.element, cleanNode(node)));\n                    gaps1.splice(index1, 1);\n                    t1ChildNodes.splice(index1, 1);\n                    shortest = Math.min(gaps1.length, gaps2.length);\n                    index1 -= 1;\n                    index2 -= 1;\n                }\n            }\n            else if (gaps2[index2] === true) {\n                node = t2ChildNodes[index2];\n                if (node.nodeName === \"#text\") {\n                    diffs.push(new Diff()\n                        .setValue(this.options._const.action, this.options._const.addTextElement)\n                        .setValue(this.options._const.route, route.concat(index1))\n                        .setValue(this.options._const.value, node.data));\n                    gaps1.splice(index1, 0, true);\n                    t1ChildNodes.splice(index1, 0, {\n                        nodeName: \"#text\",\n                        data: node.data\n                    });\n                    shortest = Math.min(gaps1.length, gaps2.length);\n                    //index1 += 1\n                }\n                else {\n                    diffs.push(new Diff()\n                        .setValue(this.options._const.action, this.options._const.addElement)\n                        .setValue(this.options._const.route, route.concat(index1))\n                        .setValue(this.options._const.element, cleanNode(node)));\n                    gaps1.splice(index1, 0, true);\n                    t1ChildNodes.splice(index1, 0, cleanNode(node));\n                    shortest = Math.min(gaps1.length, gaps2.length);\n                    //index1 += 1\n                }\n            }\n            else if (gaps1[index1] !== gaps2[index2]) {\n                if (diffs.length > 0) {\n                    return diffs;\n                }\n                // group relocation\n                group = subtrees[gaps1[index1]];\n                toGroup = Math.min(group.newValue, t1ChildNodes.length - group.length);\n                if (toGroup !== group.oldValue) {\n                    // Check whether destination nodes are different than originating ones.\n                    destinationDifferent = false;\n                    for (var j = 0; j < group.length; j += 1) {\n                        if (!roughlyEqual(t1ChildNodes[toGroup + j], t1ChildNodes[group.oldValue + j], {}, false, true)) {\n                            destinationDifferent = true;\n                        }\n                    }\n                    if (destinationDifferent) {\n                        return [\n                            new Diff()\n                                .setValue(this.options._const.action, this.options._const.relocateGroup)\n                                .setValue(this.options._const.groupLength, group.length)\n                                .setValue(this.options._const.from, group.oldValue)\n                                .setValue(this.options._const.to, toGroup)\n                                .setValue(this.options._const.route, route) ];\n                    }\n                }\n            }\n        }\n        return diffs;\n    };\n    DiffFinder.prototype.findValueDiff = function (t1, t2, route) {\n        // Differences of value. Only useful if the value/selection/checked value\n        // differs from what is represented in the DOM. For example in the case\n        // of filled out forms, etc.\n        var diffs = [];\n        if (t1.selected !== t2.selected) {\n            diffs.push(new Diff()\n                .setValue(this.options._const.action, this.options._const.modifySelected)\n                .setValue(this.options._const.oldValue, t1.selected)\n                .setValue(this.options._const.newValue, t2.selected)\n                .setValue(this.options._const.route, route));\n        }\n        if ((t1.value || t2.value) &&\n            t1.value !== t2.value &&\n            t1.nodeName !== \"OPTION\") {\n            diffs.push(new Diff()\n                .setValue(this.options._const.action, this.options._const.modifyValue)\n                .setValue(this.options._const.oldValue, t1.value || \"\")\n                .setValue(this.options._const.newValue, t2.value || \"\")\n                .setValue(this.options._const.route, route));\n        }\n        if (t1.checked !== t2.checked) {\n            diffs.push(new Diff()\n                .setValue(this.options._const.action, this.options._const.modifyChecked)\n                .setValue(this.options._const.oldValue, t1.checked)\n                .setValue(this.options._const.newValue, t2.checked)\n                .setValue(this.options._const.route, route));\n        }\n        return diffs;\n    };\n    return DiffFinder;\n}());\n\nvar DEFAULT_OPTIONS = {\n    debug: false,\n    diffcap: 10,\n    maxDepth: false,\n    maxChildCount: 50,\n    valueDiffing: true,\n    // syntax: textDiff: function (node, currentValue, expectedValue, newValue)\n    textDiff: function (node, currentValue, expectedValue, newValue) {\n        node.data = newValue;\n        return;\n    },\n    // empty functions were benchmarked as running faster than both\n    // `f && f()` and `if (f) { f(); }`\n    preVirtualDiffApply: function () { },\n    postVirtualDiffApply: function () { },\n    preDiffApply: function () { },\n    postDiffApply: function () { },\n    filterOuterDiff: null,\n    compress: false,\n    _const: false,\n    document: typeof window !== \"undefined\" && window.document\n        ? window.document\n        : false,\n    components: []\n};\nvar DiffDOM = /** @class */ (function () {\n    function DiffDOM(options) {\n        if (options === void 0) { options = {}; }\n        // IE11 doesn't have Object.assign and buble doesn't translate object spreaders\n        // by default, so this is the safest way of doing it currently.\n        Object.entries(DEFAULT_OPTIONS).forEach(function (_a) {\n            var key = _a[0], value = _a[1];\n            if (!Object.prototype.hasOwnProperty.call(options, key)) {\n                options[key] = value;\n            }\n        });\n        if (!options._const) {\n            var varNames = [\n                \"addAttribute\",\n                \"modifyAttribute\",\n                \"removeAttribute\",\n                \"modifyTextElement\",\n                \"relocateGroup\",\n                \"removeElement\",\n                \"addElement\",\n                \"removeTextElement\",\n                \"addTextElement\",\n                \"replaceElement\",\n                \"modifyValue\",\n                \"modifyChecked\",\n                \"modifySelected\",\n                \"modifyComment\",\n                \"action\",\n                \"route\",\n                \"oldValue\",\n                \"newValue\",\n                \"element\",\n                \"group\",\n                \"groupLength\",\n                \"from\",\n                \"to\",\n                \"name\",\n                \"value\",\n                \"data\",\n                \"attributes\",\n                \"nodeName\",\n                \"childNodes\",\n                \"checked\",\n                \"selected\" ];\n            var constNames_1 = {};\n            if (options.compress) {\n                varNames.forEach(function (varName, index) { return (constNames_1[varName] = index); });\n            }\n            else {\n                varNames.forEach(function (varName) { return (constNames_1[varName] = varName); });\n            }\n            options._const = constNames_1;\n        }\n        this.options = options;\n    }\n    DiffDOM.prototype.apply = function (tree, diffs) {\n        return applyDOM(tree, diffs, this.options);\n    };\n    DiffDOM.prototype.undo = function (tree, diffs) {\n        return undoDOM(tree, diffs, this.options);\n    };\n    DiffDOM.prototype.diff = function (t1Node, t2Node) {\n        var finder = new DiffFinder(t1Node, t2Node, this.options);\n        return finder.init();\n    };\n    return DiffDOM;\n}());\n\n/**\n * Use TraceLogger to figure out function calls inside\n * JS objects by wrapping an object with a TraceLogger\n * instance.\n *\n * Pretty-prints the call trace (using unicode box code)\n * when tracelogger.toString() is called.\n */\n/**\n * Wrap an object by calling new TraceLogger(obj)\n *\n * If you're familiar with Python decorators, this\n * does roughly the same thing, adding pre/post\n * call hook logging calls so that you can see\n * what's going on.\n */\nvar TraceLogger = /** @class */ (function () {\n    function TraceLogger(obj) {\n        if (obj === void 0) { obj = {}; }\n        var _this = this;\n        this.pad = \"│   \";\n        this.padding = \"\";\n        this.tick = 1;\n        this.messages = [];\n        var wrapkey = function (obj, key) {\n            // trace this function\n            var oldfn = obj[key];\n            obj[key] = function () {\n                var arguments$1 = arguments;\n\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments$1[_i];\n                }\n                _this.fin(key, Array.prototype.slice.call(args));\n                var result = oldfn.apply(obj, args);\n                _this.fout(key, result);\n                return result;\n            };\n        };\n        // can't use Object.keys for prototype walking\n        for (var key in obj) {\n            if (typeof obj[key] === \"function\") {\n                wrapkey(obj, key);\n            }\n        }\n        this.log(\"┌ TRACELOG START\");\n    }\n    // called when entering a function\n    TraceLogger.prototype.fin = function (fn, args) {\n        this.padding += this.pad;\n        this.log(\"\\u251C\\u2500> entering \".concat(fn), args);\n    };\n    // called when exiting a function\n    TraceLogger.prototype.fout = function (fn, result) {\n        this.log(\"│<──┘ generated return value\", result);\n        this.padding = this.padding.substring(0, this.padding.length - this.pad.length);\n    };\n    // log message formatting\n    TraceLogger.prototype.format = function (s, tick) {\n        var nf = function (t) {\n            var tStr = \"\".concat(t);\n            while (tStr.length < 4) {\n                tStr = \"0\".concat(t);\n            }\n            return tStr;\n        };\n        return \"\".concat(nf(tick), \"> \").concat(this.padding).concat(s);\n    };\n    // log a trace message\n    TraceLogger.prototype.log = function () {\n        var arguments$1 = arguments;\n\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments$1[_i];\n        }\n        var stringCollapse = function (v) {\n            if (!v) {\n                return \"<falsey>\";\n            }\n            if (typeof v === \"string\") {\n                return v;\n            }\n            if (checkElementType(v, \"HTMLElement\")) {\n                return v.outerHTML || \"<empty>\";\n            }\n            if (v instanceof Array) {\n                return \"[\".concat(v.map(stringCollapse).join(\",\"), \"]\");\n            }\n            return v.toString() || v.valueOf() || \"<unknown>\";\n        };\n        var s = args.map(stringCollapse).join(\", \");\n        this.messages.push(this.format(s, this.tick++));\n    };\n    // turn the log into a structured string with\n    // unicode box codes to make it a sensible trace.\n    TraceLogger.prototype.toString = function () {\n        var cap = \"×   \";\n        var terminator = \"└───\";\n        while (terminator.length <= this.padding.length + this.pad.length) {\n            terminator += cap;\n        }\n        var _ = this.padding;\n        this.padding = \"\";\n        terminator = this.format(terminator, this.tick);\n        this.padding = _;\n        return \"\".concat(this.messages.join(\"\\n\"), \"\\n\").concat(terminator);\n    };\n    return TraceLogger;\n}());\n\nexport { DiffDOM, TraceLogger, nodeToObj, stringToObj };\n//# sourceMappingURL=module.js.map\n","import {stringToObj} from \"diff-dom\"\n\nimport {cellType, columnsStateType, columnSettingsType, DataTableOptions, headerCellType, elementNodeType, textNodeType, renderOptions, rowType} from \"./types\"\nimport {cellToText, joinWithSpaces} from \"./helpers\"\n\n\nexport const headingsToVirtualHeaderRowDOM = (\n    headings,\n    columnSettings,\n    columnsState: columnsStateType,\n    {\n        classes,\n        format,\n        hiddenHeader,\n        sortable,\n        scrollY,\n        type\n    }: DataTableOptions,\n    {\n        noColumnWidths,\n        unhideHeader\n    }: renderOptions\n) => ({\n    nodeName: \"TR\",\n\n    childNodes: headings.map(\n        (heading: headerCellType, index: number) : elementNodeType | void => {\n            const column = columnSettings[index] || ({\n                type,\n                format,\n                sortable: true,\n                searchable: true\n            } as columnSettingsType)\n            if (column.hidden) {\n                return\n            }\n            const attributes : { [key: string]: string } = heading.attributes ? {...heading.attributes} : {}\n            if (column.sortable && sortable && (!scrollY.length || unhideHeader)) {\n                if (column.filter) {\n                    attributes[\"data-filterable\"] = \"true\"\n                } else {\n                    attributes[\"data-sortable\"] = \"true\"\n                }\n            }\n\n            if (column.headerClass) {\n                attributes.class = joinWithSpaces(attributes.class, column.headerClass)\n            }\n            if (columnsState.sort && columnsState.sort.column === index) {\n                const directionClass = columnsState.sort.dir === \"asc\" ? classes.ascending : classes.descending\n                attributes.class = joinWithSpaces(attributes.class, directionClass)\n                attributes[\"aria-sort\"] = columnsState.sort.dir === \"asc\" ? \"ascending\" : \"descending\"\n            } else if (columnsState.filters[index]) {\n                attributes.class = joinWithSpaces(attributes.class, classes.filterActive)\n            }\n\n            if (columnsState.widths[index] && !noColumnWidths) {\n                const style = `width: ${columnsState.widths[index]}%;`\n                attributes.style = joinWithSpaces(attributes.style, style)\n            }\n            if (scrollY.length && !unhideHeader) {\n                const style = \"padding-bottom: 0;padding-top: 0;border: 0;\"\n                attributes.style = joinWithSpaces(attributes.style, style)\n            }\n\n            const headerNodes : elementNodeType[] = heading.type === \"html\" ?\n                heading.data as elementNodeType[] :\n                [\n                    {\n                        nodeName: \"#text\",\n                        data: heading.text ?? String(heading.data)\n                    }\n                ] as textNodeType[]\n            return {\n                nodeName: \"TH\",\n                attributes,\n                childNodes:\n                    ((hiddenHeader || scrollY.length) && !unhideHeader) ?\n                        [\n                            {\n                                nodeName: \"#text\",\n                                data: \"\"\n                            }\n                        ] :\n                        !column.sortable || !sortable ?\n                            headerNodes :\n                            [\n                                {\n                                    nodeName: \"BUTTON\",\n                                    attributes: {\n                                        class: column.filter ? classes.filter : classes.sorter\n                                    },\n                                    childNodes: headerNodes\n                                }\n                            ]\n            }\n        }\n    ).filter((column: (elementNodeType | void)) => column)\n})\n\nexport const dataToVirtualDOM = (tableAttributes: { [key: string]: string}, headings: headerCellType[], rows: rowType[], columnSettings: columnSettingsType[], columnsState: columnsStateType, rowCursor: (number | false), {\n    classes,\n    hiddenHeader,\n    header,\n    footer,\n    format,\n    sortable,\n    scrollY,\n    type,\n    rowRender,\n    tabIndex\n}: DataTableOptions, {\n    noColumnWidths,\n    unhideHeader,\n    renderHeader\n}: renderOptions, footers: elementNodeType[], captions: elementNodeType[]) => {\n    const table: elementNodeType = {\n        nodeName: \"TABLE\",\n        attributes: {...tableAttributes},\n        childNodes: [\n            {\n                nodeName: \"TBODY\",\n                childNodes: rows.map(\n                    ({row, index}) => {\n                        const tr: elementNodeType = {\n                            nodeName: \"TR\",\n                            attributes: {\n                                ...row.attributes,\n                                ...{\n                                    \"data-index\": String(index)\n                                }\n                            },\n                            childNodes: row.cells.map(\n                                (cell: cellType, cIndex: number) => {\n                                    const column = columnSettings[cIndex] || ({\n                                        type,\n                                        format,\n                                        sortable: true,\n                                        searchable: true\n                                    } as columnSettingsType)\n                                    if (column.hidden) {\n                                        return\n                                    }\n                                    const td: elementNodeType = {\n                                        nodeName: \"TD\",\n                                        attributes: cell.attributes ? {...cell.attributes} : {},\n                                        childNodes: column.type === \"html\" ?\n                                            cell.data :\n                                            [\n                                                {\n                                                    nodeName: \"#text\",\n                                                    data: cellToText(cell)\n                                                }\n                                            ]\n                                    } as elementNodeType\n                                    if (!header && !footer && columnsState.widths[cIndex] && !noColumnWidths) {\n                                        td.attributes.style = joinWithSpaces(td.attributes.style, `width: ${columnsState.widths[cIndex]}%;`)\n                                    }\n                                    if (column.cellClass) {\n                                        td.attributes.class = joinWithSpaces(td.attributes.class, column.cellClass)\n                                    }\n                                    if (column.render) {\n                                        const renderedCell : (string | elementNodeType | void) = column.render(cell.data, td, index, cIndex)\n                                        if (renderedCell) {\n                                            if (typeof renderedCell === \"string\") {\n                                                // Convenience method to make it work similarly to what it did up to version 5.\n                                                const node = stringToObj(`<td>${renderedCell}</td>`)\n\n                                                if (node.childNodes.length !== 1 || ![\"#text\", \"#comment\"].includes(node.childNodes[0].nodeName)) {\n                                                    td.childNodes = node.childNodes\n                                                } else {\n                                                    (td.childNodes[0] as textNodeType).data = renderedCell\n                                                }\n\n                                            } else {\n                                                return renderedCell\n                                            }\n                                        }\n\n                                    }\n                                    return td\n                                }\n                            ).filter((column: (elementNodeType | void)) => column)\n                        }\n                        if (index === rowCursor) {\n                            tr.attributes.class = joinWithSpaces(tr.attributes.class, classes.cursor)\n                        }\n                        if (rowRender) {\n                            const renderedRow : (elementNodeType | void) = rowRender(row, tr, index)\n                            if (renderedRow) {\n                                if (typeof renderedRow === \"string\") {\n                                    // Convenience method to make it work similarly to what it did up to version 5.\n                                    const node = stringToObj(`<tr>${renderedRow}</tr>`)\n                                    if (node.childNodes && (node.childNodes.length !== 1 || ![\"#text\", \"#comment\"].includes(node.childNodes[0].nodeName))) {\n                                        tr.childNodes = node.childNodes\n                                    } else {\n                                        (tr.childNodes[0] as textNodeType).data = renderedRow\n                                    }\n\n                                } else {\n                                    return renderedRow\n                                }\n                            }\n                        }\n                        return tr\n                    }\n                )\n            } as elementNodeType\n        ]\n    }\n\n    table.attributes.class = joinWithSpaces(table.attributes.class, classes.table)\n\n    if (header || footer || renderHeader) {\n        const headerRow: elementNodeType = headingsToVirtualHeaderRowDOM(headings, columnSettings, columnsState, {classes,\n            hiddenHeader,\n            sortable,\n            scrollY}, {noColumnWidths,\n            unhideHeader})\n\n        if (header || renderHeader) {\n            const thead: elementNodeType = {\n                nodeName: \"THEAD\",\n                childNodes: [headerRow]\n            }\n            if ((scrollY.length || hiddenHeader) && !unhideHeader) {\n                thead.attributes = {\n                    style: \"height: 0px;\"\n                }\n            }\n            table.childNodes.unshift(thead)\n        }\n        if (footer) {\n            const footerRow = header ? structuredClone(headerRow) : headerRow\n            const tfoot: elementNodeType = {\n                nodeName: \"TFOOT\",\n                childNodes: [footerRow]\n            }\n            if ((scrollY.length || hiddenHeader) && !unhideHeader) {\n                tfoot.attributes = {style: \"height: 0px;\"}\n            }\n            table.childNodes.push(tfoot)\n        }\n    }\n\n    footers.forEach(foot => table.childNodes.push(foot))\n    captions.forEach(caption => table.childNodes.push(caption))\n\n    if (tabIndex !== false) {\n        table.attributes.tabindex = String(tabIndex)\n    }\n\n    return table\n}\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d\\d/,r=/\\d\\d?/,i=/\\d*[^-_:/,()\\s\\d]+/,o={},s=function(e){return(e=+e)+(e>68?1900:2e3)};var a=function(e){return function(t){this[e]=+t}},f=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],h=function(e){var t=o[e];return t&&(t.indexOf?t:t.s.concat(t.f))},u=function(e,t){var n,r=o.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},d={A:[i,function(e){this.afternoon=u(e,!1)}],a:[i,function(e){this.afternoon=u(e,!0)}],S:[/\\d/,function(e){this.milliseconds=100*+e}],SS:[n,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[r,a(\"seconds\")],ss:[r,a(\"seconds\")],m:[r,a(\"minutes\")],mm:[r,a(\"minutes\")],H:[r,a(\"hours\")],h:[r,a(\"hours\")],HH:[r,a(\"hours\")],hh:[r,a(\"hours\")],D:[r,a(\"day\")],DD:[n,a(\"day\")],Do:[i,function(e){var t=o.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],M:[r,a(\"month\")],MM:[n,a(\"month\")],MMM:[i,function(e){var t=h(\"months\"),n=(h(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[i,function(e){var t=h(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,a(\"year\")],YY:[n,function(e){this.year=s(e)}],YYYY:[/\\d{4}/,a(\"year\")],Z:f,ZZ:f};function c(n){var r,i;r=n,i=o&&o.formats;for(var s=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=s.length,f=0;f<a;f+=1){var h=s[f],u=d[h],c=u&&u[0],l=u&&u[1];s[f]=l?{regex:c,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=s[n];if(\"string\"==typeof i)r+=i.length;else{var o=i.regex,f=i.parser,h=e.slice(r),u=o.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(s=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,s=e.args;this.$u=r;var a=s[1];if(\"string\"==typeof a){var f=!0===s[2],h=!0===s[3],u=f||h,d=s[2];h&&(d=s[2]),o=this.$locale(),!f&&d&&(o=n.Ls[d]),this.$d=function(e,t,n){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var r=c(t)(e),i=r.year,o=r.month,s=r.day,a=r.hours,f=r.minutes,h=r.seconds,u=r.milliseconds,d=r.zone,l=new Date,m=s||(i||o?1:l.getDate()),M=i||l.getFullYear(),Y=0;i&&!o||(Y=o>0?o-1:l.getMonth());var p=a||0,v=f||0,D=h||0,g=u||0;return d?new Date(Date.UTC(M,Y,m,p,v,D,g+60*d.offset*1e3)):n?new Date(Date.UTC(M,Y,m,p,v,D,g)):new Date(M,Y,m,p,v,D,g)}catch(e){return new Date(\"\")}}(t,a,r),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),o={}}else if(a instanceof Array)for(var l=a.length,m=1;m<=l;m+=1){s[1]=a[m-1];var M=n.apply(this,s);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===l&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","import dayjs from \"dayjs\"\nimport customParseFormat from \"dayjs/plugin/customParseFormat\"\n\ndayjs.extend(customParseFormat)\n\n/**\n * Use dayjs to parse cell contents for sorting\n */\nexport const parseDate = (content: string, format: string) => {\n    let date: number | string\n\n    // Converting to YYYYMMDD ensures we can accurately sort the column numerically\n\n    if (format) {\n        switch (format) {\n        case \"ISO_8601\":\n            // ISO8601 is already lexiographically sorted, so we can just sort it as a string.\n            date = content\n            break\n        case \"RFC_2822\":\n            date = dayjs(content.slice(5), \"DD MMM YYYY HH:mm:ss ZZ\").unix()\n            break\n        case \"MYSQL\":\n            date = dayjs(content, \"YYYY-MM-DD hh:mm:ss\").unix()\n            break\n        case \"UNIX\":\n            date = dayjs(content).unix()\n            break\n        // User defined format using the data-format attribute or columns[n].format option\n        default:\n            date = dayjs(content, format, true).valueOf()\n            break\n        }\n    }\n    return date\n}\n","import {nodeToObj, stringToObj} from \"diff-dom\"\nimport {parseDate} from \"./date\"\nimport {namedNodeMapToObject, objToText} from \"./helpers\"\nimport {\n    cellType,\n    columnSettingsType,\n    DataOption,\n    dataRowType,\n    headerCellType,\n    inputCellType,\n    inputHeaderCellType,\n    inputRowType,\n    nodeType\n} from \"./types\"\n\nexport const readDataCell = (cell: inputCellType, columnSettings : columnSettingsType) : cellType => {\n    if (cell?.constructor === Object && Object.prototype.hasOwnProperty.call(cell, \"data\") && !Object.keys(cell).find(key => !([\"text\", \"order\", \"data\", \"attributes\"].includes(key)))) {\n        return (cell as cellType)\n    }\n    const cellData : cellType = {\n        data: cell\n    }\n    switch (columnSettings.type) {\n    case \"string\":\n        if (!(typeof cell === \"string\")) {\n            cellData.text = String(cellData.data)\n            cellData.order = cellData.text\n        }\n        break\n    case \"date\":\n        if (columnSettings.format) {\n            cellData.order = parseDate(String(cellData.data), columnSettings.format)\n        }\n        break\n    case \"number\":\n        cellData.text = String(cellData.data as number)\n        cellData.data = parseFloat(cellData.data as string)\n        cellData.order = cellData.data\n        break\n    case \"html\": {\n        const node = Array.isArray(cellData.data) ?\n            {nodeName: \"TD\",\n                childNodes: (cellData.data as nodeType[])} : // If it is an array, we assume it is an array of nodeType\n            stringToObj(`<td>${String(cellData.data)}</td>`)\n        cellData.data = node.childNodes || []\n        const text = objToText(node)\n        cellData.text = text\n        cellData.order = text\n        break\n    }\n    case \"boolean\":\n        if (typeof cellData.data === \"string\") {\n            cellData.data = cellData.data.toLowerCase().trim()\n        }\n        cellData.data = ![\"false\", false, null, undefined, 0].includes(cellData.data as (string | number | boolean | null | undefined))\n        cellData.order = cellData.data ? 1 : 0\n        cellData.text = String(cellData.data)\n        break\n    case \"other\":\n        cellData.text = \"\"\n        cellData.order = 0\n        break\n    default:\n        cellData.text = JSON.stringify(cellData.data)\n        break\n    }\n\n    return cellData\n}\n\nconst readDOMDataCell = (cell: HTMLElement, columnSettings : columnSettingsType) : cellType => {\n    let cellData : cellType\n    switch (columnSettings.type) {\n    case \"string\":\n        cellData = {\n            data: cell.innerText\n        }\n        break\n    case \"date\": {\n        const data = cell.innerText\n        cellData = {\n            data,\n            order: parseDate(data, columnSettings.format)\n        }\n        break\n    }\n    case \"number\": {\n        const data = parseFloat(cell.innerText)\n        cellData = {\n            data,\n            order: data,\n            text: cell.innerText\n        }\n        break\n    }\n    case \"boolean\": {\n        const data = ![\"false\", \"0\", \"null\", \"undefined\"].includes(cell.innerText.toLowerCase().trim())\n        cellData = {\n            data,\n            text: data ? \"1\" : \"0\",\n            order: data ? 1 : 0\n        }\n        break\n    }\n    default: { // \"html\", \"other\"\n        const node = nodeToObj(cell, {valueDiffing: false})\n        cellData = {\n            data: node.childNodes || [],\n            text: cell.innerText,\n            order: cell.innerText\n        }\n        break\n    }\n    }\n\n    // Save cell attributes to reference when rendering\n    cellData.attributes = namedNodeMapToObject(cell.attributes)\n\n    return cellData\n}\n\n\nexport const readHeaderCell = (cell: inputHeaderCellType) : headerCellType => {\n    if (\n        cell instanceof Object &&\n        cell.constructor === Object &&\n        cell.hasOwnProperty(\"data\") &&\n        (typeof cell.text === \"string\" || typeof cell.data === \"string\")\n    ) {\n        return cell\n    }\n    const cellData : headerCellType = {\n        data: cell\n    }\n    if (typeof cell === \"string\") {\n        if (cell.length) {\n            const node = stringToObj(`<th>${cell}</th>`)\n            if (node.childNodes && (node.childNodes.length !== 1 || node.childNodes[0].nodeName !== \"#text\")) {\n                cellData.data = node.childNodes\n                cellData.type = \"html\"\n                const text = objToText(node)\n                cellData.text = text\n            }\n        }\n\n    } else if ([null, undefined].includes(cell)) {\n        cellData.text = \"\"\n    } else {\n        cellData.text = JSON.stringify(cell)\n    }\n    return cellData\n}\n\nexport const readDOMHeaderCell = (cell: HTMLElement) : headerCellType => {\n    const node = nodeToObj(cell, {valueDiffing: false})\n    let cellData: headerCellType\n    if (node.childNodes && (node.childNodes.length !== 1 || node.childNodes[0].nodeName !== \"#text\")) {\n        cellData = {\n            data: node.childNodes,\n            type: \"html\",\n            text: objToText(node)\n        }\n    } else {\n        cellData = {\n            data: cell.innerText,\n            type: \"string\"\n        }\n    }\n\n    // Save header cell attributes to reference when rendering\n    cellData.attributes = node.attributes\n\n    return cellData\n\n}\n\nexport const readTableData = (dataOption: DataOption, dom: (HTMLTableElement | undefined)=undefined, columnSettings, defaultType, defaultFormat) => {\n\n    const data = {\n        data: [] as dataRowType[],\n        headings: [] as headerCellType[]\n    }\n    if (dataOption.headings) {\n        data.headings = dataOption.headings.map((heading: inputHeaderCellType) => readHeaderCell(heading))\n    } else if (dom?.tHead) {\n        data.headings = Array.from(dom.tHead.querySelectorAll(\"th\")).map((th, index) => {\n            const heading = readDOMHeaderCell(th)\n            if (!columnSettings[index]) {\n                columnSettings[index] = {\n                    type: defaultType,\n                    format: defaultFormat,\n                    searchable: true,\n                    sortable: true\n                }\n            }\n            const settings = columnSettings[index]\n            if (th.dataset.sortable?.trim().toLowerCase() === \"false\" || th.dataset.sort?.trim().toLowerCase() === \"false\") {\n                settings.sortable = false\n            }\n            if (th.dataset.searchable?.trim().toLowerCase() === \"false\") {\n                settings.searchable = false\n            }\n            if (th.dataset.hidden?.trim().toLowerCase() === \"true\" || th.getAttribute(\"hidden\")?.trim().toLowerCase() === \"true\") {\n                settings.hidden = true\n            }\n            if ([\"number\", \"string\", \"html\", \"date\", \"boolean\", \"other\"].includes(th.dataset.type)) {\n                settings.type = th.dataset.type\n                if (settings.type === \"date\" && th.dataset.format) {\n                    settings.format = th.dataset.format\n                }\n            }\n            return heading\n        })\n    } else if (dataOption.data?.length) {\n        const firstRow = dataOption.data[0]\n        const firstRowCells = Array.isArray(firstRow) ? firstRow : firstRow.cells\n        data.headings = firstRowCells.map((_cell: inputCellType) => readHeaderCell(\"\"))\n    } else if (dom?.tBodies.length) {\n        data.headings = Array.from(dom.tBodies[0].rows[0].cells).map((_cell: HTMLElement) => readHeaderCell(\"\"))\n    }\n    for (let i=0; i<data.headings.length; i++) {\n        // Make sure that there are settings for all columns\n        if (!columnSettings[i]) {\n            columnSettings[i] = {\n                type: defaultType,\n                format: defaultFormat,\n                sortable: true,\n                searchable: true\n            }\n        }\n    }\n    if (dataOption.data) {\n        const headings = data.headings.map((heading: headerCellType) => heading.data ? String(heading.data) : heading.text)\n        data.data = dataOption.data.map((row: inputRowType | inputCellType[]) => {\n            let attributes: { [key: string]: string }\n            let cells: inputCellType[]\n            if (Array.isArray(row)) {\n                attributes = {}\n                cells = row\n            } else if (row.hasOwnProperty(\"cells\") && Object.keys(row).every(key => [\"cells\", \"attributes\"].includes(key))) {\n                attributes = row.attributes\n                cells = row.cells\n            } else {\n                attributes = {}\n                cells = []\n                Object.entries(row).forEach(([heading, cell]) => {\n                    const index = headings.indexOf(heading)\n                    if (index > -1) {\n                        cells[index] = cell\n                    }\n                })\n            }\n            return {\n                attributes,\n                cells: cells.map((cell: inputCellType, index: number) => readDataCell(cell, columnSettings[index]))\n            } as dataRowType\n        })\n    } else if (dom?.tBodies?.length) {\n        data.data = Array.from(dom.tBodies[0].rows).map(\n            row => ({\n                attributes: namedNodeMapToObject(row.attributes),\n                cells: Array.from(row.cells).map(\n                    (cell, index) => {\n                        const cellData = cell.dataset.content ?\n                            readDataCell(cell.dataset.content, columnSettings[index]) :\n                            readDOMDataCell(cell, columnSettings[index])\n                        if (cell.dataset.order) {\n                            cellData.order = isNaN(parseFloat(cell.dataset.order)) ? cell.dataset.order : parseFloat(cell.dataset.order)\n                        }\n                        return cellData\n\n                    }\n                )\n            } as dataRowType)\n        )\n    }\n\n    if (data.data.length && data.data[0].cells.length !== data.headings.length) {\n        throw new Error(\n            \"Data heading length mismatch.\"\n        )\n    }\n    return data\n}\n","import {readDataCell} from \"./read_data\"\nimport {DataTable} from \"./datatable\"\nimport {cellType, dataRowType, inputCellType} from \"./types\"\nimport {cellToText, classNamesToSelector} from \"./helpers\"\n\n/**\n * Rows API\n */\nexport class Rows {\n    cursor: (false | number)\n\n    dt: DataTable\n\n    constructor(dt: DataTable) {\n        this.dt = dt\n\n        this.cursor = false\n    }\n\n    setCursor(index: (false | number) = false) {\n        if (index === this.cursor) {\n            return\n        }\n        const oldCursor = this.cursor\n        this.cursor = index\n        this.dt._renderTable()\n        if (index !== false && this.dt.options.scrollY) {\n            const cursorSelector = classNamesToSelector(this.dt.options.classes.cursor)\n            const cursorDOM = this.dt.dom.querySelector(`tr${cursorSelector}`)\n            if (cursorDOM) {\n                cursorDOM.scrollIntoView({block: \"nearest\"})\n            }\n        }\n        this.dt.emit(\"datatable.cursormove\", this.cursor, oldCursor)\n    }\n\n    /**\n     * Add new row\n     */\n    add(data: cellType[]) {\n        if (!Array.isArray(data) || data.length < 1) {\n            return\n        }\n\n        const row: dataRowType = {\n            cells: data.map((cell: cellType, index: number) => {\n                const columnSettings = this.dt.columns.settings[index]\n                return readDataCell(cell, columnSettings)\n            })\n        }\n        this.dt.data.data.push(row)\n        this.dt.hasRows = true\n        this.dt.update(true)\n    }\n\n    /**\n     * Remove row(s)\n     */\n    remove(select: number | number[]) {\n        if (Array.isArray(select)) {\n            this.dt.data.data = this.dt.data.data.filter((_row: dataRowType, index: number) => !select.includes(index))\n            // We may have emptied the table\n            if ( !this.dt.data.data.length ) {\n                this.dt.hasRows = false\n            }\n            this.dt.update(true)\n        } else {\n            return this.remove([select])\n        }\n    }\n\n\n    /**\n     * Find index of row by searching for a value in a column\n     */\n    findRowIndex(columnIndex: number, value: string | boolean | number) {\n        // returns row index of first case-insensitive string match\n        // inside the td innerText at specific column index\n        return this.dt.data.data.findIndex(\n            (row: dataRowType) => {\n                const cell = row.cells[columnIndex]\n                const cellText = cellToText(cell)\n                return cellText.toLowerCase().includes(String(value).toLowerCase())\n            }\n        )\n    }\n\n    /**\n     * Find index, row, and column data by searching for a value in a column\n     */\n    findRow(columnIndex: number, value: string | boolean | number) {\n        // get the row index\n        const index = this.findRowIndex(columnIndex, value)\n        // exit if not found\n        if (index < 0) {\n            return {\n                index: -1,\n                row: null,\n                cols: []\n            }\n        }\n        // get the row from data\n        const row = this.dt.data.data[index]\n        // return innerHTML of each td\n        const cols = row.cells.map((cell: cellType) => cell.data)\n        // return everything\n        return {\n            index,\n            row,\n            cols\n        }\n    }\n\n    /**\n     * Update a row with new data\n     */\n    updateRow(select: number, data: inputCellType[]) {\n        const row: dataRowType = {\n            cells: data.map((cell: inputCellType, index: number) => {\n                const columnSettings = this.dt.columns.settings[index]\n                return readDataCell(cell, columnSettings)\n            })\n        }\n        this.dt.data.data.splice(select, 1, row)\n        this.dt.update(true)\n    }\n}\n","import {readDataCell, readHeaderCell} from \"./read_data\"\nimport {DataTable} from \"./datatable\"\nimport {\n    cellType,\n    columnSettingsType,\n    columnsStateType,\n    dataRowType,\n    elementNodeType,\n    headerCellType,\n    inputCellType,\n    inputHeaderCellType\n} from \"./types\"\nimport {readColumnSettings} from \"./column_settings\"\nimport {cellToText} from \"./helpers\"\n\n\nexport class Columns {\n    dt: DataTable\n\n    settings: columnSettingsType[]\n\n    _state: columnsStateType\n\n    constructor(dt: DataTable) {\n        this.dt = dt\n        this.init()\n    }\n\n    init() {\n        [this.settings, this._state] = readColumnSettings(this.dt.options.columns, this.dt.options.type, this.dt.options.format)\n    }\n\n    get(column: number) {\n        if (column < 0 || column >= this.size()) {\n            return null\n        }\n        return {...this.settings[column]}\n    }\n\n    size() {\n        return this.settings.length\n    }\n\n    /**\n     * Swap two columns\n     */\n    swap(columns: [number, number]) {\n        if (columns.length === 2) {\n            // Get the current column indexes\n            const cols = this.dt.data.headings.map((_node: headerCellType, index: number) => index)\n\n            const x = columns[0]\n            const y = columns[1]\n            const b = cols[y]\n            cols[y] = cols[x]\n            cols[x] = b\n\n            return this.order(cols)\n        }\n    }\n\n    /**\n     * Reorder the columns\n     */\n    order(columns: number[]) {\n\n        this.dt.data.headings = columns.map((index: number) => this.dt.data.headings[index])\n        this.dt.data.data.forEach(\n            (row: dataRowType) => (row.cells = columns.map((index: number) => row.cells[index]))\n        )\n        this.settings = columns.map(\n            (index: number) => this.settings[index]\n        )\n\n        // Update\n        this.dt.update()\n    }\n\n    /**\n     * Hide columns\n     */\n    hide(columns: number | number[]) {\n        if (!Array.isArray(columns)) {\n            columns = [columns]\n        }\n        if (!columns.length) {\n            return\n        }\n        columns.forEach((index: number) => {\n            if (!this.settings[index]) {\n                this.settings[index] = {\n                    type: \"string\"\n                }\n            }\n            const column = this.settings[index]\n            column.hidden = true\n        })\n\n        this.dt.update()\n    }\n\n    /**\n     * Show columns\n     */\n    show(columns: number | number[]) {\n        if (!Array.isArray(columns)) {\n            columns = [columns]\n        }\n        if (!columns.length) {\n            return\n        }\n        columns.forEach((index: number) => {\n            if (!this.settings[index]) {\n                this.settings[index] = {\n                    type: \"string\",\n                    sortable: true\n                }\n            }\n            const column = this.settings[index]\n            delete column.hidden\n        })\n\n        this.dt.update()\n    }\n\n    /**\n     * Check column(s) visibility\n     */\n    visible(columns: number | number[] | undefined) {\n\n        if (columns === undefined) {\n            columns = [...Array(this.dt.data.headings.length).keys()]\n        }\n        if (Array.isArray(columns)) {\n            return columns.map(index => !this.settings[index]?.hidden)\n        }\n        return !this.settings[columns]?.hidden\n\n    }\n\n    /**\n     * Add a new column\n     */\n    add(data: {data: inputCellType[], heading: inputHeaderCellType} & columnSettingsType) {\n        const newColumnSelector = this.dt.data.headings.length\n        this.dt.data.headings = this.dt.data.headings.concat([readHeaderCell(data.heading)])\n        this.dt.data.data.forEach((row: dataRowType, index: number) => {\n            row.cells = row.cells.concat([readDataCell(data.data[index], data)])\n        })\n        this.settings[newColumnSelector] = {\n            type: data.type || \"string\",\n            sortable: true,\n            searchable: true\n        }\n        if (data.type || data.format || data.sortable || data.render || data.filter) {\n            const column = this.settings[newColumnSelector]\n\n            if (data.render) {\n                column.render = data.render\n            }\n\n            if (data.format) {\n                column.format = data.format\n            }\n\n            if (data.cellClass) {\n                column.cellClass = data.cellClass\n            }\n\n            if (data.headerClass) {\n                column.headerClass = data.headerClass\n            }\n\n            if (data.locale) {\n                column.locale = data.locale\n            }\n\n            if (data.sortable === false) {\n                column.sortable = false\n            } else {\n                if (data.numeric) {\n                    column.numeric = data.numeric\n                }\n                if (data.caseFirst) {\n                    column.caseFirst = data.caseFirst\n                }\n            }\n\n            if (data.searchable === false) {\n                column.searchable = false\n            } else {\n                if (data.sensitivity) {\n                    column.sensitivity = data.sensitivity\n                }\n            }\n\n            if (column.searchable || column.sortable) {\n                if (data.ignorePunctuation) {\n                    column.ignorePunctuation = data.ignorePunctuation\n                }\n            }\n\n            if (data.hidden) {\n                column.hidden = true\n            }\n\n            if (data.filter) {\n                column.filter = data.filter\n            }\n\n            if (data.sortSequence) {\n                column.sortSequence = data.sortSequence\n            }\n        }\n        this.dt.update(true)\n    }\n\n    /**\n     * Remove column(s)\n     */\n    remove(columns: number | number[]) {\n        if (!Array.isArray(columns)) {\n            columns = [columns]\n        }\n\n        this.dt.data.headings = this.dt.data.headings.filter((_heading: headerCellType, index: number) => !columns.includes(index))\n        this.dt.data.data.forEach(\n            (row: dataRowType) => (row.cells = row.cells.filter((_cell: cellType, index: number) => !columns.includes(index)))\n        )\n        this.dt.update(true)\n    }\n\n    /**\n     * Filter by column\n     */\n    filter(column: number, init = false) {\n\n        if (!this.settings[column]?.filter?.length) {\n            // There is no filter to apply.\n            return\n        }\n\n        const currentFilter = this._state.filters[column]\n        let newFilterState\n        if (currentFilter) {\n            let returnNext = false\n            newFilterState = this.settings[column].filter.find((filter: (string | number | boolean | elementNodeType[] | object | ((arg: (string | number | boolean | elementNodeType[] | object)) => boolean))) => {\n                if (returnNext) {\n                    return true\n                }\n                if (filter === currentFilter) {\n                    returnNext = true\n                }\n                return false\n            })\n        } else {\n            const filter = this.settings[column].filter\n            newFilterState = filter ? filter[0] : undefined\n        }\n\n        if (newFilterState) {\n            this._state.filters[column] = newFilterState\n        } else if (currentFilter) {\n            this._state.filters[column] = undefined\n        }\n        this.dt._currentPage = 1\n        this.dt.update()\n\n        if (!init) {\n            this.dt.emit(\"datatable.filter\", column, newFilterState)\n        }\n    }\n\n    /**\n     * Sort by column\n     */\n    sort(index: number, dir: (\"asc\" | \"desc\" | undefined) = undefined, init = false) {\n        const column = this.settings[index]\n\n        if (!init) {\n            this.dt.emit(\"datatable.sorting\", index, dir)\n        }\n\n        if (!dir) {\n            const currentDir = this._state.sort && this._state.sort.column === index ? this._state.sort?.dir : false\n            const sortSequence = column?.sortSequence || [\"asc\", \"desc\"]\n            if (!currentDir) {\n                dir = sortSequence.length ? sortSequence[0] : \"asc\"\n            } else {\n                const currentDirIndex = sortSequence.indexOf(currentDir)\n                if (currentDirIndex === -1) {\n                    dir = sortSequence[0] || \"asc\"\n                } else if (currentDirIndex === sortSequence.length -1) {\n                    dir = sortSequence[0]\n                } else {\n                    dir = sortSequence[currentDirIndex + 1]\n                }\n            }\n\n        }\n\n        const collator = [\"string\", \"html\"].includes(column.type) ?\n            new Intl.Collator(column.locale || this.dt.options.locale, {\n                usage: \"sort\",\n                numeric: column.numeric || this.dt.options.numeric,\n                caseFirst: column.caseFirst || this.dt.options.caseFirst,\n                ignorePunctuation: column.ignorePunctuation|| this.dt.options.ignorePunctuation\n            }) :\n            false\n\n        this.dt.data.data.sort((row1: dataRowType, row2: dataRowType) => {\n            const cell1 = row1.cells[index]\n            const cell2 = row2.cells[index]\n            let order1 = cell1.order ?? cellToText(cell1)\n            let order2 = cell2.order ?? cellToText(cell2)\n            if (dir === \"desc\") {\n                const temp = order1\n                order1 = order2\n                order2 = temp\n            }\n            if (collator && (typeof order1 !== \"number\") && (typeof order2 !== \"number\")) {\n                return collator.compare(String(order1), String(order2))\n            }\n            if (order1 < order2) {\n                return -1\n            } else if (order1 > order2) {\n                return 1\n            }\n            return 0\n        })\n\n        this._state.sort = {column: index,\n            dir}\n        if (this.dt._searchQueries.length) {\n            this.dt.multiSearch(this.dt._searchQueries)\n            this.dt.emit(\"datatable.sort\", index, dir)\n        } else if (!init) {\n            this.dt._currentPage = 1\n            this.dt.update()\n            this.dt.emit(\"datatable.sort\", index, dir)\n        }\n    }\n\n    /**\n     * Measure the actual width of cell content by rendering the entire table with all contents.\n     * Note: Destroys current DOM and therefore requires subsequent dt.update()\n     */\n    _measureWidths() {\n        const activeHeadings = this.dt.data.headings.filter((heading: headerCellType, index: number) => !this.settings[index]?.hidden)\n        if ((this.dt.options.scrollY.length || this.dt.options.fixedColumns) && activeHeadings?.length) {\n\n            this._state.widths = []\n            const renderOptions: {noPaging?: true, noColumnWidths?: true, unhideHeader?: true, renderHeader?: true} = {\n                noPaging: true\n            }\n            // If we have headings we need only set the widths on them\n            // otherwise we need a temp header and the widths need applying to all cells\n            if (this.dt.options.header || this.dt.options.footer) {\n\n                if (this.dt.options.scrollY.length) {\n                    renderOptions.unhideHeader = true\n                }\n                if (this.dt.headerDOM) {\n                    // Remove headerDOM for accurate measurements\n                    this.dt.headerDOM.parentElement.removeChild(this.dt.headerDOM)\n                }\n\n                // Reset widths\n                renderOptions.noColumnWidths = true\n                this.dt._renderTable(renderOptions)\n\n                const activeDOMHeadings : HTMLTableCellElement[] = Array.from(this.dt.dom.querySelector(\"thead, tfoot\")?.firstElementChild?.querySelectorAll(\"th\") || [])\n                let domCounter = 0\n                const absoluteColumnWidths = this.dt.data.headings.map((_heading: headerCellType, index: number) => {\n                    if (this.settings[index]?.hidden) {\n                        return 0\n                    }\n                    const width = activeDOMHeadings[domCounter].offsetWidth\n                    domCounter += 1\n                    return width\n\n                })\n                const totalOffsetWidth = absoluteColumnWidths.reduce(\n                    (total, cellWidth) => total + cellWidth,\n                    0\n                )\n                this._state.widths = absoluteColumnWidths.map(cellWidth => cellWidth / totalOffsetWidth * 100)\n\n            } else {\n                renderOptions.renderHeader = true\n                this.dt._renderTable(renderOptions)\n\n                const activeDOMHeadings: HTMLTableCellElement[] = Array.from(this.dt.dom.querySelector(\"thead, tfoot\")?.firstElementChild?.querySelectorAll(\"th\") || [])\n                let domCounter = 0\n                const absoluteColumnWidths = this.dt.data.headings.map((_heading: headerCellType, index: number) => {\n                    if (this.settings[index]?.hidden) {\n                        return 0\n                    }\n                    const width = activeDOMHeadings[domCounter].offsetWidth\n                    domCounter += 1\n                    return width\n\n                })\n                const totalOffsetWidth = absoluteColumnWidths.reduce(\n                    (total, cellWidth) => total + cellWidth,\n                    0\n                )\n                this._state.widths = absoluteColumnWidths.map(cellWidth => cellWidth / totalOffsetWidth * 100)\n            }\n            // render table without options for measurements\n            this.dt._renderTable()\n        }\n    }\n}\n","import {\n    columnsStateType,\n    filterStateType,\n    columnSettingsType\n} from \"./types\"\n\nexport const readColumnSettings = (columnOptions = [], defaultType, defaultFormat) : [columnSettingsType[], columnsStateType] => {\n\n    let columns: (columnSettingsType | undefined)[] = []\n    let sort: (false | {column: number, dir: \"asc\" | \"desc\"}) = false\n    const filters: (filterStateType | undefined )[] = []\n\n    // Check for the columns option\n\n    columnOptions.forEach(data => {\n\n        // convert single column selection to array\n        const columnSelectors = Array.isArray(data.select) ? data.select : [data.select]\n\n        columnSelectors.forEach((selector: number) => {\n            if (columns[selector]) {\n                if (data.type) {\n                    columns[selector].type = data.type\n                }\n            } else {\n                columns[selector] = {\n                    type: data.type || defaultType,\n                    sortable: true,\n                    searchable: true\n                }\n            }\n            const column = columns[selector]\n\n\n            if (data.render) {\n                column.render = data.render\n            }\n\n            if (data.format) {\n                column.format = data.format\n            } else if (data.type === \"date\") {\n                column.format = defaultFormat\n            }\n\n            if (data.cellClass) {\n                column.cellClass = data.cellClass\n            }\n\n            if (data.headerClass) {\n                column.headerClass = data.headerClass\n            }\n\n            if (data.locale) {\n                column.locale = data.locale\n            }\n\n            if (data.sortable === false) {\n                column.sortable = false\n            } else {\n                if (data.numeric) {\n                    column.numeric = data.numeric\n                }\n                if (data.caseFirst) {\n                    column.caseFirst = data.caseFirst\n                }\n            }\n\n            if (data.searchable === false) {\n                column.searchable = false\n            } else {\n                if (data.sensitivity) {\n                    column.sensitivity = data.sensitivity\n                }\n            }\n\n            if (column.searchable || column.sortable) {\n                if (typeof data.ignorePunctuation !== \"undefined\") {\n                    column.ignorePunctuation = data.ignorePunctuation\n                }\n            }\n\n            if (data.searchMethod) {\n                column.searchMethod = data.searchMethod\n            }\n\n            if (data.hidden) {\n                column.hidden = true\n            }\n\n            if (data.filter) {\n                column.filter = data.filter\n            }\n\n            if (data.sortSequence) {\n                column.sortSequence = data.sortSequence\n            }\n\n            if (data.sort) {\n                if (data.filter) {\n                    filters[selector] = data.sort\n                } else {\n                    // We only allow one. The last one will overwrite all other options\n                    sort = {column: selector,\n                        dir: data.sort}\n                }\n            }\n\n            if (typeof data.searchItemSeparator !== \"undefined\") {\n                column.searchItemSeparator = data.searchItemSeparator\n            }\n\n        })\n\n\n    })\n\n    columns = columns.map(column => column ?\n        column :\n        {type: defaultType,\n            format: defaultType === \"date\" ? defaultFormat : undefined,\n            sortable: true,\n            searchable: true})\n\n    const widths = [] // Width are determined later on by measuring on screen.\n\n    return [\n        columns, {filters,\n            sort,\n            widths}\n    ]\n\n}\n","// Template for custom layouts\nexport const layoutTemplate = (options, dom) => `<div class='${options.classes.top}'>\n    ${\n    options.paging && options.perPageSelect ?\n        `<div class='${options.classes.dropdown}'>\n            <label>\n                <select class='${options.classes.selector}' name=\"per-page\"></select> ${options.labels.perPage}\n            </label>\n        </div>` :\n        \"\"\n}\n    ${\n    options.searchable ?\n        `<div class='${options.classes.search}'>\n            <input class='${options.classes.input}' placeholder='${options.labels.placeholder}' type='search' name=\"search\" title='${options.labels.searchTitle}'${dom.id ? ` aria-controls=\"${dom.id}\"` : \"\"}>\n        </div>` :\n        \"\"\n}\n</div>\n<div class='${options.classes.container}'${options.scrollY.length ? ` style='height: ${options.scrollY}; overflow-Y: auto;'` : \"\"}></div>\n<div class='${options.classes.bottom}'>\n    ${\n    options.paging ?\n        `<div class='${options.classes.info}'></div>` :\n        \"\"\n}\n    <nav class='${options.classes.pagination}'></nav>\n</div>`\n","import {DataTableConfiguration} from \"./types\"\nimport {layoutTemplate} from \"./templates\"\n/**\n * Default configuration\n */\nexport const defaultConfig: DataTableConfiguration = {\n    // for sorting\n    sortable: true,\n    locale: \"en\",\n    numeric: true,\n    caseFirst: \"false\",\n\n    // for searching\n    searchable: true,\n    sensitivity: \"base\",\n    ignorePunctuation: true,\n    destroyable: true,\n    searchItemSeparator: \"\", // If specified, splits the content of cells up using this separator before performing search.\n    searchQuerySeparator: \" \",\n    searchAnd: false,\n    searchMethod: false, // Custom search method to use. If not false, this will override built-in search methods.\n\n    // data\n    data: {},\n    type: \"html\", // Default data type for columns.\n    format: \"YYYY-MM-DD\",\n    columns: [],\n\n    // Pagination\n    paging: true,\n    perPage: 10,\n    perPageSelect: [5, 10, 15, 20, 25],\n    nextPrev: true,\n    firstLast: false,\n    prevText: \"‹\",\n    nextText: \"›\",\n    firstText: \"«\",\n    lastText: \"»\",\n    ellipsisText: \"…\",\n    truncatePager: true,\n    pagerDelta: 2,\n\n    scrollY: \"\",\n\n    fixedColumns: true,\n    fixedHeight: false,\n\n    footer: false,\n    header: true,\n    hiddenHeader: false,\n    caption: undefined,\n\n    rowNavigation: false,\n    tabIndex: false,\n\n    // for overriding rendering\n    pagerRender: false,\n    rowRender: false,\n    tableRender: false,\n    diffDomOptions: {\n        valueDiffing: false\n    },\n\n    // Customise the display text\n    labels: {\n        placeholder: \"Search...\", // The search input placeholder\n        searchTitle: \"Search within table\", // The search input title\n        perPage: \"entries per page\", // per-page dropdown label\n        pageTitle: \"Page {page}\", // page label used in Aria-label\n        noRows: \"No entries found\", // Message shown when there are no records to show\n        noResults: \"No results match your search query\", // Message shown when there are no search results\n        info: \"Showing {start} to {end} of {rows} entries\" //\n    },\n\n    // Customise the layout\n    template: layoutTemplate,\n\n    // Customize the class names used by datatable for different parts\n    classes: {\n        active: \"datatable-active\",\n        ascending: \"datatable-ascending\",\n        bottom: \"datatable-bottom\",\n        container: \"datatable-container\",\n        cursor: \"datatable-cursor\",\n        descending: \"datatable-descending\",\n        disabled: \"datatable-disabled\",\n        dropdown: \"datatable-dropdown\",\n        ellipsis: \"datatable-ellipsis\",\n        filter: \"datatable-filter\",\n        filterActive: \"datatable-filter-active\",\n        empty: \"datatable-empty\",\n        headercontainer: \"datatable-headercontainer\",\n        hidden: \"datatable-hidden\",\n        info: \"datatable-info\",\n        input: \"datatable-input\",\n        loading: \"datatable-loading\",\n        pagination: \"datatable-pagination\",\n        paginationList: \"datatable-pagination-list\",\n        paginationListItem: \"datatable-pagination-list-item\",\n        paginationListItemLink: \"datatable-pagination-list-item-link\",\n        search: \"datatable-search\",\n        selector: \"datatable-selector\",\n        sorter: \"datatable-sorter\",\n        table: \"datatable-table\",\n        top: \"datatable-top\",\n        wrapper: \"datatable-wrapper\"\n    }\n}\n","import {DataTableConfiguration, elementNodeType} from \"./types\"\n\n/**\n * Pager truncation algorithm\n */\nconst truncate = (paginationListItems: elementNodeType[], currentPage: number, pagesLength: number, options: DataTableConfiguration) : elementNodeType[] => {\n    const pagerDelta = options.pagerDelta\n    const classes = options.classes\n    const ellipsisText = options.ellipsisText\n\n    const doublePagerDelta = 2 * pagerDelta\n    let previousPage = currentPage - pagerDelta\n    let nextPage = currentPage + pagerDelta\n\n    if (currentPage < 4 - pagerDelta + doublePagerDelta) {\n        nextPage = 3 + doublePagerDelta\n    } else if (currentPage > pagesLength - (3 - pagerDelta + doublePagerDelta)) {\n        previousPage = pagesLength - (2 + doublePagerDelta)\n    }\n    const paginationListItemsToModify: elementNodeType[] = []\n    for (let k = 1; k <= pagesLength; k++) {\n        if (1 == k || k == pagesLength || (k >= previousPage && k <= nextPage)) {\n            const li = paginationListItems[k - 1]\n            paginationListItemsToModify.push(li)\n        }\n    }\n    let previousLi: elementNodeType\n    const modifiedLis: elementNodeType[] = []\n    paginationListItemsToModify.forEach(li => {\n        const pageNumber = parseInt((li.childNodes[0] as elementNodeType).attributes[\"data-page\"], 10)\n        if (previousLi) {\n            const previousPageNumber = parseInt((previousLi.childNodes[0] as elementNodeType).attributes[\"data-page\"], 10)\n            if (pageNumber - previousPageNumber == 2) {\n                modifiedLis.push(paginationListItems[previousPageNumber])\n            } else if (pageNumber - previousPageNumber != 1) {\n                const newLi: elementNodeType = {\n                    nodeName: \"LI\",\n                    attributes: {\n                        class: `${classes.paginationListItem} ${classes.ellipsis} ${classes.disabled}`\n                    },\n                    childNodes: [\n                        {\n                            nodeName: \"BUTTON\",\n                            attributes: {\n                                class: classes.paginationListItemLink\n                            },\n                            childNodes: [\n                                {\n                                    nodeName: \"#text\",\n                                    data: ellipsisText\n                                }\n                            ]\n                        }\n                    ]\n                }\n                modifiedLis.push(newLi)\n            }\n        }\n        modifiedLis.push(li)\n        previousLi = li\n    })\n\n    return modifiedLis\n}\n\n\nconst paginationListItem = (page: number, label: string, options: DataTableConfiguration, state: {active?: boolean, hidden?: boolean} = {}) : elementNodeType => ({\n    nodeName: \"LI\",\n    attributes: {\n        class:\n        (state.active && !state.hidden) ?\n            `${options.classes.paginationListItem} ${options.classes.active}` :\n            state.hidden ?\n                `${options.classes.paginationListItem} ${options.classes.hidden} ${options.classes.disabled}` :\n                options.classes.paginationListItem\n    },\n    childNodes: [\n        {\n            nodeName: \"BUTTON\",\n            attributes: {\n                \"data-page\": String(page),\n                class: options.classes.paginationListItemLink,\n                \"aria-label\": options.labels.pageTitle.replace(\"{page}\", String(page))\n            },\n            childNodes: [\n                {\n                    nodeName: \"#text\",\n                    data: label\n                }\n            ]\n        }\n    ]\n})\n\nexport const createVirtualPagerDOM = (onFirstPage: boolean, onLastPage: boolean, currentPage: number, totalPages: number, options) => {\n\n    let pagerListItems : elementNodeType[] = []\n\n    // first button\n    if (options.firstLast) {\n        pagerListItems.push(paginationListItem(1, options.firstText, options))\n    }\n\n    // prev button\n    if (options.nextPrev) {\n        const prev = onFirstPage ? 1 : currentPage - 1\n        pagerListItems.push(paginationListItem(prev, options.prevText, options, {hidden: onFirstPage}))\n    }\n\n    let pages = [...Array(totalPages).keys()].map(index => paginationListItem(index+1, String(index+1), options, {active: (index === (currentPage-1))}))\n\n    if (options.truncatePager) {\n        // truncate the paginationListItems\n        pages = truncate(\n            pages,\n            currentPage,\n            totalPages,\n            options\n        )\n\n    }\n\n    // append the paginationListItems\n    pagerListItems = pagerListItems.concat(pages)\n\n    // next button\n    if (options.nextPrev) {\n        const next = onLastPage ? totalPages : currentPage + 1\n        pagerListItems.push(paginationListItem(next, options.nextText, options, {hidden: onLastPage}))\n    }\n\n    // last button\n    if (options.firstLast) {\n        pagerListItems.push(paginationListItem(totalPages, options.lastText, options))\n    }\n\n    const pager : elementNodeType = {\n        nodeName: \"UL\",\n        attributes: {\n            class: options.classes.paginationList\n        },\n        childNodes: pages.length > 1 ? pagerListItems : [] // Don't show single page\n    }\n\n    return pager\n\n}\n","import {\n    cellToText,\n    classNamesToSelector,\n    containsClass,\n    createElement,\n    debounce,\n    isObject,\n    joinWithSpaces,\n    visibleToColumnIndex\n} from \"./helpers\"\nimport {\n    cellType,\n    DataTableConfiguration,\n    DataTableOptions,\n    dataRowType,\n    filterStateType,\n    headerCellType,\n    inputCellType,\n    inputRowType,\n    elementNodeType,\n    renderOptions,\n    rowType,\n    TableDataType\n} from \"./types\"\nimport {DiffDOM, nodeToObj} from \"diff-dom\"\n\nimport {dataToVirtualDOM, headingsToVirtualHeaderRowDOM} from \"./virtual_dom\"\nimport {readTableData, readDataCell, readHeaderCell} from \"./read_data\"\nimport {Rows} from \"./rows\"\nimport {Columns} from \"./columns\"\nimport {defaultConfig} from \"./config\"\nimport {createVirtualPagerDOM} from \"./virtual_pager_dom\"\n\n\nexport class DataTable {\n\n    columns: Columns\n\n    containerDOM: HTMLDivElement\n\n    _currentPage: number\n\n    data: TableDataType\n\n    _dd: DiffDOM\n\n    dom: HTMLTableElement\n\n    _events: { [key: string]: ((...args) => void)[]}\n\n    hasHeadings: boolean\n\n    hasRows: boolean\n\n    headerDOM: HTMLDivElement\n\n    _initialHTML: string\n\n    initialized: boolean\n\n    _label: HTMLElement\n\n    lastPage: number\n\n    _listeners: { [key: string]: () => void}\n\n    onFirstPage: boolean\n\n    onLastPage: boolean\n\n    options: DataTableConfiguration\n\n    _pagerDOMs: HTMLElement[]\n\n    _virtualPagerDOM: elementNodeType\n\n    pages: rowType[][]\n\n    _rect: {width: number, height: number}\n\n    rows: Rows\n\n    _searchData: number[]\n\n    _searchQueries: {source: string, terms: string[], columns: (number[] | undefined)}[]\n\n    _tableAttributes: {[key: string]: string}\n\n    _tableFooters: elementNodeType[]\n\n    _tableCaptions: elementNodeType[]\n\n    totalPages: number\n\n    _virtualDOM: elementNodeType\n\n    _virtualHeaderDOM: elementNodeType\n\n    wrapperDOM: HTMLElement\n\n    constructor(table: HTMLTableElement | string, options: DataTableOptions = {}) {\n\n        const dom = typeof table === \"string\" ?\n            document.querySelector(table) :\n            table\n        if (dom instanceof HTMLTableElement) {\n            this.dom = dom\n        } else {\n            this.dom = document.createElement(\"table\")\n            dom.appendChild(this.dom)\n        }\n\n        const diffDomOptions = {\n            ...defaultConfig.diffDomOptions,\n            ...options.diffDomOptions\n        }\n\n        const labels = {\n            ...defaultConfig.labels,\n            ...options.labels\n        }\n\n        const classes = {\n            ...defaultConfig.classes,\n            ...options.classes\n        }\n\n        // user options\n        this.options = {\n            ...defaultConfig,\n            ...options,\n            diffDomOptions,\n            labels,\n            classes\n        }\n\n        this._initialHTML = this.options.destroyable ? dom.outerHTML : \"\" // preserve in case of later destruction\n\n        if (this.options.tabIndex) {\n            this.dom.tabIndex = this.options.tabIndex\n        } else if (this.options.rowNavigation && this.dom.tabIndex === -1) {\n            this.dom.tabIndex = 0\n        }\n\n        this._listeners = {\n            onResize: () => this._onResize()\n        }\n\n        this._dd = new DiffDOM(this.options.diffDomOptions || {})\n\n        this.initialized = false\n        this._events = {}\n\n        this._currentPage = 0\n        this.onFirstPage = true\n        this.hasHeadings = false\n        this.hasRows = false\n        this._searchQueries = []\n\n        this.init()\n    }\n\n    /**\n     * Initialize the instance\n     */\n    init() {\n        if (this.initialized || containsClass(this.dom, this.options.classes.table)) {\n            return false\n        }\n\n        this._virtualDOM = nodeToObj(this.dom, this.options.diffDomOptions || {})\n\n        this._tableAttributes = {...this._virtualDOM.attributes}\n        this._tableFooters = this._virtualDOM.childNodes?.filter(node => node.nodeName === \"TFOOT\") ?? []\n        this._tableCaptions = this._virtualDOM.childNodes?.filter(node => node.nodeName === \"CAPTION\") ?? []\n        if (this.options.caption !== undefined) {\n            this._tableCaptions.push({\n                nodeName: \"CAPTION\",\n                childNodes: [\n                    {\n                        nodeName: \"#text\",\n                        data: this.options.caption\n                    }\n                ]\n            })\n        }\n\n        this.rows = new Rows(this)\n        this.columns = new Columns(this)\n\n        this.data = readTableData(this.options.data, this.dom, this.columns.settings, this.options.type, this.options.format)\n\n        this._render()\n\n        setTimeout(() => {\n            this.emit(\"datatable.init\")\n            this.initialized = true\n        }, 10)\n    }\n\n\n    /**\n     * Render the instance\n     */\n    _render() {\n\n        // Build\n        this.wrapperDOM = createElement(\"div\", {\n            class: `${this.options.classes.wrapper} ${this.options.classes.loading}`\n        })\n\n        this.wrapperDOM.innerHTML = this.options.template(this.options, this.dom)\n\n        const selectorClassSelector = classNamesToSelector(this.options.classes.selector)\n        const selector = this.wrapperDOM.querySelector(`select${selectorClassSelector}`)\n\n        // Per Page Select\n        if (selector && this.options.paging && this.options.perPageSelect) {\n\n            // Create the options\n            this.options.perPageSelect.forEach((choice: number | [string, number]) => {\n                const [lab, val] = Array.isArray(choice) ? [choice[0], choice[1]] : [String(choice), choice]\n                const selected = val === this.options.perPage\n                const option = new Option(lab, String(val), selected, selected)\n                selector.appendChild(option)\n            })\n\n        } else if (selector) {\n            selector.parentElement.removeChild(selector)\n        }\n\n        const containerSelector = classNamesToSelector(this.options.classes.container)\n        this.containerDOM = this.wrapperDOM.querySelector(containerSelector)\n\n        this._pagerDOMs = []\n        const paginationSelector = classNamesToSelector(this.options.classes.pagination)\n        Array.from(this.wrapperDOM.querySelectorAll(paginationSelector)).forEach(el => {\n            if (!(el instanceof HTMLElement)) {\n                return\n            }\n            // We remove the inner part of the pager containers to ensure they are all the same.\n            el.innerHTML = `<ul class=\"${this.options.classes.paginationList}\"></ul>`\n            this._pagerDOMs.push(el.firstElementChild as HTMLElement)\n        })\n\n        this._virtualPagerDOM = {\n            nodeName: \"UL\",\n            attributes: {\n                class: this.options.classes.paginationList\n            }\n        }\n\n\n        const infoSelector = classNamesToSelector(this.options.classes.info)\n        this._label = this.wrapperDOM.querySelector(infoSelector)\n\n        // Insert in to DOM tree\n        this.dom.parentElement.replaceChild(this.wrapperDOM, this.dom)\n        this.containerDOM.appendChild(this.dom)\n\n        // Store the table dimensions\n        this._rect = this.dom.getBoundingClientRect()\n\n        // Fix height\n        this._fixHeight()\n\n        // Class names\n        if (!this.options.header) {\n            this.wrapperDOM.classList.add(\"no-header\")\n        }\n\n        if (!this.options.footer) {\n            this.wrapperDOM.classList.add(\"no-footer\")\n        }\n\n        if (this.options.sortable) {\n            this.wrapperDOM.classList.add(\"sortable\")\n        }\n\n        if (this.options.searchable) {\n            this.wrapperDOM.classList.add(\"searchable\")\n        }\n\n        if (this.options.fixedHeight) {\n            this.wrapperDOM.classList.add(\"fixed-height\")\n        }\n\n        if (this.options.fixedColumns) {\n            this.wrapperDOM.classList.add(\"fixed-columns\")\n        }\n\n        this._bindEvents()\n\n        if (this.columns._state.sort) {\n            this.columns.sort(this.columns._state.sort.column, this.columns._state.sort.dir, true)\n        }\n\n        this.update(true)\n    }\n\n    _renderTable(renderOptions: renderOptions = {}) {\n        let rows: rowType[]\n        const isPaged = (this.options.paging || this._searchQueries.length || this.columns._state.filters.length) && this._currentPage && this.pages.length && !renderOptions.noPaging\n        if (isPaged) {\n            rows = this.pages[this._currentPage - 1]\n        } else {\n            rows = this.data.data.map((row, index) => ({\n                row,\n                index\n            }))\n        }\n\n        let newVirtualDOM = dataToVirtualDOM(\n            this._tableAttributes,\n            this.data.headings,\n            rows,\n            this.columns.settings,\n            this.columns._state,\n            this.rows.cursor,\n            this.options,\n            renderOptions,\n            this._tableFooters,\n            this._tableCaptions\n        )\n\n        if (this.options.tableRender) {\n            const renderedTableVirtualDOM : (elementNodeType | void) = this.options.tableRender(this.data, newVirtualDOM, \"main\")\n            if (renderedTableVirtualDOM) {\n                newVirtualDOM = renderedTableVirtualDOM\n            }\n        }\n        const diff = this._dd.diff(this._virtualDOM, newVirtualDOM)\n        this._dd.apply(this.dom, diff)\n        this._virtualDOM = newVirtualDOM\n    }\n\n    /**\n     * Render the page\n     * @return {Void}\n     */\n    _renderPage(lastRowCursor=false) {\n        if (this.hasRows && this.totalPages) {\n            if (this._currentPage > this.totalPages) {\n                this._currentPage = 1\n            }\n\n            // Use a fragment to limit touching the DOM\n            this._renderTable()\n\n            this.onFirstPage = this._currentPage === 1\n            this.onLastPage = this._currentPage === this.lastPage\n        } else {\n            this.setMessage(this.options.labels.noRows)\n        }\n\n        // Update the info\n        let current = 0\n\n        let f = 0\n        let t = 0\n        let items\n\n        if (this.totalPages) {\n            current = this._currentPage - 1\n            f = current * this.options.perPage\n            t = f + this.pages[current].length\n            f = f + 1\n            items = this._searchQueries.length ? this._searchData.length : this.data.data.length\n        }\n\n        if (this._label && this.options.labels.info.length) {\n            // CUSTOM LABELS\n            const string = this.options.labels.info\n                .replace(\"{start}\", String(f))\n                .replace(\"{end}\", String(t))\n                .replace(\"{page}\", String(this._currentPage))\n                .replace(\"{pages}\", String(this.totalPages))\n                .replace(\"{rows}\", String(items))\n\n            this._label.innerHTML = items ? string : \"\"\n        }\n\n        if (this._currentPage == 1) {\n            this._fixHeight()\n        }\n\n        if (this.options.rowNavigation && this._currentPage) {\n            if (!this.rows.cursor || !this.pages[this._currentPage-1].find(\n                row => row.index === this.rows.cursor)\n            ) {\n                const rows = this.pages[this._currentPage-1]\n                if (rows.length) {\n                    if (lastRowCursor) {\n                        this.rows.setCursor(rows[rows.length-1].index)\n                    } else {\n                        this.rows.setCursor(rows[0].index)\n                    }\n                }\n            }\n        }\n    }\n\n    /** Render the pager(s)\n     *\n     */\n    _renderPagers() {\n        if (!this.options.paging) {\n            return\n        }\n        let newPagerVirtualDOM = createVirtualPagerDOM(this.onFirstPage, this.onLastPage, this._currentPage, this.totalPages, this.options)\n\n        if (this.options.pagerRender) {\n            const renderedPagerVirtualDOM : (elementNodeType | void) = this.options.pagerRender([this.onFirstPage, this.onLastPage, this._currentPage, this.totalPages], newPagerVirtualDOM)\n            if (renderedPagerVirtualDOM) {\n                newPagerVirtualDOM = renderedPagerVirtualDOM\n            }\n        }\n\n        const diffs = this._dd.diff(this._virtualPagerDOM, newPagerVirtualDOM)\n        // We may have more than one pager\n        this._pagerDOMs.forEach((pagerDOM: HTMLElement) => {\n            this._dd.apply(pagerDOM, diffs)\n        })\n\n        this._virtualPagerDOM = newPagerVirtualDOM\n    }\n\n    // Render header that is not in the same table element as the remainder\n    // of the table. Used for tables with scrollY.\n    _renderSeparateHeader() {\n        const container = this.dom.parentElement\n        if (!this.headerDOM) {\n            this.headerDOM = document.createElement(\"div\")\n            this._virtualHeaderDOM = {\n                nodeName: \"DIV\"\n            }\n\n        }\n        container.parentElement.insertBefore(this.headerDOM, container)\n        let tableVirtualDOM : elementNodeType = {\n            nodeName: \"TABLE\",\n            attributes: this._tableAttributes,\n            childNodes: [\n                {\n                    nodeName: \"THEAD\",\n                    childNodes: [\n                        headingsToVirtualHeaderRowDOM(\n                            this.data.headings, this.columns.settings, this.columns._state, this.options, {unhideHeader: true})\n                    ]\n\n                }\n\n            ]\n        }\n        tableVirtualDOM.attributes.class = joinWithSpaces(tableVirtualDOM.attributes.class, this.options.classes.table)\n        if (this.options.tableRender) {\n            const renderedTableVirtualDOM : (elementNodeType | void) = this.options.tableRender(this.data, tableVirtualDOM, \"header\")\n            if (renderedTableVirtualDOM) {\n                tableVirtualDOM = renderedTableVirtualDOM\n            }\n        }\n\n        const newVirtualHeaderDOM = {\n            nodeName: \"DIV\",\n            attributes: {\n                class: this.options.classes.headercontainer\n            },\n            childNodes: [tableVirtualDOM]\n        }\n\n        const diff = this._dd.diff(this._virtualHeaderDOM, newVirtualHeaderDOM)\n        this._dd.apply(this.headerDOM, diff)\n        this._virtualHeaderDOM = newVirtualHeaderDOM\n\n        // Compensate for scrollbars\n        const paddingRight = this.headerDOM.firstElementChild.clientWidth - this.dom.clientWidth\n        if (paddingRight) {\n            const paddedVirtualHeaderDOM = structuredClone(this._virtualHeaderDOM)\n            paddedVirtualHeaderDOM.attributes.style = `padding-right: ${paddingRight}px;`\n            const diff = this._dd.diff(this._virtualHeaderDOM, paddedVirtualHeaderDOM)\n            this._dd.apply(this.headerDOM, diff)\n            this._virtualHeaderDOM = paddedVirtualHeaderDOM\n        }\n\n        if (container.scrollHeight > container.clientHeight) {\n            // scrollbars on one page means scrollbars on all pages.\n            container.style.overflowY = \"scroll\"\n        }\n    }\n\n    /**\n     * Bind event listeners\n     * @return {[type]} [description]\n     */\n    _bindEvents() {\n        // Per page selector\n        if (this.options.perPageSelect) {\n            const selectorClassSelector = classNamesToSelector(this.options.classes.selector)\n            const selector = this.wrapperDOM.querySelector(selectorClassSelector)\n            if (selector && selector instanceof HTMLSelectElement) {\n                // Change per page\n                selector.addEventListener(\"change\", () => {\n                    this.emit(\"datatable.perpage:before\", this.options.perPage)\n                    this.options.perPage = parseInt(selector.value, 10)\n                    this.update()\n\n                    this._fixHeight()\n\n                    this.emit(\"datatable.perpage\", this.options.perPage)\n                }, false)\n            }\n        }\n\n        // Search input\n        if (this.options.searchable) {\n            this.wrapperDOM.addEventListener(\"input\", (event: InputEvent) => {\n                const inputSelector = classNamesToSelector(this.options.classes.input)\n                const target = event.target\n                if (!(target instanceof HTMLInputElement) || !target.matches(inputSelector)) {\n                    return\n                }\n                event.preventDefault()\n\n                const searches: { terms: string[], columns: (number[] | undefined) }[] = []\n                const searchFields: HTMLInputElement[] = Array.from(this.wrapperDOM.querySelectorAll(inputSelector))\n                searchFields.filter(\n                    el => el.value.length\n                ).forEach(\n                    el => {\n                        const andSearch = el.dataset.and || this.options.searchAnd\n                        const querySeparator = el.dataset.querySeparator || this.options.searchQuerySeparator\n                        const terms = querySeparator ? el.value.split(this.options.searchQuerySeparator) : [el.value]\n                        if (andSearch) {\n                            terms.forEach(term => {\n                                if (el.dataset.columns) {\n                                    searches.push({\n                                        terms: [term],\n                                        columns: (JSON.parse(el.dataset.columns) as number[])\n                                    })\n                                } else {\n                                    searches.push({terms: [term],\n                                        columns: undefined})\n                                }\n                            })\n                        } else {\n                            if (el.dataset.columns) {\n                                searches.push({\n                                    terms,\n                                    columns: (JSON.parse(el.dataset.columns) as number[])\n                                })\n                            } else {\n                                searches.push({terms,\n                                    columns: undefined})\n                            }\n                        }\n\n                    }\n                )\n                if (searches.length === 1 && searches[0].terms.length === 1) {\n                    const search = searches[0]\n                    this.search(search.terms[0], search.columns)\n                } else {\n                    this.multiSearch(searches)\n                }\n            })\n        }\n\n        // Pager(s) / sorting\n        this.wrapperDOM.addEventListener(\"click\", (event: Event) => {\n            const target = event.target as Element\n            const hyperlink = target.closest(\"a, button\")\n            if (!hyperlink) {\n                return\n            }\n\n            if (hyperlink.hasAttribute(\"data-page\")) {\n                this.page(parseInt(hyperlink.getAttribute(\"data-page\"), 10))\n                event.preventDefault()\n            } else if (containsClass(hyperlink, this.options.classes.sorter)) {\n                const visibleIndex = Array.from(hyperlink.parentElement.parentElement.children).indexOf(hyperlink.parentElement)\n                const columnIndex = visibleToColumnIndex(visibleIndex, this.columns.settings)\n                this.columns.sort(columnIndex)\n                event.preventDefault()\n            } else if (containsClass(hyperlink, this.options.classes.filter)) {\n                const visibleIndex = Array.from(hyperlink.parentElement.parentElement.children).indexOf(hyperlink.parentElement)\n                const columnIndex = visibleToColumnIndex(visibleIndex, this.columns.settings)\n                this.columns.filter(columnIndex)\n                event.preventDefault()\n            }\n        }, false)\n\n        if (this.options.rowNavigation) {\n            this.dom.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n                if (event.key === \"ArrowUp\") {\n                    event.preventDefault()\n                    event.stopPropagation()\n                    let lastRow: rowType\n                    this.pages[this._currentPage-1].find((row: rowType) => {\n                        if (row.index===this.rows.cursor) {\n                            return true\n                        }\n                        lastRow = row\n                        return false\n                    })\n                    if (lastRow) {\n                        this.rows.setCursor(lastRow.index)\n                    } else if (!this.onFirstPage) {\n                        this.page(this._currentPage-1, true)\n                    }\n                } else if (event.key === \"ArrowDown\") {\n                    event.preventDefault()\n                    event.stopPropagation()\n                    let foundRow: boolean\n                    const nextRow = this.pages[this._currentPage-1].find((row: rowType) => {\n                        if (foundRow) {\n                            return true\n                        }\n                        if (row.index===this.rows.cursor) {\n                            foundRow = true\n                        }\n                        return false\n                    })\n                    if (nextRow) {\n                        this.rows.setCursor(nextRow.index)\n                    } else if (!this.onLastPage) {\n                        this.page(this._currentPage+1)\n                    }\n                } else if ([\"Enter\", \" \"].includes(event.key)) {\n                    this.emit(\"datatable.selectrow\", this.rows.cursor, event)\n                }\n            })\n            this.dom.addEventListener(\"mousedown\", (event: Event) => {\n                const target = event.target\n                if (!(target instanceof Element)) {\n                    return\n                }\n                if (this.dom.matches(\":focus\")) {\n                    const row = Array.from(this.dom.querySelectorAll(\"tbody > tr\")).find(row => row.contains(target))\n                    if (row && row instanceof HTMLElement) {\n                        this.emit(\"datatable.selectrow\", parseInt(row.dataset.index, 10), event)\n                    }\n                }\n\n            })\n        } else {\n            this.dom.addEventListener(\"mousedown\", (event: Event) => {\n                const target = event.target\n                if (!(target instanceof Element)) {\n                    return\n                }\n                const row = Array.from(this.dom.querySelectorAll(\"tbody > tr\")).find(row => row.contains(target))\n                if (row && row instanceof HTMLElement) {\n                    this.emit(\"datatable.selectrow\", parseInt(row.dataset.index, 10), event)\n                }\n            })\n        }\n\n        window.addEventListener(\"resize\", this._listeners.onResize)\n    }\n\n    /**\n     * execute on resize and debounce to avoid multiple calls\n     */\n    _onResize = debounce(() => {\n        this._rect = this.containerDOM.getBoundingClientRect()\n        if (!this._rect.width) {\n            return\n        }\n        this.update(true)\n    }, 250)\n\n    /**\n     * Destroy the instance\n     * @return {void}\n     */\n    destroy() {\n        if (!this.options.destroyable) {\n            return\n        }\n        if (this.wrapperDOM) {\n            const parentElement = this.wrapperDOM.parentElement\n            if (parentElement) {\n                // Restore the initial HTML\n                const oldDOM = createElement(\"div\")\n                oldDOM.innerHTML = this._initialHTML\n                const oldTable = oldDOM.firstElementChild as HTMLTableElement\n                parentElement.replaceChild(oldTable, this.wrapperDOM)\n                this.dom = oldTable\n            } else {\n                // Remove the className\n                this.options.classes.table?.split(\" \").forEach(className => this.wrapperDOM.classList.remove(className))\n            }\n        }\n\n        window.removeEventListener(\"resize\", this._listeners.onResize)\n\n        this.initialized = false\n    }\n\n    /**\n     * Update the instance\n     * @return {Void}\n     */\n    update(measureWidths = false) {\n        this.emit(\"datatable.update:before\")\n\n        if (measureWidths) {\n            this.columns._measureWidths()\n            this.hasRows = Boolean(this.data.data.length)\n            this.hasHeadings = Boolean(this.data.headings.length)\n        }\n        this.options.classes.empty?.split(\" \").forEach(className => this.wrapperDOM.classList.remove(className))\n\n        this._paginate()\n        this._renderPage()\n\n        this._renderPagers()\n\n        if (this.options.scrollY.length) {\n            this._renderSeparateHeader()\n        }\n\n        this.emit(\"datatable.update\")\n    }\n\n    _paginate() {\n        let rows: rowType[] = this.data.data.map((row, index) => ({\n            row,\n            index\n        }))\n\n        if (this._searchQueries.length) {\n            rows = []\n\n            this._searchData.forEach((index: number) => rows.push({index,\n                row: this.data.data[index]}))\n        }\n\n        if (this.columns._state.filters.length) {\n            this.columns._state.filters.forEach(\n                (filterState: (filterStateType | undefined), column: number) => {\n                    if (!filterState) {\n                        return\n                    }\n                    rows = rows.filter(\n                        (row: {index: number, row: dataRowType}) => {\n                            const cell = row.row.cells[column]\n                            return typeof filterState === \"function\" ? filterState(cell.data) : cellToText(cell) === filterState\n                        }\n                    )\n                }\n            )\n        }\n\n        if (this.options.paging && this.options.perPage > 0) {\n            // Check for hidden columns\n            this.pages = rows\n                .map((_row, i: number) => i % this.options.perPage === 0 ? rows.slice(i, i + this.options.perPage) : null)\n                .filter((page: {row: dataRowType, index: number}[]) => page)\n        } else {\n            this.pages = [rows]\n        }\n\n        this.totalPages = this.lastPage = this.pages.length\n\n        if (!this._currentPage) {\n            this._currentPage = 1\n        }\n        return this.totalPages\n    }\n\n    /**\n     * Fix the container height\n     */\n    _fixHeight() {\n        if (this.options.fixedHeight) {\n            this.containerDOM.style.height = null\n            this._rect = this.containerDOM.getBoundingClientRect()\n            this.containerDOM.style.height = `${this._rect.height}px`\n        }\n    }\n\n    /**\n     * Perform a simple search of the data set\n     */\n    search(term: string, columns: (number[] | undefined ) = undefined, source: string = \"search\") {\n        this.emit(\"datatable.search:before\", term, this._searchData)\n\n        if (!term.length) {\n            this._currentPage = 1\n            this._searchQueries = []\n            this._searchData = []\n            this.update()\n            this.emit(\"datatable.search\", \"\", [])\n            this.wrapperDOM.classList.remove(\"search-results\")\n            return false\n        }\n\n        this.multiSearch([\n            {terms: [term],\n                columns: columns ? columns : undefined}\n        ], source)\n\n        this.emit(\"datatable.search\", term, this._searchData)\n\n    }\n\n    /**\n     * Perform a search of the data set searching for up to multiple strings in various columns\n     */\n    multiSearch(rawQueries: { terms: string[], columns: (number[] | undefined) }[], source: string = \"search\") {\n        if (!this.hasRows) return false\n\n        this._currentPage = 1\n        this._searchData = []\n        // Remove empty queries\n        let queries = rawQueries.map(query => ({\n            columns: query.columns,\n            terms: query.terms.map(term => term.trim()).filter(term => term),\n            source\n        })).filter(query => query.terms.length)\n\n        this.emit(\"datatable.multisearch:before\", queries, this._searchData)\n\n        if (source.length) {\n            // Add any existing queries from different source\n            queries = queries.concat(this._searchQueries.filter(query => query.source !== source))\n        }\n        this._searchQueries = queries\n\n        if (!queries.length) {\n            this.update()\n            this.emit(\"datatable.multisearch\", queries, this._searchData)\n            this.wrapperDOM.classList.remove(\"search-results\")\n            return false\n        }\n        const queryWords = queries.map(query => this.columns.settings.map(\n            (column, index) => {\n                if (column.hidden || !column.searchable || (query.columns && !query.columns.includes(index))) {\n                    return false\n                }\n                let columnQueries = query.terms\n                const sensitivity = column.sensitivity || this.options.sensitivity\n                if ([\"base\", \"accent\"].includes(sensitivity)) {\n                    columnQueries = columnQueries.map(query => query.toLowerCase())\n                }\n                if ([\"base\", \"case\"].includes(sensitivity)) {\n                    columnQueries = columnQueries.map(query => query.normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\"))\n                }\n                const ignorePunctuation = column.ignorePunctuation ?? this.options.ignorePunctuation\n                if (ignorePunctuation) {\n                    columnQueries = columnQueries.map(query => query.replace(/[.,/#!$%^&*;:{}=-_`~()]/g, \"\"))\n                }\n                return columnQueries\n            }\n        ))\n        this.data.data.forEach((row: dataRowType, idx: number) => {\n            const searchRow = row.cells.map((cell, i) => {\n                const column = this.columns.settings[i]\n                const customSearchMethod = column.searchMethod || this.options.searchMethod\n                if (customSearchMethod) {\n                    return cell\n                }\n                let content = cellToText(cell).trim()\n                if (content.length) {\n                    const sensitivity = column.sensitivity || this.options.sensitivity\n                    if ([\"base\", \"accent\"].includes(sensitivity)) {\n                        content = content.toLowerCase()\n                    }\n                    if ([\"base\", \"case\"].includes(sensitivity)) {\n                        content = content.normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\")\n                    }\n                    const ignorePunctuation = column.ignorePunctuation ?? this.options.ignorePunctuation\n                    if (ignorePunctuation) {\n                        content = content.replace(/[.,/#!$%^&*;:{}=-_`~()]/g, \"\")\n                    }\n                }\n                const searchItemSeparator = column.searchItemSeparator || this.options.searchItemSeparator\n                return searchItemSeparator ? content.split(searchItemSeparator) : [content]\n            })\n            if (\n                queryWords.every(\n                    (queryColumn, queryIndex) => queryColumn.find(\n                        (queryColumnWord, index) => {\n                            if (!queryColumnWord) {\n                                return false\n                            }\n                            const column = this.columns.settings[index]\n                            const customSearchMethod = column.searchMethod || this.options.searchMethod\n                            if (customSearchMethod) {\n                                return customSearchMethod(queryColumnWord, (searchRow[index] as cellType), row, index, queries[queryIndex].source)\n                            }\n                            return queryColumnWord.find(queryWord => (searchRow[index] as string[]).find(searchItem => searchItem.includes(queryWord)))\n                        }\n                    )\n                )\n            ) {\n                this._searchData.push(idx)\n            }\n\n        })\n\n        this.wrapperDOM.classList.add(\"search-results\")\n        if (this._searchData.length) {\n            this.update()\n        } else {\n            this.wrapperDOM.classList.remove(\"search-results\")\n\n            this.setMessage(this.options.labels.noResults)\n        }\n\n        this.emit(\"datatable.multisearch\", queries, this._searchData)\n    }\n\n    /**\n     * Change page\n     */\n    page(page: number, lastRowCursor = false) {\n        this.emit(\"datatable.page:before\", page)\n\n        // We don't want to load the current page again.\n        if (page === this._currentPage) {\n            return false\n        }\n\n        if (!isNaN(page)) {\n            this._currentPage = page\n        }\n\n        if (page > this.pages.length || page < 0) {\n            return false\n        }\n\n        this._renderPage(lastRowCursor)\n        this._renderPagers()\n\n        this.emit(\"datatable.page\", page)\n    }\n\n    /**\n     * Add new row data\n     */\n    insert(data: (\n        {headings?: string[], data?: (inputRowType | inputCellType[])[]} | { [key: string]: inputCellType}[])) {\n        let rows: dataRowType[] = []\n        if (Array.isArray(data)) {\n            const headings = this.data.headings.map((heading: headerCellType) => heading.data ? String(heading.data) : heading.text)\n            data.forEach((row, rIndex) => {\n                const r: cellType[] = []\n                Object.entries(row).forEach(([heading, cell]) => {\n\n                    const index = headings.indexOf(heading)\n\n                    if (index > -1) {\n                        r[index] = readDataCell(cell as inputCellType, this.columns.settings[index])\n                    } else if (!this.hasHeadings && !this.hasRows && rIndex === 0) {\n                        r[headings.length] = readDataCell(cell as inputCellType, this.columns.settings[headings.length])\n                        headings.push(heading)\n                        this.data.headings.push(readHeaderCell(heading))\n                    }\n                })\n                rows.push({\n                    cells: r\n                })\n            })\n        } else if (isObject(data)) {\n            if (data.headings && !this.hasHeadings && !this.hasRows) {\n                this.data = readTableData(data, undefined, this.columns.settings, this.options.type, this.options.format)\n            } else if (data.data && Array.isArray(data.data)) {\n                rows = data.data.map(row => {\n                    let attributes: { [key: string]: string }\n                    let cells: inputCellType[]\n                    if (Array.isArray(row)) {\n                        attributes = {}\n                        cells = row\n                    } else {\n                        attributes = row.attributes\n                        cells = row.cells\n                    }\n                    return {\n                        attributes,\n                        cells: cells.map((cell, index) => readDataCell(cell as inputCellType, this.columns.settings[index]))\n                    } as dataRowType\n                })\n            }\n        }\n        if (rows.length) {\n            rows.forEach((row: dataRowType) => this.data.data.push(row))\n        }\n        this.hasHeadings = Boolean(this.data.headings.length)\n\n        if (this.columns._state.sort) {\n            this.columns.sort(this.columns._state.sort.column, this.columns._state.sort.dir, true)\n        }\n\n        this.update(true)\n    }\n\n    /**\n     * Refresh the instance\n     */\n    refresh() {\n        this.emit(\"datatable.refresh:before\")\n\n        if (this.options.searchable) {\n            const inputSelector = classNamesToSelector(this.options.classes.input)\n            const inputs: HTMLInputElement[] = Array.from(this.wrapperDOM.querySelectorAll(inputSelector))\n            inputs.forEach(el => (el.value = \"\"))\n            this._searchQueries = []\n        }\n        this._currentPage = 1\n        this.onFirstPage = true\n        this.update(true)\n\n        this.emit(\"datatable.refresh\")\n    }\n\n    /**\n     * Print the table\n     */\n    print() {\n        const tableDOM = createElement(\"table\")\n        const tableVirtualDOM = {nodeName: \"TABLE\"}\n        let newTableVirtualDOM = dataToVirtualDOM(\n            this._tableAttributes,\n            this.data.headings,\n            this.data.data.map((row, index) => ({\n                row,\n                index\n            })),\n            this.columns.settings,\n            this.columns._state,\n            false, // No row cursor\n            this.options,\n            {\n                noColumnWidths: true,\n                unhideHeader: true\n            },\n            this._tableFooters,\n            this._tableCaptions\n        )\n\n        if (this.options.tableRender) {\n            const renderedTableVirtualDOM : (elementNodeType | void) = this.options.tableRender(this.data, newTableVirtualDOM, \"print\")\n            if (renderedTableVirtualDOM) {\n                newTableVirtualDOM = renderedTableVirtualDOM\n            }\n        }\n\n        const diff = this._dd.diff(tableVirtualDOM, newTableVirtualDOM)\n        this._dd.apply(tableDOM, diff)\n\n        // Open new window\n        const w = window.open()\n\n        // Append the table to the body\n        w.document.body.appendChild(tableDOM)\n\n        // Print\n        w.print()\n    }\n\n    /**\n     * Show a message in the table\n     */\n    setMessage(message: string) {\n        const activeHeadings = this.data.headings.filter((heading: headerCellType, index: number) => !this.columns.settings[index]?.hidden)\n        const colspan = activeHeadings.length || 1\n\n        this.options.classes.empty?.split(\" \").forEach(className => this.wrapperDOM.classList.add(className))\n\n        if (this._label) {\n            this._label.innerHTML = \"\"\n        }\n        this.totalPages = 0\n        this._renderPagers()\n\n        let newVirtualDOM : elementNodeType = {\n            nodeName: \"TABLE\",\n            attributes: this._tableAttributes,\n            childNodes: [\n                {\n                    nodeName: \"THEAD\",\n                    childNodes: [\n                        headingsToVirtualHeaderRowDOM(\n                            this.data.headings, this.columns.settings, this.columns._state, this.options, {})\n                    ]\n                },\n                {\n                    nodeName: \"TBODY\",\n                    childNodes: [\n                        {\n                            nodeName: \"TR\",\n                            childNodes: [\n                                {\n                                    nodeName: \"TD\",\n                                    attributes: {\n                                        class: this.options.classes.empty,\n                                        colspan: String(colspan)\n                                    },\n                                    childNodes: [\n                                        {\n                                            nodeName: \"#text\",\n                                            data: message\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n                }\n\n            ]\n        }\n\n        this._tableFooters.forEach(footer => newVirtualDOM.childNodes.push(footer))\n        this._tableCaptions.forEach(caption => newVirtualDOM.childNodes.push(caption))\n\n        newVirtualDOM.attributes.class = joinWithSpaces(newVirtualDOM.attributes.class, this.options.classes.table)\n\n        if (this.options.tableRender) {\n            const renderedTableVirtualDOM : (elementNodeType | void) = this.options.tableRender(this.data, newVirtualDOM, \"message\")\n            if (renderedTableVirtualDOM) {\n                newVirtualDOM = renderedTableVirtualDOM\n            }\n        }\n\n        const diff = this._dd.diff(this._virtualDOM, newVirtualDOM)\n        this._dd.apply(this.dom, diff)\n        this._virtualDOM = newVirtualDOM\n\n    }\n\n    /**\n     * Add custom event listener\n     */\n    on(event: string, callback: (...args: any[]) => void) {\n        this._events[event] = this._events[event] || []\n        this._events[event].push(callback)\n    }\n\n    /**\n     * Remove custom event listener\n     */\n    off(event: string, callback: (...args: any[]) => void) {\n        if (event in this._events === false) return\n        this._events[event].splice(this._events[event].indexOf(callback), 1)\n    }\n\n    /**\n     * Fire custom event\n     */\n    emit(event: string, ...args) {\n        if (event in this._events === false) return\n        for (let i = 0; i < this._events[event].length; i++) {\n            this._events[event][i](...args)\n        }\n    }\n}\n","import {\n    isObject\n} from \"../helpers\"\n\ninterface csvConvertUserOptions {\n  lineDelimiter?: string,\n  columnDelimiter?: string\n  removeDoubleQuotes?: boolean\n  data: string,\n  headings?: string[],\n}\n\n\n/**\n * Convert CSV data to fit the format used in the table.\n */\nexport const convertCSV = function(userOptions : csvConvertUserOptions) {\n    let obj\n    const defaults = {\n        lineDelimiter: \"\\n\",\n        columnDelimiter: \",\",\n        removeDoubleQuotes: false\n    }\n\n    // Check for the options object\n    if (!isObject(userOptions)) {\n        return false\n    }\n\n    const options = {\n        ...defaults,\n        ...userOptions\n    }\n\n    if (options.data.length) {\n        // Import CSV\n        obj = {\n            data: []\n        }\n\n        // Split the string into rows\n        const rows : string[] = options.data.split(options.lineDelimiter)\n\n        if (rows.length) {\n\n            if (options.headings) {\n                obj.headings = rows[0].split(options.columnDelimiter)\n                if (options.removeDoubleQuotes) {\n                    obj.headings = obj.headings.map((e: string) => e.trim().replace(/(^\"|\"$)/g, \"\"))\n                }\n                rows.shift()\n            }\n\n            rows.forEach((row: string, i: number) => {\n                obj.data[i] = []\n\n                // Split the rows into values\n                const values = row.split(options.columnDelimiter)\n\n                if (values.length) {\n                    values.forEach((value: string) => {\n                        if (options.removeDoubleQuotes) {\n                            value = value.trim().replace(/(^\"|\"$)/g, \"\")\n                        }\n                        obj.data[i].push(value)\n                    })\n                }\n            })\n        }\n\n        if (obj) {\n            return obj\n        }\n    }\n\n    return false\n}\n","import {\n    isJson,\n    isObject\n} from \"../helpers\"\n\ninterface jsonConvertUserOptions {\n  lineDelimiter?: string,\n  columnDelimiter?: string\n  removeDoubleQuotes?: boolean\n  data: string,\n  headings?: string[],\n}\n\n/**\n * Convert JSON data to fit the format used in the table.\n */\nexport const convertJSON = function(userOptions : jsonConvertUserOptions) {\n    let obj\n    const defaults = {\n        data: \"\"\n    }\n\n    // Check for the options object\n    if (!isObject(userOptions)) {\n        return false\n    }\n\n    const options = {\n        ...defaults,\n        ...userOptions\n    }\n\n    if (options.data.length || isObject(options.data)) {\n        // Import JSON\n        const json = isJson(options.data) ? JSON.parse(options.data) : false\n\n        // Valid JSON string\n        if (json) {\n            obj = {\n                headings: [],\n                data: []\n            }\n\n            json.forEach((data: { [key: string]: string | number | boolean | null | undefined}, i: number) => {\n                obj.data[i] = []\n                Object.entries(data).forEach(([column, value]) => {\n                    if (!obj.headings.includes(column)) {\n                        obj.headings.push(column)\n                    }\n                    obj.data[i].push(value)\n                })\n            })\n        } else {\n            console.warn(\"That's not valid JSON!\")\n        }\n\n        if (obj) {\n            return obj\n        }\n    }\n\n    return false\n}\n","import {\n    cellToText,\n    isObject\n} from \"../helpers\"\nimport {DataTable} from \"../datatable\"\nimport {\n    cellDataType,\n    cellType,\n    dataRowType,\n    headerCellType\n} from \"../types\"\n\n/**\n * Export table to CSV\n */\n\ninterface csvUserOptions {\n  download?: boolean,\n  skipColumn?: number[],\n  lineDelimiter?: string,\n  columnDelimiter?: string,\n  selection?: number | number[],\n  filename?: string,\n}\n\n\nexport const exportCSV = function(dt: DataTable, userOptions: csvUserOptions = {}) {\n    if (!dt.hasHeadings && !dt.hasRows) return false\n\n    const defaults = {\n        download: true,\n        skipColumn: [],\n        lineDelimiter: \"\\n\",\n        columnDelimiter: \",\"\n    }\n\n    // Check for the options object\n    if (!isObject(userOptions)) {\n        return false\n    }\n\n    const options = {\n        ...defaults,\n        ...userOptions\n    }\n    const columnShown = (index: number) => !options.skipColumn.includes(index) && !dt.columns.settings[index]?.hidden\n    const headers = dt.data.headings.filter((_heading: headerCellType, index: number) => columnShown(index)).map((header: headerCellType) => header.text ?? header.data)\n\n    // Selection or whole table\n    let selectedRows: dataRowType[]\n    if (options.selection) {\n        // Page number\n        if (Array.isArray(options.selection)) {\n            // Array of page numbers\n            selectedRows = []\n            for (let i = 0; i < options.selection.length; i++) {\n                selectedRows = selectedRows.concat(dt.pages[options.selection[i] - 1].map(row => row.row))\n            }\n\n        } else {\n            selectedRows = dt.pages[options.selection - 1].map(row => row.row)\n        }\n    } else {\n        selectedRows = dt.data.data\n    }\n\n    let rows : cellDataType[][] = []\n    // Include headings\n    rows[0] = headers\n    rows = rows.concat(selectedRows.map((row: dataRowType) => {\n        const shownCells = row.cells.filter((_cell: cellType, index: number) => columnShown(index))\n        return shownCells.map((cell: cellType) => cellToText(cell))\n    }))\n\n    // Only proceed if we have data\n    if (rows.length) {\n        let str = \"\"\n        rows.forEach(row => {\n            row.forEach((cell: cellDataType) => {\n                if (typeof cell === \"string\") {\n                    cell = cell.trim()\n                    cell = cell.replace(/\\s{2,}/g, \" \")\n                    cell = cell.replace(/\\n/g, \"  \")\n                    cell = cell.replace(/\"/g, \"\\\"\\\"\")\n                    //have to manually encode \"#\" as encodeURI leaves it as is.\n                    cell = cell.replace(/#/g, \"%23\")\n                    if (cell.includes(\",\")) {\n                        cell = `\"${cell}\"`\n                    }\n                }\n                str += cell + options.columnDelimiter\n            })\n            // Remove trailing column delimiter\n            str = str.trim().substring(0, str.length - 1)\n\n            // Apply line delimiter\n            str += options.lineDelimiter\n        })\n\n        // Remove trailing line delimiter\n        str = str.trim().substring(0, str.length - 1)\n\n        // Download\n        if (options.download) {\n            // Create a link to trigger the download\n            const link = document.createElement(\"a\")\n            link.href = encodeURI(`data:text/csv;charset=utf-8,${str}`)\n            link.download = `${options.filename || \"datatable_export\"}.csv`\n\n            // Append the link\n            document.body.appendChild(link)\n\n            // Trigger the download\n            link.click()\n\n            // Remove the link\n            document.body.removeChild(link)\n        }\n\n        return str\n    }\n\n    return false\n}\n","import {\n    cellToText,\n    isObject\n} from \"../helpers\"\nimport {DataTable} from \"../datatable\"\nimport {\n    cellDataType,\n    cellType,\n    dataRowType,\n    headerCellType\n} from \"../types\"\n/**\n * Export table to JSON\n */\n\n interface jsonUserOptions {\n   download?: boolean,\n   skipColumn?: number[],\n   replacer?: null | ((key, value) => string) | (string | number)[],\n   space?: number,\n   selection?: number | number[],\n   filename?: string,\n }\n\n\nexport const exportJSON = function(dt: DataTable, userOptions: jsonUserOptions = {}) {\n    if (!dt.hasHeadings && !dt.hasRows) return false\n\n\n    const defaults = {\n        download: true,\n        skipColumn: [],\n        replacer: null,\n        space: 4\n    }\n\n    // Check for the options object\n    if (!isObject(userOptions)) {\n        return false\n    }\n\n    const options = {\n        ...defaults,\n        ...userOptions\n    }\n\n    const columnShown = (index: number) => !options.skipColumn.includes(index) && !dt.columns.settings[index]?.hidden\n\n    // Selection or whole table\n    let selectedRows: dataRowType[]\n    if (options.selection) {\n        // Page number\n        if (Array.isArray(options.selection)) {\n            // Array of page numbers\n            selectedRows = []\n            for (let i = 0; i < options.selection.length; i++) {\n                selectedRows = selectedRows.concat(dt.pages[options.selection[i] - 1].map(row => row.row))\n            }\n        } else {\n            selectedRows = dt.pages[options.selection - 1].map(row => row.row)\n        }\n    } else {\n        selectedRows = dt.data.data\n    }\n\n    const rows: cellDataType[][] = selectedRows.map((row: dataRowType) => {\n        const shownCells = row.cells.filter((_cell: cellType, index: number) => columnShown(index))\n        return shownCells.map((cell: cellType) => cellToText(cell))\n    })\n\n    const headers = dt.data.headings.filter((_heading: headerCellType, index: number) => columnShown(index)).map((header: headerCellType) => header.text ?? String(header.data))\n\n    // Only proceed if we have data\n    if (rows.length) {\n        const arr: (void | { [key: string]: cellDataType})[] = []\n        rows.forEach((row: cellDataType[], x: number) => {\n            arr[x] = arr[x] || {}\n            row.forEach((cell: cellDataType, i: number) => {\n                arr[x][headers[i]] = cell\n            })\n        })\n\n        // Convert the array of objects to JSON string\n        const str = JSON.stringify(arr, options.replacer, options.space)\n\n        // Download\n        if (options.download) {\n            // Create a link to trigger the download\n\n            const blob = new Blob(\n                [str],\n                {\n                    type: \"data:application/json;charset=utf-8\"\n                }\n            )\n            const url = URL.createObjectURL(blob)\n\n\n            const link = document.createElement(\"a\")\n            link.href = url\n            link.download = `${options.filename || \"datatable_export\"}.json`\n\n            // Append the link\n            document.body.appendChild(link)\n\n            // Trigger the download\n            link.click()\n\n            // Remove the link\n            document.body.removeChild(link)\n            URL.revokeObjectURL(url)\n        }\n\n        return str\n    }\n\n    return false\n}\n","import {\n    cellToText,\n    isObject\n} from \"../helpers\"\nimport {DataTable} from \"../datatable\"\nimport {\n    cellDataType,\n    cellType,\n    dataRowType,\n    headerCellType\n} from \"../types\"\n/**\n * Export table to SQL\n */\n\n interface sqlUserOptions {\n   download?: boolean,\n   skipColumn?: number[],\n   tableName?: string,\n   selection?: number | number[],\n   filename?: string,\n }\n\nexport const exportSQL = function(dt: DataTable, userOptions : sqlUserOptions = {}) {\n    if (!dt.hasHeadings && !dt.hasRows) return false\n\n    const defaults = {\n        download: true,\n        skipColumn: [],\n        tableName: \"myTable\"\n    }\n\n    // Check for the options object\n    if (!isObject(userOptions)) {\n        return false\n    }\n\n    const options = {\n        ...defaults,\n        ...userOptions\n    }\n    const columnShown = (index: number) => !options.skipColumn.includes(index) && !dt.columns.settings[index]?.hidden\n\n    // Selection or whole table\n    let selectedRows: dataRowType[] = []\n    if (options.selection) {\n        // Page number\n        if (Array.isArray(options.selection)) {\n            // Array of page numbers\n            for (let i = 0; i < options.selection.length; i++) {\n                selectedRows = selectedRows.concat(dt.pages[options.selection[i] - 1].map(row => row.row))\n            }\n\n        } else {\n            selectedRows = dt.pages[options.selection - 1].map(row => row.row)\n        }\n    } else {\n        selectedRows = dt.data.data\n    }\n\n    const rows: cellDataType[][] = selectedRows.map((row: dataRowType) => {\n        const shownCells = row.cells.filter((_cell: cellType, index: number) => columnShown(index))\n        return shownCells.map((cell: cellType) => cellToText(cell))\n    })\n\n    const headers = dt.data.headings.filter((_heading: headerCellType, index: number) => columnShown(index)).map((header: headerCellType) => header.text ?? String(header.data))\n    // Only proceed if we have data\n    if (rows.length) {\n        // Begin INSERT statement\n        let str = `INSERT INTO \\`${options.tableName}\\` (`\n\n        // Convert table headings to column names\n        headers.forEach((header: string) => {\n            str += `\\`${header}\\`,`\n        })\n\n        // Remove trailing comma\n        str = str.trim().substring(0, str.length - 1)\n\n        // Begin VALUES\n        str += \") VALUES \"\n\n        // Iterate rows and convert cell data to column values\n\n        rows.forEach((row: cellDataType[]) => {\n            str += \"(\"\n            row.forEach((cell: cellDataType) => {\n                if (typeof cell === \"string\") {\n                    str += `\"${cell}\",`\n                } else {\n                    str += `${cell},`\n                }\n            })\n            // Remove trailing comma\n            str = str.trim().substring(0, str.length - 1)\n\n            // end VALUES\n            str += \"),\"\n\n        })\n\n        // Remove trailing comma\n        str = str.trim().substring(0, str.length - 1)\n\n        // Add trailing colon\n        str += \";\"\n\n        if (options.download) {\n            str = `data:application/sql;charset=utf-8,${str}`\n        }\n\n        // Download\n        if (options.download) {\n            // Create a link to trigger the download\n            const link = document.createElement(\"a\")\n            link.href = encodeURI(str)\n            link.download = `${options.filename || \"datatable_export\"}.sql`\n\n            // Append the link\n            document.body.appendChild(link)\n\n            // Trigger the download\n            link.click()\n\n            // Remove the link\n            document.body.removeChild(link)\n        }\n\n        return str\n    }\n\n    return false\n}\n","import {\n    cellToText,\n    isObject\n} from \"../helpers\"\nimport {DataTable} from \"../datatable\"\nimport {\n    cellDataType,\n    cellType,\n    dataRowType,\n    headerCellType\n} from \"../types\"\n/**\n * Export table to TXT\n */\n interface txtUserOptions {\n   download?: boolean,\n   skipColumn?: number[],\n   lineDelimiter?: string,\n   columnDelimiter?: string,\n   selection?: number | number[],\n   filename?: string,\n }\n\n\nexport const exportTXT = function(dt: DataTable, userOptions : txtUserOptions = {}) {\n    if (!dt.hasHeadings && !dt.hasRows) return false\n\n    const defaults = {\n        download: true,\n        skipColumn: [],\n        lineDelimiter: \"\\n\",\n        columnDelimiter: \",\"\n    }\n\n    // Check for the options object\n    if (!isObject(userOptions)) {\n        return false\n    }\n\n    const options = {\n        ...defaults,\n        ...userOptions\n    }\n\n    const columnShown = (index: number) => !options.skipColumn.includes(index) && !dt.columns.settings[index]?.hidden\n\n    const headers = dt.data.headings.filter((_heading: headerCellType, index: number) => columnShown(index)).map((header: headerCellType) => header.text ?? header.data)\n\n    // Selection or whole table\n    let selectedRows: dataRowType[]\n    if (options.selection) {\n        // Page number\n        if (Array.isArray(options.selection)) {\n            // Array of page numbers\n            selectedRows = []\n            for (let i = 0; i < options.selection.length; i++) {\n                selectedRows = selectedRows.concat(dt.pages[options.selection[i] - 1].map(row => row.row))\n            }\n        } else {\n            selectedRows = dt.pages[options.selection - 1].map(row => row.row)\n        }\n    } else {\n        selectedRows = dt.data.data\n    }\n\n    let rows : cellDataType[][] = []\n    // Include headings\n    rows[0] = headers\n    rows = rows.concat(selectedRows.map((row: dataRowType) => {\n        const shownCells = row.cells.filter((_cell: cellType, index: number) => columnShown(index))\n        return shownCells.map((cell: cellType) => cellToText(cell))\n    }))\n\n    // Only proceed if we have data\n    if (rows.length) {\n        let str = \"\"\n\n        rows.forEach(row => {\n            row.forEach((cell: cellDataType) => {\n                if (typeof cell === \"string\") {\n                    cell = cell.trim()\n                    cell = cell.replace(/\\s{2,}/g, \" \")\n                    cell = cell.replace(/\\n/g, \"  \")\n                    cell = cell.replace(/\"/g, \"\\\"\\\"\")\n                    //have to manually encode \"#\" as encodeURI leaves it as is.\n                    cell = cell.replace(/#/g, \"%23\")\n                    if (cell.includes(\",\")) {\n                        cell = `\"${cell}\"`\n                    }\n                }\n                str += cell + options.columnDelimiter\n            })\n            // Remove trailing column delimiter\n            str = str.trim().substring(0, str.length - 1)\n\n            // Apply line delimiter\n            str += options.lineDelimiter\n\n        })\n\n        // Remove trailing line delimiter\n        str = str.trim().substring(0, str.length - 1)\n\n        if (options.download) {\n            str = `data:text/csv;charset=utf-8,${str}`\n        }\n        // Download\n        if (options.download) {\n            // Create a link to trigger the download\n            const link = document.createElement(\"a\")\n            link.href = encodeURI(str)\n            link.download = `${options.filename || \"datatable_export\"}.txt`\n\n            // Append the link\n            document.body.appendChild(link)\n\n            // Trigger the download\n            link.click()\n\n            // Remove the link\n            document.body.removeChild(link)\n        }\n\n        return str\n    }\n\n    return false\n}\n","/**\n* Default config\n* @type {Object}\n*/\nimport {Editor} from \"./editor\"\n\nexport const defaultConfig = {\n    classes: {\n        row: \"datatable-editor-row\",\n        form: \"datatable-editor-form\",\n        item: \"datatable-editor-item\",\n        menu: \"datatable-editor-menu\",\n        save: \"datatable-editor-save\",\n        block: \"datatable-editor-block\",\n        cancel: \"datatable-editor-cancel\",\n        close: \"datatable-editor-close\",\n        inner: \"datatable-editor-inner\",\n        input: \"datatable-editor-input\",\n        label: \"datatable-editor-label\",\n        modal: \"datatable-editor-modal\",\n        action: \"datatable-editor-action\",\n        header: \"datatable-editor-header\",\n        wrapper: \"datatable-editor-wrapper\",\n        editable: \"datatable-editor-editable\",\n        container: \"datatable-editor-container\",\n        separator: \"datatable-editor-separator\"\n    },\n\n    labels: {\n        closeX: \"x\",\n        editCell: \"Edit Cell\",\n        editRow: \"Edit Row\",\n        removeRow: \"Remove Row\",\n        reallyRemove: \"Are you sure?\",\n        reallyCancel: \"Do you really want to cancel?\",\n        save: \"Save\",\n        cancel: \"Cancel\"\n    },\n\n    cancelModal: editor => confirm(editor.options.labels.reallyCancel),\n\n    // edit inline instead of using a modal lay-over for editing content\n    inline: true,\n\n    // include hidden columns in the editor\n    hiddenColumns: false,\n\n    // enable the context menu\n    contextMenu: true,\n\n    // event to start editing\n    clickEvent: \"dblclick\",\n\n    // indexes of columns not to be edited\n    excludeColumns: [],\n\n    // set the context menu items\n    menuItems: [\n        {\n            text: (editor: Editor) => editor.options.labels.editCell,\n            action: (editor: Editor, _event: Event) => {\n                if (!(editor.event.target instanceof Element)) {\n                    return\n                }\n                const cell = editor.event.target.closest(\"td\")\n                return editor.editCell(cell)\n            }\n        },\n        {\n            text: (editor: Editor) => editor.options.labels.editRow,\n            action: (editor: Editor, _event: Event) => {\n                if (!(editor.event.target instanceof Element)) {\n                    return\n                }\n                const row = editor.event.target.closest(\"tr\")\n                return editor.editRow(row)\n            }\n        },\n        {\n            separator: true\n        },\n        {\n            text: (editor: Editor) => editor.options.labels.removeRow,\n            action: (editor: Editor, _event: Event) => {\n                if (!(editor.event.target instanceof Element)) {\n                    return\n                }\n                if (confirm(editor.options.labels.reallyRemove)) {\n                    const row = editor.event.target.closest(\"tr\")\n                    editor.removeRow(row)\n                }\n            }\n        }\n    ]\n}\n","import {\n    classNamesToSelector,\n    cellToText,\n    columnToVisibleIndex,\n    createElement,\n    debounce,\n    escapeText,\n    visibleToColumnIndex\n} from \"../helpers\"\nimport {\n    cellType,\n    rowRenderType,\n    elementNodeType\n} from \"../types\"\nimport {DataTable} from \"../datatable\"\nimport {parseDate} from \"../date\"\n\nimport {\n    defaultConfig\n} from \"./config\"\n\nimport {menuItemType, dataType, EditorOptions} from \"./types\"\n\n\n/**\n * Main lib\n * @param {Object} dataTable Target dataTable\n * @param {Object} options User config\n */\nexport class Editor {\n    menuOpen: boolean\n\n    containerDOM: HTMLElement\n\n    data: dataType\n\n    disabled: boolean\n\n    dt: DataTable\n\n    editing: boolean\n\n    editingCell: boolean\n\n    editingRow: boolean\n\n    event: Event\n\n    events: { [key: string]: () => void}\n\n    initialized: boolean\n\n    limits: {x: number, y: number}\n\n    menuDOM: HTMLElement\n\n    modalDOM: HTMLElement | false\n\n    options: EditorOptions\n\n    originalRowRender: rowRenderType | false\n\n    rect: {width: number, height: number}\n\n    wrapperDOM: HTMLElement\n\n    constructor(dataTable: DataTable, options = {}) {\n        this.dt = dataTable\n        this.options = {\n            ...defaultConfig,\n            ...options\n        }\n    }\n\n    /**\n     * Init instance\n     * @return {Void}\n     */\n    init() {\n        if (this.initialized) {\n            return\n        }\n        this.options.classes.editable?.split(\" \").forEach(className => this.dt.wrapperDOM.classList.add(className))\n        if (this.options.inline) {\n            this.originalRowRender = this.dt.options.rowRender\n            this.dt.options.rowRender = (row, tr, index) => {\n                let newTr = this.rowRender(row, tr, index)\n                if (this.originalRowRender) {\n                    newTr = this.originalRowRender(row, newTr, index)\n                }\n                return newTr\n            }\n        }\n        if (this.options.contextMenu) {\n            this.containerDOM = createElement(\"div\", {\n                id: this.options.classes.container\n            })\n            this.wrapperDOM = createElement(\"div\", {\n                class: this.options.classes.wrapper\n            })\n            this.menuDOM = createElement(\"ul\", {\n                class: this.options.classes.menu\n            })\n            if (this.options.menuItems && this.options.menuItems.length) {\n                this.options.menuItems.forEach((item: menuItemType) => {\n                    const li = createElement(\"li\", {\n                        class: item.separator ? this.options.classes.separator : this.options.classes.item\n                    })\n                    if (!item.separator) {\n                        const a = createElement(\"a\", {\n                            class: this.options.classes.action,\n                            href: item.url || \"#\",\n                            html: typeof item.text === \"function\" ? item.text(this) : item.text\n                        })\n                        li.appendChild(a)\n                        if (item.action && typeof item.action === \"function\") {\n                            a.addEventListener(\"click\", (event: Event) => {\n                                event.preventDefault()\n                                item.action(this, event)\n                            })\n                        }\n                    }\n                    this.menuDOM.appendChild(li)\n                })\n            }\n            this.wrapperDOM.appendChild(this.menuDOM)\n            this.containerDOM.appendChild(this.wrapperDOM)\n            this.updateMenu()\n        }\n        this.data = {}\n        this.menuOpen = false\n        this.editing = false\n        this.editingRow = false\n        this.editingCell = false\n        this.bindEvents()\n        setTimeout(() => {\n            this.initialized = true\n            this.dt.emit(\"editable.init\")\n        }, 10)\n    }\n\n    /**\n     * Bind events to DOM\n     * @return {Void}\n     */\n    bindEvents() {\n        this.events = {\n            keydown: this.keydown.bind(this),\n            click: this.click.bind(this)\n        }\n        // listen for click / double-click\n        this.dt.dom.addEventListener(this.options.clickEvent, this.events.click)\n        // listen for right-click\n        document.addEventListener(\"keydown\", this.events.keydown)\n\n        if (this.options.contextMenu) {\n            this.events.context = this.context.bind(this)\n            this.events.updateMenu = this.updateMenu.bind(this)\n            this.events.dismissMenu = this.dismissMenu.bind(this)\n            this.events.reset = debounce(() => this.events.updateMenu(), 50)\n\n            // listen for right-click\n            this.dt.dom.addEventListener(\"contextmenu\", this.events.context)\n            // listen for click everywhere except the menu\n            document.addEventListener(\"click\", this.events.dismissMenu)\n            // Reset contextmenu on browser window changes\n            window.addEventListener(\"resize\", this.events.reset)\n            window.addEventListener(\"scroll\", this.events.reset)\n        }\n    }\n\n    /**\n     * contextmenu listener\n     * @param  {Object} event Event\n     * @return {Void}\n     */\n    context(event: MouseEvent) {\n        const target = event.target\n        if (!(target instanceof Element)) {\n            return\n        }\n        this.event = event\n\n        const cell = target.closest(\"tbody td\")\n        if (!this.disabled && cell) {\n            event.preventDefault()\n            // get the mouse position\n            let x = event.pageX\n            let y = event.pageY\n            // check if we're near the right edge of window\n            if (x > this.limits.x) {\n                x -= this.rect.width\n            }\n            // check if we're near the bottom edge of window\n            if (y > this.limits.y) {\n                y -= this.rect.height\n            }\n            this.wrapperDOM.style.top = `${y}px`\n            this.wrapperDOM.style.left = `${x}px`\n            this.openMenu()\n            this.updateMenu()\n        }\n    }\n\n    /**\n     * dblclick listener\n     * @param  {Object} event Event\n     * @return {Void}\n     */\n    click(event: MouseEvent) {\n        const target = event.target\n        if (!(target instanceof Element)) {\n            return\n        }\n        if (this.editing && this.data && this.editingCell) {\n            const inputSelector = classNamesToSelector(this.options.classes.input)\n            const input = this.modalDOM ?\n                (this.modalDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement) :\n                (this.dt.wrapperDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement)\n            this.saveCell(input.value)\n        } else if (!this.editing) {\n            const cell = target.closest(\"tbody td\") as HTMLTableCellElement\n            if (cell) {\n                this.editCell(cell)\n                event.preventDefault()\n            }\n        }\n    }\n\n    /**\n     * keydown listener\n     * @param  {Object} event Event\n     * @return {Void}\n     */\n    keydown(event: KeyboardEvent) {\n        const inputSelector = classNamesToSelector(this.options.classes.input)\n        if (this.modalDOM) {\n            if (event.key === \"Escape\") { // close button\n                if (this.options.cancelModal(this)) {\n                    this.closeModal()\n                }\n            } else if (event.key === \"Enter\") { // save button\n                // Save\n                if (this.editingCell) {\n                    const input = (this.modalDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement)\n                    this.saveCell(input.value)\n                } else {\n                    const values = (Array.from(this.modalDOM.querySelectorAll(`input${inputSelector}[type=text]`)) as HTMLInputElement[]).map(input => input.value.trim())\n                    this.saveRow(values, this.data.row)\n                }\n            }\n        } else if (this.editing && this.data) {\n            if (event.key === \"Enter\") {\n                // Enter key saves\n                if (this.editingCell) {\n                    const input = (this.dt.wrapperDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement)\n                    this.saveCell(input.value)\n                } else if (this.editingRow) {\n                    const values = (Array.from(this.dt.wrapperDOM.querySelectorAll(`input${inputSelector}[type=text]`)) as HTMLInputElement[]).map(input => input.value.trim())\n                    this.saveRow(values, this.data.row)\n                }\n            } else if (event.key === \"Escape\") {\n                // Escape key reverts\n                if (this.editingCell) {\n                    this.saveCell(this.data.content)\n                } else if (this.editingRow) {\n                    this.saveRow(null, this.data.row)\n                }\n            }\n        }\n    }\n\n    /**\n     * Edit cell\n     * @param  {Object} td    The HTMLTableCellElement\n     * @return {Void}\n     */\n    editCell(td: HTMLTableCellElement) {\n        const columnIndex = visibleToColumnIndex(td.cellIndex, this.dt.columns.settings)\n        if (this.options.excludeColumns.includes(columnIndex)) {\n            this.closeMenu()\n            return\n        }\n        const rowIndex = parseInt(td.parentElement.dataset.index, 10)\n        const row = this.dt.data.data[rowIndex]\n        const cell = row.cells[columnIndex]\n\n        this.data = {\n            cell,\n            rowIndex,\n            columnIndex,\n            content: cellToText(cell)\n        }\n        this.editing = true\n        this.editingCell = true\n        if (this.options.inline) {\n            this.dt.update()\n        } else {\n            this.editCellModal()\n        }\n        this.closeMenu()\n    }\n\n    editCellModal() {\n        const cell = this.data.cell\n        const columnIndex = this.data.columnIndex\n        const label = this.dt.data.headings[columnIndex].text || String(this.dt.data.headings[columnIndex].data)\n        const template = [\n            `<div class='${this.options.classes.inner}'>`,\n            `<div class='${this.options.classes.header}'>`,\n            `<h4>${this.options.labels.editCell}</h4>`,\n            `<button class='${this.options.classes.close}' type='button' data-editor-cancel>${this.options.labels.closeX}</button>`,\n            \" </div>\",\n            `<div class='${this.options.classes.block}'>`,\n            `<form class='${this.options.classes.form}'>`,\n            `<div class='${this.options.classes.row}'>`,\n            `<label class='${this.options.classes.label}'>${escapeText(label)}</label>`,\n            `<input class='${this.options.classes.input}' value='${escapeText(cellToText(cell))}' type='text'>`,\n            \"</div>\",\n            `<div class='${this.options.classes.row}'>`,\n            `<button class='${this.options.classes.cancel}' type='button' data-editor-cancel>${this.options.labels.cancel}</button>`,\n            `<button class='${this.options.classes.save}' type='button' data-editor-save>${this.options.labels.save}</button>`,\n            \"</div>\",\n            \"</form>\",\n            \"</div>\",\n            \"</div>\"\n        ].join(\"\")\n        const modalDOM = createElement(\"div\", {\n            class: this.options.classes.modal,\n            html: template\n        })\n        this.modalDOM = modalDOM\n        this.openModal()\n        const inputSelector = classNamesToSelector(this.options.classes.input)\n        const input = (modalDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement)\n        input.focus()\n        input.selectionStart = input.selectionEnd = input.value.length\n        // Close / save\n        modalDOM.addEventListener(\"click\", (event: Event) => {\n            const target = event.target\n            if (!(target instanceof Element)) {\n                return\n            }\n            if (target.hasAttribute(\"data-editor-cancel\")) { // cancel button\n                event.preventDefault()\n                if (this.options.cancelModal(this)) {\n                    this.closeModal()\n                }\n            } else if (target.hasAttribute(\"data-editor-save\")) { // save button\n                event.preventDefault()\n                // Save\n                this.saveCell(input.value)\n            }\n        })\n    }\n\n    /**\n     * Save edited cell\n     * @param  {Object} row    The HTMLTableCellElement\n     * @param  {String} value   Cell content\n     * @return {Void}\n     */\n    saveCell(value: string) {\n        const oldData = this.data.content\n        // Get the type of that column\n        const type = this.dt.columns.settings[this.data.columnIndex].type || this.dt.options.type\n        const stringValue = value.trim()\n        let cell\n        if (type === \"number\") {\n            cell = {data: parseFloat(stringValue)}\n        } else if (type === \"boolean\") {\n            if ([\"\", \"false\", \"0\"].includes(stringValue)) {\n                cell = {data: false,\n                    text: \"false\",\n                    order: 0}\n            } else {\n                cell = {data: true,\n                    text: \"true\",\n                    order: 1}\n            }\n        } else if (type === \"html\") {\n            cell = {data: [\n                {nodeName: \"#text\",\n                    data: value}\n            ],\n            text: value,\n            order: value}\n        } else if (type === \"string\") {\n            cell = {data: value}\n        } else if (type === \"date\") {\n            const format = this.dt.columns.settings[this.data.columnIndex].format || this.dt.options.format\n            cell = {data: value,\n                order: parseDate(String(value), format)}\n        } else {\n            cell = {data: value}\n        }\n        // Set the cell content\n        const row = this.dt.data.data[this.data.rowIndex]\n        row.cells[this.data.columnIndex] = cell\n        this.closeModal()\n        const rowIndex = this.data.rowIndex\n        const columnIndex = this.data.columnIndex\n        this.data = {}\n        this.dt.update(true)\n        this.editing = false\n        this.editingCell = false\n        this.dt.emit(\"editable.save.cell\", value, oldData, rowIndex, columnIndex)\n    }\n\n    /**\n     * Edit row\n     * @param  {Object} row    The HTMLTableRowElement\n     * @return {Void}\n     */\n    editRow(tr: HTMLElement) {\n        if (!tr || tr.nodeName !== \"TR\" || this.editing) return\n        const rowIndex = parseInt(tr.dataset.index, 10)\n        const row = this.dt.data.data[rowIndex]\n        this.data = {\n            row: row.cells,\n            rowIndex\n        }\n        this.editing = true\n        this.editingRow = true\n        if (this.options.inline) {\n            this.dt.update()\n        } else {\n            this.editRowModal()\n        }\n        this.closeMenu()\n    }\n\n    editRowModal() {\n        const row = this.data.row\n\n        const template = [\n            `<div class='${this.options.classes.inner}'>`,\n            `<div class='${this.options.classes.header}'>`,\n            `<h4>${this.options.labels.editRow}</h4>`,\n            `<button class='${this.options.classes.close}' type='button' data-editor-cancel>${this.options.labels.closeX}</button>`,\n            \" </div>\",\n            `<div class='${this.options.classes.block}'>`,\n            `<form class='${this.options.classes.form}'>`,\n            `<div class='${this.options.classes.row}'>`,\n            `<button class='${this.options.classes.cancel}' type='button' data-editor-cancel>${this.options.labels.cancel}</button>`,\n            `<button class='${this.options.classes.save}' type='button' data-editor-save>${this.options.labels.save}</button>`,\n            \"</div>\",\n            \"</form>\",\n            \"</div>\",\n            \"</div>\"\n        ].join(\"\")\n        const modalDOM = createElement(\"div\", {\n            class: this.options.classes.modal,\n            html: template\n        })\n        const inner = modalDOM.firstElementChild\n        if (!inner) {\n            return\n        }\n        const form = inner.lastElementChild?.firstElementChild\n        if (!form) {\n            return\n        }\n        // Add the inputs for each cell\n        row.forEach((cell: cellType, i: number) => {\n            const columnSettings = this.dt.columns.settings[i]\n            if ((!columnSettings.hidden || (columnSettings.hidden && this.options.hiddenColumns)) && !this.options.excludeColumns.includes(i)) {\n                const label = this.dt.data.headings[i].text || String(this.dt.data.headings[i].data)\n                form.insertBefore(createElement(\"div\", {\n                    class: this.options.classes.row,\n                    html: [\n                        `<div class='${this.options.classes.row}'>`,\n                        `<label class='${this.options.classes.label}'>${escapeText(label)}</label>`,\n                        `<input class='${this.options.classes.input}' value='${escapeText(cellToText(cell))}' type='text'>`,\n                        \"</div>\"\n                    ].join(\"\")\n                }), form.lastElementChild)\n            }\n        })\n        this.modalDOM = modalDOM\n        this.openModal()\n        // Grab the inputs\n        const inputSelector = classNamesToSelector(this.options.classes.input)\n        const inputs = Array.from(form.querySelectorAll(`input${inputSelector}[type=text]`)) as HTMLInputElement[]\n\n        // Close / save\n        modalDOM.addEventListener(\"click\", (event: MouseEvent) => {\n            const target = event.target\n            if (!(target instanceof Element)) {\n                return\n            }\n            if (target.hasAttribute(\"data-editor-cancel\")) { // cancel button\n                if (this.options.cancelModal(this)) {\n                    this.closeModal()\n                }\n            } else if (target.hasAttribute(\"data-editor-save\")) { // save button\n                // Save\n                const values = inputs.map((input: HTMLInputElement) => input.value.trim())\n                this.saveRow(values, this.data.row)\n            }\n        })\n    }\n\n    /**\n     * Save edited row\n     * @param  {Object} row    The HTMLTableRowElement\n     * @param  {Array} data   Cell data\n     * @return {Void}\n     */\n    saveRow(data: string[], row: cellType[]) {\n        // Store the old data for the emitter\n        const oldData = row.map((cell: cellType) => cellToText(cell))\n        const updatedRow = this.dt.data.data[this.data.rowIndex]\n\n        if (data) {\n            let valueCounter = 0\n            updatedRow.cells = row.map((oldItem, colIndex) => {\n                if (this.options.excludeColumns.includes(colIndex) || this.dt.columns.settings[colIndex].hidden) {\n                    return oldItem\n                }\n                const type = this.dt.columns.settings[colIndex].type || this.dt.options.type\n                const value = data[valueCounter++]\n                let cell\n                if (type === \"number\") {\n                    cell = {data: parseFloat(value)}\n                } else if (type === \"boolean\") {\n                    if ([\"\", \"false\", \"0\"].includes(value)) {\n                        cell = {data: false,\n                            text: \"false\",\n                            order: 0}\n                    } else {\n                        cell = {data: true,\n                            text: \"true\",\n                            order: 1}\n                    }\n                } else if (type === \"html\") {\n                    cell = {\n                        data: [\n                            {nodeName: \"#text\",\n                                data: value}\n                        ],\n                        text: value,\n                        order: value\n                    }\n                } else if (type === \"string\") {\n                    cell = {data: value}\n                } else if (type === \"date\") {\n                    const format = this.dt.columns.settings[colIndex].format || this.dt.options.format\n                    cell = {data: value,\n                        order: parseDate(String(value), format)}\n                } else {\n                    cell = {data: value}\n                }\n                return cell\n\n            })\n        }\n\n        const newData = updatedRow.cells.map(cell => cellToText(cell))\n\n        this.data = {}\n        this.dt.update(true)\n        this.closeModal()\n        this.editing = false\n        this.dt.emit(\"editable.save.row\", newData, oldData, row)\n    }\n\n    /**\n     * Open the row editor modal\n     * @return {Void}\n     */\n    openModal() {\n        if (this.modalDOM) {\n            document.body.appendChild(this.modalDOM)\n        }\n    }\n\n    /**\n     * Close the row editor modal\n     * @return {Void}\n     */\n    closeModal() {\n        if (this.editing && this.modalDOM) {\n            document.body.removeChild(this.modalDOM)\n            this.modalDOM = this.editing = this.editingRow = this.editingCell = false\n        }\n    }\n\n    /**\n     * Remove a row\n     * @param  {Object} tr The HTMLTableRowElement\n     * @return {Void}\n     */\n    removeRow(tr: HTMLElement) {\n        if (!tr || tr.nodeName !== \"TR\" || this.editing) return\n        const index = parseInt(tr.dataset.index, 10)\n        this.dt.rows.remove(index)\n        this.closeMenu()\n    }\n\n    /**\n     * Update context menu position\n     * @return {Void}\n     */\n    updateMenu() {\n        const scrollX = window.scrollX || window.pageXOffset\n        const scrollY = window.scrollY || window.pageYOffset\n        this.rect = this.wrapperDOM.getBoundingClientRect()\n        this.limits = {\n            x: window.innerWidth + scrollX - this.rect.width,\n            y: window.innerHeight + scrollY - this.rect.height\n        }\n    }\n\n    /**\n     * Dismiss the context menu\n     * @param  {Object} event Event\n     * @return {Void}\n     */\n    dismissMenu(event: Event) {\n        const target = event.target\n        if (!(target instanceof Element) || this.wrapperDOM.contains(target)) {\n            return\n        }\n        let valid = true\n        if (this.editing) {\n            const inputSelector = classNamesToSelector(this.options.classes.input)\n            valid = !(target.matches(`input${inputSelector}[type=text]`))\n        }\n        if (valid) {\n            this.closeMenu()\n        }\n    }\n\n    /**\n     * Open the context menu\n     * @return {Void}\n     */\n    openMenu() {\n        if (this.editing && this.data && this.editingCell) {\n            const inputSelector = classNamesToSelector(this.options.classes.input)\n            const input = this.modalDOM ?\n                (this.modalDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement) :\n                (this.dt.wrapperDOM.querySelector(`input${inputSelector}[type=text]`) as HTMLInputElement)\n\n            this.saveCell(input.value)\n        }\n        document.body.appendChild(this.containerDOM)\n        this.menuOpen = true\n        this.dt.emit(\"editable.context.open\")\n    }\n\n    /**\n     * Close the context menu\n     * @return {Void}\n     */\n    closeMenu() {\n        if (this.menuOpen) {\n            this.menuOpen = false\n            document.body.removeChild(this.containerDOM)\n            this.dt.emit(\"editable.context.close\")\n        }\n    }\n\n    /**\n     * Destroy the instance\n     * @return {Void}\n     */\n    destroy() {\n        this.dt.dom.removeEventListener(this.options.clickEvent, this.events.click)\n        this.dt.dom.removeEventListener(\"contextmenu\", this.events.context)\n        document.removeEventListener(\"click\", this.events.dismissMenu)\n        document.removeEventListener(\"keydown\", this.events.keydown)\n        window.removeEventListener(\"resize\", this.events.reset)\n        window.removeEventListener(\"scroll\", this.events.reset)\n        if (document.body.contains(this.containerDOM)) {\n            document.body.removeChild(this.containerDOM)\n        }\n        if (this.options.inline) {\n            this.dt.options.rowRender = this.originalRowRender\n        }\n        this.initialized = false\n    }\n\n    rowRender(row, tr, index) {\n        if (!this.data || this.data.rowIndex !== index) {\n            return tr\n        }\n\n        if (this.editingCell) {\n            // cell editing\n            const cell = tr.childNodes[columnToVisibleIndex(this.data.columnIndex, this.dt.columns.settings)]\n            cell.childNodes = [\n                {\n                    nodeName: \"INPUT\",\n                    attributes: {\n                        type: \"text\",\n                        value: this.data.content,\n                        class: this.options.classes.input\n                    }\n                }\n            ]\n        } else {\n            // row editing\n\n            // Add the inputs for each cell\n            tr.childNodes.forEach((cell: elementNodeType, i: number) => {\n                const index = visibleToColumnIndex(i, this.dt.columns.settings)\n                const dataCell = row[index]\n                if (!this.options.excludeColumns.includes(index)) {\n                    const cell = tr.childNodes[i]\n                    cell.childNodes = [\n                        {\n                            nodeName: \"INPUT\",\n                            attributes: {\n                                type: \"text\",\n                                value: escapeText(dataCell.text || String(dataCell.data) || \"\"),\n                                class: this.options.classes.input\n                            }\n                        }\n                    ]\n                }\n            })\n\n        }\n        return tr\n\n    }\n}\n\nexport const makeEditable = function(dataTable: DataTable, options = {}) {\n    const editor = new Editor(dataTable, options)\n    if (dataTable.initialized) {\n        editor.init()\n    } else {\n        dataTable.on(\"datatable.init\", () => editor.init())\n    }\n\n    return editor\n}\n","/**\n* Default config\n* @type {Object}\n*/\n//import {ColumnFilter} from \"./column_filter\"\n\nexport const defaultConfig = {\n    classes: {\n        button: \"datatable-column-filter-button\",\n        menu: \"datatable-column-filter-menu\",\n        container: \"datatable-column-filter-container\",\n        wrapper: \"datatable-column-filter-wrapper\"\n    },\n    labels: {\n        button: \"Filter columns within the table\" // The filter button title\n    },\n    hiddenColumns: []\n}\n","import {DataTable} from \"../datatable\"\nimport {classNamesToSelector, createElement} from \"../helpers\"\n\nimport {\n    defaultConfig\n} from \"./config\"\n\nimport {ColumnFilterOptions} from \"./types\"\n\nclass ColumnFilter {\n\n    addedButtonDOM: boolean\n\n    menuOpen: boolean\n\n    buttonDOM: HTMLElement\n\n    dt: DataTable\n\n    events: { [key: string]: () => void}\n\n    initialized: boolean\n\n    options: ColumnFilterOptions\n\n    menuDOM: HTMLElement\n\n    containerDOM: HTMLElement\n\n    wrapperDOM: HTMLElement\n\n    limits: {x: number, y: number}\n\n    rect: {width: number, height: number}\n\n    event: Event\n\n    constructor(dataTable: DataTable, options = {}) {\n        this.dt = dataTable\n        this.options = {\n            ...defaultConfig,\n            ...options\n        }\n    }\n\n    init() {\n\n        if (this.initialized) {\n            return\n        }\n\n        const buttonSelector = classNamesToSelector(this.options.classes.button)\n        let buttonDOM : (HTMLElement | null) = this.dt.wrapperDOM.querySelector(buttonSelector)\n        if (!buttonDOM) {\n            buttonDOM = createElement(\n                \"button\",\n                {\n                    class: this.options.classes.button,\n                    html: \"▦\"\n                }\n            )\n            // filter button not part of template (could be default template. We add it to search.)\n            const searchSelector = classNamesToSelector(this.dt.options.classes.search)\n            const searchWrapper = this.dt.wrapperDOM.querySelector(searchSelector)\n            if (searchWrapper) {\n                searchWrapper.appendChild(buttonDOM)\n            } else {\n                this.dt.wrapperDOM.appendChild(buttonDOM)\n            }\n            this.addedButtonDOM = true\n        }\n        this.buttonDOM = buttonDOM\n\n\n        this.containerDOM = createElement(\"div\", {\n            id: this.options.classes.container\n        })\n        this.wrapperDOM = createElement(\"div\", {\n            class: this.options.classes.wrapper\n        })\n        this.menuDOM = createElement(\"ul\", {\n            class: this.options.classes.menu,\n            html: this.dt.data.headings.map(\n                (heading, index) => {\n                    const settings = this.dt.columns.settings[index]\n                    if (this.options.hiddenColumns.includes(index)) {\n                        return \"\"\n                    }\n                    return `<li data-column=\"${index}\">\n                        <input type=\"checkbox\" value=\"${heading.text || heading.data}\" ${settings.hidden ? \"\" : \"checked=''\"}>\n                        <label>\n                            ${heading.text || heading.data}\n                        </label>\n                    </li>`\n                }\n            ).join(\"\")\n        })\n        this.wrapperDOM.appendChild(this.menuDOM)\n        this.containerDOM.appendChild(this.wrapperDOM)\n        this._measureSpace()\n\n        this._bind()\n\n        this.initialized = true\n\n    }\n\n    dismiss() {\n        if (this.addedButtonDOM && this.buttonDOM.parentElement) {\n            this.buttonDOM.parentElement.removeChild(this.buttonDOM)\n        }\n        document.removeEventListener(\"click\", this.events.click)\n    }\n\n    _bind() {\n        this.events = {\n            click: this._click.bind(this)\n        }\n        document.addEventListener(\"click\", this.events.click)\n    }\n\n    _openMenu() {\n        document.body.appendChild(this.containerDOM)\n        this._measureSpace()\n        this.menuOpen = true\n        this.dt.emit(\"columnFilter.menu.open\")\n    }\n\n    _closeMenu() {\n        if (this.menuOpen) {\n            this.menuOpen = false\n            document.body.removeChild(this.containerDOM)\n            this.dt.emit(\"columnFilter.menu.close\")\n        }\n    }\n\n    _measureSpace() {\n        const scrollX = window.scrollX || window.pageXOffset\n        const scrollY = window.scrollY || window.pageYOffset\n        this.rect = this.wrapperDOM.getBoundingClientRect()\n        this.limits = {\n            x: window.innerWidth + scrollX - this.rect.width,\n            y: window.innerHeight + scrollY - this.rect.height\n        }\n    }\n\n    _click(event: MouseEvent) {\n        const target = event.target\n        if (!(target instanceof Element)) {\n            return\n        }\n        this.event = event\n\n        if (this.buttonDOM.contains(target)) {\n            event.preventDefault()\n            if (this.menuOpen) {\n                this._closeMenu()\n                return\n            }\n            this._openMenu()\n            // get the mouse position\n            let x = event.pageX\n            let y = event.pageY\n            // check if we're near the right edge of window\n            if (x > this.limits.x) {\n                x -= this.rect.width\n            }\n            // check if we're near the bottom edge of window\n            if (y > this.limits.y) {\n                y -= this.rect.height\n            }\n            this.wrapperDOM.style.top = `${y}px`\n            this.wrapperDOM.style.left = `${x}px`\n        } else if (this.menuDOM.contains(target)) {\n            const menuSelector = classNamesToSelector(this.options.classes.menu)\n            const li = target.closest(`${menuSelector} > li`) as HTMLElement\n            if (!li) {\n                return\n            }\n            const checkbox = li.querySelector(\"input[type=checkbox]\") as HTMLInputElement\n            if (!checkbox.contains(target)) {\n                checkbox.checked = !checkbox.checked\n            }\n            const column = Number(li.dataset.column)\n            if (checkbox.checked) {\n                this.dt.columns.show([column])\n            } else {\n                this.dt.columns.hide([column])\n            }\n        } else if (this.menuOpen) {\n            this._closeMenu()\n        }\n    }\n\n}\n\n\nexport const addColumnFilter = function(dataTable: DataTable, options = {}) {\n    const columnFilter = new ColumnFilter(dataTable, options)\n    if (dataTable.initialized) {\n        columnFilter.init()\n    } else {\n        dataTable.on(\"datatable.init\", () => columnFilter.init())\n    }\n\n    return columnFilter\n}\n"],"names":["isObject","val","Object","prototype","toString","call","isJson","str","t","JSON","parse","e","Array","isArray","createElement","nodeName","attrs","dom","document","attr","innerHTML","setAttribute","objToText","obj","includes","data","childNodes","map","childNode","join","cellToText","hasOwnProperty","cell","text","String","escapeText","replace","visibleToColumnIndex","visibleIndex","columns","counter","columnIndex","hidden","namedNodeMapToObject","name","value","classNamesToSelector","classNames","trim","split","className","containsClass","element","classes","hasMissingClass","some","classList","contains","joinWithSpaces","first","second","debounce","func","timeout","timer","_args","clearTimeout","window","setTimeout","__assign","assign","s","arguments$1","arguments","i","n","length","p","apply","this","__spreadArray","to","from","pack","ar","l","slice","concat","SuppressedError","Diff","options","_this","entries","forEach","_a","key","stringify","setValue","aKey","aValue","checkElementType","elementTypeNames","_i","elementTypeName","_b","ownerDocument","defaultView","objToNode","objNode","insideSvg","node","createTextNode","createComment","createElementNS","toLowerCase","attributes","appendChild","valueDiffing","checked","selected","getFromRoute","route","c","splice","applyDiff","tree","diff","newNode","reference","action","_const","addElement","addTextElement","info","preDiffApply","addAttribute","modifyAttribute","newValue","removeAttribute","modifyTextElement","textDiff","oldValue","parentNode","modifyValue","modifyComment","modifyChecked","modifySelected","replaceElement","namespaceURI","replaceChild","relocateGroup","groupLength","removeChild","index","insertBefore","removeElement","parentRoute","removeTextElement","nodeType","console","log","postDiffApply","swap","p1","p2","tmp","undoDOM","diffs","reverse","undoDiff","elementDescriptors","el","output","push","id","findUniqueDescriptors","li","uniqueDescriptors","duplicateDescriptors","descriptor","inUnique","uniqueInBoth","l1","l2","l1Unique","l2Unique","inBoth","keys","removeDone","outerDone","innerDone","valueDone","every","cleanNode","diffNode","elementNode","diffChildNode","isEqual","e1","e2","Boolean","e1Attributes","e2Attributes","attribute","roughlyEqual","sameSiblings","preventRecursion","nodeList1","nodeList2","childUniqueDescriptors_1","makeBooleanArray","v","markSubTrees","oldTree","newTree","oldChildren","newChildren","marked1","marked2","subsets","returnIndex","foundAllSubsets","_loop_1","subset","c1","c2","lcsSize","c1Length","c2Length","matches","subsetsSame","c1Desc","c2Desc","description","c1Index","c1Element","c2Index","c2Element","findCommonSubsets","item","markBoth","subsetsAge","DiffTracker","list","add","fn","getFromVirtualRoute","nodeIndex","undefined","applyVirtual","routeInfo","newSubsets","preVirtualDiffApply","movedNode","splitLength","c_1","c_2","filter","postVirtualDiffApply","applyVirtualDiff","nodeToObj","aNode","type","tagRE","attrRE","unescape","string","lookup","area","base","br","col","embed","hr","img","input","keygen","link","menuItem","meta","param","source","track","wbr","parseTag","tag","caseSensitive","res","voidElement","tagMatch","match","toUpperCase","charAt","startsWith","endIndex","indexOf","reg","RegExp","result","done","exec","arr","lastIndex","substring","stringToObj","html","current","level","end","isOpen","isComment","start","nextChar","comment","parent_1","parent_2","DiffFinder","t1Node","t2Node","t1","Element","t2","diffcount","foundAll","debug","t1Orig","t2Orig","tracker","init","findDiffs","diffcap","Error","findNextDiff","error","fdiffs","maxDepth","findOuterDiff","filterOuterDiff","findInnerDiff","findValueDiff","attr1","attr2","attrLength","pos","Math","abs","sort","t1ChildNodes","t2ChildNodes","last","max","childNodesLengthDifference","maxChildCount","cachedSubtrees","subtrees","attemptGroupRelocation","destinationDifferent","toGroup","group","similarNode","gapInformation","stable","gaps1","gaps2","endOld","endNew","j","getGapInformation","shortest","min","index2","index1","testI","DEFAULT_OPTIONS","currentValue","expectedValue","compress","components","DiffDOM","varNames","constNames_1","varName","applyDOM","undo","headingsToVirtualHeaderRowDOM","headings","columnSettings","columnsState","format","hiddenHeader","sortable","scrollY","noColumnWidths","unhideHeader","heading","column","searchable","headerClass","class","directionClass","dir","ascending","descending","filters","filterActive","widths","style","headerNodes","sorter","dataToVirtualDOM","tableAttributes","rows","rowCursor","header","footer","rowRender","tabIndex","renderHeader","footers","captions","table","row","tr","cells","cIndex","td","cellClass","render","renderedCell","cursor","renderedRow","headerRow","thead","unshift","tfoot","structuredClone","foot","caption","tabindex","r","u","a","o","f","h","d","$","y","M","weekdays","months","ordinal","m","z","utcOffset","floor","date","year","month","clone","ceil","w","D","ms","Q","g","S","_","O","args","b","locale","$L","utc","$u","x","$x","$offset","$d","Date","NaN","test","UTC","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","isSame","startOf","endOf","isAfter","isBefore","$g","set","unix","valueOf","getTime","toDate","$locale","weekStart","$set","daysInMonth","get","Number","round","subtract","invalidDate","meridiem","monthsShort","weekdaysMin","weekdaysShort","getTimezoneOffset","toJSON","toISOString","toUTCString","k","extend","$i","isDayjs","en","Ls","exports","LTS","LT","L","LL","LLL","LLLL","zone","offset","A","afternoon","milliseconds","SS","SSS","ss","mm","H","HH","hh","DD","Do","day","MM","MMM","MMMM","Y","YY","YYYY","Z","ZZ","formats","regex","parser","hours","customParseFormat","parseTwoDigitYear","minutes","seconds","dayjs","parseDate","content","readDataCell","constructor","find","cellData","order","parseFloat","readHeaderCell","readTableData","dataOption","defaultType","defaultFormat","tHead","querySelectorAll","th","innerText","readDOMHeaderCell","settings","dataset","getAttribute","firstRow","firstRowCells","_cell","tBodies","readDOMDataCell","isNaN","Rows","dt","setCursor","oldCursor","_renderTable","cursorSelector","cursorDOM","querySelector","scrollIntoView","block","emit","hasRows","update","remove","select","_row","findRowIndex","findIndex","findRow","cols","updateRow","Columns","_state","columnOptions","selector","numeric","caseFirst","sensitivity","ignorePunctuation","searchMethod","sortSequence","searchItemSeparator","readColumnSettings","size","_node","hide","show","visible","newColumnSelector","_heading","currentFilter","newFilterState","returnNext","_currentPage","currentDir","currentDirIndex","collator","Intl","Collator","usage","row1","row2","cell1","cell2","order1","order2","temp","compare","_searchQueries","multiSearch","_measureWidths","activeHeadings","fixedColumns","renderOptions","noPaging","headerDOM","parentElement","activeDOMHeadings","firstElementChild","domCounter","absoluteColumnWidths","width","offsetWidth","totalOffsetWidth","reduce","total","cellWidth","defaultConfig","destroyable","searchQuerySeparator","searchAnd","paging","perPage","perPageSelect","nextPrev","firstLast","prevText","nextText","firstText","lastText","ellipsisText","truncatePager","pagerDelta","fixedHeight","rowNavigation","pagerRender","tableRender","diffDomOptions","labels","placeholder","searchTitle","pageTitle","noRows","noResults","template","top","dropdown","search","container","bottom","pagination","active","disabled","ellipsis","empty","headercontainer","loading","paginationList","paginationListItem","paginationListItemLink","wrapper","page","label","state","createVirtualPagerDOM","onFirstPage","onLastPage","currentPage","totalPages","pagerListItems","prev","pages","paginationListItems","pagesLength","doublePagerDelta","previousPage","nextPage","paginationListItemsToModify","previousLi","modifiedLis","pageNumber","parseInt","previousPageNumber","newLi","truncate","next","DataTable","containerDOM","_dd","_events","hasHeadings","_initialHTML","initialized","_label","lastPage","_listeners","_pagerDOMs","_virtualPagerDOM","_rect","_searchData","_tableAttributes","_tableFooters","_tableCaptions","_virtualDOM","_virtualHeaderDOM","wrapperDOM","HTMLTableElement","outerHTML","onResize","_onResize","_render","selectorClassSelector","choice","lab","option","Option","containerSelector","paginationSelector","HTMLElement","infoSelector","getBoundingClientRect","_fixHeight","_bindEvents","newVirtualDOM","renderedTableVirtualDOM","_renderPage","lastRowCursor","setMessage","items","_renderPagers","newPagerVirtualDOM","renderedPagerVirtualDOM","pagerDOM","_renderSeparateHeader","tableVirtualDOM","newVirtualHeaderDOM","paddingRight","clientWidth","paddedVirtualHeaderDOM","scrollHeight","clientHeight","overflowY","HTMLSelectElement","addEventListener","event","inputSelector","target","HTMLInputElement","preventDefault","searches","andSearch","and","terms","querySeparator","term","hyperlink","closest","hasAttribute","children","lastRow","stopPropagation","foundRow","nextRow","destroy","oldDOM","oldTable","removeEventListener","measureWidths","_paginate","filterState","height","rawQueries","queries","query","queryWords","columnQueries","normalize","idx","searchRow","queryColumn","queryIndex","queryColumnWord","customSearchMethod","queryWord","searchItem","insert","rIndex","refresh","print","tableDOM","newTableVirtualDOM","open","body","message","colspan","on","callback","off","convertCSV","userOptions","lineDelimiter","columnDelimiter","removeDoubleQuotes","shift","values","convertJSON","json","warn","exportCSV","download","skipColumn","columnShown","headers","selectedRows","selection","href","encodeURI","filename","click","exportJSON","replacer","space","blob","Blob","url","URL","createObjectURL","revokeObjectURL","exportSQL","tableName","exportTXT","form","menu","save","cancel","close","inner","modal","editable","separator","closeX","editCell","editRow","removeRow","reallyRemove","reallyCancel","cancelModal","editor","confirm","inline","hiddenColumns","contextMenu","clickEvent","excludeColumns","menuItems","_event","Editor","menuOpen","editing","editingCell","editingRow","events","limits","menuDOM","modalDOM","originalRowRender","rect","dataTable","newTr","updateMenu","bindEvents","keydown","bind","context","dismissMenu","reset","pageX","pageY","left","openMenu","saveCell","closeModal","saveRow","cellIndex","closeMenu","rowIndex","editCellModal","openModal","focus","selectionStart","selectionEnd","oldData","stringValue","editRowModal","lastElementChild","inputs","updatedRow","valueCounter","oldItem","colIndex","newData","scrollX","pageXOffset","pageYOffset","innerWidth","innerHeight","valid","columnToVisibleIndex","dataCell","makeEditable","button","ColumnFilter","addedButtonDOM","buttonDOM","buttonSelector","searchSelector","searchWrapper","_measureSpace","_bind","dismiss","_click","_openMenu","_closeMenu","menuSelector","checkbox","addColumnFilter","columnFilter"],"mappings":"MAYaA,EAAYC,GAA0G,oBAAxCC,OAAOC,UAAUC,SAASC,KAAKJ,GAK7GK,EAAUC,IACnB,IAAIC,GAAI,EACR,IACIA,EAAIC,KAAKC,MAAMH,EAClB,CAAC,MAAOI,GACL,OAAO,CACV,CACD,QAAS,OAASH,IAAOI,MAAMC,QAAQL,KAAOR,EAASQ,KAAQA,CAAC,EAMvDM,EAAgB,CAACC,EAAkBC,KAC5C,MAAMC,EAAMC,SAASJ,cAAcC,GACnC,GAAIC,GAAS,iBAAmBA,EAC5B,IAAK,MAAMG,KAAQH,EACX,SAAWG,EACXF,EAAIG,UAAYJ,EAAMG,GAEtBF,EAAII,aAAaF,EAAMH,EAAMG,IAIzC,OAAOF,CAAG,EAGDK,EAAaC,GAClB,CAAC,QAAS,YAAYC,SAASD,EAAIR,UAC3BQ,EAAqBE,KAE7BF,EAAIG,WACGH,EAAIG,WAAWC,KAAKC,GAAwBN,EAAUM,KAAYC,KAAK,IAE3E,GAGEC,EAAcP,IACvB,GAAIA,QACA,MAAO,GACJ,GAAIA,EAAIQ,eAAe,SAAWR,EAAIQ,eAAe,QAAS,CACjE,MAAMC,EAAOT,EACb,OAAOS,EAAKC,MAAQH,EAAWE,EAAKP,KACvC,CAAM,OAAIF,EAAIQ,eAAe,YACnBT,EAAUC,GAEdW,OAAOX,EAAI,EAITY,EAAa,SAASF,GAC/B,OAAOA,EACFG,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,SACvB,EAGaC,EAAuB,SAASC,EAAsBC,GAC/D,IAAIC,EAAU,EACVC,EAAc,EAClB,KAAOD,EAAWF,EAAa,GAAI,CACRC,EAAQE,GACXC,SAChBF,GAAW,GAEfC,GAAe,CAClB,CACD,OAAOA,EAAY,CACvB,EAoBaE,EAAuB,SAAShB,GACzC,MAAMJ,EAAM,CAAA,EACZ,GAAII,EACA,IAAK,MAAMR,KAAQQ,EACfJ,EAAIJ,EAAKyB,MAAQzB,EAAK0B,MAG9B,OAAOtB,CACX,EAUauB,EAAwBC,GAC5BA,EAGEA,EAAWC,OAAOC,MAAM,KAAKtB,KAAIuB,GAAa,IAAIA,MAAarB,KAAK,IAFhE,KAWFsB,EAAgB,CAACC,EAAkBC,KAC5C,MAAMC,EAAkBD,GAASJ,MAAM,KAAKM,MAAKL,IAAcE,EAAQI,UAAUC,SAASP,KAC1F,OAAQI,CAAe,EAcdI,EAAiB,CAACC,EAAkCC,IACzDD,EACIC,EACO,GAAGD,KAASC,IAEhBD,EACAC,GAGJ,GAKEC,EAAW,SAASC,EAAkBC,EAAU,KACzD,IAAIC,EACJ,MAAO,IAAIC,KACPC,aAAaF,GACbA,EAAQG,OAAOC,YAAW,IAAMN,KAAQC,EAAQ,CAExD,EC7JA,IAAIM,EAAW,WAUX,OATAA,EAAWnE,OAAOoE,QAAU,SAAkB9D,GAG1C,IAFA,IAES+D,EAFLC,EAAcC,UAENC,EAAI,EAAGC,EAAIF,UAAUG,OAAQF,EAAIC,EAAGD,IAE5C,IAAK,IAAIG,KADTN,EAAIC,EAAYE,GACOxE,OAAOC,UAAU4B,eAAe1B,KAAKkE,EAAGM,KAAMrE,EAAEqE,GAAKN,EAAEM,IAElF,OAAOrE,CACf,EACW6D,EAASS,MAAMC,KAAMN,UAChC,EAEA,SAASO,EAAcC,EAAIC,EAAMC,GAC7B,GAAIA,GAA6B,IAArBV,UAAUG,OAAgB,IAAK,IAA4BQ,EAAxBV,EAAI,EAAGW,EAAIH,EAAKN,OAAYF,EAAIW,EAAGX,KAC1EU,GAAQV,KAAKQ,IACRE,IAAMA,EAAKxE,MAAMT,UAAUmF,MAAMjF,KAAK6E,EAAM,EAAGR,IACpDU,EAAGV,GAAKQ,EAAKR,IAGrB,OAAOO,EAAGM,OAAOH,GAAMxE,MAAMT,UAAUmF,MAAMjF,KAAK6E,GACtD,CAE2B,mBAApBM,iBAAiCA,gBAKxC,IAAIC,EAAsB,WACtB,SAASA,EAAKC,QACM,IAAZA,IAAsBA,EAAU,CAAE,GACtC,IAAIC,EAAQZ,KACZ7E,OAAO0F,QAAQF,GAASG,SAAQ,SAAUC,GACtC,IAAIC,EAAMD,EAAG,GAAIjD,EAAQiD,EAAG,GAC5B,OAAQH,EAAMI,GAAOlD,CACjC,GACK,CAQD,OAPA4C,EAAKtF,UAAUC,SAAW,WACtB,OAAOK,KAAKuF,UAAUjB,KAC9B,EACIU,EAAKtF,UAAU8F,SAAW,SAAUC,EAAMC,GAEtC,OADApB,KAAKmB,GAAQC,EACNpB,IACf,EACWU,CACX,IACA,SAASW,EAAiBhD,GAItB,IAHA,IAAIoB,EAAcC,UAEd4B,EAAmB,GACdC,EAAK,EAAGA,EAAK7B,UAAUG,OAAQ0B,IACpCD,EAAiBC,EAAK,GAAK9B,EAAY8B,GAE3C,OAAI,MAAOlD,GAGJiD,EAAiB9C,MAAK,SAAUgD,GACnC,IAAIT,EAAIU,EAGR,MACI,mBADyJ,QAA7IA,EAAwF,QAAlFV,EAAK1C,aAAyC,EAASA,EAAQqD,qBAAkC,IAAPX,OAAgB,EAASA,EAAGY,mBAAgC,IAAPF,OAAgB,EAASA,EAAGD,KAE7LnD,aACIA,EAAQqD,cAAcC,YAAYH,EAClD,GACA,CAEA,SAASI,EAAUC,EAASC,EAAWnB,GACnC,IAAIoB,EA+CJ,MA9CyB,UAArBF,EAAQ7F,SACR+F,EAAOpB,EAAQxE,SAAS6F,eAAeH,EAAQnF,MAErB,aAArBmF,EAAQ7F,SACb+F,EAAOpB,EAAQxE,SAAS8F,cAAcJ,EAAQnF,OAG1CoF,GACAC,EAAOpB,EAAQxE,SAAS+F,gBAAgB,6BAA8BL,EAAQ7F,UACrD,kBAArB6F,EAAQ7F,WACR8F,GAAY,IAGwB,QAAnCD,EAAQ7F,SAASmG,eACtBJ,EAAOpB,EAAQxE,SAAS+F,gBAAgB,6BAA8B,OACtEJ,GAAY,GAGZC,EAAOpB,EAAQxE,SAASJ,cAAc8F,EAAQ7F,UAE9C6F,EAAQO,YACRjH,OAAO0F,QAAQgB,EAAQO,YAAYtB,SAAQ,SAAUC,GACjD,IAAIC,EAAMD,EAAG,GAAIjD,EAAQiD,EAAG,GAC5B,OAAOgB,EAAKzF,aAAa0E,EAAKlD,EAC9C,IAEY+D,EAAQlF,YAERkF,EAAQlF,WAAWmE,SAAQ,SAAUjE,GACjC,OAAOkF,EAAKM,YAAYT,EAAU/E,EAAWiF,EAAWnB,GACxE,IAEYA,EAAQ2B,eACJT,EAAQ/D,OACRuD,EAAiBU,EAAM,oBAAqB,kBAAmB,mBAAoB,gBAAiB,mBAAoB,oBAAqB,sBAAuB,sBACpKA,EAAKjE,MAAQ+D,EAAQ/D,OAErB+D,EAAQU,SAAWlB,EAAiBU,EAAM,sBAC1CA,EAAKQ,QAAUV,EAAQU,SAEvBV,EAAQW,UACRnB,EAAiBU,EAAM,uBACvBA,EAAKS,SAAWX,EAAQW,YAI7BT,CACX,CAGA,IAAIU,EAAe,SAAUV,EAAMW,GAE/B,IADAA,EAAQA,EAAMnC,QACPmC,EAAM7C,OAAS,GAAG,CACrB,IAAI8C,EAAID,EAAME,OAAO,EAAG,GAAG,GAC3Bb,EAAOA,EAAKpF,WAAWgG,EAC1B,CACD,OAAOZ,CACX,EACA,SAASc,EAAUC,EAAMC,EAAMpC,GAC3B,IAEIoB,EAKAiB,EACAC,EARAC,EAASH,EAAKpC,EAAQwC,OAAOD,QAC7BR,EAAQK,EAAKpC,EAAQwC,OAAOT,OAE3B,CAAC/B,EAAQwC,OAAOC,WAAYzC,EAAQwC,OAAOE,gBAAgB5G,SAASyG,KAErEnB,EAAOU,EAAaK,EAAMJ,IAM9B,IAAIY,EAAO,CACPP,KAAMA,EACNhB,KAAMA,GAEV,GAAIpB,EAAQ4C,aAAaD,GACrB,OAAO,EAEX,OAAQJ,GACJ,KAAKvC,EAAQwC,OAAOK,aAChB,IAAKzB,IAASV,EAAiBU,EAAM,WACjC,OAAO,EAEXA,EAAKzF,aAAayG,EAAKpC,EAAQwC,OAAOtF,MAAOkF,EAAKpC,EAAQwC,OAAOrF,QACjE,MACJ,KAAK6C,EAAQwC,OAAOM,gBAChB,IAAK1B,IAASV,EAAiBU,EAAM,WACjC,OAAO,EAEXA,EAAKzF,aAAayG,EAAKpC,EAAQwC,OAAOtF,MAAOkF,EAAKpC,EAAQwC,OAAOO,WAC7DrC,EAAiBU,EAAM,qBACO,UAA9BgB,EAAKpC,EAAQwC,OAAOtF,QACpBkE,EAAKjE,MAAQiF,EAAKpC,EAAQwC,OAAOO,WAErC,MACJ,KAAK/C,EAAQwC,OAAOQ,gBAChB,IAAK5B,IAASV,EAAiBU,EAAM,WACjC,OAAO,EAEXA,EAAK4B,gBAAgBZ,EAAKpC,EAAQwC,OAAOtF,OACzC,MACJ,KAAK8C,EAAQwC,OAAOS,kBAChB,IAAK7B,IAASV,EAAiBU,EAAM,QACjC,OAAO,EAEXpB,EAAQkD,SAAS9B,EAAMA,EAAKrF,KAAMqG,EAAKpC,EAAQwC,OAAOW,UAAWf,EAAKpC,EAAQwC,OAAOO,WACjFrC,EAAiBU,EAAKgC,WAAY,yBAClChC,EAAKgC,WAAWjG,MAAQiF,EAAKpC,EAAQwC,OAAOO,WAEhD,MACJ,KAAK/C,EAAQwC,OAAOa,YAChB,IAAKjC,QAA8B,IAAfA,EAAKjE,MACrB,OAAO,EAEXiE,EAAKjE,MAAQiF,EAAKpC,EAAQwC,OAAOO,UACjC,MACJ,KAAK/C,EAAQwC,OAAOc,cAChB,IAAKlC,IAASV,EAAiBU,EAAM,WACjC,OAAO,EAEXpB,EAAQkD,SAAS9B,EAAMA,EAAKrF,KAAMqG,EAAKpC,EAAQwC,OAAOW,UAAWf,EAAKpC,EAAQwC,OAAOO,WACrF,MACJ,KAAK/C,EAAQwC,OAAOe,cAChB,IAAKnC,QAAgC,IAAjBA,EAAKQ,QACrB,OAAO,EAEXR,EAAKQ,QAAUQ,EAAKpC,EAAQwC,OAAOO,UACnC,MACJ,KAAK/C,EAAQwC,OAAOgB,eAChB,IAAKpC,QAAiC,IAAlBA,EAAKS,SACrB,OAAO,EAEXT,EAAKS,SAAWO,EAAKpC,EAAQwC,OAAOO,UACpC,MACJ,KAAK/C,EAAQwC,OAAOiB,eAChB,IAAItC,EAAqE,QAAzDiB,EAAKpC,EAAQwC,OAAOO,UAAU1H,SAASmG,eAClB,+BAAjCJ,EAAKgC,WAAWM,aACpBtC,EAAKgC,WAAWO,aAAa1C,EAAUmB,EAAKpC,EAAQwC,OAAOO,UAAW5B,EAAWnB,GAAUoB,GAC3F,MAEJ,KAAKpB,EAAQwC,OAAOoB,cACJtE,EAAc,GAAI,IAAIpE,MAAMkH,EAAKpC,EAAQwC,OAAOqB,eAAe,GAAM5H,KAAI,WACjF,OAAOmF,EAAK0C,YAAY1C,EAAKpF,WAAWoG,EAAKpC,EAAQwC,OAAOhD,OAC5E,IACsBW,SAAQ,SAAUjE,EAAW6H,GACrB,IAAVA,IACAzB,EACIlB,EAAKpF,WAAWoG,EAAKpC,EAAQwC,OAAOjD,MAE5C6B,EAAK4C,aAAa9H,EAAWoG,GAAa,KAC1D,IACY,MACJ,KAAKtC,EAAQwC,OAAOyB,cAChB7C,EAAKgC,WAAWU,YAAY1C,GAC5B,MACJ,KAAKpB,EAAQwC,OAAOC,WAChB,IACIT,GADAkC,EAAcnC,EAAMnC,SACJqC,OAAOiC,EAAYhF,OAAS,EAAG,GAAG,GAEtD,IAAKwB,EADLU,EAAOU,EAAaK,EAAM+B,GACE,WACxB,OAAO,EAEX9C,EAAK4C,aAAa/C,EAAUmB,EAAKpC,EAAQwC,OAAO9E,SAAgC,+BAAtB0D,EAAKsC,aAA+C1D,GAAUoB,EAAKpF,WAAWgG,IAAM,MAC9I,MAEJ,KAAKhC,EAAQwC,OAAO2B,kBAChB,IAAK/C,GAA0B,IAAlBA,EAAKgD,SACd,OAAO,EAEX,IAAIhB,EAAahC,EAAKgC,WACtBA,EAAWU,YAAY1C,GACnBV,EAAiB0C,EAAY,yBAC7BA,EAAWjG,MAAQ,IAEvB,MAEJ,KAAK6C,EAAQwC,OAAOE,eAChB,IAAIwB,EACAlC,GADAkC,EAAcnC,EAAMnC,SACJqC,OAAOiC,EAAYhF,OAAS,EAAG,GAAG,GAGtD,GAFAmD,EAAUrC,EAAQxE,SAAS6F,eAAee,EAAKpC,EAAQwC,OAAOrF,UAC9DiE,EAAOU,EAAaK,EAAM+B,IAChBlI,WACN,OAAO,EAEXoF,EAAK4C,aAAa3B,EAASjB,EAAKpF,WAAWgG,IAAM,MAC7CtB,EAAiBU,EAAKgC,WAAY,yBAClChC,EAAKgC,WAAWjG,MAAQiF,EAAKpC,EAAQwC,OAAOrF,QAEhD,MAEJ,QACIkH,QAAQC,IAAI,kBASpB,OALAtE,EAAQuE,cAAc,CAClBnC,KAAMO,EAAKP,KACXhB,KAAMuB,EAAKvB,KACXiB,QAASA,KAEN,CACX,CAQA,SAASmC,EAAK3I,EAAK4I,EAAIC,GACnB,IAAIC,EAAM9I,EAAI4I,GACd5I,EAAI4I,GAAM5I,EAAI6I,GACd7I,EAAI6I,GAAMC,CACd,CA+DA,SAASC,EAAQzC,EAAM0C,EAAO7E,IAC1B6E,EAAQA,EAAMjF,SACRkF,UACND,EAAM1E,SAAQ,SAAUiC,IAjE5B,SAAkBD,EAAMC,EAAMpC,GAC1B,OAAQoC,EAAKpC,EAAQwC,OAAOD,SACxB,KAAKvC,EAAQwC,OAAOK,aAChBT,EAAKpC,EAAQwC,OAAOD,QAAUvC,EAAQwC,OAAOQ,gBAC7Cd,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOM,gBAChB0B,EAAKpC,EAAMpC,EAAQwC,OAAOW,SAAUnD,EAAQwC,OAAOO,UACnDb,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOQ,gBAChBZ,EAAKpC,EAAQwC,OAAOD,QAAUvC,EAAQwC,OAAOK,aAC7CX,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOS,kBAIpB,KAAKjD,EAAQwC,OAAOa,YAIpB,KAAKrD,EAAQwC,OAAOc,cAIpB,KAAKtD,EAAQwC,OAAOe,cAIpB,KAAKvD,EAAQwC,OAAOgB,eAIpB,KAAKxD,EAAQwC,OAAOiB,eAChBe,EAAKpC,EAAMpC,EAAQwC,OAAOW,SAAUnD,EAAQwC,OAAOO,UACnDb,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOoB,cAChBY,EAAKpC,EAAMpC,EAAQwC,OAAOhD,KAAMQ,EAAQwC,OAAOjD,IAC/C2C,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOyB,cAChB7B,EAAKpC,EAAQwC,OAAOD,QAAUvC,EAAQwC,OAAOC,WAC7CP,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOC,WAChBL,EAAKpC,EAAQwC,OAAOD,QAAUvC,EAAQwC,OAAOyB,cAC7C/B,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAO2B,kBAChB/B,EAAKpC,EAAQwC,OAAOD,QAAUvC,EAAQwC,OAAOE,eAC7CR,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,KAAKA,EAAQwC,OAAOE,eAChBN,EAAKpC,EAAQwC,OAAOD,QAAUvC,EAAQwC,OAAO2B,kBAC7CjC,EAAUC,EAAMC,EAAMpC,GACtB,MACJ,QACIqE,QAAQC,IAAI,kBAExB,CAKQS,CAAS5C,EAAMC,EAAMpC,EAC7B,GACA,CAEA,IAAIgF,EAAqB,SAAUC,GAC/B,IAAIC,EAAS,GAab,OAZAA,EAAOC,KAAKF,EAAG5J,UACK,UAAhB4J,EAAG5J,UAAwC,aAAhB4J,EAAG5J,UAE1B4J,EAAGxD,aACCwD,EAAGxD,WAAkB,OACrByD,EAAOC,KAAK,GAAGtF,OAAOoF,EAAG5J,SAAU,KAAKwE,OAAOoF,EAAGxD,WAAkB,MAAE/E,QAAQ,KAAM,OAEpFuI,EAAGxD,WAAW2D,IACdF,EAAOC,KAAK,GAAGtF,OAAOoF,EAAG5J,SAAU,KAAKwE,OAAOoF,EAAGxD,WAAW2D,MAIlEF,CACX,EACIG,EAAwB,SAAUC,GAClC,IAAIC,EAAoB,CAAA,EACpBC,EAAuB,CAAA,EAc3B,OAbAF,EAAGnF,SAAQ,SAAUiB,GACjB4D,EAAmB5D,GAAMjB,SAAQ,SAAUsF,GACvC,IAAIC,EAAWD,KAAcF,EAExBG,GADSD,KAAcD,EAInBE,WACEH,EAAkBE,GACzBD,EAAqBC,IAAc,GAJnCF,EAAkBE,IAAc,CAMhD,GACA,IACWF,CACX,EACII,EAAe,SAAUC,EAAIC,GAC7B,IAAIC,EAAWT,EAAsBO,GACjCG,EAAWV,EAAsBQ,GACjCG,EAAS,CAAA,EAMb,OALAxL,OAAOyL,KAAKH,GAAU3F,SAAQ,SAAUE,GAChC0F,EAAS1F,KACT2F,EAAO3F,IAAO,EAE1B,IACW2F,CACX,EACIE,EAAa,SAAU/D,GAIvB,cAHOA,EAAKgE,iBACLhE,EAAKiE,iBACLjE,EAAKkE,WACRlE,EAAKnG,YACEmG,EAAKnG,WAAWsK,MAAMJ,EAKrC,EACIK,EAAY,SAAUC,GACtB,GAAIhM,OAAOC,UAAU4B,eAAe1B,KAAK6L,EAAU,QAK/C,MAJe,CACXnL,SAAgC,UAAtBmL,EAASnL,SAAuB,QAAU,WACpDU,KAAMyK,EAASzK,MAKnB,IAAI0K,EAAc,CACdpL,SAAUmL,EAASnL,UAoBvB,OAjBIb,OAAOC,UAAU4B,eAAe1B,KAAK6L,EAAU,gBAC/CC,EAAYhF,WAAa9C,EAAS,CAAE,EAAE6H,EAAS/E,aAE/CjH,OAAOC,UAAU4B,eAAe1B,KAAK6L,EAAU,aAC/CC,EAAY7E,QAAU4E,EAAS5E,SAE/BpH,OAAOC,UAAU4B,eAAe1B,KAAK6L,EAAU,WAC/CC,EAAYtJ,MAAQqJ,EAASrJ,OAE7B3C,OAAOC,UAAU4B,eAAe1B,KAAK6L,EAAU,cAC/CC,EAAY5E,SAAW2E,EAAS3E,UAEhCrH,OAAOC,UAAU4B,eAAe1B,KAAK6L,EAAU,gBAC/CC,EAAYzK,WAAawK,EAASxK,WAAWC,KAAI,SAAUyK,GACvD,OAAOH,EAAUG,EACjC,KAEeD,CAEf,EACIE,EAAU,SAAUC,EAAIC,GACxB,IAAK,CAAC,WAAY,QAAS,UAAW,WAAY,QAAQP,OAAM,SAAU5I,GACtE,OAAIkJ,EAAGlJ,KAAamJ,EAAGnJ,EAI/B,IACQ,OAAO,EAEX,GAAIlD,OAAOC,UAAU4B,eAAe1B,KAAKiM,EAAI,QAEzC,OAAO,EAIX,GAAIE,QAAQF,EAAGnF,cAAgBqF,QAAQD,EAAGpF,YACtC,OAAO,EAEX,GAAIqF,QAAQF,EAAG5K,cAAgB8K,QAAQD,EAAG7K,YACtC,OAAO,EAEX,GAAI4K,EAAGnF,WAAY,CACf,IAAIsF,EAAevM,OAAOyL,KAAKW,EAAGnF,YAC9BuF,EAAexM,OAAOyL,KAAKY,EAAGpF,YAClC,GAAIsF,EAAa7H,SAAW8H,EAAa9H,OACrC,OAAO,EAEX,IAAK6H,EAAaT,OAAM,SAAUW,GAC9B,OAAIL,EAAGnF,WAAWwF,KACdJ,EAAGpF,WAAWwF,EAI9B,IACY,OAAO,CAEd,CACD,GAAIL,EAAG5K,WAAY,CACf,GAAI4K,EAAG5K,WAAWkD,SAAW2H,EAAG7K,WAAWkD,OACvC,OAAO,EAEX,IAAK0H,EAAG5K,WAAWsK,OAAM,SAAUpK,EAAW6H,GAC1C,OAAO4C,EAAQzK,EAAW2K,EAAG7K,WAAW+H,GACpD,IACY,OAAO,CAEd,CACD,OAAO,CACX,EACImD,EAAe,SAAUN,EAAIC,EAAItB,EAAmB4B,EAAcC,GAElE,QADyB,IAArBA,IAA+BA,GAAmB,IACjDR,IAAOC,EACR,OAAO,EAEX,GAAID,EAAGvL,WAAawL,EAAGxL,SACnB,OAAO,EAEX,GAAI,CAAC,QAAS,YAAYS,SAAS8K,EAAGvL,UAIlC,QAAO+L,GAEDR,EAAG7K,OAAS8K,EAAG9K,KAIzB,GAAI6K,EAAGvL,YAAYkK,EACf,OAAO,EAEX,GAAIqB,EAAGnF,YAAcoF,EAAGpF,WAAY,CAChC,GAAImF,EAAGnF,WAAW2D,GAAI,CAClB,GAAIwB,EAAGnF,WAAW2D,KAAOyB,EAAGpF,WAAW2D,GACnC,OAAO,EAIP,GADmB,GAAGvF,OAAO+G,EAAGvL,SAAU,KAAKwE,OAAO+G,EAAGnF,WAAW2D,MAChDG,EAChB,OAAO,CAGlB,CACD,GAAIqB,EAAGnF,WAAkB,OACrBmF,EAAGnF,WAAkB,QAAMoF,EAAGpF,WAAkB,MAEhD,GADsB,GAAG5B,OAAO+G,EAAGvL,SAAU,KAAKwE,OAAO+G,EAAGnF,WAAkB,MAAE/E,QAAQ,KAAM,QACvE6I,EACnB,OAAO,CAGlB,CACD,GAAI4B,EACA,OAAO,EAEX,IAAIE,EAAYT,EAAG5K,WAAa4K,EAAG5K,WAAW4D,QAAQkF,UAAY,GAC9DwC,EAAYT,EAAG7K,WAAa6K,EAAG7K,WAAW4D,QAAQkF,UAAY,GAClE,GAAIuC,EAAUnI,SAAWoI,EAAUpI,OAC/B,OAAO,EAEX,GAAIkI,EACA,OAAOC,EAAUf,OAAM,SAAU5I,EAASqG,GACtC,OAAOrG,EAAQrC,WAAaiM,EAAUvD,GAAO1I,QACzD,IAKQ,IAAIkM,EAA2B5B,EAAa0B,EAAWC,GACvD,OAAOD,EAAUf,OAAM,SAAU5I,EAASqG,GACtC,OAAOmD,EAAaxJ,EAAS4J,EAAUvD,GAAQwD,GAA0B,GAAM,EAC3F,GAEA,EAiEIC,EAAmB,SAAUvI,EAAGwI,GAChC,OAAOnI,EAAc,GAAI,IAAIpE,MAAM+D,IAAI,GAAMhD,KAAI,WAAc,OAAOwL,CAAI,GAC9E,EAqDIC,EAAe,SAAUC,EAASC,GAwBlC,IAtBA,IAAIC,EAAcF,EAAQ3L,WAAa2L,EAAQ3L,WAAa,GACxD8L,EAAcF,EAAQ5L,WAAa4L,EAAQ5L,WAAa,GACxD+L,EAAUP,EAAiBK,EAAY3I,QAAQ,GAC/C8I,EAAUR,EAAiBM,EAAY5I,QAAQ,GAC/C+I,EAAU,GACVC,EAAc,WACd,OAAOnJ,UAAU,EACzB,EACQoJ,GAAkB,EAClBC,EAAU,WACV,IAAIC,EAhIY,SAAUC,EAAIC,EAAIR,EAASC,GAC/C,IAAIQ,EAAU,EACVzE,EAAQ,GACR0E,EAAWH,EAAGpJ,OACdwJ,EAAWH,EAAGrJ,OAElByJ,EAAUrJ,EAAc,GAAI,IAAIpE,MAAMuN,EAAW,IAAI,GAAMxM,KAAI,WAAc,MAAO,EAAK,IACrFsJ,EAAoBI,EAAa2C,EAAIC,GAIzCK,EAAcH,IAAaC,EACvBE,GACAN,EAAGzK,MAAK,SAAUH,EAASsB,GACvB,IAAI6J,EAAS7D,EAAmBtH,GAC5BoL,EAAS9D,EAAmBuD,EAAGvJ,IACnC,OAAI6J,EAAO3J,SAAW4J,EAAO5J,QACzB0J,GAAc,GACP,IAEXC,EAAOhL,MAAK,SAAUkL,EAAa/J,GAC/B,GAAI+J,IAAgBD,EAAO9J,GAEvB,OADA4J,GAAc,GACP,CAE3B,KACiBA,QAAL,EAGZ,IAGI,IAAK,IAAII,EAAU,EAAGA,EAAUP,EAAUO,IAEtC,IADA,IAAIC,EAAYX,EAAGU,GACVE,EAAU,EAAGA,EAAUR,EAAUQ,IAAW,CACjD,IAAIC,EAAYZ,EAAGW,GACdnB,EAAQiB,IACRhB,EAAQkB,KACThC,EAAa+B,EAAWE,EAAW5D,EAAmBqD,GAUtDD,EAAQK,EAAU,GAAGE,EAAU,GAAK,GATpCP,EAAQK,EAAU,GAAGE,EAAU,GAAKP,EAAQK,GAASE,GAC/CP,EAAQK,GAASE,GAAW,EAC5B,EACFP,EAAQK,EAAU,GAAGE,EAAU,IAAMV,IACrCA,EAAUG,EAAQK,EAAU,GAAGE,EAAU,GACzCnF,EAAQ,CAACiF,EAAU,EAAGE,EAAU,IAM3C,CAEL,OAAgB,IAAZV,GAGG,CACHrF,SAAUY,EAAM,GAAKyE,EACrBzF,SAAUgB,EAAM,GAAKyE,EACrBtJ,OAAQsJ,EAEhB,CAoEqBY,CAAkBvB,EAAaC,EAAaC,EAASC,GAC9DK,GACAJ,EAAQ9C,KAAKkD,GACK/I,EAAc,GAAI,IAAIpE,MAAMmN,EAAOnJ,SAAS,GAAMjD,IAAIiM,GAC5D/H,SAAQ,SAAUkJ,GAC1B,OArBD,SAAUtB,EAASC,EAASK,EAAQrJ,GAC/C+I,EAAQM,EAAOlF,SAAWnE,IAAK,EAC/BgJ,EAAQK,EAAOtF,SAAW/D,IAAK,CACnC,CAkBuBsK,CAASvB,EAASC,EAASK,EAAQgB,EAC1D,KAGYlB,GAAkB,CAE9B,GACYA,GACJC,IAIJ,OAFAT,EAAQM,QAAUA,EAClBN,EAAQ4B,WAAa,IACdtB,CACX,EACIuB,EAA6B,WAC7B,SAASA,IACLnK,KAAKoK,KAAO,EACf,CAQD,OAPAD,EAAY/O,UAAUiP,IAAM,SAAU7E,GAClC,IAAIzE,GACHA,EAAKf,KAAKoK,MAAMtE,KAAK/F,MAAMgB,EAAIyE,EACxC,EACI2E,EAAY/O,UAAU0F,QAAU,SAAUwJ,GACtCtK,KAAKoK,KAAKtJ,SAAQ,SAAUmF,GAAM,OAAOqE,EAAGrE,EAAI,GACxD,EACWkE,CACX,IAGA,SAASI,EAAoBzH,EAAMJ,GAC/B,IACIqB,EACAyG,EAFAzI,EAAOe,EAIX,IADAJ,EAAQA,EAAMnC,QACPmC,EAAM7C,OAAS,GAClB2K,EAAY9H,EAAME,OAAO,EAAG,GAAG,GAC/BmB,EAAahC,EACbA,EAAOA,EAAKpF,WAAaoF,EAAKpF,WAAW6N,QAAaC,EAE1D,MAAO,CACH1I,KAAMA,EACNgC,WAAYA,EACZyG,UAAWA,EAEnB,CAoRA,SAASE,EAAa5H,EAAM0C,EAAO7E,GAI/B,OAHA6E,EAAM1E,SAAQ,SAAUiC,IApR5B,SAA0BD,EAAMC,EAAMpC,GAClC,IAAII,EACAgB,EAAMgC,EAAYyG,EACtB,IAAK,CAAC7J,EAAQwC,OAAOC,WAAYzC,EAAQwC,OAAOE,gBAAgB5G,SAASsG,EAAKpC,EAAQwC,OAAOD,SAAU,CAEnG,IAAIyH,EAAYJ,EAAoBzH,EAAMC,EAAKpC,EAAQwC,OAAOT,QAC9DX,EAAO4I,EAAU5I,KACjBgC,EAAa4G,EAAU5G,WACvByG,EAAYG,EAAUH,SACzB,CACD,IASIxH,EAEAN,EAXAkI,EAAa,GAEbtH,EAAO,CACPP,KAAMA,EACNhB,KAAMA,GAEV,GAAIpB,EAAQkK,oBAAoBvH,GAC5B,OAAO,EAKX,OAAQP,EAAKpC,EAAQwC,OAAOD,SACxB,KAAKvC,EAAQwC,OAAOK,aACXzB,EAAKK,aACNL,EAAKK,WAAa,IAEtBL,EAAKK,WAAWW,EAAKpC,EAAQwC,OAAOtF,OAChCkF,EAAKpC,EAAQwC,OAAOrF,OACU,YAA9BiF,EAAKpC,EAAQwC,OAAOtF,MACpBkE,EAAKQ,SAAU,EAEoB,aAA9BQ,EAAKpC,EAAQwC,OAAOtF,MACzBkE,EAAKS,UAAW,EAEO,UAAlBT,EAAK/F,UACoB,UAA9B+G,EAAKpC,EAAQwC,OAAOtF,QACpBkE,EAAKjE,MAAQiF,EAAKpC,EAAQwC,OAAOrF,QAErC,MACJ,KAAK6C,EAAQwC,OAAOM,gBAChB1B,EAAKK,WAAWW,EAAKpC,EAAQwC,OAAOtF,OAChCkF,EAAKpC,EAAQwC,OAAOO,UACxB,MACJ,KAAK/C,EAAQwC,OAAOQ,uBACT5B,EAAKK,WAAWW,EAAKpC,EAAQwC,OAAOtF,OACC,IAAxC1C,OAAOyL,KAAK7E,EAAKK,YAAYvC,eACtBkC,EAAKK,WAEkB,YAA9BW,EAAKpC,EAAQwC,OAAOtF,MACpBkE,EAAKQ,SAAU,EAEoB,aAA9BQ,EAAKpC,EAAQwC,OAAOtF,aAClBkE,EAAKS,SAEW,UAAlBT,EAAK/F,UACoB,UAA9B+G,EAAKpC,EAAQwC,OAAOtF,cACbkE,EAAKjE,MAEhB,MACJ,KAAK6C,EAAQwC,OAAOS,kBAChB7B,EAAKrF,KAAOqG,EAAKpC,EAAQwC,OAAOO,UACJ,aAAxBK,EAAW/H,WACX+H,EAAWjG,MAAQiF,EAAKpC,EAAQwC,OAAOO,WAE3C,MACJ,KAAK/C,EAAQwC,OAAOa,YAChBjC,EAAKjE,MAAQiF,EAAKpC,EAAQwC,OAAOO,UACjC,MACJ,KAAK/C,EAAQwC,OAAOc,cAChBlC,EAAKrF,KAAOqG,EAAKpC,EAAQwC,OAAOO,UAChC,MACJ,KAAK/C,EAAQwC,OAAOe,cAChBnC,EAAKQ,QAAUQ,EAAKpC,EAAQwC,OAAOO,UACnC,MACJ,KAAK/C,EAAQwC,OAAOgB,eAChBpC,EAAKS,SAAWO,EAAKpC,EAAQwC,OAAOO,UACpC,MACJ,KAAK/C,EAAQwC,OAAOiB,eAChBpB,EAAUkE,EAAUnE,EAAKpC,EAAQwC,OAAOO,WACxCK,EAAWpH,WAAW6N,GAAaxH,EACnC,MACJ,KAAKrC,EAAQwC,OAAOoB,cACJxC,EAAKpF,WACZiG,OAAOG,EAAKpC,EAAQwC,OAAOhD,MAAO4C,EAAKpC,EAAQwC,OAAOqB,cACtDiB,UACK3E,SAAQ,SAAUgK,GACxB,OAAO/I,EAAKpF,WAAWiG,OAAOG,EAAKpC,EAAQwC,OAAOjD,IAAK,EAAG4K,EAC1E,IACgB/I,EAAK6G,SACL7G,EAAK6G,QAAQ9H,SAAQ,SAAUlE,GAC3B,GAAImG,EAAKpC,EAAQwC,OAAOhD,MAAQ4C,EAAKpC,EAAQwC,OAAOjD,KAChDtD,EAAIkH,UAAYf,EAAKpC,EAAQwC,OAAOjD,KACpCtD,EAAIkH,SAAWf,EAAKpC,EAAQwC,OAAOhD,MACnCvD,EAAIkH,UAAYf,EAAKpC,EAAQwC,OAAOqB,cAChCuG,EAAcnO,EAAIkH,SAAWlH,EAAIiD,OAASkD,EAAKpC,EAAQwC,OAAOjD,KAChD,IAEd0K,EAAW9E,KAAK,CACZhC,SAAUf,EAAKpC,EAAQwC,OAAOjD,IAC1B6C,EAAKpC,EAAQwC,OAAOqB,aACxBd,SAAU9G,EAAI8G,SAAW9G,EAAIiD,OAASkL,EACtClL,OAAQkL,IAEZnO,EAAIiD,QAAUkL,QAGjB,GAAIhI,EAAKpC,EAAQwC,OAAOhD,MAAQ4C,EAAKpC,EAAQwC,OAAOjD,KACrDtD,EAAIkH,SAAWf,EAAKpC,EAAQwC,OAAOjD,KACnCtD,EAAIkH,SAAWf,EAAKpC,EAAQwC,OAAOhD,MAAO,CAE1C,IAAI4K,EADJnO,EAAIkH,UAAYf,EAAKpC,EAAQwC,OAAOqB,cAChCuG,EAAcnO,EAAIkH,SAAWlH,EAAIiD,OAASkD,EAAKpC,EAAQwC,OAAOjD,KAChD,IAEd0K,EAAW9E,KAAK,CACZhC,SAAUf,EAAKpC,EAAQwC,OAAOjD,IAC1B6C,EAAKpC,EAAQwC,OAAOqB,aACxBd,SAAU9G,EAAI8G,SAAW9G,EAAIiD,OAASkL,EACtClL,OAAQkL,IAEZnO,EAAIiD,QAAUkL,EAErB,MACQnO,EAAIkH,WAAaf,EAAKpC,EAAQwC,OAAOhD,QAC1CvD,EAAIkH,SAAWf,EAAKpC,EAAQwC,OAAOjD,IAE3D,IAEY,MACJ,KAAKS,EAAQwC,OAAOyB,cAChBb,EAAWpH,WAAWiG,OAAO4H,EAAW,GACpCzG,EAAW6E,SACX7E,EAAW6E,QAAQ9H,SAAQ,SAAUlE,GAC7BA,EAAIkH,SAAW0G,EACf5N,EAAIkH,UAAY,EAEXlH,EAAIkH,WAAa0G,EACtB5N,EAAY,QAAI,EAEXA,EAAIkH,SAAW0G,GACpB5N,EAAIkH,SAAWlH,EAAIiD,OAAS2K,IACxB5N,EAAIkH,SAAWlH,EAAIiD,OAAS,IAAM2K,EAClC5N,EAAIiD,UAGJ+K,EAAW9E,KAAK,CACZpC,SAAU9G,EAAI8G,SAAW8G,EAAY5N,EAAIkH,SACzCA,SAAU0G,EACV3K,OAAQjD,EAAIiD,OAAS2K,EAAY5N,EAAIkH,SAAW,IAEpDlH,EAAIiD,OAAS2K,EAAY5N,EAAIkH,UAGzD,IAEY/B,EAAOgC,EACP,MACJ,KAAKpD,EAAQwC,OAAOC,WAEhB,IAAI4H,GADJtI,EAAQK,EAAKpC,EAAQwC,OAAOT,OAAOnC,SACnBqC,OAAOF,EAAM7C,OAAS,EAAG,GAAG,GAC5CkC,EAAmD,QAA3ChB,EAAKwJ,EAAoBzH,EAAMJ,UAA2B,IAAP3B,OAAgB,EAASA,EAAGgB,KACvFiB,EAAUkE,EAAUnE,EAAKpC,EAAQwC,OAAO9E,UACnC0D,EAAKpF,aACNoF,EAAKpF,WAAa,IAElBqO,GAAOjJ,EAAKpF,WAAWkD,OACvBkC,EAAKpF,WAAWmJ,KAAK9C,GAGrBjB,EAAKpF,WAAWiG,OAAOoI,EAAK,EAAGhI,GAE/BjB,EAAK6G,SACL7G,EAAK6G,QAAQ9H,SAAQ,SAAUlE,GAC3B,GAAIA,EAAIkH,UAAYkH,EAChBpO,EAAIkH,UAAY,OAEf,GAAIlH,EAAIkH,SAAWkH,GACpBpO,EAAIkH,SAAWlH,EAAIiD,OAASmL,EAAK,CACjC,IAAID,EAAcnO,EAAIkH,SAAWlH,EAAIiD,OAASmL,EAC9CJ,EAAW9E,KAAK,CACZpC,SAAU9G,EAAI8G,SAAW9G,EAAIiD,OAASkL,EACtCjH,SAAUkH,EAAM,EAChBnL,OAAQkL,IAEZnO,EAAIiD,QAAUkL,CACjB,CACrB,IAEY,MAEJ,KAAKpK,EAAQwC,OAAO2B,kBAChBf,EAAWpH,WAAWiG,OAAO4H,EAAW,GACZ,aAAxBzG,EAAW/H,iBACJ+H,EAAWjG,MAElBiG,EAAW6E,SACX7E,EAAW6E,QAAQ9H,SAAQ,SAAUlE,GAC7BA,EAAIkH,SAAW0G,EACf5N,EAAIkH,UAAY,EAEXlH,EAAIkH,WAAa0G,EACtB5N,EAAY,QAAI,EAEXA,EAAIkH,SAAW0G,GACpB5N,EAAIkH,SAAWlH,EAAIiD,OAAS2K,IACxB5N,EAAIkH,SAAWlH,EAAIiD,OAAS,IAAM2K,EAClC5N,EAAIiD,UAGJ+K,EAAW9E,KAAK,CACZpC,SAAU9G,EAAI8G,SAAW8G,EAAY5N,EAAIkH,SACzCA,SAAU0G,EACV3K,OAAQjD,EAAIiD,OAAS2K,EAAY5N,EAAIkH,SAAW,IAEpDlH,EAAIiD,OAAS2K,EAAY5N,EAAIkH,UAGzD,IAEY/B,EAAOgC,EACP,MACJ,KAAKpD,EAAQwC,OAAOE,eAEhB,IAAI4H,GADJvI,EAAQK,EAAKpC,EAAQwC,OAAOT,OAAOnC,SACnBqC,OAAOF,EAAM7C,OAAS,EAAG,GAAG,GAC5CmD,EAAU,CACNhH,SAAU,QACVU,KAAMqG,EAAKpC,EAAQwC,OAAOrF,SAE9BiE,EAAOwI,EAAoBzH,EAAMJ,GAAOX,MAC9BpF,aACNoF,EAAKpF,WAAa,IAElBsO,GAAOlJ,EAAKpF,WAAWkD,OACvBkC,EAAKpF,WAAWmJ,KAAK9C,GAGrBjB,EAAKpF,WAAWiG,OAAOqI,EAAK,EAAGjI,GAEb,aAAlBjB,EAAK/F,WACL+F,EAAKjE,MAAQiF,EAAKpC,EAAQwC,OAAOO,WAEjC3B,EAAK6G,SACL7G,EAAK6G,QAAQ9H,SAAQ,SAAUlE,GAI3B,GAHIA,EAAIkH,UAAYmH,IAChBrO,EAAIkH,UAAY,GAEhBlH,EAAIkH,SAAWmH,GAAOrO,EAAIkH,SAAWlH,EAAIiD,OAASoL,EAAK,CACvD,IAAIF,EAAcnO,EAAIkH,SAAWlH,EAAIiD,OAASoL,EAC9CL,EAAW9E,KAAK,CACZpC,SAAU9G,EAAI8G,SAAW9G,EAAIiD,OAASkL,EACtCjH,SAAUmH,EAAM,EAChBpL,OAAQkL,IAEZnO,EAAIiD,QAAUkL,CACjB,CACrB,IAEY,MAEJ,QACI/F,QAAQC,IAAI,kBAEhBlD,EAAK6G,UACL7G,EAAK6G,QAAU7G,EAAK6G,QAAQsC,QAAO,SAAUtO,GAAO,OAAQA,EAAY,QAAKA,EAAIkH,WAAalH,EAAI8G,QAAS,IACvGkH,EAAW/K,SACXkC,EAAK6G,QAAU7G,EAAK6G,QAAQpI,OAAOoK,KAG3CjK,EAAQwK,qBAAqB,CACzBpJ,KAAMuB,EAAKvB,KACXgB,KAAMO,EAAKP,KACXC,QAASA,GAGjB,CAGQoI,CAAiBtI,EAAMC,EAAMpC,EACrC,KACW,CACX,CAEA,SAAS0K,EAAUC,EAAO3K,QACN,IAAZA,IAAsBA,EAAU,CAAE2B,cAAc,IACpD,IAAIT,EAAU,CACV7F,SAAUsP,EAAMtP,UAEpB,GAAIqF,EAAiBiK,EAAO,OAAQ,WAChCzJ,EAAQnF,KAAO4O,EAAM5O,SAEpB,CACD,GAAI4O,EAAMlJ,YAAckJ,EAAMlJ,WAAWvC,OAAS,EAC9CgC,EAAQO,WAAa,GACLvG,MAAMT,UAAUmF,MAAMjF,KAAKgQ,EAAMlJ,YACvCtB,SAAQ,SAAU8G,GACxB,OAAQ/F,EAAQO,WAAWwF,EAAU/J,MAAQ+J,EAAU9J,KACvE,IAEQ,GAAIwN,EAAM3O,YAAc2O,EAAM3O,WAAWkD,OAAS,EAC9CgC,EAAQlF,WAAa,GACLd,MAAMT,UAAUmF,MAAMjF,KAAKgQ,EAAM3O,YACvCmE,SAAQ,SAAUjE,GACxB,OAAOgF,EAAQlF,WAAWmJ,KAAKuF,EAAUxO,EAAW8D,GACpE,IAEYA,EAAQ2B,eACJjB,EAAiBiK,EAAO,yBACxBzJ,EAAQ/D,MAAQwN,EAAMxN,OAEtBuD,EAAiBiK,EAAO,qBACxB,CAAC,QAAS,YAAY7O,SAAS6O,EAAMC,KAAKpJ,qBACxBsI,IAAlBa,EAAM/I,QACNV,EAAQU,QAAU+I,EAAM/I,QAEnBlB,EAAiBiK,EAAO,oBAAqB,kBAAmB,mBAAoB,gBAAiB,mBAAoB,oBAAqB,sBAAuB,sBAC1KzJ,EAAQ/D,MAAQwN,EAAMxN,OAEtBuD,EAAiBiK,EAAO,uBACxBzJ,EAAQW,SAAW8I,EAAM9I,UAGpC,CACD,OAAOX,CACX,CAGA,IAAI2J,EAAQ,2GACRC,EAAS,qDACb,SAASC,EAASC,GACd,OAAOA,EACFtO,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,SAAU,IAC3B,CAIA,IAAIuO,EAAS,CACTC,MAAM,EACNC,MAAM,EACNC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,QAAQ,EACRC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,QAAQ,EACRC,OAAO,EACPC,KAAK,GAELC,EAAW,SAAUC,EAAKC,GAC1B,IAAIC,EAAM,CACNhR,SAAU,GACVoG,WAAY,CAAE,GAEd6K,GAAc,EAEdC,EAAWJ,EAAIK,MAAM,uBACzB,GAAID,IACAF,EAAIhR,SACA+Q,GAAiC,QAAhBG,EAAS,GACpBA,EAAS,GACTA,EAAS,GAAGE,eAClBxB,EAAOsB,EAAS,KAAsC,MAA/BJ,EAAIO,OAAOP,EAAIjN,OAAS,MAC/CoN,GAAc,GAGdD,EAAIhR,SAASsR,WAAW,QAAQ,CAChC,IAAIC,EAAWT,EAAIU,QAAQ,UAC3B,MAAO,CACHjC,KAAM,UACNxJ,KAAM,CACF/F,SAAU,WACVU,MAAoB,IAAd6Q,EAAkBT,EAAIvM,MAAM,EAAGgN,GAAY,IAErDN,YAAaA,EAEpB,CAKL,IAHA,IAAIQ,EAAM,IAAIC,OAAOjC,GACjBkC,EAAS,KACTC,GAAO,GACHA,GAEJ,GAAe,QADfD,EAASF,EAAII,KAAKf,IAEdc,GAAO,OAEN,GAAID,EAAO,GAAG1P,OACf,GAAI0P,EAAO,GAAI,CACX,IAAIvR,EAAOuR,EAAO,GAAG1P,OACjB6P,EAAM,CAAC1R,EAAM,IACbA,EAAKoR,QAAQ,MAAQ,IACnBM,EAAM1R,EAAK8B,MAAM,MACvB8O,EAAI5K,WAAW0L,EAAI,IAAMA,EAAI,GAC7BL,EAAIM,WACP,MACQJ,EAAO,KACVX,EAAI5K,WAAWuL,EAAO,IAAMA,EAAO,GAChC1P,OACA+P,UAAU,EAAGL,EAAO,GAAG9N,OAAS,IAGjD,MAAO,CACH0L,KA/CO,MAgDPxJ,KAAMiL,EACNC,YAAaA,EAErB,EACIgB,EAAc,SAAUC,EAAMvN,QACd,IAAZA,IAAsBA,EAAU,CAChC2B,cAAc,EACdyK,eAAe,IAEnB,IACIoB,EADAR,EAAS,GAETS,GAAS,EACTN,EAAM,GACehM,GAAY,EAErC,GAA0B,IAAtBoM,EAAKV,QAAQ,KAAY,CACzB,IAAIa,EAAMH,EAAKV,QAAQ,KACvBG,EAAO7H,KAAK,CACR9J,SAAU,QACVU,MAAe,IAAT2R,EAAaH,EAAOA,EAAKF,UAAU,EAAGK,IAEnD,CA4FD,OA3FAH,EAAK7Q,QAAQmO,GAAO,SAAUsB,EAAKpI,GAC/B,IAAI4J,EAA2B,MAAlBxB,EAAIO,OAAO,GACpBkB,EAAYzB,EAAIQ,WAAW,WAC3BkB,EAAQ9J,EAAQoI,EAAIjN,OACpB4O,EAAWP,EAAKb,OAAOmB,GAC3B,GAAID,EAAW,CACX,IAAIG,EAAU7B,EAASC,EAAKnM,EAAQoM,eAAehL,KAEnD,GAAIqM,EAAQ,EAER,OADAT,EAAO7H,KAAK4I,GACL,GAEX,IAAIC,EAAWb,EAAIM,GAOnB,OANIO,GAAYD,EAAQ1S,WACf2S,EAAS5M,KAAKpF,aACfgS,EAAS5M,KAAKpF,WAAa,IAE/BgS,EAAS5M,KAAKpF,WAAWmJ,KAAK4I,IAE3B,EACV,CACD,GAAIJ,EAAQ,CAMR,GAJ8B,SAD9BH,EAAUtB,EAASC,EAAKnM,EAAQoM,eAAiBjL,IACrCC,KAAK/F,WACb8F,GAAY,GAEhBsM,KACKD,EAAQlB,aAETwB,GACa,MAAbA,EAAkB,CACbN,EAAQpM,KAAKpF,aACdwR,EAAQpM,KAAKpF,WAAa,IAE9B,IAAID,EAAOgP,EAASwC,EAAK3N,MAAMiO,EAAON,EAAKV,QAAQ,IAAKgB,KACxDL,EAAQpM,KAAKpF,WAAWmJ,KAAK,CACzB9J,SAAU,QACVU,KAAMA,IAENiE,EAAQ2B,cACkB,aAA1B6L,EAAQpM,KAAK/F,WACbmS,EAAQpM,KAAKjE,MAAQpB,EAE5B,CAEa,IAAV0R,GAAeD,EAAQpM,KAAK/F,UAC5B2R,EAAO7H,KAAKqI,EAAQpM,MAExB,IAAI6M,EAAWd,EAAIM,EAAQ,GACvBQ,GAAYT,EAAQpM,KAAK/F,WACpB4S,EAAS7M,KAAKpF,aACfiS,EAAS7M,KAAKpF,WAAa,IAE/BiS,EAAS7M,KAAKpF,WAAWmJ,KAAKqI,EAAQpM,OAE1C+L,EAAIM,GAASD,CAChB,CACD,KAAKG,GAAUH,EAAQlB,eACfmB,GAAS,IACRD,EAAQlB,aACJtM,EAAQoM,eACLoB,EAAQpM,KAAK/F,WAAa8Q,EAAIvM,MAAM,GAAI,KAC1CI,EAAQoM,eACNoB,EAAQpM,KAAK/F,SAASoR,gBAClBN,EAAIvM,MAAM,GAAI,GAAG6M,kBAC7BgB,GAEa,IACqB,QAA1BD,EAAQpM,KAAK/F,WACb8F,GAAY,GAEhBqM,EAAUL,EAAIM,IAGL,MAAbK,GAAoBA,GAAU,CAI9B,IAAI9R,GAAwB,IAAXyR,EAAeT,EAASG,EAAIM,GAAOrM,KAAKpF,YAAc,GAGnE0R,EAAMH,EAAKV,QAAQ,IAAKgB,GACxB9R,EAAOgP,EAASwC,EAAK3N,MAAMiO,GAAgB,IAATH,OAAa5D,EAAY4D,IAC/D1R,EAAWmJ,KAAK,CACZ9J,SAAU,QACVU,KAAMA,GAEb,CAEL,MAAO,EACf,IACWiR,EAAO,EAClB,EAGIkB,EAA4B,WAC5B,SAASA,EAAWC,EAAQC,EAAQpO,GAChCX,KAAKW,QAAUA,EACfX,KAAKgP,GAAyB,oBAAZC,SACd5N,EAAiByN,EAAQ,WACvBzD,EAAUyD,EAAQ9O,KAAKW,SACL,iBAAXmO,EACHb,EAAYa,EAAQ9O,KAAKW,SACzBjF,KAAKC,MAAMD,KAAKuF,UAAU6N,IACpC9O,KAAKkP,GAAyB,oBAAZD,SACd5N,EAAiB0N,EAAQ,WACvB1D,EAAU0D,EAAQ/O,KAAKW,SACL,iBAAXoO,EACHd,EAAYc,EAAQ/O,KAAKW,SACzBjF,KAAKC,MAAMD,KAAKuF,UAAU8N,IACpC/O,KAAKmP,UAAY,EACjBnP,KAAKoP,UAAW,EACZpP,KAAKqP,QACLrP,KAAKsP,OACkB,oBAAZL,SACH5N,EAAiByN,EAAQ,WACvBzD,EAAUyD,EAAQ9O,KAAKW,SACL,iBAAXmO,EACHb,EAAYa,EAAQ9O,KAAKW,SACzBjF,KAAKC,MAAMD,KAAKuF,UAAU6N,IACxC9O,KAAKuP,OACkB,oBAAZN,SACH5N,EAAiB0N,EAAQ,WACvB1D,EAAU0D,EAAQ/O,KAAKW,SACL,iBAAXoO,EACHd,EAAYc,EAAQ/O,KAAKW,SACzBjF,KAAKC,MAAMD,KAAKuF,UAAU8N,KAE5C/O,KAAKwP,QAAU,IAAIrF,CACtB,CAsdD,OArdA0E,EAAWzT,UAAUqU,KAAO,WACxB,OAAOzP,KAAK0P,UAAU1P,KAAKgP,GAAIhP,KAAKkP,GAC5C,EACIL,EAAWzT,UAAUsU,UAAY,SAAUV,EAAIE,GAC3C,IAAI1J,EACJ,EAAG,CACC,GAAIxF,KAAKW,QAAQ0O,QACbrP,KAAKmP,WAAa,EACdnP,KAAKmP,UAAYnP,KAAKW,QAAQgP,SAC9B,MAAM,IAAIC,MAAM,qBAAqBpP,OAAO9E,KAAKuF,UAAUjB,KAAKsP,QAAS,QAAQ9O,OAAO9E,KAAKuF,UAAUjB,KAAKuP,UAI/F,KADrB/J,EAAQxF,KAAK6P,aAAab,EAAIE,EAAI,KACxBrP,SAIDyH,EAAQ0H,EAAIE,KACTlP,KAAKoP,SACLpK,QAAQ8K,MAAM,oCAGd9P,KAAKoP,UAAW,EAChBvI,EAAWmI,GACXxJ,EAAQxF,KAAK6P,aAAab,EAAIE,EAAI,OAI1C1J,EAAM3F,OAAS,IACfG,KAAKoP,UAAW,EAChBpP,KAAKwP,QAAQnF,IAAI7E,GACjBkF,EAAasE,EAAIxJ,EAAOxF,KAAKW,SAE7C,OAAiB6E,EAAM3F,OAAS,GACxB,OAAOG,KAAKwP,QAAQpF,IAC5B,EACIyE,EAAWzT,UAAUyU,aAAe,SAAUb,EAAIE,EAAIxM,GAClD,IAAI8C,EACAuK,EACJ,GAAI/P,KAAKW,QAAQqP,UAAYtN,EAAM7C,OAASG,KAAKW,QAAQqP,SACrD,MAAO,GAGX,IAAKhB,EAAGlI,UAAW,CAOf,GANAtB,EAAQxF,KAAKiQ,cAAcjB,EAAIE,EAAIxM,GAC/B1C,KAAKW,QAAQuP,kBACbH,EAAS/P,KAAKW,QAAQuP,gBAAgBlB,EAAIE,EAAI1J,MAExCA,EAAQuK,GAEdvK,EAAM3F,OAAS,EAEf,OADAmP,EAAGlI,WAAY,EACRtB,EAGPwJ,EAAGlI,WAAY,CAEtB,CACD,GAAI3L,OAAOC,UAAU4B,eAAe1B,KAAK0T,EAAI,QAEzC,MAAO,GAKX,IAAKA,EAAGjI,UAAW,CAEf,IADAvB,EAAQxF,KAAKmQ,cAAcnB,EAAIE,EAAIxM,IACzB7C,OAAS,EACf,OAAO2F,EAGPwJ,EAAGjI,WAAY,CAEtB,CACD,GAAI/G,KAAKW,QAAQ2B,eAAiB0M,EAAGhI,UAAW,CAG5C,IADAxB,EAAQxF,KAAKoQ,cAAcpB,EAAIE,EAAIxM,IACzB7C,OAAS,EAEf,OADAmP,EAAGhI,WAAY,EACRxB,EAGPwJ,EAAGhI,WAAY,CAEtB,CAED,MAAO,EACf,EACI6H,EAAWzT,UAAU6U,cAAgB,SAAUjB,EAAIE,EAAIxM,GACnD,IACItG,EACAiU,EACAC,EACAC,EACAC,EACA7Q,EANA6F,EAAQ,GAOZ,GAAIwJ,EAAGhT,WAAakT,EAAGlT,SAAU,CAC7B,IAAK0G,EAAM7C,OACP,MAAM,IAAI+P,MAAM,gDAEpB,MAAO,EACH,IAAIlP,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOiB,gBACzDlD,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUoD,EAAU8H,IACjD9N,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwD,EAAUgI,IACjDhO,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GAChD,CACD,GAAIA,EAAM7C,QACNG,KAAKW,QAAQgP,QACTc,KAAKC,KAAK1B,EAAGrS,YAAc,IAAIkD,QAAUqP,EAAGvS,YAAc,IAAIkD,QAClE,MAAO,EACH,IAAIa,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOiB,gBACzDlD,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUoD,EAAU8H,IACjD9N,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwD,EAAUgI,IACjDhO,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,IAEjD,GAAIvH,OAAOC,UAAU4B,eAAe1B,KAAK0T,EAAI,SACzCA,EAAGtS,OAASwS,EAAGxS,KAEf,MAAoB,UAAhBsS,EAAGhT,SACI,EACH,IAAI0E,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOS,mBACzD1C,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GACpCxB,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUkL,EAAGtS,MAC1CwE,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwL,EAAGxS,OAG5C,EACH,IAAIgE,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOc,eACzD/C,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GACpCxB,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUkL,EAAGtS,MAC1CwE,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwL,EAAGxS,OAQ3D,IAHA2T,EAAQrB,EAAG5M,WAAajH,OAAOyL,KAAKoI,EAAG5M,YAAYuO,OAAS,GAC5DL,EAAQpB,EAAG9M,WAAajH,OAAOyL,KAAKsI,EAAG9M,YAAYuO,OAAS,GAC5DJ,EAAaF,EAAMxQ,OACdF,EAAI,EAAGA,EAAI4Q,EAAY5Q,IACxBvD,EAAOiU,EAAM1Q,IAEA,KADb6Q,EAAMF,EAAM9C,QAAQpR,IAEhBoJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOQ,iBACzDzC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GACpCxB,SAASlB,KAAKW,QAAQwC,OAAOtF,KAAMzB,GACnC8E,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAOkR,EAAG5M,WAAWhG,MAGvDkU,EAAM1N,OAAO4N,EAAK,GACdxB,EAAG5M,WAAWhG,KAAU8S,EAAG9M,WAAWhG,IACtCoJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOM,iBACzDvC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GACpCxB,SAASlB,KAAKW,QAAQwC,OAAOtF,KAAMzB,GACnC8E,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUkL,EAAG5M,WAAWhG,IACrD8E,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwL,EAAG9M,WAAWhG,MAKtE,IADAmU,EAAaD,EAAMzQ,OACdF,EAAI,EAAGA,EAAI4Q,EAAY5Q,IACxBvD,EAAOkU,EAAM3Q,GACb6F,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOK,cACzDtC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GACpCxB,SAASlB,KAAKW,QAAQwC,OAAOtF,KAAMzB,GACnC8E,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAOoR,EAAG9M,WAAWhG,KAE3D,OAAOoJ,CACf,EACIqJ,EAAWzT,UAAU+U,cAAgB,SAAUnB,EAAIE,EAAIxM,GACnD,IAAIkO,EAAe5B,EAAGrS,WAAaqS,EAAGrS,WAAW4D,QAAU,GACvDsQ,EAAe3B,EAAGvS,WAAauS,EAAGvS,WAAW4D,QAAU,GACvDuQ,EAAOL,KAAKM,IAAIH,EAAa/Q,OAAQgR,EAAahR,QAClDmR,EAA6BP,KAAKC,IAAIE,EAAa/Q,OAASgR,EAAahR,QACzE2F,EAAQ,GACRd,EAAQ,EACZ,IAAK1E,KAAKW,QAAQsQ,eAAiBH,EAAO9Q,KAAKW,QAAQsQ,cAAe,CAClE,IAAIC,EAAiBzJ,QAAQuH,EAAGpG,SAAWoG,EAAG9E,cAC1CiH,EAAWD,EACTlC,EAAGpG,QACHoG,EAAGrS,YAAcuS,EAAGvS,WAChB0L,EAAa2G,EAAIE,GACjB,GACV,GAAIiC,EAAStR,OAAS,IAIlB2F,EAAQxF,KAAKoR,uBAAuBpC,EAAIE,EAAIiC,EAAUzO,EAAOwO,IACnDrR,OAAS,EACf,OAAO2F,CAGlB,CAOD,IAAK,IAAI7F,EAAI,EAAGA,EAAImR,EAAMnR,GAAK,EAAG,CAC9B,IAAI4H,EAAKqJ,EAAajR,GAClB6H,EAAKqJ,EAAalR,GAClBqR,IAGIzJ,IAAOC,EACa,UAAhBD,EAAGvL,UACHwJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAO2B,mBACzD5D,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,IACjDxD,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAOyJ,EAAG7K,OAC5CgI,GAAS,IAGTc,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOyB,eACzD1D,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,IACjDxD,SAASlB,KAAKW,QAAQwC,OAAO9E,QAAS6I,EAAUK,KACrD7C,GAAS,GAGR8C,IAAOD,IACQ,UAAhBC,EAAGxL,SACHwJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOE,gBACzDnC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,IACjDxD,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAO0J,EAAG9K,OAG5C8I,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOC,YACzDlC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,IACjDxD,SAASlB,KAAKW,QAAQwC,OAAO9E,QAAS6I,EAAUM,OAW7DD,GAAMC,KACDxH,KAAKW,QAAQsQ,eACdH,EAAO9Q,KAAKW,QAAQsQ,cACpBzL,EAAQA,EAAMhF,OAAOR,KAAK6P,aAAatI,EAAIC,EAAI9E,EAAMlC,OAAOkE,KAEtD4C,EAAQC,EAAIC,KACdoJ,EAAa/Q,OAASgR,EAAahR,QACf,UAAhB0H,EAAGvL,SACHwJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAO2B,mBACzD5D,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,IACjDxD,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAOyJ,EAAG7K,OAG5C8I,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOyB,eACzD1D,SAASlB,KAAKW,QAAQwC,OAAO9E,QAAS6I,EAAUK,IAChDrG,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,KAE1DkM,EAAahO,OAAOjD,EAAG,GACvBA,GAAK,EACL+E,GAAS,EACTsM,GAA8B,GAEzBJ,EAAa/Q,OAASgR,EAAahR,QACxC2F,EAAQA,EAAMhF,OAAO,EACjB,IAAIE,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOC,YACzDlC,SAASlB,KAAKW,QAAQwC,OAAO9E,QAAS6I,EAAUM,IAChDtG,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,MAC1DkM,EAAahO,OAAOjD,EAAG,EAAGuH,EAAUM,IACpCwJ,GAA8B,GAG9BxL,EAAQA,EAAMhF,OAAO,EACjB,IAAIE,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOiB,gBACzDlD,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUoD,EAAUK,IACjDrG,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwD,EAAUM,IACjDtG,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAOkE,QAItEA,GAAS,CACZ,CAED,OADAsK,EAAGjI,WAAY,EACRvB,CACf,EACIqJ,EAAWzT,UAAUgW,uBAAyB,SAAUpC,EAAIE,EAAIiC,EAAUzO,EAAOwO,GAoB7E,IAZA,IAMIG,EACAC,EACAC,EACAxP,EACAyP,EAVAC,EAh8BY,SAAUzC,EAAIE,EAAIwC,GACtC,IAAIC,EAAQ3C,EAAGrS,WACTwL,EAAiB6G,EAAGrS,WAAWkD,QAAQ,GACvC,GACF+R,EAAQ1C,EAAGvS,WACTwL,EAAiB+G,EAAGvS,WAAWkD,QAAQ,GACvC,GACF0R,EAAQ,EAaZ,OAXAG,EAAO5Q,SAAQ,SAAUkI,GAGrB,IAFA,IAAI6I,EAAS7I,EAAOlF,SAAWkF,EAAOnJ,OAClCiS,EAAS9I,EAAOtF,SAAWsF,EAAOnJ,OAC7BkS,EAAI/I,EAAOlF,SAAUiO,EAAIF,EAAQE,GAAK,EAC3CJ,EAAMI,GAAKR,EAEf,IAASQ,EAAI/I,EAAOtF,SAAUqO,EAAID,EAAQC,GAAK,EAC3CH,EAAMG,GAAKR,EAEfA,GAAS,CACjB,IACW,CACHI,MAAOA,EACPC,MAAOA,EAEf,CAw6B6BI,CAAkBhD,EAAIE,EAAIiC,GAC3CQ,EAAQF,EAAeE,MACvBC,EAAQH,EAAeG,MACvBhB,EAAe5B,EAAGrS,WAAW4D,QAC7BsQ,EAAe3B,EAAGvS,WAAW4D,QAC7B0R,EAAWxB,KAAKyB,IAAIP,EAAM9R,OAAQ+R,EAAM/R,QAMxC2F,EAAQ,GACH2M,EAAS,EAAGC,EAAS,EAAGD,EAASF,EAAUG,GAAU,EAAGD,GAAU,EACvE,IAAIjB,IACmB,IAAlBS,EAAMQ,KAAsC,IAAlBP,EAAMO,IAChC,IAAsB,IAAlBR,EAAMS,GAEX,GAAsB,WADtBrQ,EAAO6O,EAAawB,IACXpW,SACL,GAAsC,UAAlC6U,EAAasB,GAAQnW,UACrB,GAAI+F,EAAKrF,OACLmU,EAAasB,GAAQzV,KAAM,CAG3B,IADA,IAAI2V,EAAQD,EACLxB,EAAa/Q,OAASwS,EAAQ,GACI,UAArCzB,EAAayB,EAAQ,GAAGrW,UAExB,GADAqW,GAAS,EACLxB,EAAasB,GACZzV,OACDkU,EAAayB,GACR3V,KAAM,CACX8U,GAAc,EACd,KACH,CAEAA,GACDhM,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAClDS,mBACA1C,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAO4R,IACjDlR,SAASlB,KAAKW,QAAQwC,OAAOW,SAAU/B,EAAKrF,MAC5CwE,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUmN,EAAasB,GAAQzV,MAExE,OAGD8I,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAO2B,mBACzD5D,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAO4R,IACjDlR,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAOiE,EAAKrF,OAC9CiV,EAAM/O,OAAOwP,EAAQ,GACrBxB,EAAahO,OAAOwP,EAAQ,GAC5BH,EAAWxB,KAAKyB,IAAIP,EAAM9R,OAAQ+R,EAAM/R,QACxCuS,GAAU,EACVD,GAAU,OAGS,IAAlBP,EAAMO,GAGX3M,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOiB,gBACzDlD,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUoD,EAAUnF,IACjDb,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwD,EAAU2J,EAAasB,KAC9DjR,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAO4R,MAKtD5M,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOyB,eACzD1D,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAO4R,IACjDlR,SAASlB,KAAKW,QAAQwC,OAAO9E,QAAS6I,EAAUnF,KACrD4P,EAAM/O,OAAOwP,EAAQ,GACrBxB,EAAahO,OAAOwP,EAAQ,GAC5BH,EAAWxB,KAAKyB,IAAIP,EAAM9R,OAAQ+R,EAAM/R,QACxCuS,GAAU,EACVD,GAAU,QAGb,IAAsB,IAAlBP,EAAMO,GAEW,WADtBpQ,EAAO8O,EAAasB,IACXnW,UACLwJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOE,gBACzDnC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAO4R,IACjDlR,SAASlB,KAAKW,QAAQwC,OAAOrF,MAAOiE,EAAKrF,OAC9CiV,EAAM/O,OAAOwP,EAAQ,GAAG,GACxBxB,EAAahO,OAAOwP,EAAQ,EAAG,CAC3BpW,SAAU,QACVU,KAAMqF,EAAKrF,OAEfuV,EAAWxB,KAAKyB,IAAIP,EAAM9R,OAAQ+R,EAAM/R,UAIxC2F,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOC,YACzDlC,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,EAAMlC,OAAO4R,IACjDlR,SAASlB,KAAKW,QAAQwC,OAAO9E,QAAS6I,EAAUnF,KACrD4P,EAAM/O,OAAOwP,EAAQ,GAAG,GACxBxB,EAAahO,OAAOwP,EAAQ,EAAGlL,EAAUnF,IACzCkQ,EAAWxB,KAAKyB,IAAIP,EAAM9R,OAAQ+R,EAAM/R,cAI3C,GAAI8R,EAAMS,KAAYR,EAAMO,GAAS,CACtC,GAAI3M,EAAM3F,OAAS,EACf,OAAO2F,EAKX,GAFA+L,EAAQJ,EAASQ,EAAMS,KACvBd,EAAUb,KAAKyB,IAAIX,EAAM7N,SAAUkN,EAAa/Q,OAAS0R,EAAM1R,WAC/C0R,EAAMzN,SAAU,CAE5BuN,GAAuB,EACvB,IAAK,IAAIU,EAAI,EAAGA,EAAIR,EAAM1R,OAAQkS,GAAK,EAC9BlK,EAAa+I,EAAaU,EAAUS,GAAInB,EAAaW,EAAMzN,SAAWiO,GAAI,CAAE,GAAE,GAAO,KACtFV,GAAuB,GAG/B,GAAIA,EACA,MAAO,EACH,IAAI3Q,GACCQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOoB,eACzDrD,SAASlB,KAAKW,QAAQwC,OAAOqB,YAAa+M,EAAM1R,QAChDqB,SAASlB,KAAKW,QAAQwC,OAAOhD,KAAMoR,EAAMzN,UACzC5C,SAASlB,KAAKW,QAAQwC,OAAOjD,GAAIoR,GACjCpQ,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,GAEpD,CACJ,OAEL,OAAO8C,CACf,EACIqJ,EAAWzT,UAAUgV,cAAgB,SAAUpB,EAAIE,EAAIxM,GAInD,IAAI8C,EAAQ,GAwBZ,OAvBIwJ,EAAGxM,WAAa0M,EAAG1M,UACnBgD,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOgB,gBACzDjD,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUkL,EAAGxM,UAC1CtB,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwL,EAAG1M,UAC1CtB,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,KAExCsM,EAAGlR,OAASoR,EAAGpR,QAChBkR,EAAGlR,QAAUoR,EAAGpR,OACA,WAAhBkR,EAAGhT,UACHwJ,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOa,aACzD9C,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUkL,EAAGlR,OAAS,IACnDoD,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwL,EAAGpR,OAAS,IACnDoD,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,IAEzCsM,EAAGzM,UAAY2M,EAAG3M,SAClBiD,EAAMM,MAAK,IAAIpF,GACVQ,SAASlB,KAAKW,QAAQwC,OAAOD,OAAQlD,KAAKW,QAAQwC,OAAOe,eACzDhD,SAASlB,KAAKW,QAAQwC,OAAOW,SAAUkL,EAAGzM,SAC1CrB,SAASlB,KAAKW,QAAQwC,OAAOO,SAAUwL,EAAG3M,SAC1CrB,SAASlB,KAAKW,QAAQwC,OAAOT,MAAOA,IAEtC8C,CACf,EACWqJ,CACX,IAEIyD,EAAkB,CAClBjD,OAAO,EACPM,QAAS,GACTK,UAAU,EACViB,cAAe,GACf3O,cAAc,EAEduB,SAAU,SAAU9B,EAAMwQ,EAAcC,EAAe9O,GACnD3B,EAAKrF,KAAOgH,CAEf,EAGDmH,oBAAqB,WAAe,EACpCM,qBAAsB,WAAe,EACrC5H,aAAc,WAAe,EAC7B2B,cAAe,WAAe,EAC9BgL,gBAAiB,KACjBuC,UAAU,EACVtP,QAAQ,EACRhH,WAA4B,oBAAXiD,SAA0BA,OAAOjD,WAC5CiD,OAAOjD,SAEbuW,WAAY,IAEZC,EAAyB,WACzB,SAASA,EAAQhS,GAUb,QATgB,IAAZA,IAAsBA,EAAU,CAAE,GAGtCxF,OAAO0F,QAAQyR,GAAiBxR,SAAQ,SAAUC,GAC9C,IAAIC,EAAMD,EAAG,GAAIjD,EAAQiD,EAAG,GACvB5F,OAAOC,UAAU4B,eAAe1B,KAAKqF,EAASK,KAC/CL,EAAQK,GAAOlD,EAE/B,KACa6C,EAAQwC,OAAQ,CACjB,IAAIyP,EAAW,CACX,eACA,kBACA,kBACA,oBACA,gBACA,gBACA,aACA,oBACA,iBACA,iBACA,cACA,gBACA,iBACA,gBACA,SACA,QACA,WACA,WACA,UACA,QACA,cACA,OACA,KACA,OACA,QACA,OACA,aACA,WACA,aACA,UACA,YACAC,EAAe,CAAA,EACflS,EAAQ8R,SACRG,EAAS9R,SAAQ,SAAUgS,EAASpO,GAAS,OAAQmO,EAAaC,GAAWpO,CAAO,IAGpFkO,EAAS9R,SAAQ,SAAUgS,GAAW,OAAQD,EAAaC,GAAWA,CAAS,IAEnFnS,EAAQwC,OAAS0P,CACpB,CACD7S,KAAKW,QAAUA,CAClB,CAWD,OAVAgS,EAAQvX,UAAU2E,MAAQ,SAAU+C,EAAM0C,GACtC,OA1iDR,SAAkB1C,EAAM0C,EAAO7E,GAC3B,OAAO6E,EAAMyB,OAAM,SAAUlE,GACzB,OAAOF,EAAUC,EAAMC,EAAMpC,EACrC,GACA,CAsiDeoS,CAASjQ,EAAM0C,EAAOxF,KAAKW,QAC1C,EACIgS,EAAQvX,UAAU4X,KAAO,SAAUlQ,EAAM0C,GACrC,OAAOD,EAAQzC,EAAM0C,EAAOxF,KAAKW,QACzC,EACIgS,EAAQvX,UAAU2H,KAAO,SAAU+L,EAAQC,GAEvC,OADa,IAAIF,EAAWC,EAAQC,EAAQ/O,KAAKW,SACnC8O,MACtB,EACWkD,CACX,IC70DO,MAAMM,EAAgC,CACzCC,EACAC,EACAC,GAEI9U,UACA+U,SACAC,eACAC,WACAC,UACAjI,SAGAkI,iBACAC,mBAEF,CACF1X,SAAU,KAEVW,WAAYuW,EAAStW,KACjB,CAAC+W,EAAyBjP,KACtB,MAAMkP,EAAST,EAAezO,IAAW,CACrC6G,OACA8H,SACAE,UAAU,EACVM,YAAY,GAEhB,GAAID,EAAOjW,OACP,OAEJ,MAAMyE,EAAyCuR,EAAQvR,WAAa,IAAIuR,EAAQvR,YAAc,GAY9F,GAXIwR,EAAOL,UAAYA,KAAcC,EAAQ3T,QAAU6T,KAC/CE,EAAO1I,OACP9I,EAAW,mBAAqB,OAEhCA,EAAW,iBAAmB,QAIlCwR,EAAOE,cACP1R,EAAW2R,MAAQpV,EAAeyD,EAAW2R,MAAOH,EAAOE,cAE3DV,EAAazC,MAAQyC,EAAazC,KAAKiD,SAAWlP,EAAO,CACzD,MAAMsP,EAA2C,QAA1BZ,EAAazC,KAAKsD,IAAgB3V,EAAQ4V,UAAY5V,EAAQ6V,WACrF/R,EAAW2R,MAAQpV,EAAeyD,EAAW2R,MAAOC,GACpD5R,EAAW,aAAyC,QAA1BgR,EAAazC,KAAKsD,IAAgB,YAAc,YAC7E,MAAUb,EAAagB,QAAQ1P,KAC5BtC,EAAW2R,MAAQpV,EAAeyD,EAAW2R,MAAOzV,EAAQ+V,eAGhE,GAAIjB,EAAakB,OAAO5P,KAAW+O,EAAgB,CAC/C,MAAMc,EAAQ,UAAUnB,EAAakB,OAAO5P,OAC5CtC,EAAWmS,MAAQ5V,EAAeyD,EAAWmS,MAAOA,EACvD,CACD,GAAIf,EAAQ3T,SAAW6T,EAAc,CACjC,MAAMa,EAAQ,8CACdnS,EAAWmS,MAAQ5V,EAAeyD,EAAWmS,MAAOA,EACvD,CAED,MAAMC,EAAmD,SAAjBb,EAAQpI,KAC5CoI,EAAQjX,KACR,CACI,CACIV,SAAU,QACVU,KAAMiX,EAAQzW,MAAQC,OAAOwW,EAAQjX,QAGjD,MAAO,CACHV,SAAU,KACVoG,aACAzF,YACM2W,IAAgBE,EAAQ3T,QAAY6T,EAOjCE,EAAOL,UAAaA,EAEjB,CACI,CACIvX,SAAU,SACVoG,WAAY,CACR2R,MAAOH,EAAO1I,OAAS5M,EAAQ4M,OAAS5M,EAAQmW,QAEpD9X,WAAY6X,IAPpBA,EAPJ,CACI,CACIxY,SAAU,QACVU,KAAM,KAczB,IAEPwO,QAAQ0I,GAAqCA,MAGtCc,EAAmB,CAACC,EAA2CzB,EAA4B0B,EAAiBzB,EAAsCC,EAAgCyB,GAC3LvW,UACAgV,eACAwB,SACAC,SACA1B,SACAE,WACAC,UACAjI,OACAyJ,YACAC,aAEAxB,iBACAC,eACAwB,gBACcC,EAA4BC,KAC1C,MAAMC,EAAyB,CAC3BrZ,SAAU,QACVoG,WAAY,IAAIuS,GAChBhY,WAAY,CACR,CACIX,SAAU,QACVW,WAAYiY,EAAKhY,KACb,EAAE0Y,MAAK5Q,YACH,MAAM6Q,EAAsB,CACxBvZ,SAAU,KACVoG,WAAY,IACLkT,EAAIlT,WAEH,aAAcjF,OAAOuH,IAG7B/H,WAAY2Y,EAAIE,MAAM5Y,KAClB,CAACK,EAAgBwY,KACb,MAAM7B,EAAST,EAAesC,IAAY,CACtClK,OACA8H,SACAE,UAAU,EACVM,YAAY,GAEhB,GAAID,EAAOjW,OACP,OAEJ,MAAM+X,EAAsB,CACxB1Z,SAAU,KACVoG,WAAYnF,EAAKmF,WAAa,IAAInF,EAAKmF,YAAc,CAAE,EACvDzF,WAA4B,SAAhBiX,EAAOrI,KACftO,EAAKP,KACL,CACI,CACIV,SAAU,QACVU,KAAMK,EAAWE,MAUjC,GANK6X,GAAWC,IAAU3B,EAAakB,OAAOmB,IAAYhC,IACtDiC,EAAGtT,WAAWmS,MAAQ5V,EAAe+W,EAAGtT,WAAWmS,MAAO,UAAUnB,EAAakB,OAAOmB,SAExF7B,EAAO+B,YACPD,EAAGtT,WAAW2R,MAAQpV,EAAe+W,EAAGtT,WAAW2R,MAAOH,EAAO+B,YAEjE/B,EAAOgC,OAAQ,CACf,MAAMC,EAAmDjC,EAAOgC,OAAO3Y,EAAKP,KAAMgZ,EAAIhR,EAAO+Q,GAC7F,GAAII,EAAc,CACd,GAA4B,iBAAjBA,EAWP,OAAOA,EAX2B,CAElC,MAAM9T,EAAOkM,EAAY,OAAO4H,UAED,IAA3B9T,EAAKpF,WAAWkD,QAAiB,CAAC,QAAS,YAAYpD,SAASsF,EAAKpF,WAAW,GAAGX,UAGlF0Z,EAAG/Y,WAAW,GAAoBD,KAAOmZ,EAF1CH,EAAG/Y,WAAaoF,EAAKpF,UAK5B,CAGJ,CAEJ,CACD,OAAO+Y,CAAE,IAEfxK,QAAQ0I,GAAqCA,KAKnD,GAHIlP,IAAUmQ,IACVU,EAAGnT,WAAW2R,MAAQpV,EAAe4W,EAAGnT,WAAW2R,MAAOzV,EAAQwX,SAElEd,EAAW,CACX,MAAMe,EAAyCf,EAAUM,EAAKC,EAAI7Q,GAClE,GAAIqR,EAAa,CACb,GAA2B,iBAAhBA,EAUP,OAAOA,EAV0B,CAEjC,MAAMhU,EAAOkM,EAAY,OAAO8H,WAC5BhU,EAAKpF,YAA0C,IAA3BoF,EAAKpF,WAAWkD,QAAiB,CAAC,QAAS,YAAYpD,SAASsF,EAAKpF,WAAW,GAAGX,UAGtGuZ,EAAG5Y,WAAW,GAAoBD,KAAOqZ,EAF1CR,EAAG5Y,WAAaoF,EAAKpF,UAK5B,CAGJ,CACJ,CACD,OAAO4Y,CAAE,OAS7B,GAFAF,EAAMjT,WAAW2R,MAAQpV,EAAe0W,EAAMjT,WAAW2R,MAAOzV,EAAQ+W,OAEpEP,GAAUC,GAAUG,EAAc,CAClC,MAAMc,EAA6B/C,EAA8BC,EAAUC,EAAgBC,EAAc,CAAC9U,UACtGgV,eACAC,WACAC,WAAU,CAACC,iBACXC,iBAEJ,GAAIoB,GAAUI,EAAc,CACxB,MAAMe,EAAyB,CAC3Bja,SAAU,QACVW,WAAY,CAACqZ,KAEZxC,EAAQ3T,SAAUyT,GAAkBI,IACrCuC,EAAM7T,WAAa,CACfmS,MAAO,iBAGfc,EAAM1Y,WAAWuZ,QAAQD,EAC5B,CACD,GAAIlB,EAAQ,CACR,MACMoB,EAAyB,CAC3Bna,SAAU,QACVW,WAAY,CAHEmY,EAASsB,gBAAgBJ,GAAaA,KAKnDxC,EAAQ3T,SAAUyT,GAAkBI,IACrCyC,EAAM/T,WAAa,CAACmS,MAAO,iBAE/Bc,EAAM1Y,WAAWmJ,KAAKqQ,EACzB,CACJ,CASD,OAPAhB,EAAQrU,SAAQuV,GAAQhB,EAAM1Y,WAAWmJ,KAAKuQ,KAC9CjB,EAAStU,SAAQwV,GAAWjB,EAAM1Y,WAAWmJ,KAAKwQ,MAEjC,IAAbrB,IACAI,EAAMjT,WAAWmU,SAAWpZ,OAAO8X,IAGhCI,CAAK,oRC5P4L,WAA0B,IAAI5Z,EAAE,IAAIG,EAAE,IAAIgE,EAAE,KAAK4W,EAAE,cAAc7W,EAAE,SAASH,EAAE,SAASiX,EAAE,OAAOC,EAAE,MAAMC,EAAE,OAAOhU,EAAE,QAAQiU,EAAE,UAAUC,EAAE,OAAOC,EAAE,OAAOxW,EAAE,eAAeyW,EAAE,6FAA6FC,EAAE,sFAAsFC,EAAE,CAACpZ,KAAK,KAAKqZ,SAAS,2DAA2DhZ,MAAM,KAAKiZ,OAAO,wFAAwFjZ,MAAM,KAAKkZ,QAAQ,SAAS3b,GAAG,IAAIG,EAAE,CAAC,KAAK,KAAK,KAAK,MAAMgE,EAAEnE,EAAE,IAAI,MAAM,IAAIA,GAAGG,GAAGgE,EAAE,IAAI,KAAKhE,EAAEgE,IAAIhE,EAAE,IAAI,GAAG,GAAGyb,EAAE,SAAS5b,EAAEG,EAAEgE,GAAG,IAAI4W,EAAErZ,OAAO1B,GAAG,OAAO+a,GAAGA,EAAE3W,QAAQjE,EAAEH,EAAE,GAAGI,MAAMD,EAAE,EAAE4a,EAAE3W,QAAQ/C,KAAK8C,GAAGnE,CAAC,EAAE2M,EAAE,CAAC5I,EAAE6X,EAAEC,EAAE,SAAS7b,GAAG,IAAIG,GAAGH,EAAE8b,YAAY3X,EAAE6Q,KAAKC,IAAI9U,GAAG4a,EAAE/F,KAAK+G,MAAM5X,EAAE,IAAID,EAAEC,EAAE,GAAG,OAAOhE,GAAG,EAAE,IAAI,KAAKyb,EAAEb,EAAE,EAAE,KAAK,IAAIa,EAAE1X,EAAE,EAAE,IAAI,EAAE0X,EAAE,SAAS5b,EAAEG,EAAEgE,GAAG,GAAGhE,EAAE6b,OAAO7X,EAAE6X,OAAO,OAAOhc,EAAEmE,EAAEhE,GAAG,IAAI4a,EAAE,IAAI5W,EAAE8X,OAAO9b,EAAE8b,SAAS9X,EAAE+X,QAAQ/b,EAAE+b,SAAShY,EAAE/D,EAAEgc,QAAQvN,IAAImM,EAAE7T,GAAGnD,EAAEI,EAAED,EAAE,EAAE8W,EAAE7a,EAAEgc,QAAQvN,IAAImM,GAAGhX,GAAG,EAAE,GAAGmD,GAAG,UAAU6T,GAAG5W,EAAED,IAAIH,EAAEG,EAAE8W,EAAEA,EAAE9W,KAAK,EAAE,EAAE+W,EAAE,SAASjb,GAAG,OAAOA,EAAE,EAAEgV,KAAKoH,KAAKpc,IAAI,EAAEgV,KAAK+G,MAAM/b,EAAE,EAAEqE,EAAE,SAASrE,GAAG,MAAM,CAACwb,EAAEtU,EAAEqU,EAAEH,EAAEiB,EAAEnB,EAAEG,EAAEJ,EAAEqB,EAAEjB,EAAED,EAAEJ,EAAEY,EAAE7X,EAAEA,EAAEG,EAAEqY,GAAGxB,EAAEyB,EAAErB,GAAGnb,IAAI0B,OAAO1B,GAAG,IAAI0G,cAAc9E,QAAQ,KAAK,GAAG,EAAEoZ,EAAE,SAAShb,GAAG,YAAO,IAASA,CAAC,GAAGyc,EAAE,KAAKH,EAAE,CAAE,EAACA,EAAEG,GAAGjB,EAAE,IAAInX,EAAE,iBAAiBqY,EAAE,SAAS1c,GAAG,OAAOA,aAAa2c,MAAM3c,IAAIA,EAAEqE,GAAG,EAAEgY,EAAE,SAASrc,EAAEG,EAAEgE,EAAE4W,GAAG,IAAI7W,EAAE,IAAI/D,EAAE,OAAOsc,EAAE,GAAG,iBAAiBtc,EAAE,CAAC,IAAI4D,EAAE5D,EAAEuG,cAAc4V,EAAEvY,KAAKG,EAAEH,GAAGI,IAAImY,EAAEvY,GAAGI,EAAED,EAAEH,GAAG,IAAIiX,EAAE7a,EAAEsC,MAAM,KAAK,IAAIyB,GAAG8W,EAAE5W,OAAO,EAAE,OAAOpE,EAAEgb,EAAE,GAAG,KAAK,CAAC,IAAIC,EAAE9a,EAAEiC,KAAKka,EAAErB,GAAG9a,EAAE+D,EAAE+W,CAAC,CAAC,OAAOF,GAAG7W,IAAIuY,EAAEvY,GAAGA,IAAI6W,GAAG0B,CAAC,EAAEG,EAAE,SAAS5c,EAAEG,GAAG,GAAGuc,EAAE1c,GAAG,OAAOA,EAAEmc,QAAQ,IAAIhY,EAAE,iBAAiBhE,EAAEA,EAAE,GAAG,OAAOgE,EAAE6X,KAAKhc,EAAEmE,EAAE0Y,KAAK5Y,UAAU,IAAI0Y,EAAExY,EAAE,EAAE2Y,EAAEnQ,EAAEmQ,EAAEjY,EAAEwX,EAAES,EAAE5Y,EAAEwY,EAAEI,EAAET,EAAE,SAASrc,EAAEG,GAAG,OAAOyc,EAAE5c,EAAE,CAAC+c,OAAO5c,EAAE6c,GAAGC,IAAI9c,EAAE+c,GAAGC,EAAEhd,EAAEid,GAAGC,QAAQld,EAAEkd,SAAS,EAAE,IAAIV,EAAE,WAAW,SAASnB,EAAExb,GAAGuE,KAAKyY,GAAGX,EAAErc,EAAE+c,OAAO,MAAK,GAAIxY,KAAKrE,MAAMF,GAAGuE,KAAK6Y,GAAG7Y,KAAK6Y,IAAIpd,EAAEmd,GAAG,CAAA,EAAG5Y,KAAKF,IAAG,CAAE,CAAC,IAAIuX,EAAEJ,EAAE7b,UAAU,OAAOic,EAAE1b,MAAM,SAASF,GAAGuE,KAAK+Y,GAAG,SAAStd,GAAG,IAAIG,EAAEH,EAAEgc,KAAK7X,EAAEnE,EAAEid,IAAI,GAAG,OAAO9c,EAAE,OAAO,IAAIod,KAAKC,KAAK,GAAGV,EAAE9B,EAAE7a,GAAG,OAAO,IAAIod,KAAK,GAAGpd,aAAaod,KAAK,OAAO,IAAIA,KAAKpd,GAAG,GAAG,iBAAiBA,IAAI,MAAMsd,KAAKtd,GAAG,CAAC,IAAI4a,EAAE5a,EAAEuR,MAAM4J,GAAG,GAAGP,EAAE,CAAC,IAAI7W,EAAE6W,EAAE,GAAG,GAAG,EAAEhX,GAAGgX,EAAE,IAAI,KAAKxI,UAAU,EAAE,GAAG,OAAOpO,EAAE,IAAIoZ,KAAKA,KAAKG,IAAI3C,EAAE,GAAG7W,EAAE6W,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEhX,IAAI,IAAIwZ,KAAKxC,EAAE,GAAG7W,EAAE6W,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEA,EAAE,IAAI,EAAEhX,EAAE,CAAC,CAAC,OAAO,IAAIwZ,KAAKpd,EAAE,CAA3X,CAA6XH,GAAGuE,KAAKyP,MAAM,EAAE4H,EAAE5H,KAAK,WAAW,IAAIhU,EAAEuE,KAAK+Y,GAAG/Y,KAAKoZ,GAAG3d,EAAE4d,cAAcrZ,KAAKsZ,GAAG7d,EAAE8d,WAAWvZ,KAAKwZ,GAAG/d,EAAEge,UAAUzZ,KAAK0Z,GAAGje,EAAEke,SAAS3Z,KAAK4Z,GAAGne,EAAEoe,WAAW7Z,KAAK8Z,GAAGre,EAAEse,aAAa/Z,KAAKga,GAAGve,EAAEwe,aAAaja,KAAKka,IAAIze,EAAE0e,iBAAiB,EAAE9C,EAAE+C,OAAO,WAAW,OAAO7B,CAAC,EAAElB,EAAEgD,QAAQ,WAAW,QAAQra,KAAK+Y,GAAG1d,aAAaiF,EAAE,EAAE+W,EAAEiD,OAAO,SAAS7e,EAAEG,GAAG,IAAIgE,EAAEyY,EAAE5c,GAAG,OAAOuE,KAAKua,QAAQ3e,IAAIgE,GAAGA,GAAGI,KAAKwa,MAAM5e,EAAE,EAAEyb,EAAEoD,QAAQ,SAAShf,EAAEG,GAAG,OAAOyc,EAAE5c,GAAGuE,KAAKua,QAAQ3e,EAAE,EAAEyb,EAAEqD,SAAS,SAASjf,EAAEG,GAAG,OAAOoE,KAAKwa,MAAM5e,GAAGyc,EAAE5c,EAAE,EAAE4b,EAAEsD,GAAG,SAASlf,EAAEG,EAAEgE,GAAG,OAAO2Y,EAAE9B,EAAEhb,GAAGuE,KAAKpE,GAAGoE,KAAK4a,IAAIhb,EAAEnE,EAAE,EAAE4b,EAAEwD,KAAK,WAAW,OAAOpK,KAAK+G,MAAMxX,KAAK8a,UAAU,IAAI,EAAEzD,EAAEyD,QAAQ,WAAW,OAAO9a,KAAK+Y,GAAGgC,SAAS,EAAE1D,EAAEkD,QAAQ,SAAS9e,EAAEG,GAAG,IAAIgE,EAAEI,KAAKwW,IAAI+B,EAAE9B,EAAE7a,IAAIA,EAAEgb,EAAE2B,EAAEzY,EAAErE,GAAG6E,EAAE,SAAS7E,EAAEG,GAAG,IAAI+D,EAAE4Y,EAAET,EAAElY,EAAE+Y,GAAGK,KAAKG,IAAIvZ,EAAEwZ,GAAGxd,EAAEH,GAAG,IAAIud,KAAKpZ,EAAEwZ,GAAGxd,EAAEH,GAAGmE,GAAG,OAAO4W,EAAE7W,EAAEA,EAAE6a,MAAM9D,EAAE,EAAEK,EAAE,SAAStb,EAAEG,GAAG,OAAO2c,EAAET,EAAElY,EAAEob,SAASvf,GAAGsE,MAAMH,EAAEob,OAAO,MAAMxE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,MAAMjW,MAAM3E,IAAIgE,EAAE,EAAEoX,EAAEhX,KAAK0Z,GAAGzC,EAAEjX,KAAKsZ,GAAGjC,EAAErX,KAAKwZ,GAAGpR,EAAE,OAAOpI,KAAK2Y,GAAG,MAAM,IAAI,OAAO/B,GAAG,KAAKC,EAAE,OAAOL,EAAElW,EAAE,EAAE,GAAGA,EAAE,GAAG,IAAI,KAAKqC,EAAE,OAAO6T,EAAElW,EAAE,EAAE2W,GAAG3W,EAAE,EAAE2W,EAAE,GAAG,KAAKN,EAAE,IAAIuB,EAAElY,KAAKib,UAAUC,WAAW,EAAEnD,GAAGf,EAAEkB,EAAElB,EAAE,EAAEA,GAAGkB,EAAE,OAAO5X,EAAEkW,EAAEa,EAAEU,EAAEV,GAAG,EAAEU,GAAGd,GAAG,KAAKP,EAAE,KAAKI,EAAE,OAAOC,EAAE3O,EAAE,QAAQ,GAAG,KAAKqO,EAAE,OAAOM,EAAE3O,EAAE,UAAU,GAAG,KAAK5I,EAAE,OAAOuX,EAAE3O,EAAE,UAAU,GAAG,KAAKzI,EAAE,OAAOoX,EAAE3O,EAAE,eAAe,GAAG,QAAQ,OAAOpI,KAAK4X,QAAQ,EAAEP,EAAEmD,MAAM,SAAS/e,GAAG,OAAOuE,KAAKua,QAAQ9e,GAAE,EAAG,EAAE4b,EAAE8D,KAAK,SAAS1f,EAAEG,GAAG,IAAIgE,EAAE+W,EAAE4B,EAAEzY,EAAErE,GAAGmb,EAAE,OAAO5W,KAAK2Y,GAAG,MAAM,IAAIrY,GAAGV,EAAE,CAAA,EAAGA,EAAE8W,GAAGE,EAAE,OAAOhX,EAAEkX,GAAGF,EAAE,OAAOhX,EAAE+C,GAAGiU,EAAE,QAAQhX,EAAEiX,GAAGD,EAAE,WAAWhX,EAAE6W,GAAGG,EAAE,QAAQhX,EAAEJ,GAAGoX,EAAE,UAAUhX,EAAED,GAAGiX,EAAE,UAAUhX,EAAE4W,GAAGI,EAAE,eAAehX,GAAG+W,GAAGI,EAAEJ,IAAID,EAAE1W,KAAKwZ,IAAI5d,EAAEoE,KAAK0Z,IAAI9d,EAAE,GAAG+a,IAAIhU,GAAGgU,IAAIE,EAAE,CAAC,IAAIG,EAAEhX,KAAK4X,QAAQgD,IAAI9D,EAAE,GAAGE,EAAE+B,GAAGzY,GAAGyW,GAAGC,EAAEvH,OAAOzP,KAAK+Y,GAAG/B,EAAE4D,IAAI9D,EAAErG,KAAKyB,IAAIlS,KAAKwZ,GAAGxC,EAAEoE,gBAAgBrC,EAAE,MAAMzY,GAAGN,KAAK+Y,GAAGzY,GAAGyW,GAAG,OAAO/W,KAAKyP,OAAOzP,IAAI,EAAEqX,EAAEuD,IAAI,SAASnf,EAAEG,GAAG,OAAOoE,KAAK4X,QAAQuD,KAAK1f,EAAEG,EAAE,EAAEyb,EAAEgE,IAAI,SAAS5f,GAAG,OAAOuE,KAAKuY,EAAEzY,EAAErE,KAAK,EAAE4b,EAAEhN,IAAI,SAASmM,EAAEI,GAAG,IAAIE,EAAExW,EAAEN,KAAKwW,EAAE8E,OAAO9E,GAAG,IAAIO,EAAEwB,EAAEzY,EAAE8W,GAAGI,EAAE,SAASvb,GAAG,IAAIG,EAAEyc,EAAE/X,GAAG,OAAOiY,EAAET,EAAElc,EAAE6b,KAAK7b,EAAE6b,OAAOhH,KAAK8K,MAAM9f,EAAE+a,IAAIlW,EAAE,EAAE,GAAGyW,IAAIpU,EAAE,OAAO3C,KAAK4a,IAAIjY,EAAE3C,KAAKsZ,GAAG9C,GAAG,GAAGO,IAAIF,EAAE,OAAO7W,KAAK4a,IAAI/D,EAAE7W,KAAKoZ,GAAG5C,GAAG,GAAGO,IAAIL,EAAE,OAAOM,EAAE,GAAG,GAAGD,IAAIJ,EAAE,OAAOK,EAAE,GAAG,IAAIC,GAAGH,EAAE,CAAE,EAACA,EAAEtX,GAAG5D,EAAEkb,EAAEL,GAAG7W,EAAEkX,EAAEnX,GAAGlE,EAAEqb,GAAGC,IAAI,EAAEM,EAAErX,KAAK+Y,GAAGgC,UAAUvE,EAAES,EAAE,OAAOsB,EAAET,EAAET,EAAErX,KAAK,EAAEqX,EAAEmE,SAAS,SAAS/f,EAAEG,GAAG,OAAOoE,KAAKqK,KAAK,EAAE5O,EAAEG,EAAE,EAAEyb,EAAEhE,OAAO,SAAS5X,GAAG,IAAIG,EAAEoE,KAAKJ,EAAEI,KAAKib,UAAU,IAAIjb,KAAKqa,UAAU,OAAOza,EAAE6b,aAAanb,EAAE,IAAIkW,EAAE/a,GAAG,uBAAuBkE,EAAE4Y,EAAEjB,EAAEtX,MAAMR,EAAEQ,KAAK4Z,GAAGnD,EAAEzW,KAAK8Z,GAAGpD,EAAE1W,KAAKsZ,GAAG3C,EAAE/W,EAAEsX,SAASvU,EAAE/C,EAAEuX,OAAOP,EAAEhX,EAAE8b,SAAS7E,EAAE,SAASpb,EAAEmE,EAAED,EAAEH,GAAG,OAAO/D,IAAIA,EAAEmE,IAAInE,EAAEG,EAAE4a,KAAK7W,EAAEC,GAAGW,MAAM,EAAEf,EAAE,EAAEsX,EAAE,SAASrb,GAAG,OAAO8c,EAAE/Y,EAAEA,EAAE,IAAI,GAAG/D,EAAE,IAAI,EAAEsb,EAAEH,GAAG,SAASnb,EAAEG,EAAEgE,GAAG,IAAI4W,EAAE/a,EAAE,GAAG,KAAK,KAAK,OAAOmE,EAAE4W,EAAErU,cAAcqU,CAAC,EAAE,OAAOA,EAAEnZ,QAAQ2Z,GAAG,SAASvb,EAAE+a,GAAG,OAAOA,GAAG,SAAS/a,GAAG,OAAOA,GAAG,IAAI,KAAK,OAAO0B,OAAOvB,EAAEwd,IAAI7Y,OAAO,GAAG,IAAI,OAAO,OAAOgY,EAAE/Y,EAAE5D,EAAEwd,GAAG,EAAE,KAAK,IAAI,IAAI,OAAO1C,EAAE,EAAE,IAAI,KAAK,OAAO6B,EAAE/Y,EAAEkX,EAAE,EAAE,EAAE,KAAK,IAAI,MAAM,OAAOG,EAAEjX,EAAE+b,YAAYjF,EAAE/T,EAAE,GAAG,IAAI,OAAO,OAAOkU,EAAElU,EAAE+T,GAAG,IAAI,IAAI,OAAO9a,EAAE4d,GAAG,IAAI,KAAK,OAAOjB,EAAE/Y,EAAE5D,EAAE4d,GAAG,EAAE,KAAK,IAAI,IAAI,OAAOrc,OAAOvB,EAAE8d,IAAI,IAAI,KAAK,OAAO7C,EAAEjX,EAAEgc,YAAYhgB,EAAE8d,GAAG/C,EAAE,GAAG,IAAI,MAAM,OAAOE,EAAEjX,EAAEic,cAAcjgB,EAAE8d,GAAG/C,EAAE,GAAG,IAAI,OAAO,OAAOA,EAAE/a,EAAE8d,IAAI,IAAI,IAAI,OAAOvc,OAAOqC,GAAG,IAAI,KAAK,OAAO+Y,EAAE/Y,EAAEA,EAAE,EAAE,KAAK,IAAI,IAAI,OAAOsX,EAAE,GAAG,IAAI,KAAK,OAAOA,EAAE,GAAG,IAAI,IAAI,OAAOC,EAAEvX,EAAEiX,GAAE,GAAI,IAAI,IAAI,OAAOM,EAAEvX,EAAEiX,GAAE,GAAI,IAAI,IAAI,OAAOtZ,OAAOsZ,GAAG,IAAI,KAAK,OAAO8B,EAAE/Y,EAAEiX,EAAE,EAAE,KAAK,IAAI,IAAI,OAAOtZ,OAAOvB,EAAEoe,IAAI,IAAI,KAAK,OAAOzB,EAAE/Y,EAAE5D,EAAEoe,GAAG,EAAE,KAAK,IAAI,MAAM,OAAOzB,EAAE/Y,EAAE5D,EAAEse,IAAI,EAAE,KAAK,IAAI,IAAI,OAAOva,EAAE,OAAO,IAAI,CAAptB,CAAstBlE,IAAIkE,EAAEtC,QAAQ,IAAI,GAAI,GAAE,EAAEga,EAAEE,UAAU,WAAW,OAAO,IAAI9G,KAAK8K,MAAMvb,KAAK+Y,GAAG+C,oBAAoB,GAAG,EAAEzE,EAAEtU,KAAK,SAASyT,EAAEM,EAAExW,GAAG,IAAIyW,EAAEC,EAAEhX,KAAKiX,EAAEsB,EAAEzY,EAAEgX,GAAGO,EAAEgB,EAAE7B,GAAGpO,GAAGiP,EAAEE,YAAYvX,KAAKuX,aAAa3b,EAAEsc,EAAElY,KAAKqX,EAAEU,EAAE,WAAW,OAAOQ,EAAElB,EAAEL,EAAEK,EAAE,EAAE,OAAOJ,GAAG,KAAKJ,EAAEE,EAAEgB,IAAI,GAAG,MAAM,KAAKpV,EAAEoU,EAAEgB,IAAI,MAAM,KAAKnB,EAAEG,EAAEgB,IAAI,EAAE,MAAM,KAAKpB,EAAEI,GAAGmB,EAAE9P,GAAG,OAAO,MAAM,KAAKsO,EAAEK,GAAGmB,EAAE9P,GAAG,MAAM,MAAM,KAAKqO,EAAEM,EAAEmB,EAAEtY,EAAE,MAAM,KAAKJ,EAAEuX,EAAEmB,EAAEtc,EAAE,MAAM,KAAK+D,EAAEoX,EAAEmB,EAAEzc,EAAE,MAAM,QAAQsb,EAAEmB,EAAE,OAAO5X,EAAEyW,EAAEwB,EAAE7B,EAAEK,EAAE,EAAEM,EAAE+D,YAAY,WAAW,OAAOpb,KAAKwa,MAAM7X,GAAG6W,EAAE,EAAEnC,EAAE4D,QAAQ,WAAW,OAAOlD,EAAE/X,KAAKyY,GAAG,EAAEpB,EAAEmB,OAAO,SAAS/c,EAAEG,GAAG,IAAIH,EAAE,OAAOuE,KAAKyY,GAAG,IAAI7Y,EAAEI,KAAK4X,QAAQpB,EAAEsB,EAAErc,EAAEG,GAAE,GAAI,OAAO4a,IAAI5W,EAAE6Y,GAAGjC,GAAG5W,CAAC,EAAEyX,EAAEO,MAAM,WAAW,OAAOW,EAAET,EAAE9X,KAAK+Y,GAAG/Y,KAAK,EAAEqX,EAAE2D,OAAO,WAAW,OAAO,IAAIhC,KAAKhZ,KAAK8a,UAAU,EAAEzD,EAAE0E,OAAO,WAAW,OAAO/b,KAAKqa,UAAUra,KAAKgc,cAAc,IAAI,EAAE3E,EAAE2E,YAAY,WAAW,OAAOhc,KAAK+Y,GAAGiD,aAAa,EAAE3E,EAAEhc,SAAS,WAAW,OAAO2E,KAAK+Y,GAAGkD,aAAa,EAAEhF,CAAC,CAA/sJ,GAAmtJiF,EAAE9D,EAAEhd,UAAU,OAAOid,EAAEjd,UAAU8gB,EAAE,CAAC,CAAC,MAAM1F,GAAG,CAAC,KAAK7W,GAAG,CAAC,KAAKH,GAAG,CAAC,KAAKiX,GAAG,CAAC,KAAKC,GAAG,CAAC,KAAK/T,GAAG,CAAC,KAAKkU,GAAG,CAAC,KAAKC,IAAIhW,SAAS,SAASrF,GAAGygB,EAAEzgB,EAAE,IAAI,SAASG,GAAG,OAAOoE,KAAK2a,GAAG/e,EAAEH,EAAE,GAAGA,EAAE,GAAG,CAAE,IAAG4c,EAAE8D,OAAO,SAAS1gB,EAAEG,GAAG,OAAOH,EAAE2gB,KAAK3gB,EAAEG,EAAEwc,EAAEC,GAAG5c,EAAE2gB,IAAG,GAAI/D,CAAC,EAAEA,EAAEG,OAAOV,EAAEO,EAAEgE,QAAQlE,EAAEE,EAAEwC,KAAK,SAASpf,GAAG,OAAO4c,EAAE,IAAI5c,EAAE,EAAE4c,EAAEiE,GAAGvE,EAAEG,GAAGG,EAAEkE,GAAGxE,EAAEM,EAAEvY,EAAE,GAAGuY,CAAE,CAAl6Nzc,yBCAf4gB,QAAmK,WAAwB,IAAI5gB,EAAE,CAAC6gB,IAAI,YAAYC,GAAG,SAASC,EAAE,aAAaC,GAAG,eAAeC,IAAI,sBAAsBC,KAAK,6BAA6BrhB,EAAE,0FAA0FmE,EAAE,OAAO4W,EAAE,QAAQ7W,EAAE,qBAAqBgX,EAAE,CAAE,EAACnX,EAAE,SAAS5D,GAAG,OAAOA,GAAGA,IAAIA,EAAE,GAAG,KAAK,IAAI,EAAM8a,EAAE,SAAS9a,GAAG,OAAO,SAASH,GAAGuE,KAAKpE,IAAIH,CAAC,CAAC,EAAEmb,EAAE,CAAC,sBAAsB,SAAShb,IAAIoE,KAAK+c,OAAO/c,KAAK+c,KAAK,CAAA,IAAKC,OAAO,SAASphB,GAAG,IAAIA,EAAE,OAAO,EAAE,GAAG,MAAMA,EAAE,OAAO,EAAE,IAAIH,EAAEG,EAAEuR,MAAM,gBAAgBvN,EAAE,GAAGnE,EAAE,KAAKA,EAAE,IAAI,GAAG,OAAO,IAAImE,EAAE,EAAE,MAAMnE,EAAE,IAAImE,EAAEA,CAAC,CAAhI,CAAkIhE,EAAE,GAAGib,EAAE,SAASjb,GAAG,IAAIH,EAAEkb,EAAE/a,GAAG,OAAOH,IAAIA,EAAE+R,QAAQ/R,EAAEA,EAAE+D,EAAEgB,OAAO/E,EAAEmb,GAAG,EAAEH,EAAE,SAAS7a,EAAEH,GAAG,IAAImE,EAAE4W,EAAEG,EAAE+E,SAAS,GAAGlF,GAAG,IAAI,IAAI7W,EAAE,EAAEA,GAAG,GAAGA,GAAG,EAAE,GAAG/D,EAAE4R,QAAQgJ,EAAE7W,EAAE,EAAElE,KAAK,EAAE,CAACmE,EAAED,EAAE,GAAG,KAAK,OAAOC,EAAEhE,KAAKH,EAAE,KAAK,MAAM,OAAOmE,CAAC,EAAEkX,EAAE,CAACmG,EAAE,CAACtd,EAAE,SAAS/D,GAAGoE,KAAKkd,UAAUzG,EAAE7a,GAAE,EAAG,GAAG8a,EAAE,CAAC/W,EAAE,SAAS/D,GAAGoE,KAAKkd,UAAUzG,EAAE7a,GAAE,EAAG,GAAGuc,EAAE,CAAC,KAAK,SAASvc,GAAGoE,KAAKmd,aAAa,KAAKvhB,CAAC,GAAGwhB,GAAG,CAACxd,EAAE,SAAShE,GAAGoE,KAAKmd,aAAa,IAAIvhB,CAAC,GAAGyhB,IAAI,CAAC,QAAQ,SAASzhB,GAAGoE,KAAKmd,cAAcvhB,CAAC,GAAG4D,EAAE,CAACgX,EAAEE,EAAE,YAAY4G,GAAG,CAAC9G,EAAEE,EAAE,YAAYW,EAAE,CAACb,EAAEE,EAAE,YAAY6G,GAAG,CAAC/G,EAAEE,EAAE,YAAY8G,EAAE,CAAChH,EAAEE,EAAE,UAAUG,EAAE,CAACL,EAAEE,EAAE,UAAU+G,GAAG,CAACjH,EAAEE,EAAE,UAAUgH,GAAG,CAAClH,EAAEE,EAAE,UAAUqB,EAAE,CAACvB,EAAEE,EAAE,QAAQiH,GAAG,CAAC/d,EAAE8W,EAAE,QAAQkH,GAAG,CAACje,EAAE,SAAS/D,GAAG,IAAIH,EAAEkb,EAAES,QAAQxX,EAAEhE,EAAEuR,MAAM,OAAO,GAAGnN,KAAK6d,IAAIje,EAAE,GAAGnE,EAAE,IAAI,IAAI+a,EAAE,EAAEA,GAAG,GAAGA,GAAG,EAAE/a,EAAE+a,GAAGnZ,QAAQ,SAAS,MAAMzB,IAAIoE,KAAK6d,IAAIrH,EAAE,GAAGS,EAAE,CAACT,EAAEE,EAAE,UAAUoH,GAAG,CAACle,EAAE8W,EAAE,UAAUqH,IAAI,CAACpe,EAAE,SAAS/D,GAAG,IAAIH,EAAEob,EAAE,UAAUjX,GAAGiX,EAAE,gBAAgBpb,EAAEmB,KAAK,SAAShB,GAAG,OAAOA,EAAE2E,MAAM,EAAE,EAAG,KAAIiN,QAAQ5R,GAAG,EAAE,GAAGgE,EAAE,EAAE,MAAM,IAAIgQ,MAAM5P,KAAK2X,MAAM/X,EAAE,IAAIA,CAAC,GAAGoe,KAAK,CAACre,EAAE,SAAS/D,GAAG,IAAIH,EAAEob,EAAE,UAAUrJ,QAAQ5R,GAAG,EAAE,GAAGH,EAAE,EAAE,MAAM,IAAImU,MAAM5P,KAAK2X,MAAMlc,EAAE,IAAIA,CAAC,GAAGwiB,EAAE,CAAC,WAAWvH,EAAE,SAASwH,GAAG,CAACte,EAAE,SAAShE,GAAGoE,KAAK0X,KAAKlY,EAAE5D,EAAE,GAAGuiB,KAAK,CAAC,QAAQzH,EAAE,SAAS0H,EAAExH,EAAEyH,GAAGzH,GAAG,SAASjU,EAAE/C,GAAG,IAAI4W,EAAE7W,EAAE6W,EAAE5W,EAAED,EAAEgX,GAAGA,EAAE2H,QAAQ,IAAI,IAAI9e,GAAGI,EAAE4W,EAAEnZ,QAAQ,qCAAqC,SAAS5B,EAAEmE,EAAE4W,GAAG,IAAIG,EAAEH,GAAGA,EAAEpJ,cAAc,OAAOxN,GAAGD,EAAE6W,IAAI5a,EAAE4a,IAAI7W,EAAEgX,GAAGtZ,QAAQ,2CAA2CzB,EAAEH,EAAEmE,GAAG,OAAOnE,GAAGmE,EAAEW,MAAM,EAAG,GAAG,KAAI4M,MAAM1R,GAAGib,EAAElX,EAAEK,OAAO+W,EAAE,EAAEA,EAAEF,EAAEE,GAAG,EAAE,CAAC,IAAIC,EAAErX,EAAEoX,GAAGH,EAAEK,EAAED,GAAGlU,EAAE8T,GAAGA,EAAE,GAAGnW,EAAEmW,GAAGA,EAAE,GAAGjX,EAAEoX,GAAGtW,EAAE,CAACie,MAAM5b,EAAE6b,OAAOle,GAAGuW,EAAExZ,QAAQ,WAAW,GAAG,CAAC,OAAO,SAASzB,GAAG,IAAI,IAAIH,EAAE,CAAE,EAACmE,EAAE,EAAE4W,EAAE,EAAE5W,EAAE8W,EAAE9W,GAAG,EAAE,CAAC,IAAID,EAAEH,EAAEI,GAAG,GAAG,iBAAiBD,EAAE6W,GAAG7W,EAAEE,WAAW,CAAC,IAAI8W,EAAEhX,EAAE4e,MAAM3H,EAAEjX,EAAE6e,OAAO3H,EAAEjb,EAAE2E,MAAMiW,GAAGC,EAAEE,EAAE9I,KAAKgJ,GAAG,GAAGD,EAAEtb,KAAKG,EAAEgb,GAAG7a,EAAEA,EAAEyB,QAAQoZ,EAAE,GAAG,CAAC,CAAC,OAAO,SAAS7a,GAAG,IAAIH,EAAEG,EAAEshB,UAAU,QAAG,IAASzhB,EAAE,CAAC,IAAImE,EAAEhE,EAAE6iB,MAAMhjB,EAAEmE,EAAE,KAAKhE,EAAE6iB,OAAO,IAAI,KAAK7e,IAAIhE,EAAE6iB,MAAM,UAAU7iB,EAAEshB,SAAS,CAAC,CAAxH,CAA0HzhB,GAAGA,CAAC,CAAC,CAAC,OAAO,SAASG,EAAEH,EAAEmE,GAAGA,EAAEE,EAAE4e,mBAAkB,EAAG9iB,GAAGA,EAAE+iB,oBAAoBnf,EAAE5D,EAAE+iB,mBAAmB,IAAInI,EAAE/a,EAAEL,UAAUuE,EAAE6W,EAAE7a,MAAM6a,EAAE7a,MAAM,SAASC,GAAG,IAAIH,EAAEG,EAAE6b,KAAKjB,EAAE5a,EAAE8c,IAAIlZ,EAAE5D,EAAE0c,KAAKtY,KAAK2Y,GAAGnC,EAAE,IAAIE,EAAElX,EAAE,GAAG,GAAG,iBAAiBkX,EAAE,CAAC,IAAIE,GAAE,IAAKpX,EAAE,GAAGqX,GAAE,IAAKrX,EAAE,GAAGiX,EAAEG,GAAGC,EAAEC,EAAEtX,EAAE,GAAGqX,IAAIC,EAAEtX,EAAE,IAAImX,EAAE3W,KAAKib,WAAWrE,GAAGE,IAAIH,EAAE/W,EAAE2c,GAAGzF,IAAI9W,KAAK+Y,GAAG,SAASnd,EAAEH,EAAEmE,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK4N,QAAQ/R,IAAI,EAAE,OAAO,IAAIud,MAAM,MAAMvd,EAAE,IAAI,GAAGG,GAAG,IAAI4a,EAAE7T,EAAElH,EAAFkH,CAAK/G,GAAG+D,EAAE6W,EAAEkB,KAAKf,EAAEH,EAAEmB,MAAMnY,EAAEgX,EAAEqH,IAAInH,EAAEF,EAAEiI,MAAM7H,EAAEJ,EAAEoI,QAAQ/H,EAAEL,EAAEqI,QAAQpI,EAAED,EAAE2G,aAAarG,EAAEN,EAAEuG,KAAKzc,EAAE,IAAI0Y,KAAK3B,EAAE7X,IAAIG,GAAGgX,EAAE,EAAErW,EAAEmZ,WAAWxC,EAAEtX,GAAGW,EAAE+Y,cAAc4E,EAAE,EAAEte,IAAIgX,IAAIsH,EAAEtH,EAAE,EAAEA,EAAE,EAAErW,EAAEiZ,YAAY,IAAIzZ,EAAE4W,GAAG,EAAEtO,EAAEwO,GAAG,EAAEmB,EAAElB,GAAG,EAAEqB,EAAEzB,GAAG,EAAE,OAAOK,EAAE,IAAIkC,KAAKA,KAAKG,IAAIlC,EAAEgH,EAAE5G,EAAEvX,EAAEsI,EAAE2P,EAAEG,EAAE,GAAGpB,EAAEkG,OAAO,MAAMpd,EAAE,IAAIoZ,KAAKA,KAAKG,IAAIlC,EAAEgH,EAAE5G,EAAEvX,EAAEsI,EAAE2P,EAAEG,IAAI,IAAIc,KAAK/B,EAAEgH,EAAE5G,EAAEvX,EAAEsI,EAAE2P,EAAEG,EAAE,CAAC,MAAMtc,GAAG,OAAO,IAAIod,KAAK,GAAG,CAAC,CAAzc,CAA2cvd,EAAEib,EAAEF,GAAGxW,KAAKyP,OAAOqH,IAAG,IAAKA,IAAI9W,KAAKyY,GAAGzY,KAAKwY,OAAO1B,GAAG2B,IAAIhC,GAAGhb,GAAGuE,KAAKqT,OAAOqD,KAAK1W,KAAK+Y,GAAG,IAAIC,KAAK,KAAKrC,EAAE,CAAA,CAAE,MAAM,GAAGD,aAAa7a,MAAM,IAAI,IAAIyE,EAAEoW,EAAE7W,OAAOwX,EAAE,EAAEA,GAAG/W,EAAE+W,GAAG,EAAE,CAAC7X,EAAE,GAAGkX,EAAEW,EAAE,GAAG,IAAIJ,EAAErX,EAAEG,MAAMC,KAAKR,GAAG,GAAGyX,EAAEoD,UAAU,CAACra,KAAK+Y,GAAG9B,EAAE8B,GAAG/Y,KAAKyY,GAAGxB,EAAEwB,GAAGzY,KAAKyP,OAAO,KAAK,CAAC4H,IAAI/W,IAAIN,KAAK+Y,GAAG,IAAIC,KAAK,IAAI,MAAMrZ,EAAErE,KAAK0E,KAAKpE,EAAE,CAAC,CAAE,CAA5kHH,ICGnFqjB,EAAM3C,OAAOuC,GAKN,MAAMK,EAAY,CAACC,EAAiB3L,KACvC,IAAIoE,EAIJ,GAAIpE,EACA,OAAQA,GACR,IAAK,WAEDoE,EAAOuH,EACP,MACJ,IAAK,WACDvH,EAAOqH,EAAME,EAAQze,MAAM,GAAI,2BAA2Bsa,OAC1D,MACJ,IAAK,QACDpD,EAAOqH,EAAME,EAAS,uBAAuBnE,OAC7C,MACJ,IAAK,OACDpD,EAAOqH,EAAME,GAASnE,OACtB,MAEJ,QACIpD,EAAOqH,EAAME,EAAS3L,GAAQ,GAAMyH,UAI5C,OAAOrD,CAAI,ECnBFwH,EAAe,CAAChiB,EAAqBkW,KAC9C,GAAIlW,GAAMiiB,cAAgB/jB,QAAUA,OAAOC,UAAU4B,eAAe1B,KAAK2B,EAAM,UAAY9B,OAAOyL,KAAK3J,GAAMkiB,MAAKne,IAAS,CAAC,OAAQ,QAAS,OAAQ,cAAcvE,SAASuE,KACxK,OAAQ/D,EAEZ,MAAMmiB,EAAsB,CACxB1iB,KAAMO,GAEV,OAAQkW,EAAe5H,MACvB,IAAK,SACqB,iBAATtO,IACTmiB,EAASliB,KAAOC,OAAOiiB,EAAS1iB,MAChC0iB,EAASC,MAAQD,EAASliB,MAE9B,MACJ,IAAK,OACGiW,EAAeE,SACf+L,EAASC,MAAQN,EAAU5hB,OAAOiiB,EAAS1iB,MAAOyW,EAAeE,SAErE,MACJ,IAAK,SACD+L,EAASliB,KAAOC,OAAOiiB,EAAS1iB,MAChC0iB,EAAS1iB,KAAO4iB,WAAWF,EAAS1iB,MACpC0iB,EAASC,MAAQD,EAAS1iB,KAC1B,MACJ,IAAK,OAAQ,CACT,MAAMqF,EAAOlG,MAAMC,QAAQsjB,EAAS1iB,MAChC,CAACV,SAAU,KACPW,WAAayiB,EAAS1iB,MAC1BuR,EAAY,OAAO9Q,OAAOiiB,EAAS1iB,cACvC0iB,EAAS1iB,KAAOqF,EAAKpF,YAAc,GACnC,MAAMO,EAAOX,EAAUwF,GACvBqd,EAASliB,KAAOA,EAChBkiB,EAASC,MAAQniB,EACjB,KACH,CACD,IAAK,UAC4B,iBAAlBkiB,EAAS1iB,OAChB0iB,EAAS1iB,KAAO0iB,EAAS1iB,KAAKyF,cAAclE,QAEhDmhB,EAAS1iB,MAAQ,CAAC,SAAS,EAAO,UAAM+N,EAAW,GAAGhO,SAAS2iB,EAAS1iB,MACxE0iB,EAASC,MAAQD,EAAS1iB,KAAO,EAAI,EACrC0iB,EAASliB,KAAOC,OAAOiiB,EAAS1iB,MAChC,MACJ,IAAK,QACD0iB,EAASliB,KAAO,GAChBkiB,EAASC,MAAQ,EACjB,MACJ,QACID,EAASliB,KAAOxB,KAAKuF,UAAUme,EAAS1iB,MAI5C,OAAO0iB,CAAQ,EAuDNG,EAAkBtiB,IAC3B,GACIA,aAAgB9B,QAChB8B,EAAKiiB,cAAgB/jB,QACrB8B,EAAKD,eAAe,UACE,iBAAdC,EAAKC,MAA0C,iBAAdD,EAAKP,MAE9C,OAAOO,EAEX,MAAMmiB,EAA4B,CAC9B1iB,KAAMO,GAEV,GAAoB,iBAATA,GACP,GAAIA,EAAK4C,OAAQ,CACb,MAAMkC,EAAOkM,EAAY,OAAOhR,UAChC,GAAI8E,EAAKpF,aAA0C,IAA3BoF,EAAKpF,WAAWkD,QAAgD,UAAhCkC,EAAKpF,WAAW,GAAGX,UAAuB,CAC9FojB,EAAS1iB,KAAOqF,EAAKpF,WACrByiB,EAAS7T,KAAO,OAChB,MAAMrO,EAAOX,EAAUwF,GACvBqd,EAASliB,KAAOA,CACnB,CACJ,MAEM,CAAC,UAAMuN,GAAWhO,SAASQ,GAClCmiB,EAASliB,KAAO,GAEhBkiB,EAASliB,KAAOxB,KAAKuF,UAAUhE,GAEnC,OAAOmiB,CAAQ,EA0BNI,EAAgB,CAACC,EAAwBvjB,OAAoCuO,EAAW0I,EAAgBuM,EAAaC,KAE9H,MAAMjjB,EAAO,CACTA,KAAM,GACNwW,SAAU,IAEd,GAAIuM,EAAWvM,SACXxW,EAAKwW,SAAWuM,EAAWvM,SAAStW,KAAK+W,GAAiC4L,EAAe5L,UACtF,GAAIzX,GAAK0jB,MACZljB,EAAKwW,SAAWrX,MAAMsE,KAAKjE,EAAI0jB,MAAMC,iBAAiB,OAAOjjB,KAAI,CAACkjB,EAAIpb,KAClE,MAAMiP,EAjCe,CAAC1W,IAC9B,MAAM8E,EAAOsJ,EAAUpO,EAAM,CAACqF,cAAc,IAC5C,IAAI8c,EAiBJ,OATIA,GAPArd,EAAKpF,YAA0C,IAA3BoF,EAAKpF,WAAWkD,QAAgD,UAAhCkC,EAAKpF,WAAW,GAAGX,SAO5D,CACPU,KAAMO,EAAK8iB,UACXxU,KAAM,UARC,CACP7O,KAAMqF,EAAKpF,WACX4O,KAAM,OACNrO,KAAMX,EAAUwF,IAUxBqd,EAAShd,WAAaL,EAAKK,WAEpBgd,CAAQ,EAcSY,CAAkBF,GAC7B3M,EAAezO,KAChByO,EAAezO,GAAS,CACpB6G,KAAMmU,EACNrM,OAAQsM,EACR9L,YAAY,EACZN,UAAU,IAGlB,MAAM0M,EAAW9M,EAAezO,GAgBhC,MAfkD,UAA9Cob,EAAGI,QAAQ3M,UAAUtV,OAAOkE,eAAuE,UAA1C2d,EAAGI,QAAQvP,MAAM1S,OAAOkE,gBACjF8d,EAAS1M,UAAW,GAE4B,UAAhDuM,EAAGI,QAAQrM,YAAY5V,OAAOkE,gBAC9B8d,EAASpM,YAAa,GAEsB,SAA5CiM,EAAGI,QAAQviB,QAAQM,OAAOkE,eAAgF,SAApD2d,EAAGK,aAAa,WAAWliB,OAAOkE,gBACxF8d,EAAStiB,QAAS,GAElB,CAAC,SAAU,SAAU,OAAQ,OAAQ,UAAW,SAASlB,SAASqjB,EAAGI,QAAQ3U,QAC7E0U,EAAS1U,KAAOuU,EAAGI,QAAQ3U,KACL,SAAlB0U,EAAS1U,MAAmBuU,EAAGI,QAAQ7M,SACvC4M,EAAS5M,OAASyM,EAAGI,QAAQ7M,SAG9BM,CAAO,SAEf,GAAI8L,EAAW/iB,MAAMmD,OAAQ,CAChC,MAAMugB,EAAWX,EAAW/iB,KAAK,GAC3B2jB,EAAgBxkB,MAAMC,QAAQskB,GAAYA,EAAWA,EAAS5K,MACpE9Y,EAAKwW,SAAWmN,EAAczjB,KAAK0jB,GAAyBf,EAAe,KAC9E,MAAUrjB,GAAKqkB,QAAQ1gB,SACpBnD,EAAKwW,SAAWrX,MAAMsE,KAAKjE,EAAIqkB,QAAQ,GAAG3L,KAAK,GAAGY,OAAO5Y,KAAK0jB,GAAuBf,EAAe,OAExG,IAAK,IAAI5f,EAAE,EAAGA,EAAEjD,EAAKwW,SAASrT,OAAQF,IAE7BwT,EAAexT,KAChBwT,EAAexT,GAAK,CAChB4L,KAAMmU,EACNrM,OAAQsM,EACRpM,UAAU,EACVM,YAAY,IAIxB,GAAI4L,EAAW/iB,KAAM,CACjB,MAAMwW,EAAWxW,EAAKwW,SAAStW,KAAK+W,GAA4BA,EAAQjX,KAAOS,OAAOwW,EAAQjX,MAAQiX,EAAQzW,OAC9GR,EAAKA,KAAO+iB,EAAW/iB,KAAKE,KAAK0Y,IAC7B,IAAIlT,EACAoT,EAiBJ,OAhBI3Z,MAAMC,QAAQwZ,IACdlT,EAAa,CAAA,EACboT,EAAQF,GACDA,EAAItY,eAAe,UAAY7B,OAAOyL,KAAK0O,GAAKrO,OAAMjG,GAAO,CAAC,QAAS,cAAcvE,SAASuE,MACrGoB,EAAakT,EAAIlT,WACjBoT,EAAQF,EAAIE,QAEZpT,EAAa,CAAA,EACboT,EAAQ,GACRra,OAAO0F,QAAQyU,GAAKxU,SAAQ,EAAE6S,EAAS1W,MACnC,MAAMyH,EAAQwO,EAAS1F,QAAQmG,GAC3BjP,GAAS,IACT8Q,EAAM9Q,GAASzH,EAClB,KAGF,CACHmF,aACAoT,MAAOA,EAAM5Y,KAAI,CAACK,EAAqByH,IAAkBua,EAAahiB,EAAMkW,EAAezO,MAC/E,GAEvB,MAAUxI,GAAKqkB,SAAS1gB,SACrBnD,EAAKA,KAAOb,MAAMsE,KAAKjE,EAAIqkB,QAAQ,GAAG3L,MAAMhY,KACxC0Y,IAAQ,CACJlT,WAAYxE,EAAqB0X,EAAIlT,YACrCoT,MAAO3Z,MAAMsE,KAAKmV,EAAIE,OAAO5Y,KACzB,CAACK,EAAMyH,KACH,MAAM0a,EAAWniB,EAAKijB,QAAQlB,QAC1BC,EAAahiB,EAAKijB,QAAQlB,QAAS7L,EAAezO,IAlMtD,EAACzH,EAAmBkW,KACxC,IAAIiM,EACJ,OAAQjM,EAAe5H,MACvB,IAAK,SACD6T,EAAW,CACP1iB,KAAMO,EAAK8iB,WAEf,MACJ,IAAK,OAAQ,CACT,MAAMrjB,EAAOO,EAAK8iB,UAClBX,EAAW,CACP1iB,OACA2iB,MAAON,EAAUriB,EAAMyW,EAAeE,SAE1C,KACH,CACD,IAAK,SAAU,CACX,MAAM3W,EAAO4iB,WAAWriB,EAAK8iB,WAC7BX,EAAW,CACP1iB,OACA2iB,MAAO3iB,EACPQ,KAAMD,EAAK8iB,WAEf,KACH,CACD,IAAK,UAAW,CACZ,MAAMrjB,GAAQ,CAAC,QAAS,IAAK,OAAQ,aAAaD,SAASQ,EAAK8iB,UAAU5d,cAAclE,QACxFmhB,EAAW,CACP1iB,OACAQ,KAAMR,EAAO,IAAM,IACnB2iB,MAAO3iB,EAAO,EAAI,GAEtB,KACH,CACD,QAEI0iB,EAAW,CACP1iB,KAFS2O,EAAUpO,EAAM,CAACqF,cAAc,IAE7B3F,YAAc,GACzBO,KAAMD,EAAK8iB,UACXV,MAAOpiB,EAAK8iB,WASpB,OAFAX,EAAShd,WAAaxE,EAAqBX,EAAKmF,YAEzCgd,CAAQ,EAmJSoB,CAAgBvjB,EAAMkW,EAAezO,IAIzC,OAHIzH,EAAKijB,QAAQb,QACbD,EAASC,MAAQoB,MAAMnB,WAAWriB,EAAKijB,QAAQb,QAAUpiB,EAAKijB,QAAQb,MAAQC,WAAWriB,EAAKijB,QAAQb,QAEnGD,CAAQ,SAQnC,GAAI1iB,EAAKA,KAAKmD,QAAUnD,EAAKA,KAAK,GAAG8Y,MAAM3V,SAAWnD,EAAKwW,SAASrT,OAChE,MAAM,IAAI+P,MACN,iCAGR,OAAOlT,CAAI,QClRFgkB,GACT5K,OAEA6K,GAEA,WAAAzB,CAAYyB,GACR3gB,KAAK2gB,GAAKA,EAEV3gB,KAAK8V,QAAS,CACjB,CAED,SAAA8K,CAAUlc,GAA0B,GAChC,GAAIA,IAAU1E,KAAK8V,OACf,OAEJ,MAAM+K,EAAY7gB,KAAK8V,OAGvB,GAFA9V,KAAK8V,OAASpR,EACd1E,KAAK2gB,GAAGG,gBACM,IAAVpc,GAAmB1E,KAAK2gB,GAAGhgB,QAAQ6S,QAAS,CAC5C,MAAMuN,EAAiBhjB,EAAqBiC,KAAK2gB,GAAGhgB,QAAQrC,QAAQwX,QAC9DkL,EAAYhhB,KAAK2gB,GAAGzkB,IAAI+kB,cAAc,KAAKF,KAC7CC,GACAA,EAAUE,eAAe,CAACC,MAAO,WAExC,CACDnhB,KAAK2gB,GAAGS,KAAK,uBAAwBphB,KAAK8V,OAAQ+K,EACrD,CAKD,GAAAxW,CAAI3N,GACA,IAAKb,MAAMC,QAAQY,IAASA,EAAKmD,OAAS,EACtC,OAGJ,MAAMyV,EAAmB,CACrBE,MAAO9Y,EAAKE,KAAI,CAACK,EAAgByH,KAC7B,MAAMyO,EAAiBnT,KAAK2gB,GAAGnjB,QAAQyiB,SAASvb,GAChD,OAAOua,EAAahiB,EAAMkW,EAAe,KAGjDnT,KAAK2gB,GAAGjkB,KAAKA,KAAKoJ,KAAKwP,GACvBtV,KAAK2gB,GAAGU,SAAU,EAClBrhB,KAAK2gB,GAAGW,QAAO,EAClB,CAKD,MAAAC,CAAOC,GACH,IAAI3lB,MAAMC,QAAQ0lB,GAQd,OAAOxhB,KAAKuhB,OAAO,CAACC,IAPpBxhB,KAAK2gB,GAAGjkB,KAAKA,KAAOsD,KAAK2gB,GAAGjkB,KAAKA,KAAKwO,QAAO,CAACuW,EAAmB/c,KAAmB8c,EAAO/kB,SAASiI,KAE9F1E,KAAK2gB,GAAGjkB,KAAKA,KAAKmD,SACpBG,KAAK2gB,GAAGU,SAAU,GAEtBrhB,KAAK2gB,GAAGW,QAAO,EAItB,CAMD,YAAAI,CAAahkB,EAAqBI,GAG9B,OAAOkC,KAAK2gB,GAAGjkB,KAAKA,KAAKilB,WACpBrM,IACG,MAAMrY,EAAOqY,EAAIE,MAAM9X,GAEvB,OADiBX,EAAWE,GACZkF,cAAc1F,SAASU,OAAOW,GAAOqE,cAAc,GAG9E,CAKD,OAAAyf,CAAQlkB,EAAqBI,GAEzB,MAAM4G,EAAQ1E,KAAK0hB,aAAahkB,EAAaI,GAE7C,GAAI4G,EAAQ,EACR,MAAO,CACHA,OAAQ,EACR4Q,IAAK,KACLuM,KAAM,IAId,MAAMvM,EAAMtV,KAAK2gB,GAAGjkB,KAAKA,KAAKgI,GAExBmd,EAAOvM,EAAIE,MAAM5Y,KAAKK,GAAmBA,EAAKP,OAEpD,MAAO,CACHgI,QACA4Q,MACAuM,OAEP,CAKD,SAAAC,CAAUN,EAAgB9kB,GACtB,MAAM4Y,EAAmB,CACrBE,MAAO9Y,EAAKE,KAAI,CAACK,EAAqByH,KAClC,MAAMyO,EAAiBnT,KAAK2gB,GAAGnjB,QAAQyiB,SAASvb,GAChD,OAAOua,EAAahiB,EAAMkW,EAAe,KAGjDnT,KAAK2gB,GAAGjkB,KAAKA,KAAKkG,OAAO4e,EAAQ,EAAGlM,GACpCtV,KAAK2gB,GAAGW,QAAO,EAClB,QC7GQS,GACTpB,GAEAV,SAEA+B,OAEA,WAAA9C,CAAYyB,GACR3gB,KAAK2gB,GAAKA,EACV3gB,KAAKyP,MACR,CAED,IAAAA,IACKzP,KAAKigB,SAAUjgB,KAAKgiB,QCvBK,EAACC,EAAgB,GAAIvC,EAAaC,KAEhE,IAAIniB,EAA8C,GAC9CmT,GAAwD,EAC5D,MAAMyD,EAA4C,GAmHlD,OA/GA6N,EAAcnhB,SAAQpE,KAGMb,MAAMC,QAAQY,EAAK8kB,QAAU9kB,EAAK8kB,OAAS,CAAC9kB,EAAK8kB,SAEzD1gB,SAASohB,IACjB1kB,EAAQ0kB,GACJxlB,EAAK6O,OACL/N,EAAQ0kB,GAAU3W,KAAO7O,EAAK6O,MAGlC/N,EAAQ0kB,GAAY,CAChB3W,KAAM7O,EAAK6O,MAAQmU,EACnBnM,UAAU,EACVM,YAAY,GAGpB,MAAMD,EAASpW,EAAQ0kB,GAGnBxlB,EAAKkZ,SACLhC,EAAOgC,OAASlZ,EAAKkZ,QAGrBlZ,EAAK2W,OACLO,EAAOP,OAAS3W,EAAK2W,OACA,SAAd3W,EAAK6O,OACZqI,EAAOP,OAASsM,GAGhBjjB,EAAKiZ,YACL/B,EAAO+B,UAAYjZ,EAAKiZ,WAGxBjZ,EAAKoX,cACLF,EAAOE,YAAcpX,EAAKoX,aAG1BpX,EAAK8b,SACL5E,EAAO4E,OAAS9b,EAAK8b,SAGH,IAAlB9b,EAAK6W,SACLK,EAAOL,UAAW,GAEd7W,EAAKylB,UACLvO,EAAOuO,QAAUzlB,EAAKylB,SAEtBzlB,EAAK0lB,YACLxO,EAAOwO,UAAY1lB,EAAK0lB,aAIR,IAApB1lB,EAAKmX,WACLD,EAAOC,YAAa,EAEhBnX,EAAK2lB,cACLzO,EAAOyO,YAAc3lB,EAAK2lB,cAI9BzO,EAAOC,YAAcD,EAAOL,gBACU,IAA3B7W,EAAK4lB,oBACZ1O,EAAO0O,kBAAoB5lB,EAAK4lB,mBAIpC5lB,EAAK6lB,eACL3O,EAAO2O,aAAe7lB,EAAK6lB,cAG3B7lB,EAAKiB,SACLiW,EAAOjW,QAAS,GAGhBjB,EAAKwO,SACL0I,EAAO1I,OAASxO,EAAKwO,QAGrBxO,EAAK8lB,eACL5O,EAAO4O,aAAe9lB,EAAK8lB,cAG3B9lB,EAAKiU,OACDjU,EAAKwO,OACLkJ,EAAQ8N,GAAYxlB,EAAKiU,KAGzBA,EAAO,CAACiD,OAAQsO,EACZjO,IAAKvX,EAAKiU,YAIkB,IAA7BjU,EAAK+lB,sBACZ7O,EAAO6O,oBAAsB/lB,EAAK+lB,oBACrC,GAEH,IAKNjlB,EAAUA,EAAQZ,KAAIgX,GAAUA,GAE5B,CAACrI,KAAMmU,EACHrM,OAAwB,SAAhBqM,EAAyBC,OAAgBlV,EACjD8I,UAAU,EACVM,YAAY,KAIb,CACHrW,EAAS,CAAC4W,UACNzD,OACA2D,OALO,IAMd,EDpGkCoO,CAAmB1iB,KAAK2gB,GAAGhgB,QAAQnD,QAASwC,KAAK2gB,GAAGhgB,QAAQ4K,KAAMvL,KAAK2gB,GAAGhgB,QAAQ0S,OACpH,CAED,GAAAgI,CAAIzH,GACA,OAAIA,EAAS,GAAKA,GAAU5T,KAAK2iB,OACtB,KAEJ,IAAI3iB,KAAKigB,SAASrM,GAC5B,CAED,IAAA+O,GACI,OAAO3iB,KAAKigB,SAASpgB,MACxB,CAKD,IAAAsF,CAAK3H,GACD,GAAuB,IAAnBA,EAAQqC,OAAc,CAEtB,MAAMgiB,EAAO7hB,KAAK2gB,GAAGjkB,KAAKwW,SAAStW,KAAI,CAACgmB,EAAuBle,IAAkBA,IAE3EkU,EAAIpb,EAAQ,GACZwZ,EAAIxZ,EAAQ,GACZ+a,EAAIsJ,EAAK7K,GAIf,OAHA6K,EAAK7K,GAAK6K,EAAKjJ,GACfiJ,EAAKjJ,GAAKL,EAEHvY,KAAKqf,MAAMwC,EACrB,CACJ,CAKD,KAAAxC,CAAM7hB,GAEFwC,KAAK2gB,GAAGjkB,KAAKwW,SAAW1V,EAAQZ,KAAK8H,GAAkB1E,KAAK2gB,GAAGjkB,KAAKwW,SAASxO,KAC7E1E,KAAK2gB,GAAGjkB,KAAKA,KAAKoE,SACbwU,GAAsBA,EAAIE,MAAQhY,EAAQZ,KAAK8H,GAAkB4Q,EAAIE,MAAM9Q,OAEhF1E,KAAKigB,SAAWziB,EAAQZ,KACnB8H,GAAkB1E,KAAKigB,SAASvb,KAIrC1E,KAAK2gB,GAAGW,QACX,CAKD,IAAAuB,CAAKrlB,GACI3B,MAAMC,QAAQ0B,KACfA,EAAU,CAACA,IAEVA,EAAQqC,SAGbrC,EAAQsD,SAAS4D,IACR1E,KAAKigB,SAASvb,KACf1E,KAAKigB,SAASvb,GAAS,CACnB6G,KAAM,WAGCvL,KAAKigB,SAASvb,GACtB/G,QAAS,CAAI,IAGxBqC,KAAK2gB,GAAGW,SACX,CAKD,IAAAwB,CAAKtlB,GACI3B,MAAMC,QAAQ0B,KACfA,EAAU,CAACA,IAEVA,EAAQqC,SAGbrC,EAAQsD,SAAS4D,IACR1E,KAAKigB,SAASvb,KACf1E,KAAKigB,SAASvb,GAAS,CACnB6G,KAAM,SACNgI,UAAU,WAGHvT,KAAKigB,SAASvb,GACf/G,MAAM,IAGxBqC,KAAK2gB,GAAGW,SACX,CAKD,OAAAyB,CAAQvlB,GAKJ,YAHgBiN,IAAZjN,IACAA,EAAU,IAAI3B,MAAMmE,KAAK2gB,GAAGjkB,KAAKwW,SAASrT,QAAQ+G,SAElD/K,MAAMC,QAAQ0B,GACPA,EAAQZ,KAAI8H,IAAU1E,KAAKigB,SAASvb,IAAQ/G,UAE/CqC,KAAKigB,SAASziB,IAAUG,MAEnC,CAKD,GAAA0M,CAAI3N,GACA,MAAMsmB,EAAoBhjB,KAAK2gB,GAAGjkB,KAAKwW,SAASrT,OAUhD,GATAG,KAAK2gB,GAAGjkB,KAAKwW,SAAWlT,KAAK2gB,GAAGjkB,KAAKwW,SAAS1S,OAAO,CAAC+e,EAAe7iB,EAAKiX,WAC1E3T,KAAK2gB,GAAGjkB,KAAKA,KAAKoE,SAAQ,CAACwU,EAAkB5Q,KACzC4Q,EAAIE,MAAQF,EAAIE,MAAMhV,OAAO,CAACye,EAAaviB,EAAKA,KAAKgI,GAAQhI,IAAO,IAExEsD,KAAKigB,SAAS+C,GAAqB,CAC/BzX,KAAM7O,EAAK6O,MAAQ,SACnBgI,UAAU,EACVM,YAAY,GAEZnX,EAAK6O,MAAQ7O,EAAK2W,QAAU3W,EAAK6W,UAAY7W,EAAKkZ,QAAUlZ,EAAKwO,OAAQ,CACzE,MAAM0I,EAAS5T,KAAKigB,SAAS+C,GAEzBtmB,EAAKkZ,SACLhC,EAAOgC,OAASlZ,EAAKkZ,QAGrBlZ,EAAK2W,SACLO,EAAOP,OAAS3W,EAAK2W,QAGrB3W,EAAKiZ,YACL/B,EAAO+B,UAAYjZ,EAAKiZ,WAGxBjZ,EAAKoX,cACLF,EAAOE,YAAcpX,EAAKoX,aAG1BpX,EAAK8b,SACL5E,EAAO4E,OAAS9b,EAAK8b,SAGH,IAAlB9b,EAAK6W,SACLK,EAAOL,UAAW,GAEd7W,EAAKylB,UACLvO,EAAOuO,QAAUzlB,EAAKylB,SAEtBzlB,EAAK0lB,YACLxO,EAAOwO,UAAY1lB,EAAK0lB,aAIR,IAApB1lB,EAAKmX,WACLD,EAAOC,YAAa,EAEhBnX,EAAK2lB,cACLzO,EAAOyO,YAAc3lB,EAAK2lB,cAI9BzO,EAAOC,YAAcD,EAAOL,WACxB7W,EAAK4lB,oBACL1O,EAAO0O,kBAAoB5lB,EAAK4lB,mBAIpC5lB,EAAKiB,SACLiW,EAAOjW,QAAS,GAGhBjB,EAAKwO,SACL0I,EAAO1I,OAASxO,EAAKwO,QAGrBxO,EAAK8lB,eACL5O,EAAO4O,aAAe9lB,EAAK8lB,aAElC,CACDxiB,KAAK2gB,GAAGW,QAAO,EAClB,CAKD,MAAAC,CAAO/jB,GACE3B,MAAMC,QAAQ0B,KACfA,EAAU,CAACA,IAGfwC,KAAK2gB,GAAGjkB,KAAKwW,SAAWlT,KAAK2gB,GAAGjkB,KAAKwW,SAAShI,QAAO,CAAC+X,EAA0Bve,KAAmBlH,EAAQf,SAASiI,KACpH1E,KAAK2gB,GAAGjkB,KAAKA,KAAKoE,SACbwU,GAAsBA,EAAIE,MAAQF,EAAIE,MAAMtK,QAAO,CAACoV,EAAiB5b,KAAmBlH,EAAQf,SAASiI,OAE9G1E,KAAK2gB,GAAGW,QAAO,EAClB,CAKD,MAAApW,CAAO0I,EAAgBnE,GAAO,GAE1B,IAAKzP,KAAKigB,SAASrM,IAAS1I,QAAQrL,OAEhC,OAGJ,MAAMqjB,EAAgBljB,KAAKgiB,OAAO5N,QAAQR,GAC1C,IAAIuP,EACJ,GAAID,EAAe,CACf,IAAIE,GAAa,EACjBD,EAAiBnjB,KAAKigB,SAASrM,GAAQ1I,OAAOiU,MAAMjU,KAC5CkY,IAGAlY,IAAWgY,IACXE,GAAa,IAEV,IAEd,KAAM,CACH,MAAMlY,EAASlL,KAAKigB,SAASrM,GAAQ1I,OACrCiY,EAAiBjY,EAASA,EAAO,QAAKT,CACzC,CAEG0Y,EACAnjB,KAAKgiB,OAAO5N,QAAQR,GAAUuP,EACvBD,IACPljB,KAAKgiB,OAAO5N,QAAQR,QAAUnJ,GAElCzK,KAAK2gB,GAAG0C,aAAe,EACvBrjB,KAAK2gB,GAAGW,SAEH7R,GACDzP,KAAK2gB,GAAGS,KAAK,mBAAoBxN,EAAQuP,EAEhD,CAKD,IAAAxS,CAAKjM,EAAeuP,OAAoCxJ,EAAWgF,GAAO,GACtE,MAAMmE,EAAS5T,KAAKigB,SAASvb,GAM7B,GAJK+K,GACDzP,KAAK2gB,GAAGS,KAAK,oBAAqB1c,EAAOuP,IAGxCA,EAAK,CACN,MAAMqP,KAAatjB,KAAKgiB,OAAOrR,MAAQ3Q,KAAKgiB,OAAOrR,KAAKiD,SAAWlP,IAAQ1E,KAAKgiB,OAAOrR,MAAMsD,IACvFuO,EAAe5O,GAAQ4O,cAAgB,CAAC,MAAO,QACrD,GAAKc,EAEE,CACH,MAAMC,EAAkBf,EAAahV,QAAQ8V,GAEzCrP,GADqB,IAArBsP,EACMf,EAAa,IAAM,MAClBe,IAAoBf,EAAa3iB,OAAQ,EAC1C2iB,EAAa,GAEbA,EAAae,EAAkB,EAE5C,MAVGtP,EAAMuO,EAAa3iB,OAAS2iB,EAAa,GAAK,KAYrD,CAED,MAAMgB,IAAW,CAAC,SAAU,QAAQ/mB,SAASmX,EAAOrI,OAChD,IAAIkY,KAAKC,SAAS9P,EAAO4E,QAAUxY,KAAK2gB,GAAGhgB,QAAQ6X,OAAQ,CACvDmL,MAAO,OACPxB,QAASvO,EAAOuO,SAAWniB,KAAK2gB,GAAGhgB,QAAQwhB,QAC3CC,UAAWxO,EAAOwO,WAAapiB,KAAK2gB,GAAGhgB,QAAQyhB,UAC/CE,kBAAmB1O,EAAO0O,mBAAoBtiB,KAAK2gB,GAAGhgB,QAAQ2hB,oBAItEtiB,KAAK2gB,GAAGjkB,KAAKA,KAAKiU,MAAK,CAACiT,EAAmBC,KACvC,MAAMC,EAAQF,EAAKpO,MAAM9Q,GACnBqf,EAAQF,EAAKrO,MAAM9Q,GACzB,IAAIsf,EAASF,EAAMzE,OAAStiB,EAAW+mB,GACnCG,EAASF,EAAM1E,OAAStiB,EAAWgnB,GACvC,GAAY,SAAR9P,EAAgB,CAChB,MAAMiQ,EAAOF,EACbA,EAASC,EACTA,EAASC,CACZ,CACD,OAAIV,GAA+B,iBAAXQ,GAA2C,iBAAXC,EAC7CT,EAASW,QAAQhnB,OAAO6mB,GAAS7mB,OAAO8mB,IAE/CD,EAASC,GACD,EACDD,EAASC,EACT,EAEJ,CAAC,IAGZjkB,KAAKgiB,OAAOrR,KAAO,CAACiD,OAAQlP,EACxBuP,OACAjU,KAAK2gB,GAAGyD,eAAevkB,QACvBG,KAAK2gB,GAAG0D,YAAYrkB,KAAK2gB,GAAGyD,gBAC5BpkB,KAAK2gB,GAAGS,KAAK,iBAAkB1c,EAAOuP,IAC9BxE,IACRzP,KAAK2gB,GAAG0C,aAAe,EACvBrjB,KAAK2gB,GAAGW,SACRthB,KAAK2gB,GAAGS,KAAK,iBAAkB1c,EAAOuP,GAE7C,CAMD,cAAAqQ,GACI,MAAMC,EAAiBvkB,KAAK2gB,GAAGjkB,KAAKwW,SAAShI,QAAO,CAACyI,EAAyBjP,KAAmB1E,KAAKigB,SAASvb,IAAQ/G,SACvH,IAAKqC,KAAK2gB,GAAGhgB,QAAQ6S,QAAQ3T,QAAUG,KAAK2gB,GAAGhgB,QAAQ6jB,eAAiBD,GAAgB1kB,OAAQ,CAE5FG,KAAKgiB,OAAO1N,OAAS,GACrB,MAAMmQ,EAAoG,CACtGC,UAAU,GAId,GAAI1kB,KAAK2gB,GAAGhgB,QAAQmU,QAAU9U,KAAK2gB,GAAGhgB,QAAQoU,OAAQ,CAE9C/U,KAAK2gB,GAAGhgB,QAAQ6S,QAAQ3T,SACxB4kB,EAAc/Q,cAAe,GAE7B1T,KAAK2gB,GAAGgE,WAER3kB,KAAK2gB,GAAGgE,UAAUC,cAAcngB,YAAYzE,KAAK2gB,GAAGgE,WAIxDF,EAAchR,gBAAiB,EAC/BzT,KAAK2gB,GAAGG,aAAa2D,GAErB,MAAMI,EAA6ChpB,MAAMsE,KAAKH,KAAK2gB,GAAGzkB,IAAI+kB,cAAc,iBAAiB6D,mBAAmBjF,iBAAiB,OAAS,IACtJ,IAAIkF,EAAa,EACjB,MAAMC,EAAuBhlB,KAAK2gB,GAAGjkB,KAAKwW,SAAStW,KAAI,CAACqmB,EAA0Bve,KAC9E,GAAI1E,KAAKigB,SAASvb,IAAQ/G,OACtB,OAAO,EAEX,MAAMsnB,EAAQJ,EAAkBE,GAAYG,YAE5C,OADAH,GAAc,EACPE,CAAK,IAGVE,EAAmBH,EAAqBI,QAC1C,CAACC,EAAOC,IAAcD,EAAQC,GAC9B,GAEJtlB,KAAKgiB,OAAO1N,OAAS0Q,EAAqBpoB,KAAI0oB,GAAaA,EAAYH,EAAmB,KAE7F,KAAM,CACHV,EAAcvP,cAAe,EAC7BlV,KAAK2gB,GAAGG,aAAa2D,GAErB,MAAMI,EAA4ChpB,MAAMsE,KAAKH,KAAK2gB,GAAGzkB,IAAI+kB,cAAc,iBAAiB6D,mBAAmBjF,iBAAiB,OAAS,IACrJ,IAAIkF,EAAa,EACjB,MAAMC,EAAuBhlB,KAAK2gB,GAAGjkB,KAAKwW,SAAStW,KAAI,CAACqmB,EAA0Bve,KAC9E,GAAI1E,KAAKigB,SAASvb,IAAQ/G,OACtB,OAAO,EAEX,MAAMsnB,EAAQJ,EAAkBE,GAAYG,YAE5C,OADAH,GAAc,EACPE,CAAK,IAGVE,EAAmBH,EAAqBI,QAC1C,CAACC,EAAOC,IAAcD,EAAQC,GAC9B,GAEJtlB,KAAKgiB,OAAO1N,OAAS0Q,EAAqBpoB,KAAI0oB,GAAaA,EAAYH,EAAmB,KAC7F,CAEDnlB,KAAK2gB,GAAGG,cACX,CACJ,EE3ZE,MCIMyE,GAAwC,CAEjDhS,UAAU,EACViF,OAAQ,KACR2J,SAAS,EACTC,UAAW,QAGXvO,YAAY,EACZwO,YAAa,OACbC,mBAAmB,EACnBkD,aAAa,EACb/C,oBAAqB,GACrBgD,qBAAsB,IACtBC,WAAW,EACXnD,cAAc,EAGd7lB,KAAM,CAAE,EACR6O,KAAM,OACN8H,OAAQ,aACR7V,QAAS,GAGTmoB,QAAQ,EACRC,QAAS,GACTC,cAAe,CAAC,EAAG,GAAI,GAAI,GAAI,IAC/BC,UAAU,EACVC,WAAW,EACXC,SAAU,IACVC,SAAU,IACVC,UAAW,IACXC,SAAU,IACVC,aAAc,IACdC,eAAe,EACfC,WAAY,EAEZ9S,QAAS,GAETgR,cAAc,EACd+B,aAAa,EAEbxR,QAAQ,EACRD,QAAQ,EACRxB,cAAc,EACdgD,aAAS7L,EAET+b,eAAe,EACfvR,UAAU,EAGVwR,aAAa,EACbzR,WAAW,EACX0R,aAAa,EACbC,eAAgB,CACZrkB,cAAc,GAIlBskB,OAAQ,CACJC,YAAa,YACbC,YAAa,sBACblB,QAAS,mBACTmB,UAAW,cACXC,OAAQ,mBACRC,UAAW,qCACX3jB,KAAM,8CAIV4jB,SD1E0B,CAACvmB,EAASzE,IAAQ,eAAeyE,EAAQrC,QAAQ6oB,cAE3ExmB,EAAQglB,QAAUhlB,EAAQklB,cACtB,eAAellB,EAAQrC,QAAQ8oB,mEAENzmB,EAAQrC,QAAQ4jB,uCAAuCvhB,EAAQimB,OAAOhB,gDAG/F,WAGJjlB,EAAQkT,WACJ,eAAelT,EAAQrC,QAAQ+oB,uCACX1mB,EAAQrC,QAAQ8N,uBAAuBzL,EAAQimB,OAAOC,mDAAmDlmB,EAAQimB,OAAOE,eAAe5qB,EAAI6J,GAAK,mBAAmB7J,EAAI6J,MAAQ,sBAEnM,2BAGMpF,EAAQrC,QAAQgpB,aAAa3mB,EAAQ6S,QAAQ3T,OAAS,mBAAmBc,EAAQ6S,8BAAgC,0BACjH7S,EAAQrC,QAAQipB,iBAE1B5mB,EAAQglB,OACJ,eAAehlB,EAAQrC,QAAQgF,eAC/B,uBAEU3C,EAAQrC,QAAQkpB,6BCoD9BlpB,QAAS,CACLmpB,OAAQ,mBACRvT,UAAW,sBACXqT,OAAQ,mBACRD,UAAW,sBACXxR,OAAQ,mBACR3B,WAAY,uBACZuT,SAAU,qBACVN,SAAU,qBACVO,SAAU,qBACVzc,OAAQ,mBACRmJ,aAAc,0BACduT,MAAO,kBACPC,gBAAiB,4BACjBlqB,OAAQ,mBACR2F,KAAM,iBACN8I,MAAO,kBACP0b,QAAS,oBACTN,WAAY,uBACZO,eAAgB,4BAChBC,mBAAoB,iCACpBC,uBAAwB,sCACxBZ,OAAQ,mBACRnF,SAAU,qBACVzN,OAAQ,mBACRY,MAAO,kBACP8R,IAAK,gBACLe,QAAS,sBCvCXF,GAAqB,CAACG,EAAcC,EAAeznB,EAAiC0nB,EAA8C,CAAA,KAA0B,CAC9JrsB,SAAU,KACVoG,WAAY,CACR2R,MACCsU,EAAMZ,SAAWY,EAAM1qB,OACpB,GAAGgD,EAAQrC,QAAQ0pB,sBAAsBrnB,EAAQrC,QAAQmpB,SACzDY,EAAM1qB,OACF,GAAGgD,EAAQrC,QAAQ0pB,sBAAsBrnB,EAAQrC,QAAQX,UAAUgD,EAAQrC,QAAQopB,WACnF/mB,EAAQrC,QAAQ0pB,oBAE5BrrB,WAAY,CACR,CACIX,SAAU,SACVoG,WAAY,CACR,YAAajF,OAAOgrB,GACpBpU,MAAOpT,EAAQrC,QAAQ2pB,uBACvB,aAActnB,EAAQimB,OAAOG,UAAU1pB,QAAQ,SAAUF,OAAOgrB,KAEpExrB,WAAY,CACR,CACIX,SAAU,QACVU,KAAM0rB,QAObE,GAAwB,CAACC,EAAsBC,EAAqBC,EAAqBC,EAAoB/nB,KAEtH,IAAIgoB,EAAqC,GAQzC,GALIhoB,EAAQolB,WACR4C,EAAe7iB,KAAKkiB,GAAmB,EAAGrnB,EAAQulB,UAAWvlB,IAI7DA,EAAQmlB,SAAU,CAClB,MAAM8C,EAAOL,EAAc,EAAIE,EAAc,EAC7CE,EAAe7iB,KAAKkiB,GAAmBY,EAAMjoB,EAAQqlB,SAAUrlB,EAAS,CAAChD,OAAQ4qB,IACpF,CAED,IAAIM,EAAQ,IAAIhtB,MAAM6sB,GAAY9hB,QAAQhK,KAAI8H,GAASsjB,GAAmBtjB,EAAM,EAAGvH,OAAOuH,EAAM,GAAI/D,EAAS,CAAC8mB,OAAS/iB,IAAW+jB,EAAY,MAiB9I,GAfI9nB,EAAQ0lB,gBAERwC,EA5GS,EAACC,EAAwCL,EAAqBM,EAAqBpoB,KAChG,MAAM2lB,EAAa3lB,EAAQ2lB,WACrBhoB,EAAUqC,EAAQrC,QAClB8nB,EAAezlB,EAAQylB,aAEvB4C,EAAmB,EAAI1C,EAC7B,IAAI2C,EAAeR,EAAcnC,EAC7B4C,EAAWT,EAAcnC,EAEzBmC,EAAc,EAAInC,EAAa0C,EAC/BE,EAAW,EAAIF,EACRP,EAAcM,GAAe,EAAIzC,EAAa0C,KACrDC,EAAeF,GAAe,EAAIC,IAEtC,MAAMG,EAAiD,GACvD,IAAK,IAAIjN,EAAI,EAAGA,GAAK6M,EAAa7M,IAC9B,GAAI,GAAKA,GAAKA,GAAK6M,GAAgB7M,GAAK+M,GAAgB/M,GAAKgN,EAAW,CACpE,MAAMjjB,EAAK6iB,EAAoB5M,EAAI,GACnCiN,EAA4BrjB,KAAKG,EACpC,CAEL,IAAImjB,EACJ,MAAMC,EAAiC,GAmCvC,OAlCAF,EAA4BroB,SAAQmF,IAChC,MAAMqjB,EAAaC,SAAUtjB,EAAGtJ,WAAW,GAAuByF,WAAW,aAAc,IAC3F,GAAIgnB,EAAY,CACZ,MAAMI,EAAqBD,SAAUH,EAAWzsB,WAAW,GAAuByF,WAAW,aAAc,IAC3G,GAAIknB,EAAaE,GAAsB,EACnCH,EAAYvjB,KAAKgjB,EAAoBU,SAClC,GAAIF,EAAaE,GAAsB,EAAG,CAC7C,MAAMC,EAAyB,CAC3BztB,SAAU,KACVoG,WAAY,CACR2R,MAAO,GAAGzV,EAAQ0pB,sBAAsB1pB,EAAQqpB,YAAYrpB,EAAQopB,YAExE/qB,WAAY,CACR,CACIX,SAAU,SACVoG,WAAY,CACR2R,MAAOzV,EAAQ2pB,wBAEnBtrB,WAAY,CACR,CACIX,SAAU,QACVU,KAAM0pB,OAM1BiD,EAAYvjB,KAAK2jB,EACpB,CACJ,CACDJ,EAAYvjB,KAAKG,GACjBmjB,EAAanjB,CAAE,IAGZojB,CAAW,EAmDNK,CACJb,EACAJ,EACAC,EACA/nB,IAMRgoB,EAAiBA,EAAenoB,OAAOqoB,GAGnCloB,EAAQmlB,SAAU,CAClB,MAAM6D,EAAOnB,EAAaE,EAAaD,EAAc,EACrDE,EAAe7iB,KAAKkiB,GAAmB2B,EAAMhpB,EAAQslB,SAAUtlB,EAAS,CAAChD,OAAQ6qB,IACpF,CAGG7nB,EAAQolB,WACR4C,EAAe7iB,KAAKkiB,GAAmBU,EAAY/nB,EAAQwlB,SAAUxlB,IAWzE,MARgC,CAC5B3E,SAAU,KACVoG,WAAY,CACR2R,MAAOpT,EAAQrC,QAAQypB,gBAE3BprB,WAAYksB,EAAMhpB,OAAS,EAAI8oB,EAAiB,GAGxC,QC9GHiB,GAETpsB,QAEAqsB,aAEAxG,aAEA3mB,KAEAotB,IAEA5tB,IAEA6tB,QAEAC,YAEA3I,QAEAsD,UAEAsF,aAEAC,YAEAC,OAEAC,SAEAC,WAEA9B,YAEAC,WAEA7nB,QAEA2pB,WAEAC,iBAEA1B,MAEA2B,MAEA5V,KAEA6V,YAEArG,eAEAsG,iBAEAC,cAEAC,eAEAlC,WAEAmC,YAEAC,kBAEAC,WAEA,WAAA7L,CAAY7J,EAAkC1U,EAA4B,IAEtE,MAAMzE,EAAuB,iBAAVmZ,EACflZ,SAAS8kB,cAAc5L,GACvBA,EACAnZ,aAAe8uB,iBACfhrB,KAAK9D,IAAMA,GAEX8D,KAAK9D,IAAMC,SAASJ,cAAc,SAClCG,EAAImG,YAAYrC,KAAK9D,MAGzB,MAAMyqB,EAAiB,IAChBpB,GAAcoB,kBACdhmB,EAAQgmB,gBAGTC,EAAS,IACRrB,GAAcqB,UACdjmB,EAAQimB,QAGTtoB,EAAU,IACTinB,GAAcjnB,WACdqC,EAAQrC,SAIf0B,KAAKW,QAAU,IACR4kB,MACA5kB,EACHgmB,iBACAC,SACAtoB,WAGJ0B,KAAKiqB,aAAejqB,KAAKW,QAAQ6kB,YAActpB,EAAI+uB,UAAY,GAE3DjrB,KAAKW,QAAQsU,SACbjV,KAAK9D,IAAI+Y,SAAWjV,KAAKW,QAAQsU,SAC1BjV,KAAKW,QAAQ6lB,gBAAwC,IAAvBxmB,KAAK9D,IAAI+Y,WAC9CjV,KAAK9D,IAAI+Y,SAAW,GAGxBjV,KAAKqqB,WAAa,CACda,SAAU,IAAMlrB,KAAKmrB,aAGzBnrB,KAAK8pB,IAAM,IAAInX,EAAQ3S,KAAKW,QAAQgmB,gBAAkB,CAAA,GAEtD3mB,KAAKkqB,aAAc,EACnBlqB,KAAK+pB,QAAU,GAEf/pB,KAAKqjB,aAAe,EACpBrjB,KAAKuoB,aAAc,EACnBvoB,KAAKgqB,aAAc,EACnBhqB,KAAKqhB,SAAU,EACfrhB,KAAKokB,eAAiB,GAEtBpkB,KAAKyP,MACR,CAKD,IAAAA,GACI,GAAIzP,KAAKkqB,aAAe9rB,EAAc4B,KAAK9D,IAAK8D,KAAKW,QAAQrC,QAAQ+W,OACjE,OAAO,EAGXrV,KAAK6qB,YAAcxf,EAAUrL,KAAK9D,IAAK8D,KAAKW,QAAQgmB,gBAAkB,CAAA,GAEtE3mB,KAAK0qB,iBAAmB,IAAI1qB,KAAK6qB,YAAYzoB,YAC7CpC,KAAK2qB,cAAgB3qB,KAAK6qB,YAAYluB,YAAYuO,QAAOnJ,GAA0B,UAAlBA,EAAK/F,YAAyB,GAC/FgE,KAAK4qB,eAAiB5qB,KAAK6qB,YAAYluB,YAAYuO,QAAOnJ,GAA0B,YAAlBA,EAAK/F,YAA2B,QACrEyO,IAAzBzK,KAAKW,QAAQ2V,SACbtW,KAAK4qB,eAAe9kB,KAAK,CACrB9J,SAAU,UACVW,WAAY,CACR,CACIX,SAAU,QACVU,KAAMsD,KAAKW,QAAQ2V,YAMnCtW,KAAK4U,KAAO,IAAI8L,GAAK1gB,MACrBA,KAAKxC,QAAU,IAAIukB,GAAQ/hB,MAE3BA,KAAKtD,KAAO8iB,EAAcxf,KAAKW,QAAQjE,KAAMsD,KAAK9D,IAAK8D,KAAKxC,QAAQyiB,SAAUjgB,KAAKW,QAAQ4K,KAAMvL,KAAKW,QAAQ0S,QAE9GrT,KAAKorB,UAEL/rB,YAAW,KACPW,KAAKohB,KAAK,kBACVphB,KAAKkqB,aAAc,CAAI,GACxB,GACN,CAMD,OAAAkB,GAGIprB,KAAK+qB,WAAahvB,EAAc,MAAO,CACnCgY,MAAO,GAAG/T,KAAKW,QAAQrC,QAAQ4pB,WAAWloB,KAAKW,QAAQrC,QAAQwpB,YAGnE9nB,KAAK+qB,WAAW1uB,UAAY2D,KAAKW,QAAQumB,SAASlnB,KAAKW,QAASX,KAAK9D,KAErE,MAAMmvB,EAAwBttB,EAAqBiC,KAAKW,QAAQrC,QAAQ4jB,UAClEA,EAAWliB,KAAK+qB,WAAW9J,cAAc,SAASoK,KAGpDnJ,GAAYliB,KAAKW,QAAQglB,QAAU3lB,KAAKW,QAAQklB,cAGhD7lB,KAAKW,QAAQklB,cAAc/kB,SAASwqB,IAChC,MAAOC,EAAKrwB,GAAOW,MAAMC,QAAQwvB,GAAU,CAACA,EAAO,GAAIA,EAAO,IAAM,CAACnuB,OAAOmuB,GAASA,GAC/E9oB,EAAWtH,IAAQ8E,KAAKW,QAAQilB,QAChC4F,EAAS,IAAIC,OAAOF,EAAKpuB,OAAOjC,GAAMsH,EAAUA,GACtD0f,EAAS7f,YAAYmpB,EAAO,IAGzBtJ,GACPA,EAAS0C,cAAcngB,YAAYyd,GAGvC,MAAMwJ,EAAoB3tB,EAAqBiC,KAAKW,QAAQrC,QAAQgpB,WACpEtnB,KAAK6pB,aAAe7pB,KAAK+qB,WAAW9J,cAAcyK,GAElD1rB,KAAKsqB,WAAa,GAClB,MAAMqB,EAAqB5tB,EAAqBiC,KAAKW,QAAQrC,QAAQkpB,YACrE3rB,MAAMsE,KAAKH,KAAK+qB,WAAWlL,iBAAiB8L,IAAqB7qB,SAAQ8E,IAC/DA,aAAcgmB,cAIpBhmB,EAAGvJ,UAAY,cAAc2D,KAAKW,QAAQrC,QAAQypB,wBAClD/nB,KAAKsqB,WAAWxkB,KAAKF,EAAGkf,mBAAiC,IAG7D9kB,KAAKuqB,iBAAmB,CACpBvuB,SAAU,KACVoG,WAAY,CACR2R,MAAO/T,KAAKW,QAAQrC,QAAQypB,iBAKpC,MAAM8D,EAAe9tB,EAAqBiC,KAAKW,QAAQrC,QAAQgF,MAC/DtD,KAAKmqB,OAASnqB,KAAK+qB,WAAW9J,cAAc4K,GAG5C7rB,KAAK9D,IAAI0oB,cAActgB,aAAatE,KAAK+qB,WAAY/qB,KAAK9D,KAC1D8D,KAAK6pB,aAAaxnB,YAAYrC,KAAK9D,KAGnC8D,KAAKwqB,MAAQxqB,KAAK9D,IAAI4vB,wBAGtB9rB,KAAK+rB,aAGA/rB,KAAKW,QAAQmU,QACd9U,KAAK+qB,WAAWtsB,UAAU4L,IAAI,aAG7BrK,KAAKW,QAAQoU,QACd/U,KAAK+qB,WAAWtsB,UAAU4L,IAAI,aAG9BrK,KAAKW,QAAQ4S,UACbvT,KAAK+qB,WAAWtsB,UAAU4L,IAAI,YAG9BrK,KAAKW,QAAQkT,YACb7T,KAAK+qB,WAAWtsB,UAAU4L,IAAI,cAG9BrK,KAAKW,QAAQ4lB,aACbvmB,KAAK+qB,WAAWtsB,UAAU4L,IAAI,gBAG9BrK,KAAKW,QAAQ6jB,cACbxkB,KAAK+qB,WAAWtsB,UAAU4L,IAAI,iBAGlCrK,KAAKgsB,cAEDhsB,KAAKxC,QAAQwkB,OAAOrR,MACpB3Q,KAAKxC,QAAQmT,KAAK3Q,KAAKxC,QAAQwkB,OAAOrR,KAAKiD,OAAQ5T,KAAKxC,QAAQwkB,OAAOrR,KAAKsD,KAAK,GAGrFjU,KAAKshB,QAAO,EACf,CAED,YAAAR,CAAa2D,EAA+B,IACxC,IAAI7P,EAGAA,GAFa5U,KAAKW,QAAQglB,QAAU3lB,KAAKokB,eAAevkB,QAAUG,KAAKxC,QAAQwkB,OAAO5N,QAAQvU,SAAWG,KAAKqjB,cAAgBrjB,KAAK6oB,MAAMhpB,SAAW4kB,EAAcC,SAE3J1kB,KAAK6oB,MAAM7oB,KAAKqjB,aAAe,GAE/BrjB,KAAKtD,KAAKA,KAAKE,KAAI,CAAC0Y,EAAK5Q,KAAW,CACvC4Q,MACA5Q,YAIR,IAAIunB,EAAgBvX,EAChB1U,KAAK0qB,iBACL1qB,KAAKtD,KAAKwW,SACV0B,EACA5U,KAAKxC,QAAQyiB,SACbjgB,KAAKxC,QAAQwkB,OACbhiB,KAAK4U,KAAKkB,OACV9V,KAAKW,QACL8jB,EACAzkB,KAAK2qB,cACL3qB,KAAK4qB,gBAGT,GAAI5qB,KAAKW,QAAQ+lB,YAAa,CAC1B,MAAMwF,EAAqDlsB,KAAKW,QAAQ+lB,YAAY1mB,KAAKtD,KAAMuvB,EAAe,QAC1GC,IACAD,EAAgBC,EAEvB,CACD,MAAMnpB,EAAO/C,KAAK8pB,IAAI/mB,KAAK/C,KAAK6qB,YAAaoB,GAC7CjsB,KAAK8pB,IAAI/pB,MAAMC,KAAK9D,IAAK6G,GACzB/C,KAAK6qB,YAAcoB,CACtB,CAMD,WAAAE,CAAYC,GAAc,GAClBpsB,KAAKqhB,SAAWrhB,KAAK0oB,YACjB1oB,KAAKqjB,aAAerjB,KAAK0oB,aACzB1oB,KAAKqjB,aAAe,GAIxBrjB,KAAK8gB,eAEL9gB,KAAKuoB,YAAoC,IAAtBvoB,KAAKqjB,aACxBrjB,KAAKwoB,WAAaxoB,KAAKqjB,eAAiBrjB,KAAKoqB,UAE7CpqB,KAAKqsB,WAAWrsB,KAAKW,QAAQimB,OAAOI,QAIxC,IAIIsF,EAJAne,EAAU,EAEVyI,EAAI,EACJnb,EAAI,EAWR,GARIuE,KAAK0oB,aACLva,EAAUnO,KAAKqjB,aAAe,EAC9BzM,EAAIzI,EAAUnO,KAAKW,QAAQilB,QAC3BnqB,EAAImb,EAAI5W,KAAK6oB,MAAM1a,GAAStO,OAC5B+W,GAAQ,EACR0V,EAAQtsB,KAAKokB,eAAevkB,OAASG,KAAKyqB,YAAY5qB,OAASG,KAAKtD,KAAKA,KAAKmD,QAG9EG,KAAKmqB,QAAUnqB,KAAKW,QAAQimB,OAAOtjB,KAAKzD,OAAQ,CAEhD,MAAM8L,EAAS3L,KAAKW,QAAQimB,OAAOtjB,KAC9BjG,QAAQ,UAAWF,OAAOyZ,IAC1BvZ,QAAQ,QAASF,OAAO1B,IACxB4B,QAAQ,SAAUF,OAAO6C,KAAKqjB,eAC9BhmB,QAAQ,UAAWF,OAAO6C,KAAK0oB,aAC/BrrB,QAAQ,SAAUF,OAAOmvB,IAE9BtsB,KAAKmqB,OAAO9tB,UAAYiwB,EAAQ3gB,EAAS,EAC5C,CAMD,GAJyB,GAArB3L,KAAKqjB,cACLrjB,KAAK+rB,aAGL/rB,KAAKW,QAAQ6lB,eAAiBxmB,KAAKqjB,gBAC9BrjB,KAAK4U,KAAKkB,SAAW9V,KAAK6oB,MAAM7oB,KAAKqjB,aAAa,GAAGlE,MACtD7J,GAAOA,EAAI5Q,QAAU1E,KAAK4U,KAAKkB,UACjC,CACE,MAAMlB,EAAO5U,KAAK6oB,MAAM7oB,KAAKqjB,aAAa,GACtCzO,EAAK/U,SACDusB,EACApsB,KAAK4U,KAAKgM,UAAUhM,EAAKA,EAAK/U,OAAO,GAAG6E,OAExC1E,KAAK4U,KAAKgM,UAAUhM,EAAK,GAAGlQ,OAGvC,CAER,CAKD,aAAA6nB,GACI,IAAKvsB,KAAKW,QAAQglB,OACd,OAEJ,IAAI6G,EAAqBlE,GAAsBtoB,KAAKuoB,YAAavoB,KAAKwoB,WAAYxoB,KAAKqjB,aAAcrjB,KAAK0oB,WAAY1oB,KAAKW,SAE3H,GAAIX,KAAKW,QAAQ8lB,YAAa,CAC1B,MAAMgG,EAAqDzsB,KAAKW,QAAQ8lB,YAAY,CAACzmB,KAAKuoB,YAAavoB,KAAKwoB,WAAYxoB,KAAKqjB,aAAcrjB,KAAK0oB,YAAa8D,GACzJC,IACAD,EAAqBC,EAE5B,CAED,MAAMjnB,EAAQxF,KAAK8pB,IAAI/mB,KAAK/C,KAAKuqB,iBAAkBiC,GAEnDxsB,KAAKsqB,WAAWxpB,SAAS4rB,IACrB1sB,KAAK8pB,IAAI/pB,MAAM2sB,EAAUlnB,EAAM,IAGnCxF,KAAKuqB,iBAAmBiC,CAC3B,CAID,qBAAAG,GACI,MAAMrF,EAAYtnB,KAAK9D,IAAI0oB,cACtB5kB,KAAK2kB,YACN3kB,KAAK2kB,UAAYxoB,SAASJ,cAAc,OACxCiE,KAAK8qB,kBAAoB,CACrB9uB,SAAU,QAIlBsrB,EAAU1C,cAAcjgB,aAAa3E,KAAK2kB,UAAW2C,GACrD,IAAIsF,EAAoC,CACpC5wB,SAAU,QACVoG,WAAYpC,KAAK0qB,iBACjB/tB,WAAY,CACR,CACIX,SAAU,QACVW,WAAY,CACRsW,EACIjT,KAAKtD,KAAKwW,SAAUlT,KAAKxC,QAAQyiB,SAAUjgB,KAAKxC,QAAQwkB,OAAQhiB,KAAKW,QAAS,CAAC+S,cAAc,QAQjH,GADAkZ,EAAgBxqB,WAAW2R,MAAQpV,EAAeiuB,EAAgBxqB,WAAW2R,MAAO/T,KAAKW,QAAQrC,QAAQ+W,OACrGrV,KAAKW,QAAQ+lB,YAAa,CAC1B,MAAMwF,EAAqDlsB,KAAKW,QAAQ+lB,YAAY1mB,KAAKtD,KAAMkwB,EAAiB,UAC5GV,IACAU,EAAkBV,EAEzB,CAED,MAAMW,EAAsB,CACxB7wB,SAAU,MACVoG,WAAY,CACR2R,MAAO/T,KAAKW,QAAQrC,QAAQupB,iBAEhClrB,WAAY,CAACiwB,IAGX7pB,EAAO/C,KAAK8pB,IAAI/mB,KAAK/C,KAAK8qB,kBAAmB+B,GACnD7sB,KAAK8pB,IAAI/pB,MAAMC,KAAK2kB,UAAW5hB,GAC/B/C,KAAK8qB,kBAAoB+B,EAGzB,MAAMC,EAAe9sB,KAAK2kB,UAAUG,kBAAkBiI,YAAc/sB,KAAK9D,IAAI6wB,YAC7E,GAAID,EAAc,CACd,MAAME,EAAyB5W,gBAAgBpW,KAAK8qB,mBACpDkC,EAAuB5qB,WAAWmS,MAAQ,kBAAkBuY,OAC5D,MAAM/pB,EAAO/C,KAAK8pB,IAAI/mB,KAAK/C,KAAK8qB,kBAAmBkC,GACnDhtB,KAAK8pB,IAAI/pB,MAAMC,KAAK2kB,UAAW5hB,GAC/B/C,KAAK8qB,kBAAoBkC,CAC5B,CAEG1F,EAAU2F,aAAe3F,EAAU4F,eAEnC5F,EAAU/S,MAAM4Y,UAAY,SAEnC,CAMD,WAAAnB,GAEI,GAAIhsB,KAAKW,QAAQklB,cAAe,CAC5B,MAAMwF,EAAwBttB,EAAqBiC,KAAKW,QAAQrC,QAAQ4jB,UAClEA,EAAWliB,KAAK+qB,WAAW9J,cAAcoK,GAC3CnJ,GAAYA,aAAoBkL,mBAEhClL,EAASmL,iBAAiB,UAAU,KAChCrtB,KAAKohB,KAAK,2BAA4BphB,KAAKW,QAAQilB,SACnD5lB,KAAKW,QAAQilB,QAAU2D,SAASrH,EAASpkB,MAAO,IAChDkC,KAAKshB,SAELthB,KAAK+rB,aAEL/rB,KAAKohB,KAAK,oBAAqBphB,KAAKW,QAAQilB,QAAQ,IACrD,EAEV,CAGG5lB,KAAKW,QAAQkT,YACb7T,KAAK+qB,WAAWsC,iBAAiB,SAAUC,IACvC,MAAMC,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAC1DohB,EAASF,EAAME,OACrB,KAAMA,aAAkBC,kBAAsBD,EAAOlkB,QAAQikB,IACzD,OAEJD,EAAMI,iBAEN,MAAMC,EAAmE,GAmCzE,GAlCyC9xB,MAAMsE,KAAKH,KAAK+qB,WAAWlL,iBAAiB0N,IACxEriB,QACTtF,GAAMA,EAAG9H,MAAM+B,SACjBiB,SACE8E,IACI,MAAMgoB,EAAYhoB,EAAGsa,QAAQ2N,KAAO7tB,KAAKW,QAAQ+kB,UAE3CoI,EADiBloB,EAAGsa,QAAQ6N,gBAAkB/tB,KAAKW,QAAQ8kB,qBAClC7f,EAAG9H,MAAMI,MAAM8B,KAAKW,QAAQ8kB,sBAAwB,CAAC7f,EAAG9H,OACnF8vB,EACAE,EAAMhtB,SAAQktB,IACNpoB,EAAGsa,QAAQ1iB,QACXmwB,EAAS7nB,KAAK,CACVgoB,MAAO,CAACE,GACRxwB,QAAU9B,KAAKC,MAAMiK,EAAGsa,QAAQ1iB,WAGpCmwB,EAAS7nB,KAAK,CAACgoB,MAAO,CAACE,GACnBxwB,aAASiN,GAChB,IAGD7E,EAAGsa,QAAQ1iB,QACXmwB,EAAS7nB,KAAK,CACVgoB,QACAtwB,QAAU9B,KAAKC,MAAMiK,EAAGsa,QAAQ1iB,WAGpCmwB,EAAS7nB,KAAK,CAACgoB,QACXtwB,aAASiN,GAEpB,IAIe,IAApBkjB,EAAS9tB,QAA6C,IAA7B8tB,EAAS,GAAGG,MAAMjuB,OAAc,CACzD,MAAMwnB,EAASsG,EAAS,GACxB3tB,KAAKqnB,OAAOA,EAAOyG,MAAM,GAAIzG,EAAO7pB,QACvC,MACGwC,KAAKqkB,YAAYsJ,EACpB,IAKT3tB,KAAK+qB,WAAWsC,iBAAiB,SAAUC,IACvC,MACMW,EADSX,EAAME,OACIU,QAAQ,aACjC,GAAKD,EAIL,GAAIA,EAAUE,aAAa,aACvBnuB,KAAKmoB,KAAKoB,SAAS0E,EAAU9N,aAAa,aAAc,KACxDmN,EAAMI,sBACH,GAAItvB,EAAc6vB,EAAWjuB,KAAKW,QAAQrC,QAAQmW,QAAS,CAC9D,MAAMlX,EAAe1B,MAAMsE,KAAK8tB,EAAUrJ,cAAcA,cAAcwJ,UAAU5gB,QAAQygB,EAAUrJ,eAC5FlnB,EAAcJ,EAAqBC,EAAcyC,KAAKxC,QAAQyiB,UACpEjgB,KAAKxC,QAAQmT,KAAKjT,GAClB4vB,EAAMI,gBACT,MAAM,GAAItvB,EAAc6vB,EAAWjuB,KAAKW,QAAQrC,QAAQ4M,QAAS,CAC9D,MAAM3N,EAAe1B,MAAMsE,KAAK8tB,EAAUrJ,cAAcA,cAAcwJ,UAAU5gB,QAAQygB,EAAUrJ,eAC5FlnB,EAAcJ,EAAqBC,EAAcyC,KAAKxC,QAAQyiB,UACpEjgB,KAAKxC,QAAQ0N,OAAOxN,GACpB4vB,EAAMI,gBACT,KACF,GAEC1tB,KAAKW,QAAQ6lB,eACbxmB,KAAK9D,IAAImxB,iBAAiB,WAAYC,IAClC,GAAkB,YAAdA,EAAMtsB,IAAmB,CAGzB,IAAIqtB,EAFJf,EAAMI,iBACNJ,EAAMgB,kBAENtuB,KAAK6oB,MAAM7oB,KAAKqjB,aAAa,GAAGlE,MAAM7J,GAC9BA,EAAI5Q,QAAQ1E,KAAK4U,KAAKkB,SAG1BuY,EAAU/Y,GACH,KAEP+Y,EACAruB,KAAK4U,KAAKgM,UAAUyN,EAAQ3pB,OACpB1E,KAAKuoB,aACbvoB,KAAKmoB,KAAKnoB,KAAKqjB,aAAa,GAAG,EAEtC,MAAM,GAAkB,cAAdiK,EAAMtsB,IAAqB,CAGlC,IAAIutB,EAFJjB,EAAMI,iBACNJ,EAAMgB,kBAEN,MAAME,EAAUxuB,KAAK6oB,MAAM7oB,KAAKqjB,aAAa,GAAGlE,MAAM7J,KAC9CiZ,IAGAjZ,EAAI5Q,QAAQ1E,KAAK4U,KAAKkB,SACtByY,GAAW,IAER,KAEPC,EACAxuB,KAAK4U,KAAKgM,UAAU4N,EAAQ9pB,OACpB1E,KAAKwoB,YACbxoB,KAAKmoB,KAAKnoB,KAAKqjB,aAAa,EAEnC,KAAU,CAAC,QAAS,KAAK5mB,SAAS6wB,EAAMtsB,MACrChB,KAAKohB,KAAK,sBAAuBphB,KAAK4U,KAAKkB,OAAQwX,EACtD,IAELttB,KAAK9D,IAAImxB,iBAAiB,aAAcC,IACpC,MAAME,EAASF,EAAME,OACrB,GAAMA,aAAkBve,SAGpBjP,KAAK9D,IAAIoN,QAAQ,UAAW,CAC5B,MAAMgM,EAAMzZ,MAAMsE,KAAKH,KAAK9D,IAAI2jB,iBAAiB,eAAeV,MAAK7J,GAAOA,EAAI5W,SAAS8uB,KACrFlY,GAAOA,aAAesW,aACtB5rB,KAAKohB,KAAK,sBAAuBmI,SAASjU,EAAI4K,QAAQxb,MAAO,IAAK4oB,EAEzE,MAILttB,KAAK9D,IAAImxB,iBAAiB,aAAcC,IACpC,MAAME,EAASF,EAAME,OACrB,KAAMA,aAAkBve,SACpB,OAEJ,MAAMqG,EAAMzZ,MAAMsE,KAAKH,KAAK9D,IAAI2jB,iBAAiB,eAAeV,MAAK7J,GAAOA,EAAI5W,SAAS8uB,KACrFlY,GAAOA,aAAesW,aACtB5rB,KAAKohB,KAAK,sBAAuBmI,SAASjU,EAAI4K,QAAQxb,MAAO,IAAK4oB,EACrE,IAITluB,OAAOiuB,iBAAiB,SAAUrtB,KAAKqqB,WAAWa,SACrD,CAKDC,UAAYrsB,GAAS,KACjBkB,KAAKwqB,MAAQxqB,KAAK6pB,aAAaiC,wBAC1B9rB,KAAKwqB,MAAMvF,OAGhBjlB,KAAKshB,QAAO,EAAK,GAClB,KAMH,OAAAmN,GACI,GAAKzuB,KAAKW,QAAQ6kB,YAAlB,CAGA,GAAIxlB,KAAK+qB,WAAY,CACjB,MAAMnG,EAAgB5kB,KAAK+qB,WAAWnG,cACtC,GAAIA,EAAe,CAEf,MAAM8J,EAAS3yB,EAAc,OAC7B2yB,EAAOryB,UAAY2D,KAAKiqB,aACxB,MAAM0E,EAAWD,EAAO5J,kBACxBF,EAActgB,aAAaqqB,EAAU3uB,KAAK+qB,YAC1C/qB,KAAK9D,IAAMyyB,CACd,MAEG3uB,KAAKW,QAAQrC,QAAQ+W,OAAOnX,MAAM,KAAK4C,SAAQ3C,GAAa6B,KAAK+qB,WAAWtsB,UAAU8iB,OAAOpjB,IAEpG,CAEDiB,OAAOwvB,oBAAoB,SAAU5uB,KAAKqqB,WAAWa,UAErDlrB,KAAKkqB,aAAc,CAlBlB,CAmBJ,CAMD,MAAA5I,CAAOuN,GAAgB,GACnB7uB,KAAKohB,KAAK,2BAENyN,IACA7uB,KAAKxC,QAAQ8mB,iBACbtkB,KAAKqhB,QAAU5Z,QAAQzH,KAAKtD,KAAKA,KAAKmD,QACtCG,KAAKgqB,YAAcviB,QAAQzH,KAAKtD,KAAKwW,SAASrT,SAElDG,KAAKW,QAAQrC,QAAQspB,OAAO1pB,MAAM,KAAK4C,SAAQ3C,GAAa6B,KAAK+qB,WAAWtsB,UAAU8iB,OAAOpjB,KAE7F6B,KAAK8uB,YACL9uB,KAAKmsB,cAELnsB,KAAKusB,gBAEDvsB,KAAKW,QAAQ6S,QAAQ3T,QACrBG,KAAK2sB,wBAGT3sB,KAAKohB,KAAK,mBACb,CAED,SAAA0N,GACI,IAAIla,EAAkB5U,KAAKtD,KAAKA,KAAKE,KAAI,CAAC0Y,EAAK5Q,KAAW,CACtD4Q,MACA5Q,YAwCJ,OArCI1E,KAAKokB,eAAevkB,SACpB+U,EAAO,GAEP5U,KAAKyqB,YAAY3pB,SAAS4D,GAAkBkQ,EAAK9O,KAAK,CAACpB,QACnD4Q,IAAKtV,KAAKtD,KAAKA,KAAKgI,QAGxB1E,KAAKxC,QAAQwkB,OAAO5N,QAAQvU,QAC5BG,KAAKxC,QAAQwkB,OAAO5N,QAAQtT,SACxB,CAACiuB,EAA4Cnb,KACpCmb,IAGLna,EAAOA,EAAK1J,QACPoK,IACG,MAAMrY,EAAOqY,EAAIA,IAAIE,MAAM5B,GAC3B,MAA8B,mBAAhBmb,EAA6BA,EAAY9xB,EAAKP,MAAQK,EAAWE,KAAU8xB,CAAW,IAE3G,IAKT/uB,KAAKW,QAAQglB,QAAU3lB,KAAKW,QAAQilB,QAAU,EAE9C5lB,KAAK6oB,MAAQjU,EACRhY,KAAI,CAAC6kB,EAAM9hB,IAAcA,EAAIK,KAAKW,QAAQilB,SAAY,EAAIhR,EAAKrU,MAAMZ,EAAGA,EAAIK,KAAKW,QAAQilB,SAAW,OACpG1a,QAAQid,GAA8CA,IAE3DnoB,KAAK6oB,MAAQ,CAACjU,GAGlB5U,KAAK0oB,WAAa1oB,KAAKoqB,SAAWpqB,KAAK6oB,MAAMhpB,OAExCG,KAAKqjB,eACNrjB,KAAKqjB,aAAe,GAEjBrjB,KAAK0oB,UACf,CAKD,UAAAqD,GACQ/rB,KAAKW,QAAQ4lB,cACbvmB,KAAK6pB,aAAatV,MAAMya,OAAS,KACjChvB,KAAKwqB,MAAQxqB,KAAK6pB,aAAaiC,wBAC/B9rB,KAAK6pB,aAAatV,MAAMya,OAAS,GAAGhvB,KAAKwqB,MAAMwE,WAEtD,CAKD,MAAA3H,CAAO2G,EAAcxwB,OAAmCiN,EAAWiC,EAAiB,UAGhF,GAFA1M,KAAKohB,KAAK,0BAA2B4M,EAAMhuB,KAAKyqB,cAE3CuD,EAAKnuB,OAON,OANAG,KAAKqjB,aAAe,EACpBrjB,KAAKokB,eAAiB,GACtBpkB,KAAKyqB,YAAc,GACnBzqB,KAAKshB,SACLthB,KAAKohB,KAAK,mBAAoB,GAAI,IAClCphB,KAAK+qB,WAAWtsB,UAAU8iB,OAAO,mBAC1B,EAGXvhB,KAAKqkB,YAAY,CACb,CAACyJ,MAAO,CAACE,GACLxwB,QAASA,QAAoBiN,IAClCiC,GAEH1M,KAAKohB,KAAK,mBAAoB4M,EAAMhuB,KAAKyqB,YAE5C,CAKD,WAAApG,CAAY4K,EAAoEviB,EAAiB,UAC7F,IAAK1M,KAAKqhB,QAAS,OAAO,EAE1BrhB,KAAKqjB,aAAe,EACpBrjB,KAAKyqB,YAAc,GAEnB,IAAIyE,EAAUD,EAAWryB,KAAIuyB,IAAU,CACnC3xB,QAAS2xB,EAAM3xB,QACfswB,MAAOqB,EAAMrB,MAAMlxB,KAAIoxB,GAAQA,EAAK/vB,SAAQiN,QAAO8iB,GAAQA,IAC3DthB,aACAxB,QAAOikB,GAASA,EAAMrB,MAAMjuB,SAUhC,GARAG,KAAKohB,KAAK,+BAAgC8N,EAASlvB,KAAKyqB,aAEpD/d,EAAO7M,SAEPqvB,EAAUA,EAAQ1uB,OAAOR,KAAKokB,eAAelZ,QAAOikB,GAASA,EAAMziB,SAAWA,MAElF1M,KAAKokB,eAAiB8K,GAEjBA,EAAQrvB,OAIT,OAHAG,KAAKshB,SACLthB,KAAKohB,KAAK,wBAAyB8N,EAASlvB,KAAKyqB,aACjDzqB,KAAK+qB,WAAWtsB,UAAU8iB,OAAO,mBAC1B,EAEX,MAAM6N,EAAaF,EAAQtyB,KAAIuyB,GAASnvB,KAAKxC,QAAQyiB,SAASrjB,KAC1D,CAACgX,EAAQlP,KACL,GAAIkP,EAAOjW,SAAWiW,EAAOC,YAAesb,EAAM3xB,UAAY2xB,EAAM3xB,QAAQf,SAASiI,GACjF,OAAO,EAEX,IAAI2qB,EAAgBF,EAAMrB,MAC1B,MAAMzL,EAAczO,EAAOyO,aAAeriB,KAAKW,QAAQ0hB,YACnD,CAAC,OAAQ,UAAU5lB,SAAS4lB,KAC5BgN,EAAgBA,EAAczyB,KAAIuyB,GAASA,EAAMhtB,iBAEjD,CAAC,OAAQ,QAAQ1F,SAAS4lB,KAC1BgN,EAAgBA,EAAczyB,KAAIuyB,GAASA,EAAMG,UAAU,OAAOjyB,QAAQ,kBAAmB,OAMjG,OAJ0BuW,EAAO0O,mBAAqBtiB,KAAKW,QAAQ2hB,qBAE/D+M,EAAgBA,EAAczyB,KAAIuyB,GAASA,EAAM9xB,QAAQ,2BAA4B,OAElFgyB,CAAa,MAG5BrvB,KAAKtD,KAAKA,KAAKoE,SAAQ,CAACwU,EAAkBia,KACtC,MAAMC,EAAYla,EAAIE,MAAM5Y,KAAI,CAACK,EAAM0C,KACnC,MAAMiU,EAAS5T,KAAKxC,QAAQyiB,SAAStgB,GAErC,GAD2BiU,EAAO2O,cAAgBviB,KAAKW,QAAQ4hB,aAE3D,OAAOtlB,EAEX,IAAI+hB,EAAUjiB,EAAWE,GAAMgB,OAC/B,GAAI+gB,EAAQnf,OAAQ,CAChB,MAAMwiB,EAAczO,EAAOyO,aAAeriB,KAAKW,QAAQ0hB,YACnD,CAAC,OAAQ,UAAU5lB,SAAS4lB,KAC5BrD,EAAUA,EAAQ7c,eAElB,CAAC,OAAQ,QAAQ1F,SAAS4lB,KAC1BrD,EAAUA,EAAQsQ,UAAU,OAAOjyB,QAAQ,kBAAmB,MAExCuW,EAAO0O,mBAAqBtiB,KAAKW,QAAQ2hB,qBAE/DtD,EAAUA,EAAQ3hB,QAAQ,2BAA4B,IAE7D,CACD,MAAMolB,EAAsB7O,EAAO6O,qBAAuBziB,KAAKW,QAAQ8hB,oBACvE,OAAOA,EAAsBzD,EAAQ9gB,MAAMukB,GAAuB,CAACzD,EAAQ,IAG3EoQ,EAAWnoB,OACP,CAACwoB,EAAaC,IAAeD,EAAYtQ,MACrC,CAACwQ,EAAiBjrB,KACd,IAAKirB,EACD,OAAO,EAEX,MACMC,EADS5vB,KAAKxC,QAAQyiB,SAASvb,GACH6d,cAAgBviB,KAAKW,QAAQ4hB,aAC/D,OAAIqN,EACOA,EAAmBD,EAAkBH,EAAU9qB,GAAqB4Q,EAAK5Q,EAAOwqB,EAAQQ,GAAYhjB,QAExGijB,EAAgBxQ,MAAK0Q,GAAcL,EAAU9qB,GAAoBya,MAAK2Q,GAAcA,EAAWrzB,SAASozB,MAAY,OAKvI7vB,KAAKyqB,YAAY3kB,KAAKypB,EACzB,IAILvvB,KAAK+qB,WAAWtsB,UAAU4L,IAAI,kBAC1BrK,KAAKyqB,YAAY5qB,OACjBG,KAAKshB,UAELthB,KAAK+qB,WAAWtsB,UAAU8iB,OAAO,kBAEjCvhB,KAAKqsB,WAAWrsB,KAAKW,QAAQimB,OAAOK,YAGxCjnB,KAAKohB,KAAK,wBAAyB8N,EAASlvB,KAAKyqB,YACpD,CAKD,IAAAtC,CAAKA,EAAciE,GAAgB,GAI/B,OAHApsB,KAAKohB,KAAK,wBAAyB+G,GAG/BA,IAASnoB,KAAKqjB,eAIb5C,MAAM0H,KACPnoB,KAAKqjB,aAAe8E,KAGpBA,EAAOnoB,KAAK6oB,MAAMhpB,QAAUsoB,EAAO,KAIvCnoB,KAAKmsB,YAAYC,GACjBpsB,KAAKusB,qBAELvsB,KAAKohB,KAAK,iBAAkB+G,IAC/B,CAKD,MAAA4H,CAAOrzB,GAEH,IAAIkY,EAAsB,GAC1B,GAAI/Y,MAAMC,QAAQY,GAAO,CACrB,MAAMwW,EAAWlT,KAAKtD,KAAKwW,SAAStW,KAAK+W,GAA4BA,EAAQjX,KAAOS,OAAOwW,EAAQjX,MAAQiX,EAAQzW,OACnHR,EAAKoE,SAAQ,CAACwU,EAAK0a,KACf,MAAMxZ,EAAgB,GACtBrb,OAAO0F,QAAQyU,GAAKxU,SAAQ,EAAE6S,EAAS1W,MAEnC,MAAMyH,EAAQwO,EAAS1F,QAAQmG,GAE3BjP,GAAS,EACT8R,EAAE9R,GAASua,EAAahiB,EAAuB+C,KAAKxC,QAAQyiB,SAASvb,IAC7D1E,KAAKgqB,aAAgBhqB,KAAKqhB,SAAsB,IAAX2O,IAC7CxZ,EAAEtD,EAASrT,QAAUof,EAAahiB,EAAuB+C,KAAKxC,QAAQyiB,SAAS/M,EAASrT,SACxFqT,EAASpN,KAAK6N,GACd3T,KAAKtD,KAAKwW,SAASpN,KAAKyZ,EAAe5L,IAC1C,IAELiB,EAAK9O,KAAK,CACN0P,MAAOgB,GACT,GAET,MAAUvb,EAASyB,MACZA,EAAKwW,UAAalT,KAAKgqB,aAAgBhqB,KAAKqhB,QAErC3kB,EAAKA,MAAQb,MAAMC,QAAQY,EAAKA,QACvCkY,EAAOlY,EAAKA,KAAKE,KAAI0Y,IACjB,IAAIlT,EACAoT,EAQJ,OAPI3Z,MAAMC,QAAQwZ,IACdlT,EAAa,CAAA,EACboT,EAAQF,IAERlT,EAAakT,EAAIlT,WACjBoT,EAAQF,EAAIE,OAET,CACHpT,aACAoT,MAAOA,EAAM5Y,KAAI,CAACK,EAAMyH,IAAUua,EAAahiB,EAAuB+C,KAAKxC,QAAQyiB,SAASvb,MAChF,KAfpB1E,KAAKtD,KAAO8iB,EAAc9iB,OAAM+N,EAAWzK,KAAKxC,QAAQyiB,SAAUjgB,KAAKW,QAAQ4K,KAAMvL,KAAKW,QAAQ0S,SAmBtGuB,EAAK/U,QACL+U,EAAK9T,SAASwU,GAAqBtV,KAAKtD,KAAKA,KAAKoJ,KAAKwP,KAE3DtV,KAAKgqB,YAAcviB,QAAQzH,KAAKtD,KAAKwW,SAASrT,QAE1CG,KAAKxC,QAAQwkB,OAAOrR,MACpB3Q,KAAKxC,QAAQmT,KAAK3Q,KAAKxC,QAAQwkB,OAAOrR,KAAKiD,OAAQ5T,KAAKxC,QAAQwkB,OAAOrR,KAAKsD,KAAK,GAGrFjU,KAAKshB,QAAO,EACf,CAKD,OAAA2O,GAGI,GAFAjwB,KAAKohB,KAAK,4BAENphB,KAAKW,QAAQkT,WAAY,CACzB,MAAM0Z,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAC7BvQ,MAAMsE,KAAKH,KAAK+qB,WAAWlL,iBAAiB0N,IACxEzsB,SAAQ8E,GAAOA,EAAG9H,MAAQ,KACjCkC,KAAKokB,eAAiB,EACzB,CACDpkB,KAAKqjB,aAAe,EACpBrjB,KAAKuoB,aAAc,EACnBvoB,KAAKshB,QAAO,GAEZthB,KAAKohB,KAAK,oBACb,CAKD,KAAA8O,GACI,MAAMC,EAAWp0B,EAAc,SAE/B,IAAIq0B,EAAqB1b,EACrB1U,KAAK0qB,iBACL1qB,KAAKtD,KAAKwW,SACVlT,KAAKtD,KAAKA,KAAKE,KAAI,CAAC0Y,EAAK5Q,KAAW,CAChC4Q,MACA5Q,YAEJ1E,KAAKxC,QAAQyiB,SACbjgB,KAAKxC,QAAQwkB,QACb,EACAhiB,KAAKW,QACL,CACI8S,gBAAgB,EAChBC,cAAc,GAElB1T,KAAK2qB,cACL3qB,KAAK4qB,gBAGT,GAAI5qB,KAAKW,QAAQ+lB,YAAa,CAC1B,MAAMwF,EAAqDlsB,KAAKW,QAAQ+lB,YAAY1mB,KAAKtD,KAAM0zB,EAAoB,SAC/GlE,IACAkE,EAAqBlE,EAE5B,CAED,MAAMnpB,EAAO/C,KAAK8pB,IAAI/mB,KA3BE,CAAC/G,SAAU,SA2BSo0B,GAC5CpwB,KAAK8pB,IAAI/pB,MAAMowB,EAAUptB,GAGzB,MAAM+U,EAAI1Y,OAAOixB,OAGjBvY,EAAE3b,SAASm0B,KAAKjuB,YAAY8tB,GAG5BrY,EAAEoY,OACL,CAKD,UAAA7D,CAAWkE,GACP,MACMC,EADiBxwB,KAAKtD,KAAKwW,SAAShI,QAAO,CAACyI,EAAyBjP,KAAmB1E,KAAKxC,QAAQyiB,SAASvb,IAAQ/G,SAC7FkC,QAAU,EAEzCG,KAAKW,QAAQrC,QAAQspB,OAAO1pB,MAAM,KAAK4C,SAAQ3C,GAAa6B,KAAK+qB,WAAWtsB,UAAU4L,IAAIlM,KAEtF6B,KAAKmqB,SACLnqB,KAAKmqB,OAAO9tB,UAAY,IAE5B2D,KAAK0oB,WAAa,EAClB1oB,KAAKusB,gBAEL,IAAIN,EAAkC,CAClCjwB,SAAU,QACVoG,WAAYpC,KAAK0qB,iBACjB/tB,WAAY,CACR,CACIX,SAAU,QACVW,WAAY,CACRsW,EACIjT,KAAKtD,KAAKwW,SAAUlT,KAAKxC,QAAQyiB,SAAUjgB,KAAKxC,QAAQwkB,OAAQhiB,KAAKW,QAAS,CAAA,KAG1F,CACI3E,SAAU,QACVW,WAAY,CACR,CACIX,SAAU,KACVW,WAAY,CACR,CACIX,SAAU,KACVoG,WAAY,CACR2R,MAAO/T,KAAKW,QAAQrC,QAAQspB,MAC5B4I,QAASrzB,OAAOqzB,IAEpB7zB,WAAY,CACR,CACIX,SAAU,QACVU,KAAM6zB,WAiB1C,GALAvwB,KAAK2qB,cAAc7pB,SAAQiU,GAAUkX,EAActvB,WAAWmJ,KAAKiP,KACnE/U,KAAK4qB,eAAe9pB,SAAQwV,GAAW2V,EAActvB,WAAWmJ,KAAKwQ,KAErE2V,EAAc7pB,WAAW2R,MAAQpV,EAAestB,EAAc7pB,WAAW2R,MAAO/T,KAAKW,QAAQrC,QAAQ+W,OAEjGrV,KAAKW,QAAQ+lB,YAAa,CAC1B,MAAMwF,EAAqDlsB,KAAKW,QAAQ+lB,YAAY1mB,KAAKtD,KAAMuvB,EAAe,WAC1GC,IACAD,EAAgBC,EAEvB,CAED,MAAMnpB,EAAO/C,KAAK8pB,IAAI/mB,KAAK/C,KAAK6qB,YAAaoB,GAC7CjsB,KAAK8pB,IAAI/pB,MAAMC,KAAK9D,IAAK6G,GACzB/C,KAAK6qB,YAAcoB,CAEtB,CAKD,EAAAwE,CAAGnD,EAAeoD,GACd1wB,KAAK+pB,QAAQuD,GAASttB,KAAK+pB,QAAQuD,IAAU,GAC7CttB,KAAK+pB,QAAQuD,GAAOxnB,KAAK4qB,EAC5B,CAKD,GAAAC,CAAIrD,EAAeoD,GACXpD,KAASttB,KAAK+pB,UAAY,GAC9B/pB,KAAK+pB,QAAQuD,GAAO1qB,OAAO5C,KAAK+pB,QAAQuD,GAAO9f,QAAQkjB,GAAW,EACrE,CAKD,IAAAtP,CAAKkM,KAAkBhV,GACnB,GAAIgV,KAASttB,KAAK+pB,UAAY,EAC9B,IAAK,IAAIpqB,EAAI,EAAGA,EAAIK,KAAK+pB,QAAQuD,GAAOztB,OAAQF,IAC5CK,KAAK+pB,QAAQuD,GAAO3tB,MAAM2Y,EAEjC,ECrnCE,MAAMsY,GAAa,SAASC,GAC/B,IAAIr0B,EAQJ,IAAKvB,EAAS41B,GACV,OAAO,EAGX,MAAMlwB,EAAU,CAVZmwB,cAAe,KACfC,gBAAiB,IACjBC,oBAAoB,KAUjBH,GAGP,GAAIlwB,EAAQjE,KAAKmD,OAAQ,CAErBrD,EAAM,CACFE,KAAM,IAIV,MAAMkY,EAAkBjU,EAAQjE,KAAKwB,MAAMyC,EAAQmwB,eA6BnD,GA3BIlc,EAAK/U,SAEDc,EAAQuS,WACR1W,EAAI0W,SAAW0B,EAAK,GAAG1W,MAAMyC,EAAQowB,iBACjCpwB,EAAQqwB,qBACRx0B,EAAI0W,SAAW1W,EAAI0W,SAAStW,KAAKhB,GAAcA,EAAEqC,OAAOZ,QAAQ,WAAY,OAEhFuX,EAAKqc,SAGTrc,EAAK9T,SAAQ,CAACwU,EAAa3V,KACvBnD,EAAIE,KAAKiD,GAAK,GAGd,MAAMuxB,EAAS5b,EAAIpX,MAAMyC,EAAQowB,iBAE7BG,EAAOrxB,QACPqxB,EAAOpwB,SAAShD,IACR6C,EAAQqwB,qBACRlzB,EAAQA,EAAMG,OAAOZ,QAAQ,WAAY,KAE7Cb,EAAIE,KAAKiD,GAAGmG,KAAKhI,EAAM,GAE9B,KAILtB,EACA,OAAOA,CAEd,CAED,OAAO,CACX,EC5Da20B,GAAc,SAASN,GAChC,IAAIr0B,EAMJ,IAAKvB,EAAS41B,GACV,OAAO,EAGX,MAAMlwB,EAAU,CARZjE,KAAM,MAUHm0B,GAGP,GAAIlwB,EAAQjE,KAAKmD,QAAU5E,EAAS0F,EAAQjE,MAAO,CAE/C,MAAM00B,IAAO71B,EAAOoF,EAAQjE,OAAQhB,KAAKC,MAAMgF,EAAQjE,MAsBvD,GAnBI00B,GACA50B,EAAM,CACF0W,SAAU,GACVxW,KAAM,IAGV00B,EAAKtwB,SAAQ,CAACpE,EAAsEiD,KAChFnD,EAAIE,KAAKiD,GAAK,GACdxE,OAAO0F,QAAQnE,GAAMoE,SAAQ,EAAE8S,EAAQ9V,MAC9BtB,EAAI0W,SAASzW,SAASmX,IACvBpX,EAAI0W,SAASpN,KAAK8N,GAEtBpX,EAAIE,KAAKiD,GAAGmG,KAAKhI,EAAM,GACzB,KAGNkH,QAAQqsB,KAAK,0BAGb70B,EACA,OAAOA,CAEd,CAED,OAAO,CACX,ECpCa80B,GAAY,SAAS3Q,EAAekQ,EAA8B,IAC3E,IAAKlQ,EAAGqJ,cAAgBrJ,EAAGU,QAAS,OAAO,EAU3C,IAAKpmB,EAAS41B,GACV,OAAO,EAGX,MAAMlwB,EAAU,CAXZ4wB,UAAU,EACVC,WAAY,GACZV,cAAe,KACfC,gBAAiB,OAUdF,GAEDY,EAAe/sB,IAAmB/D,EAAQ6wB,WAAW/0B,SAASiI,KAAWic,EAAGnjB,QAAQyiB,SAASvb,IAAQ/G,OACrG+zB,EAAU/Q,EAAGjkB,KAAKwW,SAAShI,QAAO,CAAC+X,EAA0Bve,IAAkB+sB,EAAY/sB,KAAQ9H,KAAKkY,GAA2BA,EAAO5X,MAAQ4X,EAAOpY,OAG/J,IAAIi1B,EACJ,GAAIhxB,EAAQixB,UAER,GAAI/1B,MAAMC,QAAQ6E,EAAQixB,WAAY,CAElCD,EAAe,GACf,IAAK,IAAIhyB,EAAI,EAAGA,EAAIgB,EAAQixB,UAAU/xB,OAAQF,IAC1CgyB,EAAeA,EAAanxB,OAAOmgB,EAAGkI,MAAMloB,EAAQixB,UAAUjyB,GAAK,GAAG/C,KAAI0Y,GAAOA,EAAIA,MAG5F,MACGqc,EAAehR,EAAGkI,MAAMloB,EAAQixB,UAAY,GAAGh1B,KAAI0Y,GAAOA,EAAIA,WAGlEqc,EAAehR,EAAGjkB,KAAKA,KAG3B,IAAIkY,EAA0B,GAS9B,GAPAA,EAAK,GAAK8c,EACV9c,EAAOA,EAAKpU,OAAOmxB,EAAa/0B,KAAK0Y,GACdA,EAAIE,MAAMtK,QAAO,CAACoV,EAAiB5b,IAAkB+sB,EAAY/sB,KAClE9H,KAAKK,GAAmBF,EAAWE,QAIrD2X,EAAK/U,OAAQ,CACb,IAAIrE,EAAM,GA2BV,GA1BAoZ,EAAK9T,SAAQwU,IACTA,EAAIxU,SAAS7D,IACW,iBAATA,IAMPA,GAFAA,GADAA,GADAA,GADAA,EAAOA,EAAKgB,QACAZ,QAAQ,UAAW,MACnBA,QAAQ,MAAO,OACfA,QAAQ,KAAM,OAEdA,QAAQ,KAAM,QACjBZ,SAAS,OACdQ,EAAO,IAAIA,MAGnBzB,GAAOyB,EAAO0D,EAAQowB,eAAe,IAGzCv1B,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAG3CrE,GAAOmF,EAAQmwB,aAAa,IAIhCt1B,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAGvCc,EAAQ4wB,SAAU,CAElB,MAAMjlB,EAAOnQ,SAASJ,cAAc,KACpCuQ,EAAKulB,KAAOC,UAAU,+BAA+Bt2B,KACrD8Q,EAAKilB,SAAW,GAAG5wB,EAAQoxB,UAAY,yBAGvC51B,SAASm0B,KAAKjuB,YAAYiK,GAG1BA,EAAK0lB,QAGL71B,SAASm0B,KAAK7rB,YAAY6H,EAC7B,CAED,OAAO9Q,CACV,CAED,OAAO,CACX,EClGay2B,GAAa,SAAStR,EAAekQ,EAA+B,IAC7E,IAAKlQ,EAAGqJ,cAAgBrJ,EAAGU,QAAS,OAAO,EAW3C,IAAKpmB,EAAS41B,GACV,OAAO,EAGX,MAAMlwB,EAAU,CAXZ4wB,UAAU,EACVC,WAAY,GACZU,SAAU,KACVC,MAAO,KAUJtB,GAGDY,EAAe/sB,IAAmB/D,EAAQ6wB,WAAW/0B,SAASiI,KAAWic,EAAGnjB,QAAQyiB,SAASvb,IAAQ/G,OAG3G,IAAIg0B,EACJ,GAAIhxB,EAAQixB,UAER,GAAI/1B,MAAMC,QAAQ6E,EAAQixB,WAAY,CAElCD,EAAe,GACf,IAAK,IAAIhyB,EAAI,EAAGA,EAAIgB,EAAQixB,UAAU/xB,OAAQF,IAC1CgyB,EAAeA,EAAanxB,OAAOmgB,EAAGkI,MAAMloB,EAAQixB,UAAUjyB,GAAK,GAAG/C,KAAI0Y,GAAOA,EAAIA,MAE5F,MACGqc,EAAehR,EAAGkI,MAAMloB,EAAQixB,UAAY,GAAGh1B,KAAI0Y,GAAOA,EAAIA,WAGlEqc,EAAehR,EAAGjkB,KAAKA,KAG3B,MAAMkY,EAAyB+c,EAAa/0B,KAAK0Y,GAC1BA,EAAIE,MAAMtK,QAAO,CAACoV,EAAiB5b,IAAkB+sB,EAAY/sB,KAClE9H,KAAKK,GAAmBF,EAAWE,OAGnDy0B,EAAU/Q,EAAGjkB,KAAKwW,SAAShI,QAAO,CAAC+X,EAA0Bve,IAAkB+sB,EAAY/sB,KAAQ9H,KAAKkY,GAA2BA,EAAO5X,MAAQC,OAAO2X,EAAOpY,QAGtK,GAAIkY,EAAK/U,OAAQ,CACb,MAAMiO,EAAiD,GACvD8G,EAAK9T,SAAQ,CAACwU,EAAqBsD,KAC/B9K,EAAI8K,GAAK9K,EAAI8K,IAAM,CAAA,EACnBtD,EAAIxU,SAAQ,CAAC7D,EAAoB0C,KAC7BmO,EAAI8K,GAAG8Y,EAAQ/xB,IAAM1C,CAAI,GAC3B,IAIN,MAAMzB,EAAME,KAAKuF,UAAU6M,EAAKnN,EAAQuxB,SAAUvxB,EAAQwxB,OAG1D,GAAIxxB,EAAQ4wB,SAAU,CAGlB,MAAMa,EAAO,IAAIC,KACb,CAAC72B,GACD,CACI+P,KAAM,wCAGR+mB,EAAMC,IAAIC,gBAAgBJ,GAG1B9lB,EAAOnQ,SAASJ,cAAc,KACpCuQ,EAAKulB,KAAOS,EACZhmB,EAAKilB,SAAW,GAAG5wB,EAAQoxB,UAAY,0BAGvC51B,SAASm0B,KAAKjuB,YAAYiK,GAG1BA,EAAK0lB,QAGL71B,SAASm0B,KAAK7rB,YAAY6H,GAC1BimB,IAAIE,gBAAgBH,EACvB,CAED,OAAO92B,CACV,CAED,OAAO,CACX,EC9Fak3B,GAAY,SAAS/R,EAAekQ,EAA+B,IAC5E,IAAKlQ,EAAGqJ,cAAgBrJ,EAAGU,QAAS,OAAO,EAS3C,IAAKpmB,EAAS41B,GACV,OAAO,EAGX,MAAMlwB,EAAU,CAVZ4wB,UAAU,EACVC,WAAY,GACZmB,UAAW,aAUR9B,GAEDY,EAAe/sB,IAAmB/D,EAAQ6wB,WAAW/0B,SAASiI,KAAWic,EAAGnjB,QAAQyiB,SAASvb,IAAQ/G,OAG3G,IAAIg0B,EAA8B,GAClC,GAAIhxB,EAAQixB,UAER,GAAI/1B,MAAMC,QAAQ6E,EAAQixB,WAEtB,IAAK,IAAIjyB,EAAI,EAAGA,EAAIgB,EAAQixB,UAAU/xB,OAAQF,IAC1CgyB,EAAeA,EAAanxB,OAAOmgB,EAAGkI,MAAMloB,EAAQixB,UAAUjyB,GAAK,GAAG/C,KAAI0Y,GAAOA,EAAIA,YAIzFqc,EAAehR,EAAGkI,MAAMloB,EAAQixB,UAAY,GAAGh1B,KAAI0Y,GAAOA,EAAIA,WAGlEqc,EAAehR,EAAGjkB,KAAKA,KAG3B,MAAMkY,EAAyB+c,EAAa/0B,KAAK0Y,GAC1BA,EAAIE,MAAMtK,QAAO,CAACoV,EAAiB5b,IAAkB+sB,EAAY/sB,KAClE9H,KAAKK,GAAmBF,EAAWE,OAGnDy0B,EAAU/Q,EAAGjkB,KAAKwW,SAAShI,QAAO,CAAC+X,EAA0Bve,IAAkB+sB,EAAY/sB,KAAQ9H,KAAKkY,GAA2BA,EAAO5X,MAAQC,OAAO2X,EAAOpY,QAEtK,GAAIkY,EAAK/U,OAAQ,CAEb,IAAIrE,EAAM,iBAAiBmF,EAAQgyB,gBA2CnC,GAxCAjB,EAAQ5wB,SAASgU,IACbtZ,GAAO,KAAKsZ,MAAW,IAI3BtZ,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAG3CrE,GAAO,YAIPoZ,EAAK9T,SAASwU,IACV9Z,GAAO,IACP8Z,EAAIxU,SAAS7D,IAELzB,GADgB,iBAATyB,EACA,IAAIA,MAEJ,GAAGA,IACb,IAGLzB,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAG3CrE,GAAO,IAAI,IAKfA,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAG3CrE,GAAO,IAEHmF,EAAQ4wB,WACR/1B,EAAM,sCAAsCA,KAI5CmF,EAAQ4wB,SAAU,CAElB,MAAMjlB,EAAOnQ,SAASJ,cAAc,KACpCuQ,EAAKulB,KAAOC,UAAUt2B,GACtB8Q,EAAKilB,SAAW,GAAG5wB,EAAQoxB,UAAY,yBAGvC51B,SAASm0B,KAAKjuB,YAAYiK,GAG1BA,EAAK0lB,QAGL71B,SAASm0B,KAAK7rB,YAAY6H,EAC7B,CAED,OAAO9Q,CACV,CAED,OAAO,CACX,EC5Gao3B,GAAY,SAASjS,EAAekQ,EAA+B,IAC5E,IAAKlQ,EAAGqJ,cAAgBrJ,EAAGU,QAAS,OAAO,EAU3C,IAAKpmB,EAAS41B,GACV,OAAO,EAGX,MAAMlwB,EAAU,CAXZ4wB,UAAU,EACVC,WAAY,GACZV,cAAe,KACfC,gBAAiB,OAUdF,GAGDY,EAAe/sB,IAAmB/D,EAAQ6wB,WAAW/0B,SAASiI,KAAWic,EAAGnjB,QAAQyiB,SAASvb,IAAQ/G,OAErG+zB,EAAU/Q,EAAGjkB,KAAKwW,SAAShI,QAAO,CAAC+X,EAA0Bve,IAAkB+sB,EAAY/sB,KAAQ9H,KAAKkY,GAA2BA,EAAO5X,MAAQ4X,EAAOpY,OAG/J,IAAIi1B,EACJ,GAAIhxB,EAAQixB,UAER,GAAI/1B,MAAMC,QAAQ6E,EAAQixB,WAAY,CAElCD,EAAe,GACf,IAAK,IAAIhyB,EAAI,EAAGA,EAAIgB,EAAQixB,UAAU/xB,OAAQF,IAC1CgyB,EAAeA,EAAanxB,OAAOmgB,EAAGkI,MAAMloB,EAAQixB,UAAUjyB,GAAK,GAAG/C,KAAI0Y,GAAOA,EAAIA,MAE5F,MACGqc,EAAehR,EAAGkI,MAAMloB,EAAQixB,UAAY,GAAGh1B,KAAI0Y,GAAOA,EAAIA,WAGlEqc,EAAehR,EAAGjkB,KAAKA,KAG3B,IAAIkY,EAA0B,GAS9B,GAPAA,EAAK,GAAK8c,EACV9c,EAAOA,EAAKpU,OAAOmxB,EAAa/0B,KAAK0Y,GACdA,EAAIE,MAAMtK,QAAO,CAACoV,EAAiB5b,IAAkB+sB,EAAY/sB,KAClE9H,KAAKK,GAAmBF,EAAWE,QAIrD2X,EAAK/U,OAAQ,CACb,IAAIrE,EAAM,GAgCV,GA9BAoZ,EAAK9T,SAAQwU,IACTA,EAAIxU,SAAS7D,IACW,iBAATA,IAMPA,GAFAA,GADAA,GADAA,GADAA,EAAOA,EAAKgB,QACAZ,QAAQ,UAAW,MACnBA,QAAQ,MAAO,OACfA,QAAQ,KAAM,OAEdA,QAAQ,KAAM,QACjBZ,SAAS,OACdQ,EAAO,IAAIA,MAGnBzB,GAAOyB,EAAO0D,EAAQowB,eAAe,IAGzCv1B,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAG3CrE,GAAOmF,EAAQmwB,aAAa,IAKhCt1B,EAAMA,EAAIyC,OAAO+P,UAAU,EAAGxS,EAAIqE,OAAS,GAEvCc,EAAQ4wB,WACR/1B,EAAM,+BAA+BA,KAGrCmF,EAAQ4wB,SAAU,CAElB,MAAMjlB,EAAOnQ,SAASJ,cAAc,KACpCuQ,EAAKulB,KAAOC,UAAUt2B,GACtB8Q,EAAKilB,SAAW,GAAG5wB,EAAQoxB,UAAY,yBAGvC51B,SAASm0B,KAAKjuB,YAAYiK,GAG1BA,EAAK0lB,QAGL71B,SAASm0B,KAAK7rB,YAAY6H,EAC7B,CAED,OAAO9Q,CACV,CAED,OAAO,CACX,ECzHa+pB,GAAgB,CACzBjnB,QAAS,CACLgX,IAAK,uBACLud,KAAM,wBACN7oB,KAAM,wBACN8oB,KAAM,wBACNC,KAAM,wBACN5R,MAAO,yBACP6R,OAAQ,0BACRC,MAAO,yBACPC,MAAO,yBACP9mB,MAAO,yBACPgc,MAAO,yBACP+K,MAAO,yBACPjwB,OAAQ,0BACR4R,OAAQ,0BACRoT,QAAS,2BACTkL,SAAU,4BACV9L,UAAW,6BACX+L,UAAW,8BAGfzM,OAAQ,CACJ0M,OAAQ,IACRC,SAAU,YACVC,QAAS,WACTC,UAAW,aACXC,aAAc,gBACdC,aAAc,gCACdZ,KAAM,OACNC,OAAQ,UAGZY,YAAaC,GAAUC,QAAQD,EAAOlzB,QAAQimB,OAAO+M,cAGrDI,QAAQ,EAGRC,eAAe,EAGfC,aAAa,EAGbC,WAAY,WAGZC,eAAgB,GAGhBC,UAAW,CACP,CACIl3B,KAAO22B,GAAmBA,EAAOlzB,QAAQimB,OAAO2M,SAChDrwB,OAAQ,CAAC2wB,EAAgBQ,KACrB,KAAMR,EAAOvG,MAAME,kBAAkBve,SACjC,OAEJ,MAAMhS,EAAO42B,EAAOvG,MAAME,OAAOU,QAAQ,MACzC,OAAO2F,EAAON,SAASt2B,EAAK,GAGpC,CACIC,KAAO22B,GAAmBA,EAAOlzB,QAAQimB,OAAO4M,QAChDtwB,OAAQ,CAAC2wB,EAAgBQ,KACrB,KAAMR,EAAOvG,MAAME,kBAAkBve,SACjC,OAEJ,MAAMqG,EAAMue,EAAOvG,MAAME,OAAOU,QAAQ,MACxC,OAAO2F,EAAOL,QAAQle,EAAI,GAGlC,CACI+d,WAAW,GAEf,CACIn2B,KAAO22B,GAAmBA,EAAOlzB,QAAQimB,OAAO6M,UAChDvwB,OAAQ,CAAC2wB,EAAgBQ,KACrB,GAAMR,EAAOvG,MAAME,kBAAkBve,SAGjC6kB,QAAQD,EAAOlzB,QAAQimB,OAAO8M,cAAe,CAC7C,MAAMpe,EAAMue,EAAOvG,MAAME,OAAOU,QAAQ,MACxC2F,EAAOJ,UAAUne,EACpB,YC7DJgf,GACTC,SAEA1K,aAEAntB,KAEAgrB,SAEA/G,GAEA6T,QAEAC,YAEAC,WAEApH,MAEAqH,OAEAzK,YAEA0K,OAEAC,QAEAC,SAEAn0B,QAEAo0B,kBAEAC,KAEAjK,WAEA,WAAA7L,CAAY+V,EAAsBt0B,EAAU,IACxCX,KAAK2gB,GAAKsU,EACVj1B,KAAKW,QAAU,IACR4kB,MACA5kB,EAEV,CAMD,IAAA8O,GACQzP,KAAKkqB,cAGTlqB,KAAKW,QAAQrC,QAAQ80B,UAAUl1B,MAAM,KAAK4C,SAAQ3C,GAAa6B,KAAK2gB,GAAGoK,WAAWtsB,UAAU4L,IAAIlM,KAC5F6B,KAAKW,QAAQozB,SACb/zB,KAAK+0B,kBAAoB/0B,KAAK2gB,GAAGhgB,QAAQqU,UACzChV,KAAK2gB,GAAGhgB,QAAQqU,UAAY,CAACM,EAAKC,EAAI7Q,KAClC,IAAIwwB,EAAQl1B,KAAKgV,UAAUM,EAAKC,EAAI7Q,GAIpC,OAHI1E,KAAK+0B,oBACLG,EAAQl1B,KAAK+0B,kBAAkBzf,EAAK4f,EAAOxwB,IAExCwwB,CAAK,GAGhBl1B,KAAKW,QAAQszB,cACbj0B,KAAK6pB,aAAe9tB,EAAc,MAAO,CACrCgK,GAAI/F,KAAKW,QAAQrC,QAAQgpB,YAE7BtnB,KAAK+qB,WAAahvB,EAAc,MAAO,CACnCgY,MAAO/T,KAAKW,QAAQrC,QAAQ4pB,UAEhCloB,KAAK60B,QAAU94B,EAAc,KAAM,CAC/BgY,MAAO/T,KAAKW,QAAQrC,QAAQw0B,OAE5B9yB,KAAKW,QAAQyzB,WAAap0B,KAAKW,QAAQyzB,UAAUv0B,QACjDG,KAAKW,QAAQyzB,UAAUtzB,SAASkJ,IAC5B,MAAM/D,EAAKlK,EAAc,KAAM,CAC3BgY,MAAO/J,EAAKqpB,UAAYrzB,KAAKW,QAAQrC,QAAQ+0B,UAAYrzB,KAAKW,QAAQrC,QAAQ0L,OAElF,IAAKA,EAAKqpB,UAAW,CACjB,MAAM3c,EAAI3a,EAAc,IAAK,CACzBgY,MAAO/T,KAAKW,QAAQrC,QAAQ4E,OAC5B2uB,KAAM7nB,EAAKsoB,KAAO,IAClBpkB,KAA2B,mBAAdlE,EAAK9M,KAAsB8M,EAAK9M,KAAK8C,MAAQgK,EAAK9M,OAEnE+I,EAAG5D,YAAYqU,GACX1M,EAAK9G,QAAiC,mBAAhB8G,EAAK9G,QAC3BwT,EAAE2W,iBAAiB,SAAUC,IACzBA,EAAMI,iBACN1jB,EAAK9G,OAAOlD,KAAMstB,EAAM,GAGnC,CACDttB,KAAK60B,QAAQxyB,YAAY4D,EAAG,IAGpCjG,KAAK+qB,WAAW1oB,YAAYrC,KAAK60B,SACjC70B,KAAK6pB,aAAaxnB,YAAYrC,KAAK+qB,YACnC/qB,KAAKm1B,cAETn1B,KAAKtD,KAAO,GACZsD,KAAKu0B,UAAW,EAChBv0B,KAAKw0B,SAAU,EACfx0B,KAAK00B,YAAa,EAClB10B,KAAKy0B,aAAc,EACnBz0B,KAAKo1B,aACL/1B,YAAW,KACPW,KAAKkqB,aAAc,EACnBlqB,KAAK2gB,GAAGS,KAAK,gBAAgB,GAC9B,IACN,CAMD,UAAAgU,GACIp1B,KAAK20B,OAAS,CACVU,QAASr1B,KAAKq1B,QAAQC,KAAKt1B,MAC3BgyB,MAAOhyB,KAAKgyB,MAAMsD,KAAKt1B,OAG3BA,KAAK2gB,GAAGzkB,IAAImxB,iBAAiBrtB,KAAKW,QAAQuzB,WAAYl0B,KAAK20B,OAAO3C,OAElE71B,SAASkxB,iBAAiB,UAAWrtB,KAAK20B,OAAOU,SAE7Cr1B,KAAKW,QAAQszB,cACbj0B,KAAK20B,OAAOY,QAAUv1B,KAAKu1B,QAAQD,KAAKt1B,MACxCA,KAAK20B,OAAOQ,WAAan1B,KAAKm1B,WAAWG,KAAKt1B,MAC9CA,KAAK20B,OAAOa,YAAcx1B,KAAKw1B,YAAYF,KAAKt1B,MAChDA,KAAK20B,OAAOc,MAAQ32B,GAAS,IAAMkB,KAAK20B,OAAOQ,cAAc,IAG7Dn1B,KAAK2gB,GAAGzkB,IAAImxB,iBAAiB,cAAertB,KAAK20B,OAAOY,SAExDp5B,SAASkxB,iBAAiB,QAASrtB,KAAK20B,OAAOa,aAE/Cp2B,OAAOiuB,iBAAiB,SAAUrtB,KAAK20B,OAAOc,OAC9Cr2B,OAAOiuB,iBAAiB,SAAUrtB,KAAK20B,OAAOc,OAErD,CAOD,OAAAF,CAAQjI,GACJ,MAAME,EAASF,EAAME,OACrB,KAAMA,aAAkBve,SACpB,OAEJjP,KAAKstB,MAAQA,EAEb,MAAMrwB,EAAOuwB,EAAOU,QAAQ,YAC5B,IAAKluB,KAAK0nB,UAAYzqB,EAAM,CACxBqwB,EAAMI,iBAEN,IAAI9U,EAAI0U,EAAMoI,MACV1e,EAAIsW,EAAMqI,MAEV/c,EAAI5Y,KAAK40B,OAAOhc,IAChBA,GAAK5Y,KAAKg1B,KAAK/P,OAGfjO,EAAIhX,KAAK40B,OAAO5d,IAChBA,GAAKhX,KAAKg1B,KAAKhG,QAEnBhvB,KAAK+qB,WAAWxW,MAAM4S,IAAM,GAAGnQ,MAC/BhX,KAAK+qB,WAAWxW,MAAMqhB,KAAO,GAAGhd,MAChC5Y,KAAK61B,WACL71B,KAAKm1B,YACR,CACJ,CAOD,KAAAnD,CAAM1E,GACF,MAAME,EAASF,EAAME,OACrB,GAAMA,aAAkBve,QAGxB,GAAIjP,KAAKw0B,SAAWx0B,KAAKtD,MAAQsD,KAAKy0B,YAAa,CAC/C,MAAMlH,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAC1DA,EAAQpM,KAAK80B,SACd90B,KAAK80B,SAAS7T,cAAc,QAAQsM,gBACpCvtB,KAAK2gB,GAAGoK,WAAW9J,cAAc,QAAQsM,gBAC9CvtB,KAAK81B,SAAS1pB,EAAMtO,MACvB,MAAM,IAAKkC,KAAKw0B,QAAS,CACtB,MAAMv3B,EAAOuwB,EAAOU,QAAQ,YACxBjxB,IACA+C,KAAKuzB,SAASt2B,GACdqwB,EAAMI,iBAEb,CACJ,CAOD,OAAA2H,CAAQ/H,GACJ,MAAMC,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAChE,GAAIpM,KAAK80B,UACL,GAAkB,WAAdxH,EAAMtsB,IACFhB,KAAKW,QAAQizB,YAAY5zB,OACzBA,KAAK+1B,kBAEN,GAAkB,UAAdzI,EAAMtsB,IAEb,GAAIhB,KAAKy0B,YAAa,CAClB,MAAMroB,EAASpM,KAAK80B,SAAS7T,cAAc,QAAQsM,gBACnDvtB,KAAK81B,SAAS1pB,EAAMtO,MACvB,KAAM,CACH,MAAMozB,EAAUr1B,MAAMsE,KAAKH,KAAK80B,SAASjV,iBAAiB,QAAQ0N,iBAAoD3wB,KAAIwP,GAASA,EAAMtO,MAAMG,SAC/I+B,KAAKg2B,QAAQ9E,EAAQlxB,KAAKtD,KAAK4Y,IAClC,OAEF,GAAItV,KAAKw0B,SAAWx0B,KAAKtD,KAC5B,GAAkB,UAAd4wB,EAAMtsB,KAEN,GAAIhB,KAAKy0B,YAAa,CAClB,MAAMroB,EAASpM,KAAK2gB,GAAGoK,WAAW9J,cAAc,QAAQsM,gBACxDvtB,KAAK81B,SAAS1pB,EAAMtO,MACvB,MAAM,GAAIkC,KAAK00B,WAAY,CACxB,MAAMxD,EAAUr1B,MAAMsE,KAAKH,KAAK2gB,GAAGoK,WAAWlL,iBAAiB,QAAQ0N,iBAAoD3wB,KAAIwP,GAASA,EAAMtO,MAAMG,SACpJ+B,KAAKg2B,QAAQ9E,EAAQlxB,KAAKtD,KAAK4Y,IAClC,MACoB,WAAdgY,EAAMtsB,MAEThB,KAAKy0B,YACLz0B,KAAK81B,SAAS91B,KAAKtD,KAAKsiB,SACjBhf,KAAK00B,YACZ10B,KAAKg2B,QAAQ,KAAMh2B,KAAKtD,KAAK4Y,KAI5C,CAOD,QAAAie,CAAS7d,GACL,MAAMhY,EAAcJ,EAAqBoY,EAAGugB,UAAWj2B,KAAK2gB,GAAGnjB,QAAQyiB,UACvE,GAAIjgB,KAAKW,QAAQwzB,eAAe13B,SAASiB,GAErC,YADAsC,KAAKk2B,YAGT,MAAMC,EAAW5M,SAAS7T,EAAGkP,cAAc1E,QAAQxb,MAAO,IAEpDzH,EADM+C,KAAK2gB,GAAGjkB,KAAKA,KAAKy5B,GACb3gB,MAAM9X,GAEvBsC,KAAKtD,KAAO,CACRO,OACAk5B,WACAz4B,cACAshB,QAASjiB,EAAWE,IAExB+C,KAAKw0B,SAAU,EACfx0B,KAAKy0B,aAAc,EACfz0B,KAAKW,QAAQozB,OACb/zB,KAAK2gB,GAAGW,SAERthB,KAAKo2B,gBAETp2B,KAAKk2B,WACR,CAED,aAAAE,GACI,MAAMn5B,EAAO+C,KAAKtD,KAAKO,KACjBS,EAAcsC,KAAKtD,KAAKgB,YACxB0qB,EAAQpoB,KAAK2gB,GAAGjkB,KAAKwW,SAASxV,GAAaR,MAAQC,OAAO6C,KAAK2gB,GAAGjkB,KAAKwW,SAASxV,GAAahB,MAC7FwqB,EAAW,CACb,eAAelnB,KAAKW,QAAQrC,QAAQ40B,UACpC,eAAelzB,KAAKW,QAAQrC,QAAQwW,WACpC,OAAO9U,KAAKW,QAAQimB,OAAO2M,gBAC3B,kBAAkBvzB,KAAKW,QAAQrC,QAAQ20B,2CAA2CjzB,KAAKW,QAAQimB,OAAO0M,kBACtG,UACA,eAAetzB,KAAKW,QAAQrC,QAAQ6iB,UACpC,gBAAgBnhB,KAAKW,QAAQrC,QAAQu0B,SACrC,eAAe7yB,KAAKW,QAAQrC,QAAQgX,QACpC,iBAAiBtV,KAAKW,QAAQrC,QAAQ8pB,UAAUhrB,EAAWgrB,aAC3D,iBAAiBpoB,KAAKW,QAAQrC,QAAQ8N,iBAAiBhP,EAAWL,EAAWE,oBAC7E,SACA,eAAe+C,KAAKW,QAAQrC,QAAQgX,QACpC,kBAAkBtV,KAAKW,QAAQrC,QAAQ00B,4CAA4ChzB,KAAKW,QAAQimB,OAAOoM,kBACvG,kBAAkBhzB,KAAKW,QAAQrC,QAAQy0B,wCAAwC/yB,KAAKW,QAAQimB,OAAOmM,gBACnG,SACA,UACA,SACA,UACFj2B,KAAK,IACDg4B,EAAW/4B,EAAc,MAAO,CAClCgY,MAAO/T,KAAKW,QAAQrC,QAAQ60B,MAC5BjlB,KAAMgZ,IAEVlnB,KAAK80B,SAAWA,EAChB90B,KAAKq2B,YACL,MAAM9I,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAC1DA,EAAS0oB,EAAS7T,cAAc,QAAQsM,gBAC9CnhB,EAAMkqB,QACNlqB,EAAMmqB,eAAiBnqB,EAAMoqB,aAAepqB,EAAMtO,MAAM+B,OAExDi1B,EAASzH,iBAAiB,SAAUC,IAChC,MAAME,EAASF,EAAME,OACfA,aAAkBve,UAGpBue,EAAOW,aAAa,uBACpBb,EAAMI,iBACF1tB,KAAKW,QAAQizB,YAAY5zB,OACzBA,KAAK+1B,cAEFvI,EAAOW,aAAa,sBAC3Bb,EAAMI,iBAEN1tB,KAAK81B,SAAS1pB,EAAMtO,QACvB,GAER,CAQD,QAAAg4B,CAASh4B,GACL,MAAM24B,EAAUz2B,KAAKtD,KAAKsiB,QAEpBzT,EAAOvL,KAAK2gB,GAAGnjB,QAAQyiB,SAASjgB,KAAKtD,KAAKgB,aAAa6N,MAAQvL,KAAK2gB,GAAGhgB,QAAQ4K,KAC/EmrB,EAAc54B,EAAMG,OAC1B,IAAIhB,EACJ,GAAa,WAATsO,EACAtO,EAAO,CAACP,KAAM4iB,WAAWoX,SACtB,GAAa,YAATnrB,EAEHtO,EADA,CAAC,GAAI,QAAS,KAAKR,SAASi6B,GACrB,CAACh6B,MAAM,EACVQ,KAAM,QACNmiB,MAAO,GAEJ,CAAC3iB,MAAM,EACVQ,KAAM,OACNmiB,MAAO,QAEZ,GAAa,SAAT9T,EACPtO,EAAO,CAACP,KAAM,CACV,CAACV,SAAU,QACPU,KAAMoB,IAEdZ,KAAMY,EACNuhB,MAAOvhB,QACJ,GAAa,WAATyN,EACPtO,EAAO,CAACP,KAAMoB,QACX,GAAa,SAATyN,EAAiB,CACxB,MAAM8H,EAASrT,KAAK2gB,GAAGnjB,QAAQyiB,SAASjgB,KAAKtD,KAAKgB,aAAa2V,QAAUrT,KAAK2gB,GAAGhgB,QAAQ0S,OACzFpW,EAAO,CAACP,KAAMoB,EACVuhB,MAAON,EAAU5hB,OAAOW,GAAQuV,GACvC,MACGpW,EAAO,CAACP,KAAMoB,GAGNkC,KAAK2gB,GAAGjkB,KAAKA,KAAKsD,KAAKtD,KAAKy5B,UACpC3gB,MAAMxV,KAAKtD,KAAKgB,aAAeT,EACnC+C,KAAK+1B,aACL,MAAMI,EAAWn2B,KAAKtD,KAAKy5B,SACrBz4B,EAAcsC,KAAKtD,KAAKgB,YAC9BsC,KAAKtD,KAAO,GACZsD,KAAK2gB,GAAGW,QAAO,GACfthB,KAAKw0B,SAAU,EACfx0B,KAAKy0B,aAAc,EACnBz0B,KAAK2gB,GAAGS,KAAK,qBAAsBtjB,EAAO24B,EAASN,EAAUz4B,EAChE,CAOD,OAAA81B,CAAQje,GACJ,IAAKA,GAAsB,OAAhBA,EAAGvZ,UAAqBgE,KAAKw0B,QAAS,OACjD,MAAM2B,EAAW5M,SAAShU,EAAG2K,QAAQxb,MAAO,IACtC4Q,EAAMtV,KAAK2gB,GAAGjkB,KAAKA,KAAKy5B,GAC9Bn2B,KAAKtD,KAAO,CACR4Y,IAAKA,EAAIE,MACT2gB,YAEJn2B,KAAKw0B,SAAU,EACfx0B,KAAK00B,YAAa,EACd10B,KAAKW,QAAQozB,OACb/zB,KAAK2gB,GAAGW,SAERthB,KAAK22B,eAET32B,KAAKk2B,WACR,CAED,YAAAS,GACI,MAAMrhB,EAAMtV,KAAKtD,KAAK4Y,IAEhB4R,EAAW,CACb,eAAelnB,KAAKW,QAAQrC,QAAQ40B,UACpC,eAAelzB,KAAKW,QAAQrC,QAAQwW,WACpC,OAAO9U,KAAKW,QAAQimB,OAAO4M,eAC3B,kBAAkBxzB,KAAKW,QAAQrC,QAAQ20B,2CAA2CjzB,KAAKW,QAAQimB,OAAO0M,kBACtG,UACA,eAAetzB,KAAKW,QAAQrC,QAAQ6iB,UACpC,gBAAgBnhB,KAAKW,QAAQrC,QAAQu0B,SACrC,eAAe7yB,KAAKW,QAAQrC,QAAQgX,QACpC,kBAAkBtV,KAAKW,QAAQrC,QAAQ00B,4CAA4ChzB,KAAKW,QAAQimB,OAAOoM,kBACvG,kBAAkBhzB,KAAKW,QAAQrC,QAAQy0B,wCAAwC/yB,KAAKW,QAAQimB,OAAOmM,gBACnG,SACA,UACA,SACA,UACFj2B,KAAK,IACDg4B,EAAW/4B,EAAc,MAAO,CAClCgY,MAAO/T,KAAKW,QAAQrC,QAAQ60B,MAC5BjlB,KAAMgZ,IAEJgM,EAAQ4B,EAAShQ,kBACvB,IAAKoO,EACD,OAEJ,MAAML,EAAOK,EAAM0D,kBAAkB9R,kBACrC,IAAK+N,EACD,OAGJvd,EAAIxU,SAAQ,CAAC7D,EAAgB0C,KACzB,MAAMwT,EAAiBnT,KAAK2gB,GAAGnjB,QAAQyiB,SAAStgB,GAChD,KAAMwT,EAAexV,QAAWwV,EAAexV,QAAUqC,KAAKW,QAAQqzB,iBAAoBh0B,KAAKW,QAAQwzB,eAAe13B,SAASkD,GAAI,CAC/H,MAAMyoB,EAAQpoB,KAAK2gB,GAAGjkB,KAAKwW,SAASvT,GAAGzC,MAAQC,OAAO6C,KAAK2gB,GAAGjkB,KAAKwW,SAASvT,GAAGjD,MAC/Em2B,EAAKluB,aAAa5I,EAAc,MAAO,CACnCgY,MAAO/T,KAAKW,QAAQrC,QAAQgX,IAC5BpH,KAAM,CACF,eAAelO,KAAKW,QAAQrC,QAAQgX,QACpC,iBAAiBtV,KAAKW,QAAQrC,QAAQ8pB,UAAUhrB,EAAWgrB,aAC3D,iBAAiBpoB,KAAKW,QAAQrC,QAAQ8N,iBAAiBhP,EAAWL,EAAWE,oBAC7E,UACFH,KAAK,MACP+1B,EAAK+D,iBACZ,KAEL52B,KAAK80B,SAAWA,EAChB90B,KAAKq2B,YAEL,MAAM9I,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAC1DyqB,EAASh7B,MAAMsE,KAAK0yB,EAAKhT,iBAAiB,QAAQ0N,iBAGxDuH,EAASzH,iBAAiB,SAAUC,IAChC,MAAME,EAASF,EAAME,OACrB,GAAMA,aAAkBve,QAGxB,GAAIue,EAAOW,aAAa,sBAChBnuB,KAAKW,QAAQizB,YAAY5zB,OACzBA,KAAK+1B,kBAEN,GAAIvI,EAAOW,aAAa,oBAAqB,CAEhD,MAAM+C,EAAS2F,EAAOj6B,KAAKwP,GAA4BA,EAAMtO,MAAMG,SACnE+B,KAAKg2B,QAAQ9E,EAAQlxB,KAAKtD,KAAK4Y,IAClC,IAER,CAQD,OAAA0gB,CAAQt5B,EAAgB4Y,GAEpB,MAAMmhB,EAAUnhB,EAAI1Y,KAAKK,GAAmBF,EAAWE,KACjD65B,EAAa92B,KAAK2gB,GAAGjkB,KAAKA,KAAKsD,KAAKtD,KAAKy5B,UAE/C,GAAIz5B,EAAM,CACN,IAAIq6B,EAAe,EACnBD,EAAWthB,MAAQF,EAAI1Y,KAAI,CAACo6B,EAASC,KACjC,GAAIj3B,KAAKW,QAAQwzB,eAAe13B,SAASw6B,IAAaj3B,KAAK2gB,GAAGnjB,QAAQyiB,SAASgX,GAAUt5B,OACrF,OAAOq5B,EAEX,MAAMzrB,EAAOvL,KAAK2gB,GAAGnjB,QAAQyiB,SAASgX,GAAU1rB,MAAQvL,KAAK2gB,GAAGhgB,QAAQ4K,KAClEzN,EAAQpB,EAAKq6B,KACnB,IAAI95B,EACJ,GAAa,WAATsO,EACAtO,EAAO,CAACP,KAAM4iB,WAAWxhB,SACtB,GAAa,YAATyN,EAEHtO,EADA,CAAC,GAAI,QAAS,KAAKR,SAASqB,GACrB,CAACpB,MAAM,EACVQ,KAAM,QACNmiB,MAAO,GAEJ,CAAC3iB,MAAM,EACVQ,KAAM,OACNmiB,MAAO,QAEZ,GAAa,SAAT9T,EACPtO,EAAO,CACHP,KAAM,CACF,CAACV,SAAU,QACPU,KAAMoB,IAEdZ,KAAMY,EACNuhB,MAAOvhB,QAER,GAAa,WAATyN,EACPtO,EAAO,CAACP,KAAMoB,QACX,GAAa,SAATyN,EAAiB,CACxB,MAAM8H,EAASrT,KAAK2gB,GAAGnjB,QAAQyiB,SAASgX,GAAU5jB,QAAUrT,KAAK2gB,GAAGhgB,QAAQ0S,OAC5EpW,EAAO,CAACP,KAAMoB,EACVuhB,MAAON,EAAU5hB,OAAOW,GAAQuV,GACvC,MACGpW,EAAO,CAACP,KAAMoB,GAElB,OAAOb,CAAI,GAGlB,CAED,MAAMi6B,EAAUJ,EAAWthB,MAAM5Y,KAAIK,GAAQF,EAAWE,KAExD+C,KAAKtD,KAAO,GACZsD,KAAK2gB,GAAGW,QAAO,GACfthB,KAAK+1B,aACL/1B,KAAKw0B,SAAU,EACfx0B,KAAK2gB,GAAGS,KAAK,oBAAqB8V,EAAST,EAASnhB,EACvD,CAMD,SAAA+gB,GACQr2B,KAAK80B,UACL34B,SAASm0B,KAAKjuB,YAAYrC,KAAK80B,SAEtC,CAMD,UAAAiB,GACQ/1B,KAAKw0B,SAAWx0B,KAAK80B,WACrB34B,SAASm0B,KAAK7rB,YAAYzE,KAAK80B,UAC/B90B,KAAK80B,SAAW90B,KAAKw0B,QAAUx0B,KAAK00B,WAAa10B,KAAKy0B,aAAc,EAE3E,CAOD,SAAAhB,CAAUle,GACN,IAAKA,GAAsB,OAAhBA,EAAGvZ,UAAqBgE,KAAKw0B,QAAS,OACjD,MAAM9vB,EAAQ6kB,SAAShU,EAAG2K,QAAQxb,MAAO,IACzC1E,KAAK2gB,GAAG/L,KAAK2M,OAAO7c,GACpB1E,KAAKk2B,WACR,CAMD,UAAAf,GACI,MAAMgC,EAAU/3B,OAAO+3B,SAAW/3B,OAAOg4B,YACnC5jB,EAAUpU,OAAOoU,SAAWpU,OAAOi4B,YACzCr3B,KAAKg1B,KAAOh1B,KAAK+qB,WAAWe,wBAC5B9rB,KAAK40B,OAAS,CACVhc,EAAGxZ,OAAOk4B,WAAaH,EAAUn3B,KAAKg1B,KAAK/P,MAC3CjO,EAAG5X,OAAOm4B,YAAc/jB,EAAUxT,KAAKg1B,KAAKhG,OAEnD,CAOD,WAAAwG,CAAYlI,GACR,MAAME,EAASF,EAAME,OACrB,KAAMA,aAAkBve,UAAYjP,KAAK+qB,WAAWrsB,SAAS8uB,GACzD,OAEJ,IAAIgK,GAAQ,EACZ,GAAIx3B,KAAKw0B,QAAS,CACd,MAAMjH,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAChEorB,GAAUhK,EAAOlkB,QAAQ,QAAQikB,eACpC,CACGiK,GACAx3B,KAAKk2B,WAEZ,CAMD,QAAAL,GACI,GAAI71B,KAAKw0B,SAAWx0B,KAAKtD,MAAQsD,KAAKy0B,YAAa,CAC/C,MAAMlH,EAAgBxvB,EAAqBiC,KAAKW,QAAQrC,QAAQ8N,OAC1DA,EAAQpM,KAAK80B,SACd90B,KAAK80B,SAAS7T,cAAc,QAAQsM,gBACpCvtB,KAAK2gB,GAAGoK,WAAW9J,cAAc,QAAQsM,gBAE9CvtB,KAAK81B,SAAS1pB,EAAMtO,MACvB,CACD3B,SAASm0B,KAAKjuB,YAAYrC,KAAK6pB,cAC/B7pB,KAAKu0B,UAAW,EAChBv0B,KAAK2gB,GAAGS,KAAK,wBAChB,CAMD,SAAA8U,GACQl2B,KAAKu0B,WACLv0B,KAAKu0B,UAAW,EAChBp4B,SAASm0B,KAAK7rB,YAAYzE,KAAK6pB,cAC/B7pB,KAAK2gB,GAAGS,KAAK,0BAEpB,CAMD,OAAAqN,GACIzuB,KAAK2gB,GAAGzkB,IAAI0yB,oBAAoB5uB,KAAKW,QAAQuzB,WAAYl0B,KAAK20B,OAAO3C,OACrEhyB,KAAK2gB,GAAGzkB,IAAI0yB,oBAAoB,cAAe5uB,KAAK20B,OAAOY,SAC3Dp5B,SAASyyB,oBAAoB,QAAS5uB,KAAK20B,OAAOa,aAClDr5B,SAASyyB,oBAAoB,UAAW5uB,KAAK20B,OAAOU,SACpDj2B,OAAOwvB,oBAAoB,SAAU5uB,KAAK20B,OAAOc,OACjDr2B,OAAOwvB,oBAAoB,SAAU5uB,KAAK20B,OAAOc,OAC7Ct5B,SAASm0B,KAAK5xB,SAASsB,KAAK6pB,eAC5B1tB,SAASm0B,KAAK7rB,YAAYzE,KAAK6pB,cAE/B7pB,KAAKW,QAAQozB,SACb/zB,KAAK2gB,GAAGhgB,QAAQqU,UAAYhV,KAAK+0B,mBAErC/0B,KAAKkqB,aAAc,CACtB,CAED,SAAAlV,CAAUM,EAAKC,EAAI7Q,GACf,IAAK1E,KAAKtD,MAAQsD,KAAKtD,KAAKy5B,WAAazxB,EACrC,OAAO6Q,EAGX,GAAIvV,KAAKy0B,YAAa,CAELlf,EAAG5Y,WrB1lBQ,SAASe,EAAqBF,GAC9D,IAAID,EAAeG,EACfD,EAAU,EACd,KAAOA,EAAUC,GACUF,EAAQC,GACZE,SACfJ,GAAgB,GAEpBE,IAEJ,OAAOF,CACX,CqB+kBuCk6B,CAAqBz3B,KAAKtD,KAAKgB,YAAasC,KAAK2gB,GAAGnjB,QAAQyiB,WAClFtjB,WAAa,CACd,CACIX,SAAU,QACVoG,WAAY,CACRmJ,KAAM,OACNzN,MAAOkC,KAAKtD,KAAKsiB,QACjBjL,MAAO/T,KAAKW,QAAQrC,QAAQ8N,QAI3C,MAIGmJ,EAAG5Y,WAAWmE,SAAQ,CAAC7D,EAAuB0C,KAC1C,MAAM+E,EAAQpH,EAAqBqC,EAAGK,KAAK2gB,GAAGnjB,QAAQyiB,UAChDyX,EAAWpiB,EAAI5Q,GACrB,IAAK1E,KAAKW,QAAQwzB,eAAe13B,SAASiI,GAAQ,CACjC6Q,EAAG5Y,WAAWgD,GACtBhD,WAAa,CACd,CACIX,SAAU,QACVoG,WAAY,CACRmJ,KAAM,OACNzN,MAAOV,EAAWs6B,EAASx6B,MAAQC,OAAOu6B,EAASh7B,OAAS,IAC5DqX,MAAO/T,KAAKW,QAAQrC,QAAQ8N,QAI3C,KAIT,OAAOmJ,CAEV,QAGQoiB,GAAe,SAAS1C,EAAsBt0B,EAAU,IACjE,MAAMkzB,EAAS,IAAIS,GAAOW,EAAWt0B,GAOrC,OANIs0B,EAAU/K,YACV2J,EAAOpkB,OAEPwlB,EAAUxE,GAAG,kBAAkB,IAAMoD,EAAOpkB,SAGzCokB,CACX,EC7tBatO,GAAgB,CACzBjnB,QAAS,CACLs5B,OAAQ,iCACR9E,KAAM,+BACNxL,UAAW,oCACXY,QAAS,mCAEbtB,OAAQ,CACJgR,OAAQ,mCAEZ5D,cAAe,ICPnB,MAAM6D,GAEFC,eAEAvD,SAEAwD,UAEApX,GAEAgU,OAEAzK,YAEAvpB,QAEAk0B,QAEAhL,aAEAkB,WAEA6J,OAEAI,KAEA1H,MAEA,WAAApO,CAAY+V,EAAsBt0B,EAAU,IACxCX,KAAK2gB,GAAKsU,EACVj1B,KAAKW,QAAU,IACR4kB,MACA5kB,EAEV,CAED,IAAA8O,GAEI,GAAIzP,KAAKkqB,YACL,OAGJ,MAAM8N,EAAiBj6B,EAAqBiC,KAAKW,QAAQrC,QAAQs5B,QACjE,IAAIG,EAAmC/3B,KAAK2gB,GAAGoK,WAAW9J,cAAc+W,GACxE,IAAKD,EAAW,CACZA,EAAYh8B,EACR,SACA,CACIgY,MAAO/T,KAAKW,QAAQrC,QAAQs5B,OAC5B1pB,KAAM,MAId,MAAM+pB,EAAiBl6B,EAAqBiC,KAAK2gB,GAAGhgB,QAAQrC,QAAQ+oB,QAC9D6Q,EAAgBl4B,KAAK2gB,GAAGoK,WAAW9J,cAAcgX,GACnDC,EACAA,EAAc71B,YAAY01B,GAE1B/3B,KAAK2gB,GAAGoK,WAAW1oB,YAAY01B,GAEnC/3B,KAAK83B,gBAAiB,CACzB,CACD93B,KAAK+3B,UAAYA,EAGjB/3B,KAAK6pB,aAAe9tB,EAAc,MAAO,CACrCgK,GAAI/F,KAAKW,QAAQrC,QAAQgpB,YAE7BtnB,KAAK+qB,WAAahvB,EAAc,MAAO,CACnCgY,MAAO/T,KAAKW,QAAQrC,QAAQ4pB,UAEhCloB,KAAK60B,QAAU94B,EAAc,KAAM,CAC/BgY,MAAO/T,KAAKW,QAAQrC,QAAQw0B,KAC5B5kB,KAAMlO,KAAK2gB,GAAGjkB,KAAKwW,SAAStW,KACxB,CAAC+W,EAASjP,KACN,MAAMub,EAAWjgB,KAAK2gB,GAAGnjB,QAAQyiB,SAASvb,GAC1C,OAAI1E,KAAKW,QAAQqzB,cAAcv3B,SAASiI,GAC7B,GAEJ,oBAAoBA,8DACSiP,EAAQzW,MAAQyW,EAAQjX,SAASujB,EAAStiB,OAAS,GAAK,+EAElFgW,EAAQzW,MAAQyW,EAAQjX,mEAE5B,IAEZI,KAAK,MAEXkD,KAAK+qB,WAAW1oB,YAAYrC,KAAK60B,SACjC70B,KAAK6pB,aAAaxnB,YAAYrC,KAAK+qB,YACnC/qB,KAAKm4B,gBAELn4B,KAAKo4B,QAELp4B,KAAKkqB,aAAc,CAEtB,CAED,OAAAmO,GACQr4B,KAAK83B,gBAAkB93B,KAAK+3B,UAAUnT,eACtC5kB,KAAK+3B,UAAUnT,cAAcngB,YAAYzE,KAAK+3B,WAElD57B,SAASyyB,oBAAoB,QAAS5uB,KAAK20B,OAAO3C,MACrD,CAED,KAAAoG,GACIp4B,KAAK20B,OAAS,CACV3C,MAAOhyB,KAAKs4B,OAAOhD,KAAKt1B,OAE5B7D,SAASkxB,iBAAiB,QAASrtB,KAAK20B,OAAO3C,MAClD,CAED,SAAAuG,GACIp8B,SAASm0B,KAAKjuB,YAAYrC,KAAK6pB,cAC/B7pB,KAAKm4B,gBACLn4B,KAAKu0B,UAAW,EAChBv0B,KAAK2gB,GAAGS,KAAK,yBAChB,CAED,UAAAoX,GACQx4B,KAAKu0B,WACLv0B,KAAKu0B,UAAW,EAChBp4B,SAASm0B,KAAK7rB,YAAYzE,KAAK6pB,cAC/B7pB,KAAK2gB,GAAGS,KAAK,2BAEpB,CAED,aAAA+W,GACI,MAAMhB,EAAU/3B,OAAO+3B,SAAW/3B,OAAOg4B,YACnC5jB,EAAUpU,OAAOoU,SAAWpU,OAAOi4B,YACzCr3B,KAAKg1B,KAAOh1B,KAAK+qB,WAAWe,wBAC5B9rB,KAAK40B,OAAS,CACVhc,EAAGxZ,OAAOk4B,WAAaH,EAAUn3B,KAAKg1B,KAAK/P,MAC3CjO,EAAG5X,OAAOm4B,YAAc/jB,EAAUxT,KAAKg1B,KAAKhG,OAEnD,CAED,MAAAsJ,CAAOhL,GACH,MAAME,EAASF,EAAME,OACrB,GAAMA,aAAkBve,QAKxB,GAFAjP,KAAKstB,MAAQA,EAETttB,KAAK+3B,UAAUr5B,SAAS8uB,GAAS,CAEjC,GADAF,EAAMI,iBACF1tB,KAAKu0B,SAEL,YADAv0B,KAAKw4B,aAGTx4B,KAAKu4B,YAEL,IAAI3f,EAAI0U,EAAMoI,MACV1e,EAAIsW,EAAMqI,MAEV/c,EAAI5Y,KAAK40B,OAAOhc,IAChBA,GAAK5Y,KAAKg1B,KAAK/P,OAGfjO,EAAIhX,KAAK40B,OAAO5d,IAChBA,GAAKhX,KAAKg1B,KAAKhG,QAEnBhvB,KAAK+qB,WAAWxW,MAAM4S,IAAM,GAAGnQ,MAC/BhX,KAAK+qB,WAAWxW,MAAMqhB,KAAO,GAAGhd,KACnC,MAAM,GAAI5Y,KAAK60B,QAAQn2B,SAAS8uB,GAAS,CACtC,MAAMiL,EAAe16B,EAAqBiC,KAAKW,QAAQrC,QAAQw0B,MACzD7sB,EAAKunB,EAAOU,QAAQ,GAAGuK,UAC7B,IAAKxyB,EACD,OAEJ,MAAMyyB,EAAWzyB,EAAGgb,cAAc,wBAC7ByX,EAASh6B,SAAS8uB,KACnBkL,EAASn2B,SAAWm2B,EAASn2B,SAEjC,MAAMqR,EAAS0H,OAAOrV,EAAGia,QAAQtM,QAC7B8kB,EAASn2B,QACTvC,KAAK2gB,GAAGnjB,QAAQslB,KAAK,CAAClP,IAEtB5T,KAAK2gB,GAAGnjB,QAAQqlB,KAAK,CAACjP,GAE7B,MAAU5T,KAAKu0B,UACZv0B,KAAKw4B,YAEZ,QAKQG,GAAkB,SAAS1D,EAAsBt0B,EAAU,IACpE,MAAMi4B,EAAe,IAAIf,GAAa5C,EAAWt0B,GAOjD,OANIs0B,EAAU/K,YACV0O,EAAanpB,OAEbwlB,EAAUxE,GAAG,kBAAkB,IAAMmI,EAAanpB,SAG/CmpB,CACX","x_google_ignoreList":[1,3,4]}