8bitworkshop/gen/chunk-UC2UKQOH.js.map

8 lines
122 KiB
Plaintext

{
"version": 3,
"sources": ["../node_modules/dompurify/src/utils.js", "../node_modules/dompurify/src/tags.js", "../node_modules/dompurify/src/attrs.js", "../node_modules/dompurify/src/regexp.js", "../node_modules/dompurify/src/purify.js", "../node_modules/split.js/dist/split.js", "../src/ide/toolbar.ts"],
"sourcesContent": ["const {\n hasOwnProperty,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!apply) {\n apply = function (fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\n\nif (!freeze) {\n freeze = function (x) {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x) {\n return x;\n };\n}\n\nif (!construct) {\n construct = function (Func, args) {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\nexport function unapply(func) {\n return (thisArg, ...args) => apply(func, thisArg, args);\n}\n\nexport function unconstruct(func) {\n return (...args) => construct(func, args);\n}\n\n/* Add properties to a lookup table */\nexport function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n}\n\n/* Shallow clone an object */\nexport function clone(object) {\n const newObject = create(null);\n\n let property;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property]) === true) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n}\n\n/* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n // Object\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n hasOwnProperty,\n isFrozen,\n setPrototypeOf,\n seal,\n // RegExp\n regExpTest,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringTrim,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n]);\n\n// SVG\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n]);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n]);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'fedropshadow',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n]);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n]);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n]);\n\nexport const text = freeze(['#text']);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'xmlns',\n 'slot',\n]);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n]);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnsalign',\n 'columnlines',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lspace',\n 'lquote',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n]);\n", "import { seal } from './utils.js';\n\n// eslint-disable-next-line unicorn/better-regex\nexport const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\n", "import * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n freeze,\n arrayForEach,\n arrayPop,\n arrayPush,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringIndexOf,\n stringTrim,\n regExpTest,\n typeErrorCreate,\n lookupGetter,\n} from './utils.js';\n\nconst getGlobal = () => (typeof window === 'undefined' ? null : window);\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\nconst _createTrustedTypesPolicy = function (trustedTypes, document) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (\n document.currentScript &&\n document.currentScript.hasAttribute(ATTR_NAME)\n ) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n },\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nfunction createDOMPurify(window = getGlobal()) {\n const DOMPurify = (root) => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = VERSION;\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n const originalDocument = window.document;\n\n let { document } = window;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n const trustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n originalDocument\n );\n const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName,\n } = document;\n const { importNode } = originalDocument;\n\n let documentMode = {};\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof getParentNode === 'function' &&\n implementation &&\n typeof implementation.createHTMLDocument !== 'undefined' &&\n documentMode !== 9;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n const CUSTOM_ELEMENT_HANDLING = Object.seal(\n Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false,\n },\n })\n );\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Decide if document with <html>... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (\u00A77.3.3)\n * - DOM Tree Accessors (\u00A73.1.5)\n * - Form Element Parent-Child Relations (\u00A74.10.3)\n * - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n * - HTMLCollection (\u00A74.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n 'style',\n 'svg',\n 'template',\n 'thead',\n 'title',\n 'video',\n 'xmp',\n ]);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n 'audio',\n 'video',\n 'img',\n 'source',\n 'image',\n 'track',\n ]);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n 'alt',\n 'class',\n 'for',\n 'id',\n 'label',\n 'name',\n 'pattern',\n 'placeholder',\n 'role',\n 'summary',\n 'title',\n 'value',\n 'style',\n 'xmlns',\n ]);\n\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet(\n {},\n [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE],\n stringToString\n );\n\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc;\n\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n\n const isRegexOrFunction = function (testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function (cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1\n ? (PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE)\n : (PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE);\n\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc =\n PARSER_MEDIA_TYPE === 'application/xhtml+xml'\n ? stringToString\n : stringToLowerCase;\n\n /* Set configuration parameters */\n ALLOWED_TAGS =\n 'ALLOWED_TAGS' in cfg\n ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc)\n : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR =\n 'ALLOWED_ATTR' in cfg\n ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc)\n : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES =\n 'ALLOWED_NAMESPACES' in cfg\n ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString)\n : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES =\n 'ADD_URI_SAFE_ATTR' in cfg\n ? addToSet(\n clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS =\n 'ADD_DATA_URI_TAGS' in cfg\n ? addToSet(\n clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS =\n 'FORBID_CONTENTS' in cfg\n ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc)\n : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS =\n 'FORBID_TAGS' in cfg\n ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc)\n : {};\n FORBID_ATTR =\n 'FORBID_ATTR' in cfg\n ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc)\n : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements ===\n 'boolean'\n ) {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements =\n cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [...TAGS.text]);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, TAGS.html);\n addToSet(ALLOWED_ATTR, ATTRS.html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, TAGS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, TAGS.svgFilters);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, TAGS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n ]);\n\n const HTML_INTEGRATION_POINTS = addToSet({}, [\n 'foreignobject',\n 'desc',\n 'title',\n 'annotation-xml',\n ]);\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script',\n ]);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, TAGS.svg);\n addToSet(ALL_SVG_TAGS, TAGS.svgFilters);\n addToSet(ALL_SVG_TAGS, TAGS.svgDisallowed);\n\n const ALL_MATHML_TAGS = addToSet({}, TAGS.mathMl);\n addToSet(ALL_MATHML_TAGS, TAGS.mathMlDisallowed);\n\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function (element) {\n let parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template',\n };\n }\n\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return (\n tagName === 'svg' &&\n (parentTagName === 'annotation-xml' ||\n MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n );\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (\n parent.namespaceURI === SVG_NAMESPACE &&\n !HTML_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n if (\n parent.namespaceURI === MATHML_NAMESPACE &&\n !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return (\n !ALL_MATHML_TAGS[tagName] &&\n (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName])\n );\n }\n\n // For XHTML and XML documents that support custom namespaces\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n ALLOWED_NAMESPACES[element.namespaceURI]\n ) {\n return true;\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function (node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function (name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node,\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node,\n });\n }\n\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function (dirty) {\n /* Create a HTML document */\n let doc;\n let leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n NAMESPACE === HTML_NAMESPACE\n ) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty =\n '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' +\n dirty +\n '</body></html>';\n }\n\n const dirtyPayload = trustedTypesPolicy\n ? trustedTypesPolicy.createHTML(dirty)\n : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT\n ? emptyHTML\n : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n\n const body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(\n document.createTextNode(leadingWhitespace),\n body.childNodes[0] || null\n );\n }\n\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(\n doc,\n WHOLE_DOCUMENT ? 'html' : 'body'\n )[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n const _createIterator = function (root) {\n return createNodeIterator.call(\n root.ownerDocument || root,\n root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT,\n null,\n false\n );\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function (elm) {\n return (\n elm instanceof HTMLFormElement &&\n (typeof elm.nodeName !== 'string' ||\n typeof elm.textContent !== 'string' ||\n typeof elm.removeChild !== 'function' ||\n !(elm.attributes instanceof NamedNodeMap) ||\n typeof elm.removeAttribute !== 'function' ||\n typeof elm.setAttribute !== 'function' ||\n typeof elm.namespaceURI !== 'string' ||\n typeof elm.insertBefore !== 'function' ||\n typeof elm.hasChildNodes !== 'function')\n );\n };\n\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function (object) {\n return typeof Node === 'object'\n ? object instanceof Node\n : object &&\n typeof object === 'object' &&\n typeof object.nodeType === 'number' &&\n typeof object.nodeName === 'string';\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function (entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], (hook) => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function (currentNode) {\n let content;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check if tagname contains Unicode */\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS,\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (\n currentNode.hasChildNodes() &&\n !_isNode(currentNode.firstElementChild) &&\n (!_isNode(currentNode.content) ||\n !_isNode(currentNode.content.firstElementChild)) &&\n regExpTest(/<[/\\w]/g, currentNode.innerHTML) &&\n regExpTest(/<[/\\w]/g, currentNode.textContent)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Mitigate a problem with templates inside select */\n if (\n tagName === 'select' &&\n regExpTest(/<template/i, currentNode.innerHTML)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove element if anything forbids its presence */\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {\n if (\n CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp &&\n regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)\n )\n return false;\n if (\n CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function &&\n CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)\n )\n return false;\n }\n\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n\n for (let i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(\n cloneNode(childNodes[i], true),\n getNextSibling(currentNode)\n );\n }\n }\n }\n\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n if (\n (tagName === 'noscript' || tagName === 'noembed') &&\n regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR, ' ');\n content = stringReplace(content, ERB_EXPR, ' ');\n content = stringReplace(content, TMPLIT_EXPR, ' ');\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n currentNode.textContent = content;\n }\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function (lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (\n SANITIZE_DOM &&\n (lcName === 'id' || lcName === 'name') &&\n (value in document || value in formElement)\n ) {\n return false;\n }\n\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (\n ALLOW_DATA_ATTR &&\n !FORBID_ATTR[lcName] &&\n regExpTest(DATA_ATTR, lcName)\n ) {\n // This attribute is safe\n } else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) {\n // This attribute is safe\n /* Otherwise, check the name is permitted */\n } else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n (_basicCustomElementTest(lcTag) &&\n ((CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp &&\n regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag)) ||\n (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function &&\n CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag))) &&\n ((CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp &&\n regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName)) ||\n (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function &&\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)))) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n (lcName === 'is' &&\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements &&\n ((CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp &&\n regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value)) ||\n (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function &&\n CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))))\n ) {\n // If user has supplied a regexp or function in CUSTOM_ELEMENT_HANDLING.tagNameCheck, we need to also allow derived custom elements using the same tagName test.\n // Additionally, we need to allow attributes passing the CUSTOM_ELEMENT_HANDLING.attributeNameCheck user has configured, as custom elements can define these at their own discretion.\n } else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) {\n // This attribute is safe\n /* Check no script, data or unknown possibly unsafe URI\n unless we know URI values are safe for that attribute */\n } else if (\n regExpTest(IS_ALLOWED_URI, stringReplace(value, ATTR_WHITESPACE, ''))\n ) {\n // This attribute is safe\n /* Keep image data URIs alive if src/xlink:href is allowed */\n /* Further prevent gadget XSS for dynamically built script tags */\n } else if (\n (lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') &&\n lcTag !== 'script' &&\n stringIndexOf(value, 'data:') === 0 &&\n DATA_URI_TAGS[lcTag]\n ) {\n // This attribute is safe\n /* Allow unknown protocols: This provides support for links that\n are handled by protocol handlers which may be unknown ahead of\n time, e.g. fb:, spotify: */\n } else if (\n ALLOW_UNKNOWN_PROTOCOLS &&\n !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))\n ) {\n // This attribute is safe\n /* Check for binary attributes */\n // eslint-disable-next-line no-negated-condition\n } else if (!value) {\n // Binary attributes are safe at this point\n /* Anything else, presume unsafe, do not add it back */\n } else {\n return false;\n }\n\n return true;\n };\n\n /**\n * _basicCustomElementCheck\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n * @param {string} tagName name of the tag of the node to sanitize\n */\n const _basicCustomElementTest = function (tagName) {\n return tagName.indexOf('-') > 0;\n };\n\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n const _sanitizeAttributes = function (currentNode) {\n let attr;\n let value;\n let lcName;\n let l;\n /* Execute a hook if present */\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n const { attributes } = currentNode;\n\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes) {\n return;\n }\n\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n };\n l = attributes.length;\n\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n attr = attributes[l];\n const { name, namespaceURI } = attr;\n value = name === 'value' ? attr.value : stringTrim(attr.value);\n lcName = transformCaseFunc(name);\n\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n\n /* Remove attribute */\n _removeAttribute(name, currentNode);\n\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n continue;\n }\n\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR, ' ');\n value = stringReplace(value, ERB_EXPR, ' ');\n value = stringReplace(value, TMPLIT_EXPR, ' ');\n }\n\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n\n /* Handle attributes that require Trusted Types */\n if (\n trustedTypesPolicy &&\n typeof trustedTypes === 'object' &&\n typeof trustedTypes.getAttributeType === 'function'\n ) {\n if (namespaceURI) {\n /* Namespaces are not yet supported, see https://bugs.chromium.org/p/chromium/issues/detail?id=1305293 */\n } else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n value = trustedTypesPolicy.createHTML(value);\n break;\n case 'TrustedScriptURL':\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n default:\n break;\n }\n }\n }\n\n /* Handle invalid data-* attribute set by try-catching it */\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function (fragment) {\n let shadowNode;\n const shadowIterator = _createIterator(fragment);\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while ((shadowNode = shadowIterator.nextNode())) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(shadowNode);\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty, cfg = {}) {\n let body;\n let importedNode;\n let currentNode;\n let oldNode;\n let returnNode;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n\n /* Check we can run. Otherwise fall back or ignore */\n if (!DOMPurify.isSupported) {\n if (\n typeof window.toStaticHTML === 'object' ||\n typeof window.toStaticHTML === 'function'\n ) {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n\n /* Clean up removed elements */\n DOMPurify.removed = [];\n\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate(\n 'root node is forbidden and cannot be sanitized in-place'\n );\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (\n !RETURN_DOM &&\n !SAFE_FOR_TEMPLATES &&\n !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1\n ) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n ? trustedTypesPolicy.createHTML(dirty)\n : dirty;\n }\n\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n\n /* Get node iterator */\n const nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n\n /* Now start iterating over the created document */\n while ((currentNode = nodeIterator.nextNode())) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n\n return returnNode;\n }\n\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n /* Serialize doctype if allowed */\n if (\n WHOLE_DOCUMENT &&\n ALLOWED_TAGS['!doctype'] &&\n body.ownerDocument &&\n body.ownerDocument.doctype &&\n body.ownerDocument.doctype.name &&\n regExpTest(EXPRESSIONS.DOCTYPE_NAME, body.ownerDocument.doctype.name)\n ) {\n serializedHTML =\n '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');\n serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n ? trustedTypesPolicy.createHTML(serializedHTML)\n : serializedHTML;\n };\n\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n}\n\nexport default createDOMPurify();\n", "/*! Split.js - v1.6.5 */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Split = factory());\n}(this, (function () { 'use strict';\n\n // The programming goals of Split.js are to deliver readable, understandable and\n // maintainable code, while at the same time manually optimizing for tiny minified file size,\n // browser compatibility without additional requirements\n // and very few assumptions about the user's page layout.\n var global = typeof window !== 'undefined' ? window : null;\n var ssr = global === null;\n var document = !ssr ? global.document : undefined;\n\n // Save a couple long function names that are used frequently.\n // This optimization saves around 400 bytes.\n var addEventListener = 'addEventListener';\n var removeEventListener = 'removeEventListener';\n var getBoundingClientRect = 'getBoundingClientRect';\n var gutterStartDragging = '_a';\n var aGutterSize = '_b';\n var bGutterSize = '_c';\n var HORIZONTAL = 'horizontal';\n var NOOP = function () { return false; };\n\n // Helper function determines which prefixes of CSS calc we need.\n // We only need to do this once on startup, when this anonymous function is called.\n //\n // Tests -webkit, -moz and -o prefixes. Modified from StackOverflow:\n // http://stackoverflow.com/questions/16625140/js-feature-detection-to-detect-the-usage-of-webkit-calc-over-calc/16625167#16625167\n var calc = ssr\n ? 'calc'\n : ((['', '-webkit-', '-moz-', '-o-']\n .filter(function (prefix) {\n var el = document.createElement('div');\n el.style.cssText = \"width:\" + prefix + \"calc(9px)\";\n\n return !!el.style.length\n })\n .shift()) + \"calc\");\n\n // Helper function checks if its argument is a string-like type\n var isString = function (v) { return typeof v === 'string' || v instanceof String; };\n\n // Helper function allows elements and string selectors to be used\n // interchangeably. In either case an element is returned. This allows us to\n // do `Split([elem1, elem2])` as well as `Split(['#id1', '#id2'])`.\n var elementOrSelector = function (el) {\n if (isString(el)) {\n var ele = document.querySelector(el);\n if (!ele) {\n throw new Error((\"Selector \" + el + \" did not match a DOM element\"))\n }\n return ele\n }\n\n return el\n };\n\n // Helper function gets a property from the properties object, with a default fallback\n var getOption = function (options, propName, def) {\n var value = options[propName];\n if (value !== undefined) {\n return value\n }\n return def\n };\n\n var getGutterSize = function (gutterSize, isFirst, isLast, gutterAlign) {\n if (isFirst) {\n if (gutterAlign === 'end') {\n return 0\n }\n if (gutterAlign === 'center') {\n return gutterSize / 2\n }\n } else if (isLast) {\n if (gutterAlign === 'start') {\n return 0\n }\n if (gutterAlign === 'center') {\n return gutterSize / 2\n }\n }\n\n return gutterSize\n };\n\n // Default options\n var defaultGutterFn = function (i, gutterDirection) {\n var gut = document.createElement('div');\n gut.className = \"gutter gutter-\" + gutterDirection;\n return gut\n };\n\n var defaultElementStyleFn = function (dim, size, gutSize) {\n var style = {};\n\n if (!isString(size)) {\n style[dim] = calc + \"(\" + size + \"% - \" + gutSize + \"px)\";\n } else {\n style[dim] = size;\n }\n\n return style\n };\n\n var defaultGutterStyleFn = function (dim, gutSize) {\n var obj;\n\n return (( obj = {}, obj[dim] = (gutSize + \"px\"), obj ));\n };\n\n // The main function to initialize a split. Split.js thinks about each pair\n // of elements as an independant pair. Dragging the gutter between two elements\n // only changes the dimensions of elements in that pair. This is key to understanding\n // how the following functions operate, since each function is bound to a pair.\n //\n // A pair object is shaped like this:\n //\n // {\n // a: DOM element,\n // b: DOM element,\n // aMin: Number,\n // bMin: Number,\n // dragging: Boolean,\n // parent: DOM element,\n // direction: 'horizontal' | 'vertical'\n // }\n //\n // The basic sequence:\n //\n // 1. Set defaults to something sane. `options` doesn't have to be passed at all.\n // 2. Initialize a bunch of strings based on the direction we're splitting.\n // A lot of the behavior in the rest of the library is paramatized down to\n // rely on CSS strings and classes.\n // 3. Define the dragging helper functions, and a few helpers to go with them.\n // 4. Loop through the elements while pairing them off. Every pair gets an\n // `pair` object and a gutter.\n // 5. Actually size the pair elements, insert gutters and attach event listeners.\n var Split = function (idsOption, options) {\n if ( options === void 0 ) options = {};\n\n if (ssr) { return {} }\n\n var ids = idsOption;\n var dimension;\n var clientAxis;\n var position;\n var positionEnd;\n var clientSize;\n var elements;\n\n // Allow HTMLCollection to be used as an argument when supported\n if (Array.from) {\n ids = Array.from(ids);\n }\n\n // All DOM elements in the split should have a common parent. We can grab\n // the first elements parent and hope users read the docs because the\n // behavior will be whacky otherwise.\n var firstElement = elementOrSelector(ids[0]);\n var parent = firstElement.parentNode;\n var parentStyle = getComputedStyle ? getComputedStyle(parent) : null;\n var parentFlexDirection = parentStyle ? parentStyle.flexDirection : null;\n\n // Set default options.sizes to equal percentages of the parent element.\n var sizes = getOption(options, 'sizes') || ids.map(function () { return 100 / ids.length; });\n\n // Standardize minSize and maxSize to an array if it isn't already.\n // This allows minSize and maxSize to be passed as a number.\n var minSize = getOption(options, 'minSize', 100);\n var minSizes = Array.isArray(minSize) ? minSize : ids.map(function () { return minSize; });\n var maxSize = getOption(options, 'maxSize', Infinity);\n var maxSizes = Array.isArray(maxSize) ? maxSize : ids.map(function () { return maxSize; });\n\n // Get other options\n var expandToMin = getOption(options, 'expandToMin', false);\n var gutterSize = getOption(options, 'gutterSize', 10);\n var gutterAlign = getOption(options, 'gutterAlign', 'center');\n var snapOffset = getOption(options, 'snapOffset', 30);\n var snapOffsets = Array.isArray(snapOffset) ? snapOffset : ids.map(function () { return snapOffset; });\n var dragInterval = getOption(options, 'dragInterval', 1);\n var direction = getOption(options, 'direction', HORIZONTAL);\n var cursor = getOption(\n options,\n 'cursor',\n direction === HORIZONTAL ? 'col-resize' : 'row-resize'\n );\n var gutter = getOption(options, 'gutter', defaultGutterFn);\n var elementStyle = getOption(\n options,\n 'elementStyle',\n defaultElementStyleFn\n );\n var gutterStyle = getOption(options, 'gutterStyle', defaultGutterStyleFn);\n\n // 2. Initialize a bunch of strings based on the direction we're splitting.\n // A lot of the behavior in the rest of the library is paramatized down to\n // rely on CSS strings and classes.\n if (direction === HORIZONTAL) {\n dimension = 'width';\n clientAxis = 'clientX';\n position = 'left';\n positionEnd = 'right';\n clientSize = 'clientWidth';\n } else if (direction === 'vertical') {\n dimension = 'height';\n clientAxis = 'clientY';\n position = 'top';\n positionEnd = 'bottom';\n clientSize = 'clientHeight';\n }\n\n // 3. Define the dragging helper functions, and a few helpers to go with them.\n // Each helper is bound to a pair object that contains its metadata. This\n // also makes it easy to store references to listeners that that will be\n // added and removed.\n //\n // Even though there are no other functions contained in them, aliasing\n // this to self saves 50 bytes or so since it's used so frequently.\n //\n // The pair object saves metadata like dragging state, position and\n // event listener references.\n\n function setElementSize(el, size, gutSize, i) {\n // Split.js allows setting sizes via numbers (ideally), or if you must,\n // by string, like '300px'. This is less than ideal, because it breaks\n // the fluid layout that `calc(% - px)` provides. You're on your own if you do that,\n // make sure you calculate the gutter size by hand.\n var style = elementStyle(dimension, size, gutSize, i);\n\n Object.keys(style).forEach(function (prop) {\n // eslint-disable-next-line no-param-reassign\n el.style[prop] = style[prop];\n });\n }\n\n function setGutterSize(gutterElement, gutSize, i) {\n var style = gutterStyle(dimension, gutSize, i);\n\n Object.keys(style).forEach(function (prop) {\n // eslint-disable-next-line no-param-reassign\n gutterElement.style[prop] = style[prop];\n });\n }\n\n function getSizes() {\n return elements.map(function (element) { return element.size; })\n }\n\n // Supports touch events, but not multitouch, so only the first\n // finger `touches[0]` is counted.\n function getMousePosition(e) {\n if ('touches' in e) { return e.touches[0][clientAxis] }\n return e[clientAxis]\n }\n\n // Actually adjust the size of elements `a` and `b` to `offset` while dragging.\n // calc is used to allow calc(percentage + gutterpx) on the whole split instance,\n // which allows the viewport to be resized without additional logic.\n // Element a's size is the same as offset. b's size is total size - a size.\n // Both sizes are calculated from the initial parent percentage,\n // then the gutter size is subtracted.\n function adjust(offset) {\n var a = elements[this.a];\n var b = elements[this.b];\n var percentage = a.size + b.size;\n\n a.size = (offset / this.size) * percentage;\n b.size = percentage - (offset / this.size) * percentage;\n\n setElementSize(a.element, a.size, this[aGutterSize], a.i);\n setElementSize(b.element, b.size, this[bGutterSize], b.i);\n }\n\n // drag, where all the magic happens. The logic is really quite simple:\n //\n // 1. Ignore if the pair is not dragging.\n // 2. Get the offset of the event.\n // 3. Snap offset to min if within snappable range (within min + snapOffset).\n // 4. Actually adjust each element in the pair to offset.\n //\n // ---------------------------------------------------------------------\n // | | <- a.minSize || b.minSize -> | |\n // | | | <- this.snapOffset || this.snapOffset -> | | |\n // | | | || | | |\n // | | | || | | |\n // ---------------------------------------------------------------------\n // | <- this.start this.size -> |\n function drag(e) {\n var offset;\n var a = elements[this.a];\n var b = elements[this.b];\n\n if (!this.dragging) { return }\n\n // Get the offset of the event from the first side of the\n // pair `this.start`. Then offset by the initial position of the\n // mouse compared to the gutter size.\n offset =\n getMousePosition(e) -\n this.start +\n (this[aGutterSize] - this.dragOffset);\n\n if (dragInterval > 1) {\n offset = Math.round(offset / dragInterval) * dragInterval;\n }\n\n // If within snapOffset of min or max, set offset to min or max.\n // snapOffset buffers a.minSize and b.minSize, so logic is opposite for both.\n // Include the appropriate gutter sizes to prevent overflows.\n if (offset <= a.minSize + a.snapOffset + this[aGutterSize]) {\n offset = a.minSize + this[aGutterSize];\n } else if (\n offset >=\n this.size - (b.minSize + b.snapOffset + this[bGutterSize])\n ) {\n offset = this.size - (b.minSize + this[bGutterSize]);\n }\n\n if (offset >= a.maxSize - a.snapOffset + this[aGutterSize]) {\n offset = a.maxSize + this[aGutterSize];\n } else if (\n offset <=\n this.size - (b.maxSize - b.snapOffset + this[bGutterSize])\n ) {\n offset = this.size - (b.maxSize + this[bGutterSize]);\n }\n\n // Actually adjust the size.\n adjust.call(this, offset);\n\n // Call the drag callback continously. Don't do anything too intensive\n // in this callback.\n getOption(options, 'onDrag', NOOP)(getSizes());\n }\n\n // Cache some important sizes when drag starts, so we don't have to do that\n // continously:\n //\n // `size`: The total size of the pair. First + second + first gutter + second gutter.\n // `start`: The leading side of the first element.\n //\n // ------------------------------------------------\n // | aGutterSize -> ||| |\n // | ||| |\n // | ||| |\n // | ||| <- bGutterSize |\n // ------------------------------------------------\n // | <- start size -> |\n function calculateSizes() {\n // Figure out the parent size minus padding.\n var a = elements[this.a].element;\n var b = elements[this.b].element;\n\n var aBounds = a[getBoundingClientRect]();\n var bBounds = b[getBoundingClientRect]();\n\n this.size =\n aBounds[dimension] +\n bBounds[dimension] +\n this[aGutterSize] +\n this[bGutterSize];\n this.start = aBounds[position];\n this.end = aBounds[positionEnd];\n }\n\n function innerSize(element) {\n // Return nothing if getComputedStyle is not supported (< IE9)\n // Or if parent element has no layout yet\n if (!getComputedStyle) { return null }\n\n var computedStyle = getComputedStyle(element);\n\n if (!computedStyle) { return null }\n\n var size = element[clientSize];\n\n if (size === 0) { return null }\n\n if (direction === HORIZONTAL) {\n size -=\n parseFloat(computedStyle.paddingLeft) +\n parseFloat(computedStyle.paddingRight);\n } else {\n size -=\n parseFloat(computedStyle.paddingTop) +\n parseFloat(computedStyle.paddingBottom);\n }\n\n return size\n }\n\n // When specifying percentage sizes that are less than the computed\n // size of the element minus the gutter, the lesser percentages must be increased\n // (and decreased from the other elements) to make space for the pixels\n // subtracted by the gutters.\n function trimToMin(sizesToTrim) {\n // Try to get inner size of parent element.\n // If it's no supported, return original sizes.\n var parentSize = innerSize(parent);\n if (parentSize === null) {\n return sizesToTrim\n }\n\n if (minSizes.reduce(function (a, b) { return a + b; }, 0) > parentSize) {\n return sizesToTrim\n }\n\n // Keep track of the excess pixels, the amount of pixels over the desired percentage\n // Also keep track of the elements with pixels to spare, to decrease after if needed\n var excessPixels = 0;\n var toSpare = [];\n\n var pixelSizes = sizesToTrim.map(function (size, i) {\n // Convert requested percentages to pixel sizes\n var pixelSize = (parentSize * size) / 100;\n var elementGutterSize = getGutterSize(\n gutterSize,\n i === 0,\n i === sizesToTrim.length - 1,\n gutterAlign\n );\n var elementMinSize = minSizes[i] + elementGutterSize;\n\n // If element is too smal, increase excess pixels by the difference\n // and mark that it has no pixels to spare\n if (pixelSize < elementMinSize) {\n excessPixels += elementMinSize - pixelSize;\n toSpare.push(0);\n return elementMinSize\n }\n\n // Otherwise, mark the pixels it has to spare and return it's original size\n toSpare.push(pixelSize - elementMinSize);\n return pixelSize\n });\n\n // If nothing was adjusted, return the original sizes\n if (excessPixels === 0) {\n return sizesToTrim\n }\n\n return pixelSizes.map(function (pixelSize, i) {\n var newPixelSize = pixelSize;\n\n // While there's still pixels to take, and there's enough pixels to spare,\n // take as many as possible up to the total excess pixels\n if (excessPixels > 0 && toSpare[i] - excessPixels > 0) {\n var takenPixels = Math.min(\n excessPixels,\n toSpare[i] - excessPixels\n );\n\n // Subtract the amount taken for the next iteration\n excessPixels -= takenPixels;\n newPixelSize = pixelSize - takenPixels;\n }\n\n // Return the pixel size adjusted as a percentage\n return (newPixelSize / parentSize) * 100\n })\n }\n\n // stopDragging is very similar to startDragging in reverse.\n function stopDragging() {\n var self = this;\n var a = elements[self.a].element;\n var b = elements[self.b].element;\n\n if (self.dragging) {\n getOption(options, 'onDragEnd', NOOP)(getSizes());\n }\n\n self.dragging = false;\n\n // Remove the stored event listeners. This is why we store them.\n global[removeEventListener]('mouseup', self.stop);\n global[removeEventListener]('touchend', self.stop);\n global[removeEventListener]('touchcancel', self.stop);\n global[removeEventListener]('mousemove', self.move);\n global[removeEventListener]('touchmove', self.move);\n\n // Clear bound function references\n self.stop = null;\n self.move = null;\n\n a[removeEventListener]('selectstart', NOOP);\n a[removeEventListener]('dragstart', NOOP);\n b[removeEventListener]('selectstart', NOOP);\n b[removeEventListener]('dragstart', NOOP);\n\n a.style.userSelect = '';\n a.style.webkitUserSelect = '';\n a.style.MozUserSelect = '';\n a.style.pointerEvents = '';\n\n b.style.userSelect = '';\n b.style.webkitUserSelect = '';\n b.style.MozUserSelect = '';\n b.style.pointerEvents = '';\n\n self.gutter.style.cursor = '';\n self.parent.style.cursor = '';\n document.body.style.cursor = '';\n }\n\n // startDragging calls `calculateSizes` to store the inital size in the pair object.\n // It also adds event listeners for mouse/touch events,\n // and prevents selection while dragging so avoid the selecting text.\n function startDragging(e) {\n // Right-clicking can't start dragging.\n if ('button' in e && e.button !== 0) {\n return\n }\n\n // Alias frequently used variables to save space. 200 bytes.\n var self = this;\n var a = elements[self.a].element;\n var b = elements[self.b].element;\n\n // Call the onDragStart callback.\n if (!self.dragging) {\n getOption(options, 'onDragStart', NOOP)(getSizes());\n }\n\n // Don't actually drag the element. We emulate that in the drag function.\n e.preventDefault();\n\n // Set the dragging property of the pair object.\n self.dragging = true;\n\n // Create two event listeners bound to the same pair object and store\n // them in the pair object.\n self.move = drag.bind(self);\n self.stop = stopDragging.bind(self);\n\n // All the binding. `window` gets the stop events in case we drag out of the elements.\n global[addEventListener]('mouseup', self.stop);\n global[addEventListener]('touchend', self.stop);\n global[addEventListener]('touchcancel', self.stop);\n global[addEventListener]('mousemove', self.move);\n global[addEventListener]('touchmove', self.move);\n\n // Disable selection. Disable!\n a[addEventListener]('selectstart', NOOP);\n a[addEventListener]('dragstart', NOOP);\n b[addEventListener]('selectstart', NOOP);\n b[addEventListener]('dragstart', NOOP);\n\n a.style.userSelect = 'none';\n a.style.webkitUserSelect = 'none';\n a.style.MozUserSelect = 'none';\n a.style.pointerEvents = 'none';\n\n b.style.userSelect = 'none';\n b.style.webkitUserSelect = 'none';\n b.style.MozUserSelect = 'none';\n b.style.pointerEvents = 'none';\n\n // Set the cursor at multiple levels\n self.gutter.style.cursor = cursor;\n self.parent.style.cursor = cursor;\n document.body.style.cursor = cursor;\n\n // Cache the initial sizes of the pair.\n calculateSizes.call(self);\n\n // Determine the position of the mouse compared to the gutter\n self.dragOffset = getMousePosition(e) - self.end;\n }\n\n // adjust sizes to ensure percentage is within min size and gutter.\n sizes = trimToMin(sizes);\n\n // 5. Create pair and element objects. Each pair has an index reference to\n // elements `a` and `b` of the pair (first and second elements).\n // Loop through the elements while pairing them off. Every pair gets a\n // `pair` object and a gutter.\n //\n // Basic logic:\n //\n // - Starting with the second element `i > 0`, create `pair` objects with\n // `a = i - 1` and `b = i`\n // - Set gutter sizes based on the _pair_ being first/last. The first and last\n // pair have gutterSize / 2, since they only have one half gutter, and not two.\n // - Create gutter elements and add event listeners.\n // - Set the size of the elements, minus the gutter sizes.\n //\n // -----------------------------------------------------------------------\n // | i=0 | i=1 | i=2 | i=3 |\n // | | | | |\n // | pair 0 pair 1 pair 2 |\n // | | | | |\n // -----------------------------------------------------------------------\n var pairs = [];\n elements = ids.map(function (id, i) {\n // Create the element object.\n var element = {\n element: elementOrSelector(id),\n size: sizes[i],\n minSize: minSizes[i],\n maxSize: maxSizes[i],\n snapOffset: snapOffsets[i],\n i: i,\n };\n\n var pair;\n\n if (i > 0) {\n // Create the pair object with its metadata.\n pair = {\n a: i - 1,\n b: i,\n dragging: false,\n direction: direction,\n parent: parent,\n };\n\n pair[aGutterSize] = getGutterSize(\n gutterSize,\n i - 1 === 0,\n false,\n gutterAlign\n );\n pair[bGutterSize] = getGutterSize(\n gutterSize,\n false,\n i === ids.length - 1,\n gutterAlign\n );\n\n // if the parent has a reverse flex-direction, switch the pair elements.\n if (\n parentFlexDirection === 'row-reverse' ||\n parentFlexDirection === 'column-reverse'\n ) {\n var temp = pair.a;\n pair.a = pair.b;\n pair.b = temp;\n }\n }\n\n // Determine the size of the current element. IE8 is supported by\n // staticly assigning sizes without draggable gutters. Assigns a string\n // to `size`.\n //\n // Create gutter elements for each pair.\n if (i > 0) {\n var gutterElement = gutter(i, direction, element.element);\n setGutterSize(gutterElement, gutterSize, i);\n\n // Save bound event listener for removal later\n pair[gutterStartDragging] = startDragging.bind(pair);\n\n // Attach bound event listener\n gutterElement[addEventListener](\n 'mousedown',\n pair[gutterStartDragging]\n );\n gutterElement[addEventListener](\n 'touchstart',\n pair[gutterStartDragging]\n );\n\n parent.insertBefore(gutterElement, element.element);\n\n pair.gutter = gutterElement;\n }\n\n setElementSize(\n element.element,\n element.size,\n getGutterSize(\n gutterSize,\n i === 0,\n i === ids.length - 1,\n gutterAlign\n ),\n i\n );\n\n // After the first iteration, and we have a pair object, append it to the\n // list of pairs.\n if (i > 0) {\n pairs.push(pair);\n }\n\n return element\n });\n\n function adjustToMin(element) {\n var isLast = element.i === pairs.length;\n var pair = isLast ? pairs[element.i - 1] : pairs[element.i];\n\n calculateSizes.call(pair);\n\n var size = isLast\n ? pair.size - element.minSize - pair[bGutterSize]\n : element.minSize + pair[aGutterSize];\n\n adjust.call(pair, size);\n }\n\n elements.forEach(function (element) {\n var computedSize = element.element[getBoundingClientRect]()[dimension];\n\n if (computedSize < element.minSize) {\n if (expandToMin) {\n adjustToMin(element);\n } else {\n // eslint-disable-next-line no-param-reassign\n element.minSize = computedSize;\n }\n }\n });\n\n function setSizes(newSizes) {\n var trimmed = trimToMin(newSizes);\n trimmed.forEach(function (newSize, i) {\n if (i > 0) {\n var pair = pairs[i - 1];\n\n var a = elements[pair.a];\n var b = elements[pair.b];\n\n a.size = trimmed[i - 1];\n b.size = newSize;\n\n setElementSize(a.element, a.size, pair[aGutterSize], a.i);\n setElementSize(b.element, b.size, pair[bGutterSize], b.i);\n }\n });\n }\n\n function destroy(preserveStyles, preserveGutter) {\n pairs.forEach(function (pair) {\n if (preserveGutter !== true) {\n pair.parent.removeChild(pair.gutter);\n } else {\n pair.gutter[removeEventListener](\n 'mousedown',\n pair[gutterStartDragging]\n );\n pair.gutter[removeEventListener](\n 'touchstart',\n pair[gutterStartDragging]\n );\n }\n\n if (preserveStyles !== true) {\n var style = elementStyle(\n dimension,\n pair.a.size,\n pair[aGutterSize]\n );\n\n Object.keys(style).forEach(function (prop) {\n elements[pair.a].element.style[prop] = '';\n elements[pair.b].element.style[prop] = '';\n });\n }\n });\n }\n\n return {\n setSizes: setSizes,\n getSizes: getSizes,\n collapse: function collapse(i) {\n adjustToMin(elements[i]);\n },\n destroy: destroy,\n parent: parent,\n pairs: pairs,\n }\n };\n\n return Split;\n\n})));\n", "\nimport Mousetrap = require('mousetrap');\n\n/// TOOLBAR\n\nexport class Toolbar {\n span : JQuery;\n grp : JQuery;\n mousetrap;\n boundkeys = [];\n \n constructor(parentDiv:HTMLElement, focusDiv:HTMLElement) {\n this.mousetrap = focusDiv ? new Mousetrap(focusDiv) : Mousetrap;\n this.span = $(document.createElement(\"span\")).addClass(\"btn_toolbar\");\n parentDiv.appendChild(this.span[0]);\n this.newGroup();\n }\n destroy() {\n if (this.span) {\n this.span.remove();\n this.span = null;\n }\n if (this.mousetrap) {\n for (var key of this.boundkeys) {\n this.mousetrap.unbind(key);\n }\n this.mousetrap = null;\n }\n }\n newGroup() {\n return this.grp = $(document.createElement(\"span\")).addClass(\"btn_group\").appendTo(this.span).hide();\n }\n add(key:string, alttext:string, icon:string, fn:(e,combo) => void) {\n var btn = null;\n if (icon) {\n btn = $(document.createElement(\"button\")).addClass(\"btn\");\n if (icon.startsWith('glyphicon')) {\n icon = '<span class=\"glyphicon ' + icon + '\" aria-hidden=\"true\"></span>';\n }\n btn.html(icon);\n btn.prop(\"title\", key ? (alttext+\" (\"+key+\")\") : alttext);\n btn.click(fn);\n this.grp.append(btn).show();\n }\n if (key) {\n this.mousetrap.bind(key, fn);\n this.boundkeys.push(key);\n }\n return btn;\n }\n \n }\n "],
"mappings": ";qFAAA,GACE,GAKE,OALF,eACA,GAIE,OAJF,eACA,GAGE,OAHF,SACA,GAEE,OAFF,eACA,EACE,OADF,yBAGI,EAAyB,OAAzB,OAAQ,EAAiB,OAAjB,KAAM,GAAW,OAAX,OACpB,GAA2B,MAAO,UAAY,aAAe,QAAvD,GAAN,GAAM,MAAO,EAAb,GAAa,UAEb,AAAK,IACH,IAAQ,SAAU,EAAK,EAAW,EAAM,CACtC,MAAO,GAAI,MAAM,EAAW,KAI3B,GACH,GAAS,SAAU,EAAG,CACpB,MAAO,KAIN,GACH,GAAO,SAAU,EAAG,CAClB,MAAO,KAIN,GACH,GAAY,SAAU,EAAM,EAAM,CACrB,MAAA,GAAA,EAAX,EAAmB,MAIvB,GAAM,GAAe,EAAQ,MAAM,UAAU,SAEvC,EAAW,EAAQ,MAAM,UAAU,KACnC,EAAY,EAAQ,MAAM,UAAU,MAGpC,EAAoB,EAAQ,OAAO,UAAU,aAC7C,GAAiB,EAAQ,OAAO,UAAU,UAC1C,GAAc,EAAQ,OAAO,UAAU,OACvC,EAAgB,EAAQ,OAAO,UAAU,SACzC,EAAgB,EAAQ,OAAO,UAAU,SACzC,GAAa,EAAQ,OAAO,UAAU,MAEtC,EAAa,EAAQ,OAAO,UAAU,MAEtC,GAAkB,GAAY,WAE7B,WAAiB,EAAM,CAC5B,MAAO,UAAC,EAAD,CAAA,OAAA,GAAA,UAAA,OAAa,EAAb,GAAA,OAAA,EAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,IAAa,EAAb,EAAA,GAAA,UAAA,GAAA,MAAsB,IAAM,EAAM,EAAS,IAG7C,YAAqB,EAAM,CACzB,MAAA,WAAA,CAAA,OAAA,GAAA,UAAA,OAAI,EAAJ,GAAA,OAAA,GAAA,EAAA,EAAA,EAAA,EAAA,IAAI,EAAJ,GAAA,UAAA,GAAA,MAAa,GAAU,EAAM,IAI/B,WAAkB,EAAK,EAAO,EAAmB,CACtD,EAAoB,GAAwC,EACxD,IAIF,GAAe,EAAK,MAIf,OADH,GAAI,EAAM,OACP,KAAK,CACV,GAAI,GAAU,EAAM,GACpB,GAAI,MAAO,IAAY,SAAU,CAC/B,GAAM,GAAY,EAAkB,GAChC,AAAA,IAAc,GAEX,IAAS,IACZ,GAAM,GAAK,GAGb,EAAU,GAId,EAAI,GAAW,GAGjB,MAAO,GAIF,WAAe,EAAQ,CAC5B,GAAM,GAAY,GAAO,MAErB,EACC,IAAA,IAAY,GACf,AAAI,GAAM,EAAgB,EAAQ,CAAC,MAAe,IAChD,GAAU,GAAY,EAAO,IAIjC,MAAO,GAOT,YAAsB,EAAQ,EAAM,CAC3B,KAAA,IAAW,MAAM,CACtB,GAAM,GAAO,EAAyB,EAAQ,GAC9C,GAAI,EAAM,CACJ,GAAA,EAAK,IACP,MAAO,GAAQ,EAAK,KAGtB,GAAI,MAAO,GAAK,OAAU,WACxB,MAAO,GAAQ,EAAK,OAIxB,EAAS,GAAe,GAGjB,WAAc,EAAS,CAC9B,eAAQ,KAAK,qBAAsB,GAC5B,KAGT,MAAO,GChIF,GAAM,IAAO,EAAO,CACzB,IACA,OACA,UACA,UACA,OACA,UACA,QACA,QACA,IACA,MACA,MACA,MACA,QACA,aACA,OACA,KACA,SACA,SACA,UACA,SACA,OACA,OACA,MACA,WACA,UACA,OACA,WACA,KACA,YACA,MACA,UACA,MACA,SACA,MACA,MACA,KACA,KACA,UACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,UACA,OACA,WACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,SACA,QACA,SACA,SACA,OACA,SACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,QAIW,GAAM,EAAO,CACxB,MACA,IACA,WACA,cACA,eACA,eACA,gBACA,mBACA,SACA,WACA,OACA,OACA,UACA,SACA,OACA,IACA,QACA,WACA,QACA,QACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,UACA,UACA,WACA,iBACA,OACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,OACA,QACA,OACA,UAGW,EAAa,EAAO,CAC/B,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,iBAOW,GAAgB,EAAO,CAClC,UACA,gBACA,SACA,UACA,eACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,QAGW,GAAS,EAAO,CAC3B,OACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,SACA,QACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,eAKW,GAAmB,EAAO,CACrC,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,SAGW,GAAO,EAAO,CAAC,UCpRf,EAAO,EAAO,CACzB,SACA,SACA,QACA,MACA,iBACA,eACA,uBACA,WACA,aACA,UACA,SACA,UACA,cACA,cACA,UACA,OACA,QACA,QACA,QACA,OACA,UACA,WACA,eACA,SACA,cACA,WACA,WACA,UACA,MACA,WACA,0BACA,wBACA,WACA,YACA,UACA,eACA,OACA,MACA,UACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,YACA,QACA,OACA,QACA,OACA,OACA,UACA,OACA,MACA,MACA,YACA,QACA,SACA,MACA,YACA,WACA,QACA,OACA,QACA,UACA,aACA,SACA,OACA,UACA,UACA,cACA,cACA,SACA,UACA,UACA,aACA,WACA,MACA,WACA,MACA,WACA,OACA,OACA,UACA,aACA,QACA,WACA,QACA,OACA,QACA,OACA,UACA,QACA,MACA,SACA,OACA,QACA,UACA,WACA,QACA,YACA,OACA,SACA,SACA,QACA,QACA,QACA,SAGW,GAAM,EAAO,CACxB,gBACA,aACA,WACA,qBACA,SACA,gBACA,gBACA,UACA,gBACA,iBACA,QACA,OACA,KACA,QACA,OACA,gBACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,KACA,KACA,IACA,KACA,KACA,kBACA,YACA,UACA,UACA,MACA,WACA,YACA,MACA,OACA,eACA,YACA,SACA,cACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,KACA,KACA,KACA,KACA,aACA,WACA,gBACA,oBACA,SACA,OACA,KACA,kBACA,KACA,MACA,IACA,KACA,KACA,KACA,KACA,UACA,YACA,aACA,WACA,OACA,eACA,iBACA,eACA,mBACA,iBACA,QACA,aACA,aACA,eACA,eACA,cACA,cACA,mBACA,YACA,MACA,OACA,QACA,SACA,OACA,MACA,OACA,aACA,SACA,WACA,UACA,QACA,SACA,cACA,SACA,WACA,cACA,OACA,aACA,sBACA,mBACA,eACA,SACA,gBACA,sBACA,iBACA,IACA,KACA,KACA,SACA,OACA,OACA,cACA,YACA,UACA,SACA,SACA,QACA,OACA,kBACA,mBACA,mBACA,eACA,cACA,eACA,cACA,aACA,eACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,SACA,eACA,QACA,eACA,iBACA,WACA,UACA,UACA,YACA,mBACA,cACA,kBACA,iBACA,aACA,OACA,KACA,KACA,UACA,SACA,UACA,aACA,UACA,aACA,gBACA,gBACA,QACA,eACA,OACA,eACA,mBACA,mBACA,IACA,KACA,KACA,QACA,IACA,KACA,KACA,IACA,eAGW,GAAS,EAAO,CAC3B,SACA,cACA,QACA,WACA,QACA,eACA,cACA,aACA,aACA,QACA,MACA,UACA,eACA,WACA,QACA,QACA,SACA,OACA,KACA,UACA,SACA,gBACA,SACA,SACA,iBACA,YACA,WACA,cACA,UACA,UACA,gBACA,WACA,WACA,OACA,WACA,WACA,aACA,UACA,SACA,SACA,cACA,gBACA,uBACA,YACA,YACA,aACA,WACA,iBACA,iBACA,YA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",
"names": []
}