{"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/editing/helpers.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","var Diff = /** @class */ (function () {\n    function Diff(options) {\n        var _this = this;\n        if (options === void 0) { options = {}; }\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        }\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 = Array.apply(void 0, new Array(diff[options._const.groupLength])).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\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\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 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 = Array.apply(void 0, new Array(c1Length + 1)).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 Array.apply(void 0, new Array(n)).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 = Array.apply(void 0, new Array(subset.length)).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: [], // list of components used for converting from string\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        var _this = this;\n        if (obj === void 0) { obj = {}; }\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 = parseInt(cellData.data as string, 10)\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        cellData = {\n            data: parseInt(cell.innerText, 10),\n            text: cell.innerText\n        }\n        break\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        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 {\n                attributes = row.attributes\n                cells = row.cells\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[]) {\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[]) {\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[]) {\n        if (Array.isArray(columns)) {\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        } else {\n            return this.remove([columns])\n        }\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) {\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.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}'></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' 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\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    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    _initialInnerHTML: 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: {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\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._initialInnerHTML = this.options.destroyable ? this.dom.innerHTML : \"\" // 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.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\n     */\n    _onResize() {\n        this._rect = this.containerDOM.getBoundingClientRect()\n        if (!this._rect.width) {\n            // No longer shown, likely no longer part of DOM. Give up.\n            return\n        }\n        this.update(true)\n    }\n\n    /**\n     * Destroy the instance\n     * @return {void}\n     */\n    destroy() {\n        if (!this.options.destroyable) {\n            return\n        }\n        this.dom.innerHTML = this._initialInnerHTML\n\n        // Remove the className\n        this.options.classes.table?.split(\" \").forEach(className => this.wrapperDOM.classList.remove(className))\n\n        // Remove the containers\n        if (this.wrapperDOM.parentElement) {\n            this.wrapperDOM.parentElement.replaceChild(this.dom, this.wrapperDOM)\n        }\n\n        this.initialized = false\n\n        window.removeEventListener(\"resize\", this._listeners.onResize)\n    }\n\n    /**\n     * Update the instance\n     * @return {Void}\n     */\n    update(measureWidths = false) {\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) {\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        ])\n\n        this.emit(\"datatable.search\", term, this._searchData)\n\n    }\n\n    /**\n     * Perform a search of the data set seraching for up to multiple strings in various columns\n     */\n    multiSearch(rawQueries : {terms: string[], columns: (number[] | undefined)}[]) {\n        if (!this.hasRows) return false\n\n        this._currentPage = 1\n        this._searchData = []\n        // Remove empty queries\n        const queries = rawQueries.map(query => ({\n            columns: query.columns,\n            terms: query.terms.map(term => term.trim()).filter(term => term)\n        })).filter(query => query.terms.length\n        )\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                let content = cellToText(cell).trim()\n                const column = this.columns.settings[i]\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                    queries => queries.find(\n                        (query, index) => query ?\n                            query.find(queryWord => searchRow[index].find(searchItem => searchItem.includes(queryWord))) :\n                            false\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        // 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.text ?? String(heading.data))\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        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: () => 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: () => 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    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\"\nimport {\n    debounce\n} from \"./helpers\"\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","// 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","/**\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","Diff","options","_this","this","entries","forEach","_a","key","stringify","setValue","aKey","aValue","checkElementType","arguments$1","arguments","elementTypeNames","_i","length","elementTypeName","_b","ownerDocument","defaultView","objToNode","objNode","insideSvg","node","createTextNode","createComment","createElementNS","toLowerCase","attributes","appendChild","valueDiffing","checked","selected","getFromRoute","route","slice","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","apply","groupLength","removeChild","from","index","to","insertBefore","removeElement","parentRoute","removeTextElement","nodeType","console","log","postDiffApply","swap","p1","p2","tmp","undoDOM","diffs","reverse","undoDiff","__assign","assign","s","i","n","p","SuppressedError","elementDescriptors","el","output","push","concat","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","delete","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","window","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","l","$","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","parseInt","readHeaderCell","readTableData","dataOption","defaultType","defaultFormat","tHead","querySelectorAll","th","innerText","readDOMHeaderCell","settings","dataset","getAttribute","firstRow","firstRowCells","_cell","tBodies","readDOMDataCell","isNaN","parseFloat","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","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","previousPageNumber","newLi","truncate","next","DataTable","HTMLTableElement","_initialInnerHTML","_listeners","onResize","_onResize","_dd","initialized","_events","hasHeadings","_virtualDOM","_tableAttributes","_tableFooters","_tableCaptions","_render","setTimeout","wrapperDOM","selectorClassSelector","choice","lab","option","Option","containerSelector","containerDOM","_pagerDOMs","paginationSelector","HTMLElement","_virtualPagerDOM","infoSelector","_label","_rect","getBoundingClientRect","_fixHeight","_bindEvents","newVirtualDOM","renderedTableVirtualDOM","_renderPage","lastRowCursor","lastPage","setMessage","items","_searchData","_renderPagers","newPagerVirtualDOM","renderedPagerVirtualDOM","pagerDOM","_renderSeparateHeader","_virtualHeaderDOM","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","removeEventListener","measureWidths","_paginate","filterState","height","rawQueries","queries","query","queryWords","columnQueries","normalize","idx","searchRow","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","dataTable","originalRowRender","newTr","menuDOM","updateMenu","menuOpen","editing","editingRow","editingCell","bindEvents","events","keydown","bind","context","dismissMenu","reset","func","timeout","timer","_args","clearTimeout","debounce","pageX","pageY","limits","rect","left","openMenu","modalDOM","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","buttonSelector","buttonDOM","searchSelector","searchWrapper","addedButtonDOM","_measureSpace","_bind","dismiss","_click","_openMenu","_closeMenu","menuSelector","checkbox","addColumnFilter","columnFilter"],"mappings":"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","x_google_ignoreList":[1,3,4]}