{"version":3,"file":"dompurify/purify.js","sources":["dompurify/purify.js"],"sourcesContent":["/*! @license DOMPurify 3.0.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.8/LICENSE */\r\n\r\n(function (global, factory) {\r\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n\ttypeof define === 'function' && define.amd ? define(factory) :\r\n\t(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());\r\n })(this, (function () { 'use strict';\r\n\r\n\tconst {\r\n\t entries,\r\n\t setPrototypeOf,\r\n\t isFrozen,\r\n\t getPrototypeOf,\r\n\t getOwnPropertyDescriptor\r\n\t} = Object;\r\n\tlet {\r\n\t freeze,\r\n\t seal,\r\n\t create\r\n\t} = Object; // eslint-disable-line import/no-mutable-exports\r\n\tlet {\r\n\t apply,\r\n\t construct\r\n\t} = typeof Reflect !== 'undefined' && Reflect;\r\n\tif (!freeze) {\r\n\t freeze = function freeze(x) {\r\n\t\treturn x;\r\n\t };\r\n\t}\r\n\tif (!seal) {\r\n\t seal = function seal(x) {\r\n\t\treturn x;\r\n\t };\r\n\t}\r\n\tif (!apply) {\r\n\t apply = function apply(fun, thisValue, args) {\r\n\t\treturn fun.apply(thisValue, args);\r\n\t };\r\n\t}\r\n\tif (!construct) {\r\n\t construct = function construct(Func, args) {\r\n\t\treturn new Func(...args);\r\n\t };\r\n\t}\r\n\tconst arrayForEach = unapply(Array.prototype.forEach);\r\n\tconst arrayPop = unapply(Array.prototype.pop);\r\n\tconst arrayPush = unapply(Array.prototype.push);\r\n\tconst stringToLowerCase = unapply(String.prototype.toLowerCase);\r\n\tconst stringToString = unapply(String.prototype.toString);\r\n\tconst stringMatch = unapply(String.prototype.match);\r\n\tconst stringReplace = unapply(String.prototype.replace);\r\n\tconst stringIndexOf = unapply(String.prototype.indexOf);\r\n\tconst stringTrim = unapply(String.prototype.trim);\r\n\tconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\r\n\tconst regExpTest = unapply(RegExp.prototype.test);\r\n\tconst typeErrorCreate = unconstruct(TypeError);\r\n\r\n\t/**\r\n\t * Creates a new function that calls the given function with a specified thisArg and arguments.\r\n\t *\r\n\t * @param {Function} func - The function to be wrapped and called.\r\n\t * @returns {Function} A new function that calls the given function with a specified thisArg and arguments.\r\n\t */\r\n\tfunction unapply(func) {\r\n\t return function (thisArg) {\r\n\t\tfor (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\r\n\t\t args[_key - 1] = arguments[_key];\r\n\t\t}\r\n\t\treturn apply(func, thisArg, args);\r\n\t };\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\r\n\t *\r\n\t * @param {Function} func - The constructor function to be wrapped and called.\r\n\t * @returns {Function} A new function that constructs an instance of the given constructor function with the provided arguments.\r\n\t */\r\n\tfunction unconstruct(func) {\r\n\t return function () {\r\n\t\tfor (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\r\n\t\t args[_key2] = arguments[_key2];\r\n\t\t}\r\n\t\treturn construct(func, args);\r\n\t };\r\n\t}\r\n\r\n\t/**\r\n\t * Add properties to a lookup table\r\n\t *\r\n\t * @param {Object} set - The set to which elements will be added.\r\n\t * @param {Array} array - The array containing elements to be added to the set.\r\n\t * @param {Function} transformCaseFunc - An optional function to transform the case of each element before adding to the set.\r\n\t * @returns {Object} The modified set with added elements.\r\n\t */\r\n\tfunction addToSet(set, array) {\r\n\t let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\r\n\t if (setPrototypeOf) {\r\n\t\t// Make 'in' and truthy checks like Boolean(set.constructor)\r\n\t\t// independent of any properties defined on Object.prototype.\r\n\t\t// Prevent prototype setters from intercepting set as a this value.\r\n\t\tsetPrototypeOf(set, null);\r\n\t }\r\n\t let l = array.length;\r\n\t while (l--) {\r\n\t\tlet element = array[l];\r\n\t\tif (typeof element === 'string') {\r\n\t\t const lcElement = transformCaseFunc(element);\r\n\t\t if (lcElement !== element) {\r\n\t\t\t// Config presets (e.g. tags.js, attrs.js) are immutable.\r\n\t\t\tif (!isFrozen(array)) {\r\n\t\t\t array[l] = lcElement;\r\n\t\t\t}\r\n\t\t\telement = lcElement;\r\n\t\t }\r\n\t\t}\r\n\t\tset[element] = true;\r\n\t }\r\n\t return set;\r\n\t}\r\n\r\n\t/**\r\n\t * Clean up an array to harden against CSPP\r\n\t *\r\n\t * @param {Array} array - The array to be cleaned.\r\n\t * @returns {Array} The cleaned version of the array\r\n\t */\r\n\tfunction cleanArray(array) {\r\n\t for (let index = 0; index < array.length; index++) {\r\n\t\tconst isPropertyExist = objectHasOwnProperty(array, index);\r\n\t\tif (!isPropertyExist) {\r\n\t\t array[index] = null;\r\n\t\t}\r\n\t }\r\n\t return array;\r\n\t}\r\n\r\n\t/**\r\n\t * Shallow clone an object\r\n\t *\r\n\t * @param {Object} object - The object to be cloned.\r\n\t * @returns {Object} A new object that copies the original.\r\n\t */\r\n\tfunction clone(object) {\r\n\t const newObject = create(null);\r\n\t for (const [property, value] of entries(object)) {\r\n\t\tconst isPropertyExist = objectHasOwnProperty(object, property);\r\n\t\tif (isPropertyExist) {\r\n\t\t if (Array.isArray(value)) {\r\n\t\t\tnewObject[property] = cleanArray(value);\r\n\t\t } else if (value && typeof value === 'object' && value.constructor === Object) {\r\n\t\t\tnewObject[property] = clone(value);\r\n\t\t } else {\r\n\t\t\tnewObject[property] = value;\r\n\t\t }\r\n\t\t}\r\n\t }\r\n\t return newObject;\r\n\t}\r\n\r\n\t/**\r\n\t * This method automatically checks if the prop is function or getter and behaves accordingly.\r\n\t *\r\n\t * @param {Object} object - The object to look up the getter function in its prototype chain.\r\n\t * @param {String} prop - The property name for which to find the getter function.\r\n\t * @returns {Function} The getter function found in the prototype chain or a fallback function.\r\n\t */\r\n\tfunction lookupGetter(object, prop) {\r\n\t while (object !== null) {\r\n\t\tconst desc = getOwnPropertyDescriptor(object, prop);\r\n\t\tif (desc) {\r\n\t\t if (desc.get) {\r\n\t\t\treturn unapply(desc.get);\r\n\t\t }\r\n\t\t if (typeof desc.value === 'function') {\r\n\t\t\treturn unapply(desc.value);\r\n\t\t }\r\n\t\t}\r\n\t\tobject = getPrototypeOf(object);\r\n\t }\r\n\t function fallbackValue() {\r\n\t\treturn null;\r\n\t }\r\n\t return fallbackValue;\r\n\t}\r\n\r\n\tconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\r\n\r\n\t// SVG\r\n\tconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\r\n\tconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\r\n\r\n\t// List of SVG elements that are disallowed by default.\r\n\t// We still need to know them so that we can do namespace\r\n\t// checks properly in case one wants to add them to\r\n\t// allow-list.\r\n\tconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\r\n\tconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\r\n\r\n\t// Similarly to SVG, we want to know all MathML elements,\r\n\t// even those that we disallow by default.\r\n\tconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\r\n\tconst text = freeze(['#text']);\r\n\r\n\tconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot']);\r\n\tconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\r\n\tconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\r\n\tconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\r\n\r\n\t// eslint-disable-next-line unicorn/better-regex\r\n\tconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\r\n\tconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\r\n\tconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\r\n\tconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\r\n\tconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\r\n\tconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\r\n\t);\r\n\r\n\tconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\r\n\tconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\r\n\t);\r\n\r\n\tconst DOCTYPE_NAME = seal(/^html$/i);\r\n\r\n\tvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\r\n\t __proto__: null,\r\n\t MUSTACHE_EXPR: MUSTACHE_EXPR,\r\n\t ERB_EXPR: ERB_EXPR,\r\n\t TMPLIT_EXPR: TMPLIT_EXPR,\r\n\t DATA_ATTR: DATA_ATTR,\r\n\t ARIA_ATTR: ARIA_ATTR,\r\n\t IS_ALLOWED_URI: IS_ALLOWED_URI,\r\n\t IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\r\n\t ATTR_WHITESPACE: ATTR_WHITESPACE,\r\n\t DOCTYPE_NAME: DOCTYPE_NAME\r\n\t});\r\n\r\n\tconst getGlobal = function getGlobal() {\r\n\t return typeof window === 'undefined' ? null : window;\r\n\t};\r\n\r\n\t/**\r\n\t * Creates a no-op policy for internal use only.\r\n\t * Don't export this function outside this module!\r\n\t * @param {TrustedTypePolicyFactory} trustedTypes The policy factory.\r\n\t * @param {HTMLScriptElement} purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\r\n\t * @return {TrustedTypePolicy} The policy created (or null, if Trusted Types\r\n\t * are not supported or creating the policy failed).\r\n\t */\r\n\tconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\r\n\t if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\r\n\t\treturn null;\r\n\t }\r\n\r\n\t // Allow the callers to control the unique policy name\r\n\t // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\r\n\t // Policy creation with duplicate names throws in Trusted Types.\r\n\t let suffix = null;\r\n\t const ATTR_NAME = 'data-tt-policy-suffix';\r\n\t if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\r\n\t\tsuffix = purifyHostElement.getAttribute(ATTR_NAME);\r\n\t }\r\n\t const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\r\n\t try {\r\n\t\treturn trustedTypes.createPolicy(policyName, {\r\n\t\t createHTML(html) {\r\n\t\t\treturn html;\r\n\t\t },\r\n\t\t createScriptURL(scriptUrl) {\r\n\t\t\treturn scriptUrl;\r\n\t\t }\r\n\t\t});\r\n\t } catch (_) {\r\n\t\t// Policy creation failed (most likely another DOMPurify script has\r\n\t\t// already run). Skip creating the policy, as this will only cause errors\r\n\t\t// if TT are enforced.\r\n\t\tconsole.warn('TrustedTypes policy ' + policyName + ' could not be created.');\r\n\t\treturn null;\r\n\t }\r\n\t};\r\n\tfunction createDOMPurify() {\r\n\t let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\r\n\t const DOMPurify = root => createDOMPurify(root);\r\n\r\n\t /**\r\n\t * Version label, exposed for easier checks\r\n\t * if DOMPurify is up to date or not\r\n\t */\r\n\t DOMPurify.version = '3.0.8';\r\n\r\n\t /**\r\n\t * Array of elements that DOMPurify removed during sanitation.\r\n\t * Empty if nothing was removed.\r\n\t */\r\n\t DOMPurify.removed = [];\r\n\t if (!window || !window.document || window.document.nodeType !== 9) {\r\n\t\t// Not running in a browser, provide a factory function\r\n\t\t// so that you can pass your own Window\r\n\t\tDOMPurify.isSupported = false;\r\n\t\treturn DOMPurify;\r\n\t }\r\n\t let {\r\n\t\tdocument\r\n\t } = window;\r\n\t const originalDocument = document;\r\n\t const currentScript = originalDocument.currentScript;\r\n\t const {\r\n\t\tDocumentFragment,\r\n\t\tHTMLTemplateElement,\r\n\t\tNode,\r\n\t\tElement,\r\n\t\tNodeFilter,\r\n\t\tNamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\r\n\t\tHTMLFormElement,\r\n\t\tDOMParser,\r\n\t\ttrustedTypes\r\n\t } = window;\r\n\t const ElementPrototype = Element.prototype;\r\n\t const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\r\n\t const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\r\n\t const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\r\n\t const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\r\n\r\n\t // As per issue #47, the web-components registry is inherited by a\r\n\t // new document created via createHTMLDocument. As per the spec\r\n\t // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\r\n\t // a new empty registry is used when creating a template contents owner\r\n\t // document, so we use that as our parent document to ensure nothing\r\n\t // is inherited.\r\n\t if (typeof HTMLTemplateElement === 'function') {\r\n\t\tconst template = document.createElement('template');\r\n\t\tif (template.content && template.content.ownerDocument) {\r\n\t\t document = template.content.ownerDocument;\r\n\t\t}\r\n\t }\r\n\t let trustedTypesPolicy;\r\n\t let emptyHTML = '';\r\n\t const {\r\n\t\timplementation,\r\n\t\tcreateNodeIterator,\r\n\t\tcreateDocumentFragment,\r\n\t\tgetElementsByTagName\r\n\t } = document;\r\n\t const {\r\n\t\timportNode\r\n\t } = originalDocument;\r\n\t let hooks = {};\r\n\r\n\t /**\r\n\t * Expose whether this browser supports running the full DOMPurify.\r\n\t */\r\n\t DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\r\n\t const {\r\n\t\tMUSTACHE_EXPR,\r\n\t\tERB_EXPR,\r\n\t\tTMPLIT_EXPR,\r\n\t\tDATA_ATTR,\r\n\t\tARIA_ATTR,\r\n\t\tIS_SCRIPT_OR_DATA,\r\n\t\tATTR_WHITESPACE\r\n\t } = EXPRESSIONS;\r\n\t let {\r\n\t\tIS_ALLOWED_URI: IS_ALLOWED_URI$1\r\n\t } = EXPRESSIONS;\r\n\r\n\t /**\r\n\t * We consider the elements and attributes below to be safe. Ideally\r\n\t * don't add any new ones but feel free to remove unwanted ones.\r\n\t */\r\n\r\n\t /* allowed element names */\r\n\t let ALLOWED_TAGS = null;\r\n\t const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\r\n\r\n\t /* Allowed attribute names */\r\n\t let ALLOWED_ATTR = null;\r\n\t const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\r\n\r\n\t /*\r\n\t * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\r\n\t * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\r\n\t * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\r\n\t * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\r\n\t */\r\n\t let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\r\n\t\ttagNameCheck: {\r\n\t\t writable: true,\r\n\t\t configurable: false,\r\n\t\t enumerable: true,\r\n\t\t value: null\r\n\t\t},\r\n\t\tattributeNameCheck: {\r\n\t\t writable: true,\r\n\t\t configurable: false,\r\n\t\t enumerable: true,\r\n\t\t value: null\r\n\t\t},\r\n\t\tallowCustomizedBuiltInElements: {\r\n\t\t writable: true,\r\n\t\t configurable: false,\r\n\t\t enumerable: true,\r\n\t\t value: false\r\n\t\t}\r\n\t }));\r\n\r\n\t /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\r\n\t let FORBID_TAGS = null;\r\n\r\n\t /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\r\n\t let FORBID_ATTR = null;\r\n\r\n\t /* Decide if ARIA attributes are okay */\r\n\t let ALLOW_ARIA_ATTR = true;\r\n\r\n\t /* Decide if custom data attributes are okay */\r\n\t let ALLOW_DATA_ATTR = true;\r\n\r\n\t /* Decide if unknown protocols are okay */\r\n\t let ALLOW_UNKNOWN_PROTOCOLS = false;\r\n\r\n\t /* Decide if self-closing tags in attributes are allowed.\r\n\t * Usually removed due to a mXSS issue in jQuery 3.0 */\r\n\t let ALLOW_SELF_CLOSE_IN_ATTR = true;\r\n\r\n\t /* Output should be safe for common template engines.\r\n\t * This means, DOMPurify removes data attributes, mustaches and ERB\r\n\t */\r\n\t let SAFE_FOR_TEMPLATES = false;\r\n\r\n\t /* Decide if document with ... should be returned */\r\n\t let WHOLE_DOCUMENT = false;\r\n\r\n\t /* Track whether config is already set on this instance of DOMPurify. */\r\n\t let SET_CONFIG = false;\r\n\r\n\t /* Decide if all elements (e.g. style, script) must be children of\r\n\t * document.body. By default, browsers might move them to document.head */\r\n\t let FORCE_BODY = false;\r\n\r\n\t /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\r\n\t * string (or a TrustedHTML object if Trusted Types are supported).\r\n\t * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\r\n\t */\r\n\t let RETURN_DOM = false;\r\n\r\n\t /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\r\n\t * string (or a TrustedHTML object if Trusted Types are supported) */\r\n\t let RETURN_DOM_FRAGMENT = false;\r\n\r\n\t /* Try to return a Trusted Type object instead of a string, return a string in\r\n\t * case Trusted Types are not supported */\r\n\t let RETURN_TRUSTED_TYPE = false;\r\n\r\n\t /* Output should be free from DOM clobbering attacks?\r\n\t * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\r\n\t */\r\n\t let SANITIZE_DOM = true;\r\n\r\n\t /* Achieve full DOM Clobbering protection by isolating the namespace of named\r\n\t * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\r\n\t *\r\n\t * HTML/DOM spec rules that enable DOM Clobbering:\r\n\t * - Named Access on Window (§7.3.3)\r\n\t * - DOM Tree Accessors (§3.1.5)\r\n\t * - Form Element Parent-Child Relations (§4.10.3)\r\n\t * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\r\n\t * - HTMLCollection (§4.2.10.2)\r\n\t *\r\n\t * Namespace isolation is implemented by prefixing `id` and `name` attributes\r\n\t * with a constant string, i.e., `user-content-`\r\n\t */\r\n\t let SANITIZE_NAMED_PROPS = false;\r\n\t const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\r\n\r\n\t /* Keep element content when removing element? */\r\n\t let KEEP_CONTENT = true;\r\n\r\n\t /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\r\n\t * of importing it into a new Document and returning a sanitized copy */\r\n\t let IN_PLACE = false;\r\n\r\n\t /* Allow usage of profiles like html, svg and mathMl */\r\n\t let USE_PROFILES = {};\r\n\r\n\t /* Tags to ignore content of when KEEP_CONTENT is true */\r\n\t let FORBID_CONTENTS = null;\r\n\t const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\r\n\r\n\t /* Tags that are safe for data: URIs */\r\n\t let DATA_URI_TAGS = null;\r\n\t const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\r\n\r\n\t /* Attributes safe for values like \"javascript:\" */\r\n\t let URI_SAFE_ATTRIBUTES = null;\r\n\t const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\r\n\t const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\r\n\t const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\r\n\t const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\r\n\t /* Document namespace */\r\n\t let NAMESPACE = HTML_NAMESPACE;\r\n\t let IS_EMPTY_INPUT = false;\r\n\r\n\t /* Allowed XHTML+XML namespaces */\r\n\t let ALLOWED_NAMESPACES = null;\r\n\t const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\r\n\r\n\t /* Parsing of strict XHTML documents */\r\n\t let PARSER_MEDIA_TYPE = null;\r\n\t const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\r\n\t const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\r\n\t let transformCaseFunc = null;\r\n\r\n\t /* Keep a reference to config to pass to hooks */\r\n\t let CONFIG = null;\r\n\r\n\t /* Ideally, do not touch anything below this line */\r\n\t /* ______________________________________________ */\r\n\r\n\t const formElement = document.createElement('form');\r\n\t const isRegexOrFunction = function isRegexOrFunction(testValue) {\r\n\t\treturn testValue instanceof RegExp || testValue instanceof Function;\r\n\t };\r\n\r\n\t /**\r\n\t * _parseConfig\r\n\t *\r\n\t * @param {Object} cfg optional config literal\r\n\t */\r\n\t // eslint-disable-next-line complexity\r\n\t const _parseConfig = function _parseConfig() {\r\n\t\tlet cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\r\n\t\tif (CONFIG && CONFIG === cfg) {\r\n\t\t return;\r\n\t\t}\r\n\r\n\t\t/* Shield configuration object from tampering */\r\n\t\tif (!cfg || typeof cfg !== 'object') {\r\n\t\t cfg = {};\r\n\t\t}\r\n\r\n\t\t/* Shield configuration object from prototype pollution */\r\n\t\tcfg = clone(cfg);\r\n\t\tPARSER_MEDIA_TYPE =\r\n\t\t// eslint-disable-next-line unicorn/prefer-includes\r\n\t\tSUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\r\n\r\n\t\t// HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\r\n\t\ttransformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\r\n\r\n\t\t/* Set configuration parameters */\r\n\t\tALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\r\n\t\tALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\r\n\t\tALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\r\n\t\tURI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES),\r\n\t\t// eslint-disable-line indent\r\n\t\tcfg.ADD_URI_SAFE_ATTR,\r\n\t\t// eslint-disable-line indent\r\n\t\ttransformCaseFunc // eslint-disable-line indent\r\n\t\t) // eslint-disable-line indent\r\n\t\t: DEFAULT_URI_SAFE_ATTRIBUTES;\r\n\t\tDATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS),\r\n\t\t// eslint-disable-line indent\r\n\t\tcfg.ADD_DATA_URI_TAGS,\r\n\t\t// eslint-disable-line indent\r\n\t\ttransformCaseFunc // eslint-disable-line indent\r\n\t\t) // eslint-disable-line indent\r\n\t\t: DEFAULT_DATA_URI_TAGS;\r\n\t\tFORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\r\n\t\tFORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\r\n\t\tFORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\r\n\t\tUSE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\r\n\t\tALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\r\n\t\tALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\r\n\t\tALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\r\n\t\tALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\r\n\t\tSAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\r\n\t\tWHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\r\n\t\tRETURN_DOM = cfg.RETURN_DOM || false; // Default false\r\n\t\tRETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\r\n\t\tRETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\r\n\t\tFORCE_BODY = cfg.FORCE_BODY || false; // Default false\r\n\t\tSANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\r\n\t\tSANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\r\n\t\tKEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\r\n\t\tIN_PLACE = cfg.IN_PLACE || false; // Default false\r\n\t\tIS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\r\n\t\tNAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\r\n\t\tCUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\r\n\t\tif (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\r\n\t\t CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\r\n\t\t}\r\n\t\tif (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\r\n\t\t CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\r\n\t\t}\r\n\t\tif (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\r\n\t\t CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\r\n\t\t}\r\n\t\tif (SAFE_FOR_TEMPLATES) {\r\n\t\t ALLOW_DATA_ATTR = false;\r\n\t\t}\r\n\t\tif (RETURN_DOM_FRAGMENT) {\r\n\t\t RETURN_DOM = true;\r\n\t\t}\r\n\r\n\t\t/* Parse profile info */\r\n\t\tif (USE_PROFILES) {\r\n\t\t ALLOWED_TAGS = addToSet({}, text);\r\n\t\t ALLOWED_ATTR = [];\r\n\t\t if (USE_PROFILES.html === true) {\r\n\t\t\taddToSet(ALLOWED_TAGS, html$1);\r\n\t\t\taddToSet(ALLOWED_ATTR, html);\r\n\t\t }\r\n\t\t if (USE_PROFILES.svg === true) {\r\n\t\t\taddToSet(ALLOWED_TAGS, svg$1);\r\n\t\t\taddToSet(ALLOWED_ATTR, svg);\r\n\t\t\taddToSet(ALLOWED_ATTR, xml);\r\n\t\t }\r\n\t\t if (USE_PROFILES.svgFilters === true) {\r\n\t\t\taddToSet(ALLOWED_TAGS, svgFilters);\r\n\t\t\taddToSet(ALLOWED_ATTR, svg);\r\n\t\t\taddToSet(ALLOWED_ATTR, xml);\r\n\t\t }\r\n\t\t if (USE_PROFILES.mathMl === true) {\r\n\t\t\taddToSet(ALLOWED_TAGS, mathMl$1);\r\n\t\t\taddToSet(ALLOWED_ATTR, mathMl);\r\n\t\t\taddToSet(ALLOWED_ATTR, xml);\r\n\t\t }\r\n\t\t}\r\n\r\n\t\t/* Merge configuration parameters */\r\n\t\tif (cfg.ADD_TAGS) {\r\n\t\t if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\r\n\t\t\tALLOWED_TAGS = clone(ALLOWED_TAGS);\r\n\t\t }\r\n\t\t addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\r\n\t\t}\r\n\t\tif (cfg.ADD_ATTR) {\r\n\t\t if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\r\n\t\t\tALLOWED_ATTR = clone(ALLOWED_ATTR);\r\n\t\t }\r\n\t\t addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\r\n\t\t}\r\n\t\tif (cfg.ADD_URI_SAFE_ATTR) {\r\n\t\t addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\r\n\t\t}\r\n\t\tif (cfg.FORBID_CONTENTS) {\r\n\t\t if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\r\n\t\t\tFORBID_CONTENTS = clone(FORBID_CONTENTS);\r\n\t\t }\r\n\t\t addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\r\n\t\t}\r\n\r\n\t\t/* Add #text in case KEEP_CONTENT is set to true */\r\n\t\tif (KEEP_CONTENT) {\r\n\t\t ALLOWED_TAGS['#text'] = true;\r\n\t\t}\r\n\r\n\t\t/* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\r\n\t\tif (WHOLE_DOCUMENT) {\r\n\t\t addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\r\n\t\t}\r\n\r\n\t\t/* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\r\n\t\tif (ALLOWED_TAGS.table) {\r\n\t\t addToSet(ALLOWED_TAGS, ['tbody']);\r\n\t\t delete FORBID_TAGS.tbody;\r\n\t\t}\r\n\t\tif (cfg.TRUSTED_TYPES_POLICY) {\r\n\t\t if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\r\n\t\t\tthrow typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\r\n\t\t }\r\n\t\t if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\r\n\t\t\tthrow typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\r\n\t\t }\r\n\r\n\t\t // Overwrite existing TrustedTypes policy.\r\n\t\t trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\r\n\r\n\t\t // Sign local variables required by `sanitize`.\r\n\t\t emptyHTML = trustedTypesPolicy.createHTML('');\r\n\t\t} else {\r\n\t\t // Uninitialized policy, attempt to initialize the internal dompurify policy.\r\n\t\t if (trustedTypesPolicy === undefined) {\r\n\t\t\ttrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\r\n\t\t }\r\n\r\n\t\t // If creating the internal policy succeeded sign internal variables.\r\n\t\t if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\r\n\t\t\temptyHTML = trustedTypesPolicy.createHTML('');\r\n\t\t }\r\n\t\t}\r\n\r\n\t\t// Prevent further manipulation of configuration.\r\n\t\t// Not available in IE8, Safari 5, etc.\r\n\t\tif (freeze) {\r\n\t\t freeze(cfg);\r\n\t\t}\r\n\t\tCONFIG = cfg;\r\n\t };\r\n\t const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\r\n\t const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']);\r\n\r\n\t // Certain elements are allowed in both SVG and HTML\r\n\t // namespace. We need to specify them explicitly\r\n\t // so that they don't get erroneously deleted from\r\n\t // HTML namespace.\r\n\t const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\r\n\r\n\t /* Keep track of all possible SVG and MathML tags\r\n\t * so that we can perform the namespace checks\r\n\t * correctly. */\r\n\t const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\r\n\t const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\r\n\r\n\t /**\r\n\t * @param {Element} element a DOM element whose namespace is being checked\r\n\t * @returns {boolean} Return false if the element has a\r\n\t * namespace that a spec-compliant parser would never\r\n\t * return. Return true otherwise.\r\n\t */\r\n\t const _checkValidNamespace = function _checkValidNamespace(element) {\r\n\t\tlet parent = getParentNode(element);\r\n\r\n\t\t// In JSDOM, if we're inside shadow DOM, then parentNode\r\n\t\t// can be null. We just simulate parent in this case.\r\n\t\tif (!parent || !parent.tagName) {\r\n\t\t parent = {\r\n\t\t\tnamespaceURI: NAMESPACE,\r\n\t\t\ttagName: 'template'\r\n\t\t };\r\n\t\t}\r\n\t\tconst tagName = stringToLowerCase(element.tagName);\r\n\t\tconst parentTagName = stringToLowerCase(parent.tagName);\r\n\t\tif (!ALLOWED_NAMESPACES[element.namespaceURI]) {\r\n\t\t return false;\r\n\t\t}\r\n\t\tif (element.namespaceURI === SVG_NAMESPACE) {\r\n\t\t // The only way to switch from HTML namespace to SVG\r\n\t\t // is via . If it happens via any other tag, then\r\n\t\t // it should be killed.\r\n\t\t if (parent.namespaceURI === HTML_NAMESPACE) {\r\n\t\t\treturn tagName === 'svg';\r\n\t\t }\r\n\r\n\t\t // The only way to switch from MathML to SVG is via`\r\n\t\t // svg if parent is either or MathML\r\n\t\t // text integration points.\r\n\t\t if (parent.namespaceURI === MATHML_NAMESPACE) {\r\n\t\t\treturn tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\r\n\t\t }\r\n\r\n\t\t // We only allow elements that are defined in SVG\r\n\t\t // spec. All others are disallowed in SVG namespace.\r\n\t\t return Boolean(ALL_SVG_TAGS[tagName]);\r\n\t\t}\r\n\t\tif (element.namespaceURI === MATHML_NAMESPACE) {\r\n\t\t // The only way to switch from HTML namespace to MathML\r\n\t\t // is via . If it happens via any other tag, then\r\n\t\t // it should be killed.\r\n\t\t if (parent.namespaceURI === HTML_NAMESPACE) {\r\n\t\t\treturn tagName === 'math';\r\n\t\t }\r\n\r\n\t\t // The only way to switch from SVG to MathML is via\r\n\t\t // and HTML integration points\r\n\t\t if (parent.namespaceURI === SVG_NAMESPACE) {\r\n\t\t\treturn tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\r\n\t\t }\r\n\r\n\t\t // We only allow elements that are defined in MathML\r\n\t\t // spec. All others are disallowed in MathML namespace.\r\n\t\t return Boolean(ALL_MATHML_TAGS[tagName]);\r\n\t\t}\r\n\t\tif (element.namespaceURI === HTML_NAMESPACE) {\r\n\t\t // The only way to switch from SVG to HTML is via\r\n\t\t // HTML integration points, and from MathML to HTML\r\n\t\t // is via MathML text integration points\r\n\t\t if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\r\n\t\t\treturn false;\r\n\t\t }\r\n\t\t if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\r\n\t\t\treturn false;\r\n\t\t }\r\n\r\n\t\t // We disallow tags that are specific for MathML\r\n\t\t // or SVG and should never appear in HTML namespace\r\n\t\t return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\r\n\t\t}\r\n\r\n\t\t// For XHTML and XML documents that support custom namespaces\r\n\t\tif (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\r\n\t\t return true;\r\n\t\t}\r\n\r\n\t\t// The code should never reach this place (this means\r\n\t\t// that the element somehow got namespace that is not\r\n\t\t// HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\r\n\t\t// Return false just in case.\r\n\t\treturn false;\r\n\t };\r\n\r\n\t /**\r\n\t * _forceRemove\r\n\t *\r\n\t * @param {Node} node a DOM node\r\n\t */\r\n\t const _forceRemove = function _forceRemove(node) {\r\n\t\tarrayPush(DOMPurify.removed, {\r\n\t\t element: node\r\n\t\t});\r\n\t\ttry {\r\n\t\t // eslint-disable-next-line unicorn/prefer-dom-node-remove\r\n\t\t node.parentNode.removeChild(node);\r\n\t\t} catch (_) {\r\n\t\t node.remove();\r\n\t\t}\r\n\t };\r\n\r\n\t /**\r\n\t * _removeAttribute\r\n\t *\r\n\t * @param {String} name an Attribute name\r\n\t * @param {Node} node a DOM node\r\n\t */\r\n\t const _removeAttribute = function _removeAttribute(name, node) {\r\n\t\ttry {\r\n\t\t arrayPush(DOMPurify.removed, {\r\n\t\t\tattribute: node.getAttributeNode(name),\r\n\t\t\tfrom: node\r\n\t\t });\r\n\t\t} catch (_) {\r\n\t\t arrayPush(DOMPurify.removed, {\r\n\t\t\tattribute: null,\r\n\t\t\tfrom: node\r\n\t\t });\r\n\t\t}\r\n\t\tnode.removeAttribute(name);\r\n\r\n\t\t// We void attribute values for unremovable \"is\"\" attributes\r\n\t\tif (name === 'is' && !ALLOWED_ATTR[name]) {\r\n\t\t if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\r\n\t\t\ttry {\r\n\t\t\t _forceRemove(node);\r\n\t\t\t} catch (_) {}\r\n\t\t } else {\r\n\t\t\ttry {\r\n\t\t\t node.setAttribute(name, '');\r\n\t\t\t} catch (_) {}\r\n\t\t }\r\n\t\t}\r\n\t };\r\n\r\n\t /**\r\n\t * _initDocument\r\n\t *\r\n\t * @param {String} dirty a string of dirty markup\r\n\t * @return {Document} a DOM, filled with the dirty markup\r\n\t */\r\n\t const _initDocument = function _initDocument(dirty) {\r\n\t\t/* Create a HTML document */\r\n\t\tlet doc = null;\r\n\t\tlet leadingWhitespace = null;\r\n\t\tif (FORCE_BODY) {\r\n\t\t dirty = '' + dirty;\r\n\t\t} else {\r\n\t\t /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\r\n\t\t const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\r\n\t\t leadingWhitespace = matches && matches[0];\r\n\t\t}\r\n\t\tif (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\r\n\t\t // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\r\n\t\t dirty = '' + dirty + '';\r\n\t\t}\r\n\t\tconst dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\r\n\t\t/*\r\n\t\t * Use the DOMParser API by default, fallback later if needs be\r\n\t\t * DOMParser not work for svg when has multiple root element.\r\n\t\t */\r\n\t\tif (NAMESPACE === HTML_NAMESPACE) {\r\n\t\t try {\r\n\t\t\tdoc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\r\n\t\t } catch (_) {}\r\n\t\t}\r\n\r\n\t\t/* Use createHTMLDocument in case DOMParser is not available */\r\n\t\tif (!doc || !doc.documentElement) {\r\n\t\t doc = implementation.createDocument(NAMESPACE, 'template', null);\r\n\t\t try {\r\n\t\t\tdoc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\r\n\t\t } catch (_) {\r\n\t\t\t// Syntax error if dirtyPayload is invalid xml\r\n\t\t }\r\n\t\t}\r\n\t\tconst body = doc.body || doc.documentElement;\r\n\t\tif (dirty && leadingWhitespace) {\r\n\t\t body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\r\n\t\t}\r\n\r\n\t\t/* Work on whole document or just its body */\r\n\t\tif (NAMESPACE === HTML_NAMESPACE) {\r\n\t\t return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\r\n\t\t}\r\n\t\treturn WHOLE_DOCUMENT ? doc.documentElement : body;\r\n\t };\r\n\r\n\t /**\r\n\t * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\r\n\t *\r\n\t * @param {Node} root The root element or node to start traversing on.\r\n\t * @return {NodeIterator} The created NodeIterator\r\n\t */\r\n\t const _createNodeIterator = function _createNodeIterator(root) {\r\n\t\treturn createNodeIterator.call(root.ownerDocument || root, root,\r\n\t\t// eslint-disable-next-line no-bitwise\r\n\t\tNodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null);\r\n\t };\r\n\r\n\t /**\r\n\t * _isClobbered\r\n\t *\r\n\t * @param {Node} elm element to check for clobbering attacks\r\n\t * @return {Boolean} true if clobbered, false if safe\r\n\t */\r\n\t const _isClobbered = function _isClobbered(elm) {\r\n\t\treturn elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function' || typeof elm.hasChildNodes !== 'function');\r\n\t };\r\n\r\n\t /**\r\n\t * Checks whether the given object is a DOM node.\r\n\t *\r\n\t * @param {Node} object object to check whether it's a DOM node\r\n\t * @return {Boolean} true is object is a DOM node\r\n\t */\r\n\t const _isNode = function _isNode(object) {\r\n\t\treturn typeof Node === 'function' && object instanceof Node;\r\n\t };\r\n\r\n\t /**\r\n\t * _executeHook\r\n\t * Execute user configurable hooks\r\n\t *\r\n\t * @param {String} entryPoint Name of the hook's entry point\r\n\t * @param {Node} currentNode node to work on with the hook\r\n\t * @param {Object} data additional hook parameters\r\n\t */\r\n\t const _executeHook = function _executeHook(entryPoint, currentNode, data) {\r\n\t\tif (!hooks[entryPoint]) {\r\n\t\t return;\r\n\t\t}\r\n\t\tarrayForEach(hooks[entryPoint], hook => {\r\n\t\t hook.call(DOMPurify, currentNode, data, CONFIG);\r\n\t\t});\r\n\t };\r\n\r\n\t /**\r\n\t * _sanitizeElements\r\n\t *\r\n\t * @protect nodeName\r\n\t * @protect textContent\r\n\t * @protect removeChild\r\n\t *\r\n\t * @param {Node} currentNode to check for permission to exist\r\n\t * @return {Boolean} true if node was killed, false if left alive\r\n\t */\r\n\t const _sanitizeElements = function _sanitizeElements(currentNode) {\r\n\t\tlet content = null;\r\n\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('beforeSanitizeElements', currentNode, null);\r\n\r\n\t\t/* Check if element is clobbered or can clobber */\r\n\t\tif (_isClobbered(currentNode)) {\r\n\t\t _forceRemove(currentNode);\r\n\t\t return true;\r\n\t\t}\r\n\r\n\t\t/* Now let's check the element's type and name */\r\n\t\tconst tagName = transformCaseFunc(currentNode.nodeName);\r\n\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('uponSanitizeElement', currentNode, {\r\n\t\t tagName,\r\n\t\t allowedTags: ALLOWED_TAGS\r\n\t\t});\r\n\r\n\t\t/* Detect mXSS attempts abusing namespace confusion */\r\n\t\tif (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\r\n\t\t _forceRemove(currentNode);\r\n\t\t return true;\r\n\t\t}\r\n\r\n\t\t/* Remove element if anything forbids its presence */\r\n\t\tif (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\r\n\t\t /* Check if we have a custom element to handle */\r\n\t\t if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\r\n\t\t\tif (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\r\n\t\t\t return false;\r\n\t\t\t}\r\n\t\t\tif (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\r\n\t\t\t return false;\r\n\t\t\t}\r\n\t\t }\r\n\r\n\t\t /* Keep content except for bad-listed elements */\r\n\t\t if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\r\n\t\t\tconst parentNode = getParentNode(currentNode) || currentNode.parentNode;\r\n\t\t\tconst childNodes = getChildNodes(currentNode) || currentNode.childNodes;\r\n\t\t\tif (childNodes && parentNode) {\r\n\t\t\t const childCount = childNodes.length;\r\n\t\t\t for (let i = childCount - 1; i >= 0; --i) {\r\n\t\t\t\tparentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));\r\n\t\t\t }\r\n\t\t\t}\r\n\t\t }\r\n\t\t _forceRemove(currentNode);\r\n\t\t return true;\r\n\t\t}\r\n\r\n\t\t/* Check whether element has a valid namespace */\r\n\t\tif (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\r\n\t\t _forceRemove(currentNode);\r\n\t\t return true;\r\n\t\t}\r\n\r\n\t\t/* Make sure that older browsers don't get fallback-tag mXSS */\r\n\t\tif ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\r\n\t\t _forceRemove(currentNode);\r\n\t\t return true;\r\n\t\t}\r\n\r\n\t\t/* Sanitize element content to be template-safe */\r\n\t\tif (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\r\n\t\t /* Get the element's text content */\r\n\t\t content = currentNode.textContent;\r\n\t\t arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\r\n\t\t\tcontent = stringReplace(content, expr, ' ');\r\n\t\t });\r\n\t\t if (currentNode.textContent !== content) {\r\n\t\t\tarrayPush(DOMPurify.removed, {\r\n\t\t\t element: currentNode.cloneNode()\r\n\t\t\t});\r\n\t\t\tcurrentNode.textContent = content;\r\n\t\t }\r\n\t\t}\r\n\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('afterSanitizeElements', currentNode, null);\r\n\t\treturn false;\r\n\t };\r\n\r\n\t /**\r\n\t * _isValidAttribute\r\n\t *\r\n\t * @param {string} lcTag Lowercase tag name of containing element.\r\n\t * @param {string} lcName Lowercase attribute name.\r\n\t * @param {string} value Attribute value.\r\n\t * @return {Boolean} Returns true if `value` is valid, otherwise false.\r\n\t */\r\n\t // eslint-disable-next-line complexity\r\n\t const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\r\n\t\t/* Make sure attribute cannot clobber */\r\n\t\tif (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\r\n\t\t return false;\r\n\t\t}\r\n\r\n\t\t/* Allow valid data-* attributes: At least one character after \"-\"\r\n\t\t\t(https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\r\n\t\t\tXML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\r\n\t\t\tWe don't need to check the value; it's always URI safe. */\r\n\t\tif (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\r\n\t\t if (\r\n\t\t // First condition does a very basic check if a) it's basically a valid custom element tagname AND\r\n\t\t // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\r\n\t\t // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\r\n\t\t _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\r\n\t\t // Alternative, second condition checks if it's an `is`-attribute, AND\r\n\t\t // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\r\n\t\t lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\r\n\t\t\treturn false;\r\n\t\t }\r\n\t\t /* Check value is safe. First, is attr inert? If so, is safe */\r\n\t\t} else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\r\n\t\t return false;\r\n\t\t} else ;\r\n\t\treturn true;\r\n\t };\r\n\r\n\t /**\r\n\t * _isBasicCustomElement\r\n\t * checks if at least one dash is included in tagName, and it's not the first char\r\n\t * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\r\n\t *\r\n\t * @param {string} tagName name of the tag of the node to sanitize\r\n\t * @returns {boolean} Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\r\n\t */\r\n\t const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\r\n\t\treturn tagName !== 'annotation-xml' && tagName.indexOf('-') > 0;\r\n\t };\r\n\r\n\t /**\r\n\t * _sanitizeAttributes\r\n\t *\r\n\t * @protect attributes\r\n\t * @protect nodeName\r\n\t * @protect removeAttribute\r\n\t * @protect setAttribute\r\n\t *\r\n\t * @param {Node} currentNode to sanitize\r\n\t */\r\n\t const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('beforeSanitizeAttributes', currentNode, null);\r\n\t\tconst {\r\n\t\t attributes\r\n\t\t} = currentNode;\r\n\r\n\t\t/* Check if we have attributes; if not we might have a text node */\r\n\t\tif (!attributes) {\r\n\t\t return;\r\n\t\t}\r\n\t\tconst hookEvent = {\r\n\t\t attrName: '',\r\n\t\t attrValue: '',\r\n\t\t keepAttr: true,\r\n\t\t allowedAttributes: ALLOWED_ATTR\r\n\t\t};\r\n\t\tlet l = attributes.length;\r\n\r\n\t\t/* Go backwards over all attributes; safely remove bad ones */\r\n\t\twhile (l--) {\r\n\t\t const attr = attributes[l];\r\n\t\t const {\r\n\t\t\tname,\r\n\t\t\tnamespaceURI,\r\n\t\t\tvalue: attrValue\r\n\t\t } = attr;\r\n\t\t const lcName = transformCaseFunc(name);\r\n\t\t let value = name === 'value' ? attrValue : stringTrim(attrValue);\r\n\r\n\t\t /* Execute a hook if present */\r\n\t\t hookEvent.attrName = lcName;\r\n\t\t hookEvent.attrValue = value;\r\n\t\t hookEvent.keepAttr = true;\r\n\t\t hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\r\n\t\t _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\r\n\t\t value = hookEvent.attrValue;\r\n\t\t /* Did the hooks approve of the attribute? */\r\n\t\t if (hookEvent.forceKeepAttr) {\r\n\t\t\tcontinue;\r\n\t\t }\r\n\r\n\t\t /* Remove attribute */\r\n\t\t _removeAttribute(name, currentNode);\r\n\r\n\t\t /* Did the hooks approve of the attribute? */\r\n\t\t if (!hookEvent.keepAttr) {\r\n\t\t\tcontinue;\r\n\t\t }\r\n\r\n\t\t /* Work around a security issue in jQuery 3.0 */\r\n\t\t if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\r\n\t\t\t_removeAttribute(name, currentNode);\r\n\t\t\tcontinue;\r\n\t\t }\r\n\r\n\t\t /* Sanitize attribute content to be template-safe */\r\n\t\t if (SAFE_FOR_TEMPLATES) {\r\n\t\t\tarrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\r\n\t\t\t value = stringReplace(value, expr, ' ');\r\n\t\t\t});\r\n\t\t }\r\n\r\n\t\t /* Is `value` valid for this attribute? */\r\n\t\t const lcTag = transformCaseFunc(currentNode.nodeName);\r\n\t\t if (!_isValidAttribute(lcTag, lcName, value)) {\r\n\t\t\tcontinue;\r\n\t\t }\r\n\r\n\t\t /* Full DOM Clobbering protection via namespace isolation,\r\n\t\t * Prefix id and name attributes with `user-content-`\r\n\t\t */\r\n\t\t if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\r\n\t\t\t// Remove the attribute with this value\r\n\t\t\t_removeAttribute(name, currentNode);\r\n\r\n\t\t\t// Prefix the value and later re-create the attribute with the sanitized value\r\n\t\t\tvalue = SANITIZE_NAMED_PROPS_PREFIX + value;\r\n\t\t }\r\n\r\n\t\t /* Handle attributes that require Trusted Types */\r\n\t\t if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\r\n\t\t\tif (namespaceURI) ; else {\r\n\t\t\t switch (trustedTypes.getAttributeType(lcTag, lcName)) {\r\n\t\t\t\tcase 'TrustedHTML':\r\n\t\t\t\t {\r\n\t\t\t\t\tvalue = trustedTypesPolicy.createHTML(value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t }\r\n\t\t\t\tcase 'TrustedScriptURL':\r\n\t\t\t\t {\r\n\t\t\t\t\tvalue = trustedTypesPolicy.createScriptURL(value);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t }\r\n\t\t\t }\r\n\t\t\t}\r\n\t\t }\r\n\r\n\t\t /* Handle invalid data-* attribute set by try-catching it */\r\n\t\t try {\r\n\t\t\tif (namespaceURI) {\r\n\t\t\t currentNode.setAttributeNS(namespaceURI, name, value);\r\n\t\t\t} else {\r\n\t\t\t /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\r\n\t\t\t currentNode.setAttribute(name, value);\r\n\t\t\t}\r\n\t\t\tarrayPop(DOMPurify.removed);\r\n\t\t } catch (_) {}\r\n\t\t}\r\n\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('afterSanitizeAttributes', currentNode, null);\r\n\t };\r\n\r\n\t /**\r\n\t * _sanitizeShadowDOM\r\n\t *\r\n\t * @param {DocumentFragment} fragment to iterate over recursively\r\n\t */\r\n\t const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\r\n\t\tlet shadowNode = null;\r\n\t\tconst shadowIterator = _createNodeIterator(fragment);\r\n\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('beforeSanitizeShadowDOM', fragment, null);\r\n\t\twhile (shadowNode = shadowIterator.nextNode()) {\r\n\t\t /* Execute a hook if present */\r\n\t\t _executeHook('uponSanitizeShadowNode', shadowNode, null);\r\n\r\n\t\t /* Sanitize tags and elements */\r\n\t\t if (_sanitizeElements(shadowNode)) {\r\n\t\t\tcontinue;\r\n\t\t }\r\n\r\n\t\t /* Deep shadow DOM detected */\r\n\t\t if (shadowNode.content instanceof DocumentFragment) {\r\n\t\t\t_sanitizeShadowDOM(shadowNode.content);\r\n\t\t }\r\n\r\n\t\t /* Check attributes, sanitize if necessary */\r\n\t\t _sanitizeAttributes(shadowNode);\r\n\t\t}\r\n\r\n\t\t/* Execute a hook if present */\r\n\t\t_executeHook('afterSanitizeShadowDOM', fragment, null);\r\n\t };\r\n\r\n\t /**\r\n\t * Sanitize\r\n\t * Public method providing core sanitation functionality\r\n\t *\r\n\t * @param {String|Node} dirty string or DOM node\r\n\t * @param {Object} cfg object\r\n\t */\r\n\t // eslint-disable-next-line complexity\r\n\t DOMPurify.sanitize = function (dirty) {\r\n\t\tlet cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n\t\tlet body = null;\r\n\t\tlet importedNode = null;\r\n\t\tlet currentNode = null;\r\n\t\tlet returnNode = null;\r\n\t\t/* Make sure we have a string to sanitize.\r\n\t\t DO NOT return early, as this will return the wrong type if\r\n\t\t the user has requested a DOM object rather than a string */\r\n\t\tIS_EMPTY_INPUT = !dirty;\r\n\t\tif (IS_EMPTY_INPUT) {\r\n\t\t dirty = '';\r\n\t\t}\r\n\r\n\t\t/* Stringify, in case dirty is an object */\r\n\t\tif (typeof dirty !== 'string' && !_isNode(dirty)) {\r\n\t\t if (typeof dirty.toString === 'function') {\r\n\t\t\tdirty = dirty.toString();\r\n\t\t\tif (typeof dirty !== 'string') {\r\n\t\t\t throw typeErrorCreate('dirty is not a string, aborting');\r\n\t\t\t}\r\n\t\t } else {\r\n\t\t\tthrow typeErrorCreate('toString is not a function');\r\n\t\t }\r\n\t\t}\r\n\r\n\t\t/* Return dirty HTML if DOMPurify cannot run */\r\n\t\tif (!DOMPurify.isSupported) {\r\n\t\t return dirty;\r\n\t\t}\r\n\r\n\t\t/* Assign config vars */\r\n\t\tif (!SET_CONFIG) {\r\n\t\t _parseConfig(cfg);\r\n\t\t}\r\n\r\n\t\t/* Clean up removed elements */\r\n\t\tDOMPurify.removed = [];\r\n\r\n\t\t/* Check if dirty is correctly typed for IN_PLACE */\r\n\t\tif (typeof dirty === 'string') {\r\n\t\t IN_PLACE = false;\r\n\t\t}\r\n\t\tif (IN_PLACE) {\r\n\t\t /* Do some early pre-sanitization to avoid unsafe root nodes */\r\n\t\t if (dirty.nodeName) {\r\n\t\t\tconst tagName = transformCaseFunc(dirty.nodeName);\r\n\t\t\tif (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\r\n\t\t\t throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\r\n\t\t\t}\r\n\t\t }\r\n\t\t} else if (dirty instanceof Node) {\r\n\t\t /* If dirty is a DOM element, append to an empty document to avoid\r\n\t\t\t elements being stripped by the parser */\r\n\t\t body = _initDocument('');\r\n\t\t importedNode = body.ownerDocument.importNode(dirty, true);\r\n\t\t if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {\r\n\t\t\t/* Node is already a body, use as is */\r\n\t\t\tbody = importedNode;\r\n\t\t } else if (importedNode.nodeName === 'HTML') {\r\n\t\t\tbody = importedNode;\r\n\t\t } else {\r\n\t\t\t// eslint-disable-next-line unicorn/prefer-dom-node-append\r\n\t\t\tbody.appendChild(importedNode);\r\n\t\t }\r\n\t\t} else {\r\n\t\t /* Exit directly if we have nothing to do */\r\n\t\t if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\r\n\t\t // eslint-disable-next-line unicorn/prefer-includes\r\n\t\t dirty.indexOf('<') === -1) {\r\n\t\t\treturn trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\r\n\t\t }\r\n\r\n\t\t /* Initialize the document to work on */\r\n\t\t body = _initDocument(dirty);\r\n\r\n\t\t /* Check we have a DOM node from the data */\r\n\t\t if (!body) {\r\n\t\t\treturn RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\r\n\t\t }\r\n\t\t}\r\n\r\n\t\t/* Remove first element node (ours) if FORCE_BODY is set */\r\n\t\tif (body && FORCE_BODY) {\r\n\t\t _forceRemove(body.firstChild);\r\n\t\t}\r\n\r\n\t\t/* Get node iterator */\r\n\t\tconst nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\r\n\r\n\t\t/* Now start iterating over the created document */\r\n\t\twhile (currentNode = nodeIterator.nextNode()) {\r\n\t\t /* Sanitize tags and elements */\r\n\t\t if (_sanitizeElements(currentNode)) {\r\n\t\t\tcontinue;\r\n\t\t }\r\n\r\n\t\t /* Shadow DOM detected, sanitize it */\r\n\t\t if (currentNode.content instanceof DocumentFragment) {\r\n\t\t\t_sanitizeShadowDOM(currentNode.content);\r\n\t\t }\r\n\r\n\t\t /* Check attributes, sanitize if necessary */\r\n\t\t _sanitizeAttributes(currentNode);\r\n\t\t}\r\n\r\n\t\t/* If we sanitized `dirty` in-place, return it. */\r\n\t\tif (IN_PLACE) {\r\n\t\t return dirty;\r\n\t\t}\r\n\r\n\t\t/* Return sanitized string or DOM */\r\n\t\tif (RETURN_DOM) {\r\n\t\t if (RETURN_DOM_FRAGMENT) {\r\n\t\t\treturnNode = createDocumentFragment.call(body.ownerDocument);\r\n\t\t\twhile (body.firstChild) {\r\n\t\t\t // eslint-disable-next-line unicorn/prefer-dom-node-append\r\n\t\t\t returnNode.appendChild(body.firstChild);\r\n\t\t\t}\r\n\t\t } else {\r\n\t\t\treturnNode = body;\r\n\t\t }\r\n\t\t if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\r\n\t\t\t/*\r\n\t\t\t AdoptNode() is not used because internal state is not reset\r\n\t\t\t (e.g. the past names map of a HTMLFormElement), this is safe\r\n\t\t\t in theory but we would rather not risk another attack vector.\r\n\t\t\t The state that is cloned by importNode() is explicitly defined\r\n\t\t\t by the specs.\r\n\t\t\t*/\r\n\t\t\treturnNode = importNode.call(originalDocument, returnNode, true);\r\n\t\t }\r\n\t\t return returnNode;\r\n\t\t}\r\n\t\tlet serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\r\n\r\n\t\t/* Serialize doctype if allowed */\r\n\t\tif (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\r\n\t\t serializedHTML = '\\n' + serializedHTML;\r\n\t\t}\r\n\r\n\t\t/* Sanitize final string template-safe */\r\n\t\tif (SAFE_FOR_TEMPLATES) {\r\n\t\t arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\r\n\t\t\tserializedHTML = stringReplace(serializedHTML, expr, ' ');\r\n\t\t });\r\n\t\t}\r\n\t\treturn trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\r\n\t };\r\n\r\n\t /**\r\n\t * Public method to set the configuration once\r\n\t * setConfig\r\n\t *\r\n\t * @param {Object} cfg configuration object\r\n\t */\r\n\t DOMPurify.setConfig = function () {\r\n\t\tlet cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\r\n\t\t_parseConfig(cfg);\r\n\t\tSET_CONFIG = true;\r\n\t };\r\n\r\n\t /**\r\n\t * Public method to remove the configuration\r\n\t * clearConfig\r\n\t *\r\n\t */\r\n\t DOMPurify.clearConfig = function () {\r\n\t\tCONFIG = null;\r\n\t\tSET_CONFIG = false;\r\n\t };\r\n\r\n\t /**\r\n\t * Public method to check if an attribute value is valid.\r\n\t * Uses last set config, if any. Otherwise, uses config defaults.\r\n\t * isValidAttribute\r\n\t *\r\n\t * @param {String} tag Tag name of containing element.\r\n\t * @param {String} attr Attribute name.\r\n\t * @param {String} value Attribute value.\r\n\t * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\r\n\t */\r\n\t DOMPurify.isValidAttribute = function (tag, attr, value) {\r\n\t\t/* Initialize shared config vars if necessary. */\r\n\t\tif (!CONFIG) {\r\n\t\t _parseConfig({});\r\n\t\t}\r\n\t\tconst lcTag = transformCaseFunc(tag);\r\n\t\tconst lcName = transformCaseFunc(attr);\r\n\t\treturn _isValidAttribute(lcTag, lcName, value);\r\n\t };\r\n\r\n\t /**\r\n\t * AddHook\r\n\t * Public method to add DOMPurify hooks\r\n\t *\r\n\t * @param {String} entryPoint entry point for the hook to add\r\n\t * @param {Function} hookFunction function to execute\r\n\t */\r\n\t DOMPurify.addHook = function (entryPoint, hookFunction) {\r\n\t\tif (typeof hookFunction !== 'function') {\r\n\t\t return;\r\n\t\t}\r\n\t\thooks[entryPoint] = hooks[entryPoint] || [];\r\n\t\tarrayPush(hooks[entryPoint], hookFunction);\r\n\t };\r\n\r\n\t /**\r\n\t * RemoveHook\r\n\t * Public method to remove a DOMPurify hook at a given entryPoint\r\n\t * (pops it from the stack of hooks if more are present)\r\n\t *\r\n\t * @param {String} entryPoint entry point for the hook to remove\r\n\t * @return {Function} removed(popped) hook\r\n\t */\r\n\t DOMPurify.removeHook = function (entryPoint) {\r\n\t\tif (hooks[entryPoint]) {\r\n\t\t return arrayPop(hooks[entryPoint]);\r\n\t\t}\r\n\t };\r\n\r\n\t /**\r\n\t * RemoveHooks\r\n\t * Public method to remove all DOMPurify hooks at a given entryPoint\r\n\t *\r\n\t * @param {String} entryPoint entry point for the hooks to remove\r\n\t */\r\n\t DOMPurify.removeHooks = function (entryPoint) {\r\n\t\tif (hooks[entryPoint]) {\r\n\t\t hooks[entryPoint] = [];\r\n\t\t}\r\n\t };\r\n\r\n\t /**\r\n\t * RemoveAllHooks\r\n\t * Public method to remove all DOMPurify hooks\r\n\t */\r\n\t DOMPurify.removeAllHooks = function () {\r\n\t\thooks = {};\r\n\t };\r\n\t return DOMPurify;\r\n\t}\r\n\tvar purify = createDOMPurify();\r\n\r\n\treturn purify;\r\n\r\n }));\r\n \r\n"],"names":["global","factory","exports","module","define","amd","globalThis","self","DOMPurify","this","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","let","freeze","seal","create","apply","construct","Reflect","x","fun","thisValue","args","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","objectHasOwnProperty","hasOwnProperty","regExpTest","RegExp","test","typeErrorCreate","func","TypeError","_len2","arguments","length","_key2","thisArg","_len","_key","addToSet","set","array","lcElement","transformCaseFunc","undefined","l","element","clone","object","property","value","newObject","isArray","index","constructor","lookupGetter","prop","desc","get","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","text","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","EXPRESSIONS","__proto__","createDOMPurify","window","root","version","removed","document","nodeType","isSupported","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","tagNameCheck","writable","configurable","enumerable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","TRUSTED_TYPES_POLICY","createHTML","createScriptURL","purifyHostElement","createPolicy","suffix","ATTR_NAME","policyName","hasAttribute","getAttribute","scriptUrl","_","console","warn","_forceRemove","node","parentNode","removeChild","remove","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createNodeIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isNode","_sanitizeElements","currentNode","_executeHook","elm","nodeName","textContent","attributes","removeAttribute","setAttribute","namespaceURI","hasChildNodes","tagName","allowedTags","firstElementChild","_checkValidNamespace","parent","parentTagName","MATHML_TEXT_INTEGRATION_POINTS","Boolean","ALL_SVG_TAGS","HTML_INTEGRATION_POINTS","ALL_MATHML_TAGS","COMMON_SVG_AND_HTML_ELEMENTS","expr","_isBasicCustomElement","i","_sanitizeAttributes","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","name","lcName","forceKeepAttr","_removeAttribute","lcTag","_isValidAttribute","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","formElement","attribute","getAttributeNode","from","entryPoint","data","hook","sanitize","returnNode","importedNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmode","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","attr","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":"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"}