CVE-2023-2516: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') (CWE-79)
value: Cross-site Scripting (XSS) - Stored in GitHub repository nilsteampassnet/teampass prior to 3.0.7.
CWE description: The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.
CVSS v3 base score: 5.4
Published: 2023-05-05T19:15Z
Repository: https://github.com/nilsteampassnet/teampass
Language: JavaScript
Files changed: index.php, pages/items.js.php, plugins/DOMPurify/purify.cjs.js, plugins/DOMPurify/purify.cjs.js.map, plugins/DOMPurify/purify.es.js, plugins/DOMPurify/purify.es.js.map, plugins/DOMPurify/purify.js, plugins/DOMPurify/purify.js.map, plugins/DOMPurify/purify.min.js, plugins/DOMPurify/purify.min.js.map
Commit date: 2023-05-02 08:30:07 +0200
Commit message: 3.0.7

Added purify library to fix potentiel xss

Diff: diff --git a/index.php b/index.php
index b933a76b9..ccec1e240 100755
--- a/index.php
+++ b/index.php
@@ -1152,10 +1152,12 @@ if (($session_validite_pw === null
     <!--<link rel="stylesheet" href="./plugins/icheck-material/icheck-material.min.css">-->
     <link rel="stylesheet" href="./plugins/icheck/skins/all.css">
     <script type="text/javascript" src="./plugins/icheck/icheck.min.js"></script>
     <!-- bootstrap-add-clear -->
     <script type="text/javascript" src="plugins/bootstrap-add-clear/bootstrap-add-clear.min.js"></script>
+    <!-- DOMPurify -->
+    <script type="text/javascript" src="plugins/DOMPurify/purify.min.js"></script>
 
     <?php
     $get = [];
     $get['page'] = $superGlobal->get('page', 'GET') === null ? '' : $superGlobal->get('page', 'GET');
     if ($menuAdmin === true) {
diff --git a/pages/items.js.php b/pages/items.js.php
index 31bdebd7e..113e5ec5a 100755
--- a/pages/items.js.php
+++ b/pages/items.js.php
@@ -2793,34 +2793,34 @@ $var['hidden_asterisk'] = '<i class="fas fa-asterisk mr-2"></i><i class="fas fa-
                 }
                 //prepare data
                 var data = {
                     'anyone_can_modify': $('#form-item-anyoneCanModify').is(':checked') ? 1 : 0,
                     'complexity_level': parseInt($('#form-item-password-complex').val()),
-                    'description': $('#form-item-description').summernote('code') !== "<p><br></p>" ? $('#form-item-description').summernote('code') : '',
+                    'description': $('#form-item-description').summernote('code') !== "<p><br></p>" ? DOMPurify.sanitize($('#form-item-description').summernote('code'), {USE_PROFILES: {html: true}}) : '',
                     'diffusion_list': diffusion,
                     'diffusion_list_names': diffusionNames,
                     'folder': parseInt($('#form-item-folder').val()),
-                    'email': $('#form-item-email').val(),
+                    'email': DOMPurify.sanitize($('#form-item-email').val()),
                     'fields': fields,
                     'folder_is_personal': store.get('teampassItem').IsPersonalFolder === 1 ? 1 : 0,
                     'id': store.get('teampassItem').id,
-                    'label': $('#form-item-label').val(),
-                    'login': $('#form-item-login').val(),
+                    'label': DOMPurify.sanitize($('#form-item-label').val()),
+                    'login': DOMPurify.sanitize($('#form-item-login').val()),
                     'pw': $('#form-item-password').val(),
                     'restricted_to': restriction,
                     'restricted_to_roles': restrictionRole,
-                    'tags': $('#form-item-tags').val(),
+                    'tags': DOMPurify.sanitize($('#form-item-tags').val()),
                     'template_id': parseInt($('input.form-check-input-template:checkbox:checked').data('category-id')),
                     'to_be_deleted_after_date': ($('#form-item-deleteAfterDate').length !== 0 &&
                         $('#form-item-deleteAfterDate').val() !== '') ? $('#form-item-deleteAfterDate').val() : '',
                     'to_be_deleted_after_x_views': ($('#form-item-deleteAfterShown').length !== 0 &&
                             $('#form-item-deleteAfterShown').val() !== '' && $('#form-item-deleteAfterShown').val() >= 1) ?
                         parseInt($('#form-item-deleteAfterShown').val()) : '',
-                    'url': $('#form-item-url').val(),
+                    'url': DOMPurify.sanitize($('#form-item-url').val()),
                     'user_id': parseInt('<?php echo $_SESSION['user_id']; ?>'),
                     'uploaded_file_id': store.get('teampassApplication').uploadedFileId === undefined ? '' : store.get('teampassApplication').uploadedFileId,
-                    'fa_icon': $('#form-item-icon').val(),
+                    'fa_icon': DOMPurify.sanitize($('#form-item-icon').val()),
                 };
                 if (debugJavascript === true) {
                     console.log('SAVING DATA');
                     console.log(data);
                 }
diff --git a/plugins/DOMPurify/purify.cjs.js b/plugins/DOMPurify/purify.cjs.js
new file mode 100644
index 000000000..6165ee86d
--- /dev/null
+++ b/plugins/DOMPurify/purify.cjs.js
@@ -0,0 +1,1597 @@
+/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */
+
+'use strict';
+
+const {
+  entries,
+  setPrototypeOf,
+  isFrozen,
+  getPrototypeOf,
+  getOwnPropertyDescriptor
+} = Object;
+let {
+  freeze,
+  seal,
+  create
+} = Object; // eslint-disable-line import/no-mutable-exports
+
+let {
+  apply,
+  construct
+} = typeof Reflect !== 'undefined' && Reflect;
+
+if (!apply) {
+  apply = function apply(fun, thisValue, args) {
+    return fun.apply(thisValue, args);
+  };
+}
+
+if (!freeze) {
+  freeze = function freeze(x) {
+    return x;
+  };
+}
+
+if (!seal) {
+  seal = function seal(x) {
+    return x;
+  };
+}
+
+if (!construct) {
+  construct = function construct(Func, args) {
+    return new Func(...args);
+  };
+}
+
+const arrayForEach = unapply(Array.prototype.forEach);
+const arrayPop = unapply(Array.prototype.pop);
+const arrayPush = unapply(Array.prototype.push);
+const stringToLowerCase = unapply(String.prototype.toLowerCase);
+const stringToString = unapply(String.prototype.toString);
+const stringMatch = unapply(String.prototype.match);
+const stringReplace = unapply(String.prototype.replace);
+const stringIndexOf = unapply(String.prototype.indexOf);
+const stringTrim = unapply(String.prototype.trim);
+const regExpTest = unapply(RegExp.prototype.test);
+const typeErrorCreate = unconstruct(TypeError);
+function unapply(func) {
+  return function (thisArg) {
+    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+      args[_key - 1] = arguments[_key];
+    }
+
+    return apply(func, thisArg, args);
+  };
+}
+function unconstruct(func) {
+  return function () {
+    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+      args[_key2] = arguments[_key2];
+    }
+
+    return construct(func, args);
+  };
+}
+/* Add properties to a lookup table */
+
+function addToSet(set, array, transformCaseFunc) {
+  transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;
+
+  if (setPrototypeOf) {
+    // Make 'in' and truthy checks like Boolean(set.constructor)
+    // independent of any properties defined on Object.prototype.
+    // Prevent prototype setters from intercepting set as a this value.
+    setPrototypeOf(set, null);
+  }
+
+  let l = array.length;
+
+  while (l--) {
+    let element = array[l];
+
+    if (typeof element === 'string') {
+      const lcElement = transformCaseFunc(element);
+
+      if (lcElement !== element) {
+        // Config presets (e.g. tags.js, attrs.js) are immutable.
+        if (!isFrozen(array)) {
+          array[l] = lcElement;
+        }
+
+        element = lcElement;
+      }
+    }
+
+    set[element] = true;
+  }
+
+  return set;
+}
+/* Shallow clone an object */
+
+function clone(object) {
+  const newObject = create(null);
+
+  for (const [property, value] of entries(object)) {
+    newObject[property] = value;
+  }
+
+  return newObject;
+}
+/* This method automatically checks if the prop is function
+ * or getter and behaves accordingly. */
+
+function lookupGetter(object, prop) {
+  while (object !== null) {
+    const desc = getOwnPropertyDescriptor(object, prop);
+
+    if (desc) {
+      if (desc.get) {
+        return unapply(desc.get);
+      }
+
+      if (typeof desc.value === 'function') {
+        return unapply(desc.value);
+      }
+    }
+
+    object = getPrototypeOf(object);
+  }
+
+  function fallbackValue(element) {
+    console.warn('fallback value for', element);
+    return null;
+  }
+
+  return fallbackValue;
+}
+
+const 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']); // SVG
+
+const 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']);
+const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.
+// We still need to know them so that we can do namespace
+// checks properly in case one wants to add them to
+// allow-list.
+
+const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', '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']);
+const 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']); // Similarly to SVG, we want to know all MathML elements,
+// even those that we disallow by default.
+
+const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
+const text = freeze(['#text']);
+
+const 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']);
+const 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']);
+const 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']);
+const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
+
+const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
+
+const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
+const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
+const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
+
+const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
+
+const 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
+);
+const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
+const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex
+);
+const DOCTYPE_NAME = seal(/^html$/i);
+
+var EXPRESSIONS = /*#__PURE__*/Object.freeze({
+  __proto__: null,
+  MUSTACHE_EXPR: MUSTACHE_EXPR,
+  ERB_EXPR: ERB_EXPR,
+  TMPLIT_EXPR: TMPLIT_EXPR,
+  DATA_ATTR: DATA_ATTR,
+  ARIA_ATTR: ARIA_ATTR,
+  IS_ALLOWED_URI: IS_ALLOWED_URI,
+  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
+  ATTR_WHITESPACE: ATTR_WHITESPACE,
+  DOCTYPE_NAME: DOCTYPE_NAME
+});
+
+const getGlobal = () => typeof window === 'undefined' ? null : window;
+/**
+ * Creates a no-op policy for internal use only.
+ * Don't export this function outside this module!
+ * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
+ * @param {Document} document The document object (to determine policy name suffix)
+ * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
+ * are not supported).
+ */
+
+
+const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
+  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
+    return null;
+  } // Allow the callers to control the unique policy name
+  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.
+  // Policy creation with duplicate names throws in Trusted Types.
+
+
+  let suffix = null;
+  const ATTR_NAME = 'data-tt-policy-suffix';
+
+  if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
+    suffix = document.currentScript.getAttribute(ATTR_NAME);
+  }
+
+  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');
+
+  try {
+    return trustedTypes.createPolicy(policyName, {
+      createHTML(html) {
+        return html;
+      },
+
+      createScriptURL(scriptUrl) {
+        return scriptUrl;
+      }
+
+    });
+  } catch (_) {
+    // Policy creation failed (most likely another DOMPurify script has
+    // already run). Skip creating the policy, as this will only cause errors
+    // if TT are enforced.
+    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
+    return null;
+  }
+};
+
+function createDOMPurify() {
+  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
+
+  const DOMPurify = root => createDOMPurify(root);
+  /**
+   * Version label, exposed for easier checks
+   * if DOMPurify is up to date or not
+   */
+
+
+  DOMPurify.version = '3.0.2';
+  /**
+   * Array of elements that DOMPurify removed during sanitation.
+   * Empty if nothing was removed.
+   */
+
+  DOMPurify.removed = [];
+
+  if (!window || !window.document || window.document.nodeType !== 9) {
+    // Not running in a browser, provide a factory function
+    // so that you can pass your own Window
+    DOMPurify.isSupported = false;
+    return DOMPurify;
+  }
+
+  const originalDocument = window.document;
+  let {
+    document
+  } = window;
+  const {
+    DocumentFragment,
+    HTMLTemplateElement,
+    Node,
+    Element,
+    NodeFilter,
+    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,
+    HTMLFormElement,
+    DOMParser,
+    trustedTypes
+  } = window;
+  const ElementPrototype = Element.prototype;
+  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
+  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
+  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
+  const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a
+  // new document created via createHTMLDocument. As per the spec
+  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
+  // a new empty registry is used when creating a template contents owner
+  // document, so we use that as our parent document to ensure nothing
+  // is inherited.
+
+  if (typeof HTMLTemplateElement === 'function') {
+    const template = document.createElement('template');
+
+    if (template.content && template.content.ownerDocument) {
+      document = template.content.ownerDocument;
+    }
+  }
+
+  const trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);
+
+  const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
+  const {
+    implementation,
+    createNodeIterator,
+    createDocumentFragment,
+    getElementsByTagName
+  } = document;
+  const {
+    importNode
+  } = originalDocument;
+  let hooks = {};
+  /**
+   * Expose whether this browser supports running the full DOMPurify.
+   */
+
+  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined';
+  const {
+    MUSTACHE_EXPR,
+    ERB_EXPR,
+    TMPLIT_EXPR,
+    DATA_ATTR,
+    ARIA_ATTR,
+    IS_SCRIPT_OR_DATA,
+    ATTR_WHITESPACE
+  } = EXPRESSIONS;
+  let {
+    IS_ALLOWED_URI: IS_ALLOWED_URI$1
+  } = EXPRESSIONS;
+  /**
+   * We consider the elements and attributes below to be safe. Ideally
+   * don't add any new ones but feel free to remove unwanted ones.
+   */
+
+  /* allowed element names */
+
+  let ALLOWED_TAGS = null;
+  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
+  /* Allowed attribute names */
+
+  let ALLOWED_ATTR = null;
+  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
+  /*
+   * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.
+   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)
+   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)
+   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.
+   */
+
+  let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
+    tagNameCheck: {
+      writable: true,
+      configurable: false,
+      enumerable: true,
+      value: null
+    },
+    attributeNameCheck: {
+      writable: true,
+      configurable: false,
+      enumerable: true,
+      value: null
+    },
+    allowCustomizedBuiltInElements: {
+      writable: true,
+      configurable: false,
+      enumerable: true,
+      value: false
+    }
+  }));
+  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */
+
+  let FORBID_TAGS = null;
+  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */
+
+  let FORBID_ATTR = null;
+  /* Decide if ARIA attributes are okay */
+
+  let ALLOW_ARIA_ATTR = true;
+  /* Decide if custom data attributes are okay */
+
+  let ALLOW_DATA_ATTR = true;
+  /* Decide if unknown protocols are okay */
+
+  let ALLOW_UNKNOWN_PROTOCOLS = false;
+  /* Decide if self-closing tags in attributes are allowed.
+   * Usually removed due to a mXSS issue in jQuery 3.0 */
+
+  let ALLOW_SELF_CLOSE_IN_ATTR = true;
+  /* Output should be safe for common template engines.
+   * This means, DOMPurify removes data attributes, mustaches and ERB
+   */
+
+  let SAFE_FOR_TEMPLATES = false;
+  /* Decide if document with <html>... should be returned */
+
+  let WHOLE_DOCUMENT = false;
+  /* Track whether config is already set on this instance of DOMPurify. */
+
+  let SET_CONFIG = false;
+  /* Decide if all elements (e.g. style, script) must be children of
+   * document.body. By default, browsers might move them to document.head */
+
+  let FORCE_BODY = false;
+  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
+   * string (or a TrustedHTML object if Trusted Types are supported).
+   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
+   */
+
+  let RETURN_DOM = false;
+  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html
+   * string  (or a TrustedHTML object if Trusted Types are supported) */
+
+  let RETURN_DOM_FRAGMENT = false;
+  /* Try to return a Trusted Type object instead of a string, return a string in
+   * case Trusted Types are not supported  */
+
+  let RETURN_TRUSTED_TYPE = false;
+  /* Output should be free from DOM clobbering attacks?
+   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.
+   */
+
+  let SANITIZE_DOM = true;
+  /* Achieve full DOM Clobbering protection by isolating the namespace of named
+   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.
+   *
+   * HTML/DOM spec rules that enable DOM Clobbering:
+   *   - Named Access on Window (§7.3.3)
+   *   - DOM Tree Accessors (§3.1.5)
+   *   - Form Element Parent-Child Relations (§4.10.3)
+   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)
+   *   - HTMLCollection (§4.2.10.2)
+   *
+   * Namespace isolation is implemented by prefixing `id` and `name` attributes
+   * with a constant string, i.e., `user-content-`
+   */
+
+  let SANITIZE_NAMED_PROPS = false;
+  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';
+  /* Keep element content when removing element? */
+
+  let KEEP_CONTENT = true;
+  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
+   * of importing it into a new Document and returning a sanitized copy */
+
+  let IN_PLACE = false;
+  /* Allow usage of profiles like html, svg and mathMl */
+
+  let USE_PROFILES = {};
+  /* Tags to ignore content of when KEEP_CONTENT is true */
+
+  let FORBID_CONTENTS = null;
+  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']);
+  /* Tags that are safe for data: URIs */
+
+  let DATA_URI_TAGS = null;
+  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);
+  /* Attributes safe for values like "javascript:" */
+
+  let URI_SAFE_ATTRIBUTES = null;
+  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);
+  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+  /* Document namespace */
+
+  let NAMESPACE = HTML_NAMESPACE;
+  let IS_EMPTY_INPUT = false;
+  /* Allowed XHTML+XML namespaces */
+
+  let ALLOWED_NAMESPACES = null;
+  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
+  /* Parsing of strict XHTML documents */
+
+  let PARSER_MEDIA_TYPE;
+  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];
+  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
+  let transformCaseFunc;
+  /* Keep a reference to config to pass to hooks */
+
+  let CONFIG = null;
+  /* Ideally, do not touch anything below this line */
+
+  /* ______________________________________________ */
+
+  const formElement = document.createElement('form');
+
+  const isRegexOrFunction = function isRegexOrFunction(testValue) {
+    return testValue instanceof RegExp || testValue instanceof Function;
+  };
+  /**
+   * _parseConfig
+   *
+   * @param  {Object} cfg optional config literal
+   */
+  // eslint-disable-next-line complexity
+
+
+  const _parseConfig = function _parseConfig(cfg) {
+    if (CONFIG && CONFIG === cfg) {
+      return;
+    }
+    /* Shield configuration object from tampering */
+
+
+    if (!cfg || typeof cfg !== 'object') {
+      cfg = {};
+    }
+    /* Shield configuration object from prototype pollution */
+
+
+    cfg = clone(cfg);
+    PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
+    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.
+
+    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
+    /* Set configuration parameters */
+
+    ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
+    ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
+    ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
+    URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent
+    cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent
+    transformCaseFunc // eslint-disable-line indent
+    ) // eslint-disable-line indent
+    : DEFAULT_URI_SAFE_ATTRIBUTES;
+    DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent
+    cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent
+    transformCaseFunc // eslint-disable-line indent
+    ) // eslint-disable-line indent
+    : DEFAULT_DATA_URI_TAGS;
+    FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
+    FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};
+    FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};
+    USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
+    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true
+
+    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
+
+    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
+
+    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true
+
+    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false
+
+    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false
+
+    RETURN_DOM = cfg.RETURN_DOM || false; // Default false
+
+    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false
+
+    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false
+
+    FORCE_BODY = cfg.FORCE_BODY || false; // Default false
+
+    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true
+
+    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false
+
+    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
+
+    IN_PLACE = cfg.IN_PLACE || false; // Default false
+
+    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
+    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
+    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};
+
+    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
+      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
+    }
+
+    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
+      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
+    }
+
+    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
+      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
+    }
+
+    if (SAFE_FOR_TEMPLATES) {
+      ALLOW_DATA_ATTR = false;
+    }
+
+    if (RETURN_DOM_FRAGMENT) {
+      RETURN_DOM = true;
+    }
+    /* Parse profile info */
+
+
+    if (USE_PROFILES) {
+      ALLOWED_TAGS = addToSet({}, [...text]);
+      ALLOWED_ATTR = [];
+
+      if (USE_PROFILES.html === true) {
+        addToSet(ALLOWED_TAGS, html$1);
+        addToSet(ALLOWED_ATTR, html);
+      }
+
+      if (USE_PROFILES.svg === true) {
+        addToSet(ALLOWED_TAGS, svg$1);
+        addToSet(ALLOWED_ATTR, svg);
+        addToSet(ALLOWED_ATTR, xml);
+      }
+
+      if (USE_PROFILES.svgFilters === true) {
+        addToSet(ALLOWED_TAGS, svgFilters);
+        addToSet(ALLOWED_ATTR, svg);
+        addToSet(ALLOWED_ATTR, xml);
+      }
+
+      if (USE_PROFILES.mathMl === true) {
+        addToSet(ALLOWED_TAGS, mathMl$1);
+        addToSet(ALLOWED_ATTR, mathMl);
+        addToSet(ALLOWED_ATTR, xml);
+      }
+    }
+    /* Merge configuration parameters */
+
+
+    if (cfg.ADD_TAGS) {
+      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
+        ALLOWED_TAGS = clone(ALLOWED_TAGS);
+      }
+
+      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
+    }
+
+    if (cfg.ADD_ATTR) {
+      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
+        ALLOWED_ATTR = clone(ALLOWED_ATTR);
+      }
+
+      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
+    }
+
+    if (cfg.ADD_URI_SAFE_ATTR) {
+      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
+    }
+
+    if (cfg.FORBID_CONTENTS) {
+      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
+        FORBID_CONTENTS = clone(FORBID_CONTENTS);
+      }
+
+      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
+    }
+    /* Add #text in case KEEP_CONTENT is set to true */
+
+
+    if (KEEP_CONTENT) {
+      ALLOWED_TAGS['#text'] = true;
+    }
+    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */
+
+
+    if (WHOLE_DOCUMENT) {
+      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
+    }
+    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */
+
+
+    if (ALLOWED_TAGS.table) {
+      addToSet(ALLOWED_TAGS, ['tbody']);
+      delete FORBID_TAGS.tbody;
+    } // Prevent further manipulation of configuration.
+    // Not available in IE8, Safari 5, etc.
+
+
+    if (freeze) {
+      freeze(cfg);
+    }
+
+    CONFIG = cfg;
+  };
+
+  const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);
+  const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML
+  // namespace. We need to specify them explicitly
+  // so that they don't get erroneously deleted from
+  // HTML namespace.
+
+  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);
+  /* Keep track of all possible SVG and MathML tags
+   * so that we can perform the namespace checks
+   * correctly. */
+
+  const ALL_SVG_TAGS = addToSet({}, svg$1);
+  addToSet(ALL_SVG_TAGS, svgFilters);
+  addToSet(ALL_SVG_TAGS, svgDisallowed);
+  const ALL_MATHML_TAGS = addToSet({}, mathMl$1);
+  addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
+  /**
+   *
+   *
+   * @param  {Element} element a DOM element whose namespace is being checked
+   * @returns {boolean} Return false if the element has a
+   *  namespace that a spec-compliant parser would never
+   *  return. Return true otherwise.
+   */
+
+  const _checkValidNamespace = function _checkValidNamespace(element) {
+    let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode
+    // can be null. We just simulate parent in this case.
+
+    if (!parent || !parent.tagName) {
+      parent = {
+        namespaceURI: NAMESPACE,
+        tagName: 'template'
+      };
+    }
+
+    const tagName = stringToLowerCase(element.tagName);
+    const parentTagName = stringToLowerCase(parent.tagName);
+
+    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
+      return false;
+    }
+
+    if (element.namespaceURI === SVG_NAMESPACE) {
+      // The only way to switch from HTML namespace to SVG
+      // is via <svg>. If it happens via any other tag, then
+      // it should be killed.
+      if (parent.namespaceURI === HTML_NAMESPACE) {
+        return tagName === 'svg';
+      } // The only way to switch from MathML to SVG is via`
+      // svg if parent is either <annotation-xml> or MathML
+      // text integration points.
+
+
+      if (parent.namespaceURI === MATHML_NAMESPACE) {
+        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
+      } // We only allow elements that are defined in SVG
+      // spec. All others are disallowed in SVG namespace.
+
+
+      return Boolean(ALL_SVG_TAGS[tagName]);
+    }
+
+    if (element.namespaceURI === MATHML_NAMESPACE) {
+      // The only way to switch from HTML namespace to MathML
+      // is via <math>. If it happens via any other tag, then
+      // it should be killed.
+      if (parent.namespaceURI === HTML_NAMESPACE) {
+        return tagName === 'math';
+      } // The only way to switch from SVG to MathML is via
+      // <math> and HTML integration points
+
+
+      if (parent.namespaceURI === SVG_NAMESPACE) {
+        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
+      } // We only allow elements that are defined in MathML
+      // spec. All others are disallowed in MathML namespace.
+
+
+      return Boolean(ALL_MATHML_TAGS[tagName]);
+    }
+
+    if (element.namespaceURI === HTML_NAMESPACE) {
+      // The only way to switch from SVG to HTML is via
+      // HTML integration points, and from MathML to HTML
+      // is via MathML text integration points
+      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
+        return false;
+      }
+
+      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
+        return false;
+      } // We disallow tags that are specific for MathML
+      // or SVG and should never appear in HTML namespace
+
+
+      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
+    } // For XHTML and XML documents that support custom namespaces
+
+
+    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {
+      return true;
+    } // The code should never reach this place (this means
+    // that the element somehow got namespace that is not
+    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).
+    // Return false just in case.
+
+
+    return false;
+  };
+  /**
+   * _forceRemove
+   *
+   * @param  {Node} node a DOM node
+   */
+
+
+  const _forceRemove = function _forceRemove(node) {
+    arrayPush(DOMPurify.removed, {
+      element: node
+    });
+
+    try {
+      // eslint-disable-next-line unicorn/prefer-dom-node-remove
+      node.parentNode.removeChild(node);
+    } catch (_) {
+      node.remove();
+    }
+  };
+  /**
+   * _removeAttribute
+   *
+   * @param  {String} name an Attribute name
+   * @param  {Node} node a DOM node
+   */
+
+
+  const _removeAttribute = function _removeAttribute(name, node) {
+    try {
+      arrayPush(DOMPurify.removed, {
+        attribute: node.getAttributeNode(name),
+        from: node
+      });
+    } catch (_) {
+      arrayPush(DOMPurify.removed, {
+        attribute: null,
+        from: node
+      });
+    }
+
+    node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes
+
+    if (name === 'is' && !ALLOWED_ATTR[name]) {
+      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
+        try {
+          _forceRemove(node);
+        } catch (_) {}
+      } else {
+        try {
+          node.setAttribute(name, '');
+        } catch (_) {}
+      }
+    }
+  };
+  /**
+   * _initDocument
+   *
+   * @param  {String} dirty a string of dirty markup
+   * @return {Document} a DOM, filled with the dirty markup
+   */
+
+
+  const _initDocument = function _initDocument(dirty) {
+    /* Create a HTML document */
+    let doc;
+    let leadingWhitespace;
+
+    if (FORCE_BODY) {
+      dirty = '<remove></remove>' + dirty;
+    } else {
+      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
+      const matches = stringMatch(dirty, /^[\r\n\t ]+/);
+      leadingWhitespace = matches && matches[0];
+    }
+
+    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {
+      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)
+      dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
+    }
+
+    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
+    /*
+     * Use the DOMParser API by default, fallback later if needs be
+     * DOMParser not work for svg when has multiple root element.
+     */
+
+    if (NAMESPACE === HTML_NAMESPACE) {
+      try {
+        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
+      } catch (_) {}
+    }
+    /* Use createHTMLDocument in case DOMParser is not available */
+
+
+    if (!doc || !doc.documentElement) {
+      doc = implementation.createDocument(NAMESPACE, 'template', null);
+
+      try {
+        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
+      } catch (_) {// Syntax error if dirtyPayload is invalid xml
+      }
+    }
+
+    const body = doc.body || doc.documentElement;
+
+    if (dirty && leadingWhitespace) {
+      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
+    }
+    /* Work on whole document or just its body */
+
+
+    if (NAMESPACE === HTML_NAMESPACE) {
+      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
+    }
+
+    return WHOLE_DOCUMENT ? doc.documentElement : body;
+  };
+  /**
+   * _createIterator
+   *
+   * @param  {Document} root document/fragment to create iterator for
+   * @return {Iterator} iterator instance
+   */
+
+
+  const _createIterator = function _createIterator(root) {
+    return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise
+    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
+  };
+  /**
+   * _isClobbered
+   *
+   * @param  {Node} elm element to check for clobbering attacks
+   * @return {Boolean} true if clobbered, false if safe
+   */
+
+
+  const _isClobbered = function _isClobbered(elm) {
+    return 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');
+  };
+  /**
+   * _isNode
+   *
+   * @param  {Node} obj object to check whether it's a DOM node
+   * @return {Boolean} true is object is a DOM node
+   */
+
+
+  const _isNode = function _isNode(object) {
+    return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
+  };
+  /**
+   * _executeHook
+   * Execute user configurable hooks
+   *
+   * @param  {String} entryPoint  Name of the hook's entry point
+   * @param  {Node} currentNode node to work on with the hook
+   * @param  {Object} data additional hook parameters
+   */
+
+
+  const _executeHook = function _executeHook(entryPoint, currentNode, data) {
+    if (!hooks[entryPoint]) {
+      return;
+    }
+
+    arrayForEach(hooks[entryPoint], hook => {
+      hook.call(DOMPurify, currentNode, data, CONFIG);
+    });
+  };
+  /**
+   * _sanitizeElements
+   *
+   * @protect nodeName
+   * @protect textContent
+   * @protect removeChild
+   *
+   * @param   {Node} currentNode to check for permission to exist
+   * @return  {Boolean} true if node was killed, false if left alive
+   */
+
+
+  const _sanitizeElements = function _sanitizeElements(currentNode) {
+    let content;
+    /* Execute a hook if present */
+
+    _executeHook('beforeSanitizeElements', currentNode, null);
+    /* Check if element is clobbered or can clobber */
+
+
+    if (_isClobbered(currentNode)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Now let's check the element's type and name */
+
+
+    const tagName = transformCaseFunc(currentNode.nodeName);
+    /* Execute a hook if present */
+
+    _executeHook('uponSanitizeElement', currentNode, {
+      tagName,
+      allowedTags: ALLOWED_TAGS
+    });
+    /* Detect mXSS attempts abusing namespace confusion */
+
+
+    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Remove element if anything forbids its presence */
+
+
+    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+      /* Check if we have a custom element to handle */
+      if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
+        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
+        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
+      }
+      /* Keep content except for bad-listed elements */
+
+
+      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
+        const parentNode = getParentNode(currentNode) || currentNode.parentNode;
+        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;
+
+        if (childNodes && parentNode) {
+          const childCount = childNodes.length;
+
+          for (let i = childCount - 1; i >= 0; --i) {
+            parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
+          }
+        }
+      }
+
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Check whether element has a valid namespace */
+
+
+    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Make sure that older browsers don't get noscript mXSS */
+
+
+    if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Sanitize element content to be template-safe */
+
+
+    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
+      /* Get the element's text content */
+      content = currentNode.textContent;
+      content = stringReplace(content, MUSTACHE_EXPR, ' ');
+      content = stringReplace(content, ERB_EXPR, ' ');
+      content = stringReplace(content, TMPLIT_EXPR, ' ');
+
+      if (currentNode.textContent !== content) {
+        arrayPush(DOMPurify.removed, {
+          element: currentNode.cloneNode()
+        });
+        currentNode.textContent = content;
+      }
+    }
+    /* Execute a hook if present */
+
+
+    _executeHook('afterSanitizeElements', currentNode, null);
+
+    return false;
+  };
+  /**
+   * _isValidAttribute
+   *
+   * @param  {string} lcTag Lowercase tag name of containing element.
+   * @param  {string} lcName Lowercase attribute name.
+   * @param  {string} value Attribute value.
+   * @return {Boolean} Returns true if `value` is valid, otherwise false.
+   */
+  // eslint-disable-next-line complexity
+
+
+  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
+    /* Make sure attribute cannot clobber */
+    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
+      return false;
+    }
+    /* Allow valid data-* attributes: At least one character after "-"
+        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
+        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
+        We don't need to check the value; it's always URI safe. */
+
+
+    if (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]) {
+      if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND
+      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
+      _basicCustomElementTest(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)) || // Alternative, second condition checks if it's an `is`-attribute, AND
+      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+      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 {
+        return false;
+      }
+      /* Check value is safe. First, is attr inert? If so, is safe */
+
+    } 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) ; else {
+      return false;
+    }
+
+    return true;
+  };
+  /**
+   * _basicCustomElementCheck
+   * checks if at least one dash is included in tagName, and it's not the first char
+   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
+   * @param {string} tagName name of the tag of the node to sanitize
+   */
+
+
+  const _basicCustomElementTest = function _basicCustomElementTest(tagName) {
+    return tagName.indexOf('-') > 0;
+  };
+  /**
+   * _sanitizeAttributes
+   *
+   * @protect attributes
+   * @protect nodeName
+   * @protect removeAttribute
+   * @protect setAttribute
+   *
+   * @param  {Node} currentNode to sanitize
+   */
+
+
+  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
+    let attr;
+    let value;
+    let lcName;
+    let l;
+    /* Execute a hook if present */
+
+    _executeHook('beforeSanitizeAttributes', currentNode, null);
+
+    const {
+      attributes
+    } = currentNode;
+    /* Check if we have attributes; if not we might have a text node */
+
+    if (!attributes) {
+      return;
+    }
+
+    const hookEvent = {
+      attrName: '',
+      attrValue: '',
+      keepAttr: true,
+      allowedAttributes: ALLOWED_ATTR
+    };
+    l = attributes.length;
+    /* Go backwards over all attributes; safely remove bad ones */
+
+    while (l--) {
+      attr = attributes[l];
+      const {
+        name,
+        namespaceURI
+      } = attr;
+      value = name === 'value' ? attr.value : stringTrim(attr.value);
+      lcName = transformCaseFunc(name);
+      /* Execute a hook if present */
+
+      hookEvent.attrName = lcName;
+      hookEvent.attrValue = value;
+      hookEvent.keepAttr = true;
+      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
+
+      _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
+
+      value = hookEvent.attrValue;
+      /* Did the hooks approve of the attribute? */
+
+      if (hookEvent.forceKeepAttr) {
+        continue;
+      }
+      /* Remove attribute */
+
+
+      _removeAttribute(name, currentNode);
+      /* Did the hooks approve of the attribute? */
+
+
+      if (!hookEvent.keepAttr) {
+        continue;
+      }
+      /* Work around a security issue in jQuery 3.0 */
+
+
+      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) {
+        _removeAttribute(name, currentNode);
+
+        continue;
+      }
+      /* Sanitize attribute content to be template-safe */
+
+
+      if (SAFE_FOR_TEMPLATES) {
+        value = stringReplace(value, MUSTACHE_EXPR, ' ');
+        value = stringReplace(value, ERB_EXPR, ' ');
+        value = stringReplace(value, TMPLIT_EXPR, ' ');
+      }
+      /* Is `value` valid for this attribute? */
+
+
+      const lcTag = transformCaseFunc(currentNode.nodeName);
+
+      if (!_isValidAttribute(lcTag, lcName, value)) {
+        continue;
+      }
+      /* Full DOM Clobbering protection via namespace isolation,
+       * Prefix id and name attributes with `user-content-`
+       */
+
+
+      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
+        // Remove the attribute with this value
+        _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value
+
+
+        value = SANITIZE_NAMED_PROPS_PREFIX + value;
+      }
+      /* Handle attributes that require Trusted Types */
+
+
+      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {
+        if (namespaceURI) ; else {
+          switch (trustedTypes.getAttributeType(lcTag, lcName)) {
+            case 'TrustedHTML':
+              value = trustedTypesPolicy.createHTML(value);
+              break;
+
+            case 'TrustedScriptURL':
+              value = trustedTypesPolicy.createScriptURL(value);
+              break;
+          }
+        }
+      }
+      /* Handle invalid data-* attribute set by try-catching it */
+
+
+      try {
+        if (namespaceURI) {
+          currentNode.setAttributeNS(namespaceURI, name, value);
+        } else {
+          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
+          currentNode.setAttribute(name, value);
+        }
+
+        arrayPop(DOMPurify.removed);
+      } catch (_) {}
+    }
+    /* Execute a hook if present */
+
+
+    _executeHook('afterSanitizeAttributes', currentNode, null);
+  };
+  /**
+   * _sanitizeShadowDOM
+   *
+   * @param  {DocumentFragment} fragment to iterate over recursively
+   */
+
+
+  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
+    let shadowNode;
+
+    const shadowIterator = _createIterator(fragment);
+    /* Execute a hook if present */
+
+
+    _executeHook('beforeSanitizeShadowDOM', fragment, null);
+
+    while (shadowNode = shadowIterator.nextNode()) {
+      /* Execute a hook if present */
+      _executeHook('uponSanitizeShadowNode', shadowNode, null);
+      /* Sanitize tags and elements */
+
+
+      if (_sanitizeElements(shadowNode)) {
+        continue;
+      }
+      /* Deep shadow DOM detected */
+
+
+      if (shadowNode.content instanceof DocumentFragment) {
+        _sanitizeShadowDOM(shadowNode.content);
+      }
+      /* Check attributes, sanitize if necessary */
+
+
+      _sanitizeAttributes(shadowNode);
+    }
+    /* Execute a hook if present */
+
+
+    _executeHook('afterSanitizeShadowDOM', fragment, null);
+  };
+  /**
+   * Sanitize
+   * Public method providing core sanitation functionality
+   *
+   * @param {String|Node} dirty string or DOM node
+   * @param {Object} configuration object
+   */
+  // eslint-disable-next-line complexity
+
+
+  DOMPurify.sanitize = function (dirty) {
+    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+    let body;
+    let importedNode;
+    let currentNode;
+    let returnNode;
+    /* Make sure we have a string to sanitize.
+      DO NOT return early, as this will return the wrong type if
+      the user has requested a DOM object rather than a string */
+
+    IS_EMPTY_INPUT = !dirty;
+
+    if (IS_EMPTY_INPUT) {
+      dirty = '<!-->';
+    }
+    /* Stringify, in case dirty is an object */
+
+
+    if (typeof dirty !== 'string' && !_isNode(dirty)) {
+      // eslint-disable-next-line no-negated-condition
+      if (typeof dirty.toString !== 'function') {
+        throw typeErrorCreate('toString is not a function');
+      } else {
+        dirty = dirty.toString();
+
+        if (typeof dirty !== 'string') {
+          throw typeErrorCreate('dirty is not a string, aborting');
+        }
+      }
+    }
+    /* Return dirty HTML if DOMPurify cannot run */
+
+
+    if (!DOMPurify.isSupported) {
+      return dirty;
+    }
+    /* Assign config vars */
+
+
+    if (!SET_CONFIG) {
+      _parseConfig(cfg);
+    }
+    /* Clean up removed elements */
+
+
+    DOMPurify.removed = [];
+    /* Check if dirty is correctly typed for IN_PLACE */
+
+    if (typeof dirty === 'string') {
+      IN_PLACE = false;
+    }
+
+    if (IN_PLACE) {
+      /* Do some early pre-sanitization to avoid unsafe root nodes */
+      if (dirty.nodeName) {
+        const tagName = transformCaseFunc(dirty.nodeName);
+
+        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
+        }
+      }
+    } else if (dirty instanceof Node) {
+      /* If dirty is a DOM element, append to an empty document to avoid
+         elements being stripped by the parser */
+      body = _initDocument('<!---->');
+      importedNode = body.ownerDocument.importNode(dirty, true);
+
+      if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
+        /* Node is already a body, use as is */
+        body = importedNode;
+      } else if (importedNode.nodeName === 'HTML') {
+        body = importedNode;
+      } else {
+        // eslint-disable-next-line unicorn/prefer-dom-node-append
+        body.appendChild(importedNode);
+      }
+    } else {
+      /* Exit directly if we have nothing to do */
+      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
+      dirty.indexOf('<') === -1) {
+        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
+      }
+      /* Initialize the document to work on */
+
+
+      body = _initDocument(dirty);
+      /* Check we have a DOM node from the data */
+
+      if (!body) {
+        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
+      }
+    }
+    /* Remove first element node (ours) if FORCE_BODY is set */
+
+
+    if (body && FORCE_BODY) {
+      _forceRemove(body.firstChild);
+    }
+    /* Get node iterator */
+
+
+    const nodeIterator = _createIterator(IN_PLACE ? dirty : body);
+    /* Now start iterating over the created document */
+
+
+    while (currentNode = nodeIterator.nextNode()) {
+      /* Sanitize tags and elements */
+      if (_sanitizeElements(currentNode)) {
+        continue;
+      }
+      /* Shadow DOM detected, sanitize it */
+
+
+      if (currentNode.content instanceof DocumentFragment) {
+        _sanitizeShadowDOM(currentNode.content);
+      }
+      /* Check attributes, sanitize if necessary */
+
+
+      _sanitizeAttributes(currentNode);
+    }
+    /* If we sanitized `dirty` in-place, return it. */
+
+
+    if (IN_PLACE) {
+      return dirty;
+    }
+    /* Return sanitized string or DOM */
+
+
+    if (RETURN_DOM) {
+      if (RETURN_DOM_FRAGMENT) {
+        returnNode = createDocumentFragment.call(body.ownerDocument);
+
+        while (body.firstChild) {
+          // eslint-disable-next-line unicorn/prefer-dom-node-append
+          returnNode.appendChild(body.firstChild);
+        }
+      } else {
+        returnNode = body;
+      }
+
+      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {
+        /*
+          AdoptNode() is not used because internal state is not reset
+          (e.g. the past names map of a HTMLFormElement), this is safe
+          in theory but we would rather not risk another attack vector.
+          The state that is cloned by importNode() is explicitly defined
+          by the specs.
+        */
+        returnNode = importNode.call(originalDocument, returnNode, true);
+      }
+
+      return returnNode;
+    }
+
+    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
+    /* Serialize doctype if allowed */
+
+    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
+      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
+    }
+    /* Sanitize final string template-safe */
+
+
+    if (SAFE_FOR_TEMPLATES) {
+      serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');
+      serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');
+      serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');
+    }
+
+    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
+  };
+  /**
+   * Public method to set the configuration once
+   * setConfig
+   *
+   * @param {Object} cfg configuration object
+   */
+
+
+  DOMPurify.setConfig = function (cfg) {
+    _parseConfig(cfg);
+
+    SET_CONFIG = true;
+  };
+  /**
+   * Public method to remove the configuration
+   * clearConfig
+   *
+   */
+
+
+  DOMPurify.clearConfig = function () {
+    CONFIG = null;
+    SET_CONFIG = false;
+  };
+  /**
+   * Public method to check if an attribute value is valid.
+   * Uses last set config, if any. Otherwise, uses config defaults.
+   * isValidAttribute
+   *
+   * @param  {string} tag Tag name of containing element.
+   * @param  {string} attr Attribute name.
+   * @param  {string} value Attribute value.
+   * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
+   */
+
+
+  DOMPurify.isValidAttribute = function (tag, attr, value) {
+    /* Initialize shared config vars if necessary. */
+    if (!CONFIG) {
+      _parseConfig({});
+    }
+
+    const lcTag = transformCaseFunc(tag);
+    const lcName = transformCaseFunc(attr);
+    return _isValidAttribute(lcTag, lcName, value);
+  };
+  /**
+   * AddHook
+   * Public method to add DOMPurify hooks
+   *
+   * @param {String} entryPoint entry point for the hook to add
+   * @param {Function} hookFunction function to execute
+   */
+
+
+  DOMPurify.addHook = function (entryPoint, hookFunction) {
+    if (typeof hookFunction !== 'function') {
+      return;
+    }
+
+    hooks[entryPoint] = hooks[entryPoint] || [];
+    arrayPush(hooks[entryPoint], hookFunction);
+  };
+  /**
+   * RemoveHook
+   * Public method to remove a DOMPurify hook at a given entryPoint
+   * (pops it from the stack of hooks if more are present)
+   *
+   * @param {String} entryPoint entry point for the hook to remove
+   * @return {Function} removed(popped) hook
+   */
+
+
+  DOMPurify.removeHook = function (entryPoint) {
+    if (hooks[entryPoint]) {
+      return arrayPop(hooks[entryPoint]);
+    }
+  };
+  /**
+   * RemoveHooks
+   * Public method to remove all DOMPurify hooks at a given entryPoint
+   *
+   * @param  {String} entryPoint entry point for the hooks to remove
+   */
+
+
+  DOMPurify.removeHooks = function (entryPoint) {
+    if (hooks[entryPoint]) {
+      hooks[entryPoint] = [];
+    }
+  };
+  /**
+   * RemoveAllHooks
+   * Public method to remove all DOMPurify hooks
+   *
+   */
+
+
+  DOMPurify.removeAllHooks = function () {
+    hooks = {};
+  };
+
+  return DOMPurify;
+}
+
+var purify = createDOMPurify();
+
+module.exports = purify;
+//# sourceMappingURL=purify.cjs.js.map
diff --git a/plugins/DOMPurify/purify.cjs.js.map b/plugins/DOMPurify/purify.cjs.js.map
new file mode 100644
index 000000000..808cdbdc1
--- /dev/null
+++ b/plugins/DOMPurify/purify.cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"purify.cjs.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","unconstruct","TypeError","func","thisArg","addToSet","set","array","transformCaseFunc","l","length","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","childCount","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":"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"}
\ No newline at end of file
diff --git a/plugins/DOMPurify/purify.es.js b/plugins/DOMPurify/purify.es.js
new file mode 100644
index 000000000..669105495
--- /dev/null
+++ b/plugins/DOMPurify/purify.es.js
@@ -0,0 +1,1595 @@
+/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */
+
+const {
+  entries,
+  setPrototypeOf,
+  isFrozen,
+  getPrototypeOf,
+  getOwnPropertyDescriptor
+} = Object;
+let {
+  freeze,
+  seal,
+  create
+} = Object; // eslint-disable-line import/no-mutable-exports
+
+let {
+  apply,
+  construct
+} = typeof Reflect !== 'undefined' && Reflect;
+
+if (!apply) {
+  apply = function apply(fun, thisValue, args) {
+    return fun.apply(thisValue, args);
+  };
+}
+
+if (!freeze) {
+  freeze = function freeze(x) {
+    return x;
+  };
+}
+
+if (!seal) {
+  seal = function seal(x) {
+    return x;
+  };
+}
+
+if (!construct) {
+  construct = function construct(Func, args) {
+    return new Func(...args);
+  };
+}
+
+const arrayForEach = unapply(Array.prototype.forEach);
+const arrayPop = unapply(Array.prototype.pop);
+const arrayPush = unapply(Array.prototype.push);
+const stringToLowerCase = unapply(String.prototype.toLowerCase);
+const stringToString = unapply(String.prototype.toString);
+const stringMatch = unapply(String.prototype.match);
+const stringReplace = unapply(String.prototype.replace);
+const stringIndexOf = unapply(String.prototype.indexOf);
+const stringTrim = unapply(String.prototype.trim);
+const regExpTest = unapply(RegExp.prototype.test);
+const typeErrorCreate = unconstruct(TypeError);
+function unapply(func) {
+  return function (thisArg) {
+    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+      args[_key - 1] = arguments[_key];
+    }
+
+    return apply(func, thisArg, args);
+  };
+}
+function unconstruct(func) {
+  return function () {
+    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+      args[_key2] = arguments[_key2];
+    }
+
+    return construct(func, args);
+  };
+}
+/* Add properties to a lookup table */
+
+function addToSet(set, array, transformCaseFunc) {
+  transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;
+
+  if (setPrototypeOf) {
+    // Make 'in' and truthy checks like Boolean(set.constructor)
+    // independent of any properties defined on Object.prototype.
+    // Prevent prototype setters from intercepting set as a this value.
+    setPrototypeOf(set, null);
+  }
+
+  let l = array.length;
+
+  while (l--) {
+    let element = array[l];
+
+    if (typeof element === 'string') {
+      const lcElement = transformCaseFunc(element);
+
+      if (lcElement !== element) {
+        // Config presets (e.g. tags.js, attrs.js) are immutable.
+        if (!isFrozen(array)) {
+          array[l] = lcElement;
+        }
+
+        element = lcElement;
+      }
+    }
+
+    set[element] = true;
+  }
+
+  return set;
+}
+/* Shallow clone an object */
+
+function clone(object) {
+  const newObject = create(null);
+
+  for (const [property, value] of entries(object)) {
+    newObject[property] = value;
+  }
+
+  return newObject;
+}
+/* This method automatically checks if the prop is function
+ * or getter and behaves accordingly. */
+
+function lookupGetter(object, prop) {
+  while (object !== null) {
+    const desc = getOwnPropertyDescriptor(object, prop);
+
+    if (desc) {
+      if (desc.get) {
+        return unapply(desc.get);
+      }
+
+      if (typeof desc.value === 'function') {
+        return unapply(desc.value);
+      }
+    }
+
+    object = getPrototypeOf(object);
+  }
+
+  function fallbackValue(element) {
+    console.warn('fallback value for', element);
+    return null;
+  }
+
+  return fallbackValue;
+}
+
+const 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']); // SVG
+
+const 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']);
+const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.
+// We still need to know them so that we can do namespace
+// checks properly in case one wants to add them to
+// allow-list.
+
+const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', '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']);
+const 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']); // Similarly to SVG, we want to know all MathML elements,
+// even those that we disallow by default.
+
+const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
+const text = freeze(['#text']);
+
+const 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']);
+const 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']);
+const 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']);
+const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
+
+const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
+
+const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
+const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
+const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
+
+const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
+
+const 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
+);
+const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
+const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex
+);
+const DOCTYPE_NAME = seal(/^html$/i);
+
+var EXPRESSIONS = /*#__PURE__*/Object.freeze({
+  __proto__: null,
+  MUSTACHE_EXPR: MUSTACHE_EXPR,
+  ERB_EXPR: ERB_EXPR,
+  TMPLIT_EXPR: TMPLIT_EXPR,
+  DATA_ATTR: DATA_ATTR,
+  ARIA_ATTR: ARIA_ATTR,
+  IS_ALLOWED_URI: IS_ALLOWED_URI,
+  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
+  ATTR_WHITESPACE: ATTR_WHITESPACE,
+  DOCTYPE_NAME: DOCTYPE_NAME
+});
+
+const getGlobal = () => typeof window === 'undefined' ? null : window;
+/**
+ * Creates a no-op policy for internal use only.
+ * Don't export this function outside this module!
+ * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
+ * @param {Document} document The document object (to determine policy name suffix)
+ * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
+ * are not supported).
+ */
+
+
+const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
+  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
+    return null;
+  } // Allow the callers to control the unique policy name
+  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.
+  // Policy creation with duplicate names throws in Trusted Types.
+
+
+  let suffix = null;
+  const ATTR_NAME = 'data-tt-policy-suffix';
+
+  if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
+    suffix = document.currentScript.getAttribute(ATTR_NAME);
+  }
+
+  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');
+
+  try {
+    return trustedTypes.createPolicy(policyName, {
+      createHTML(html) {
+        return html;
+      },
+
+      createScriptURL(scriptUrl) {
+        return scriptUrl;
+      }
+
+    });
+  } catch (_) {
+    // Policy creation failed (most likely another DOMPurify script has
+    // already run). Skip creating the policy, as this will only cause errors
+    // if TT are enforced.
+    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
+    return null;
+  }
+};
+
+function createDOMPurify() {
+  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
+
+  const DOMPurify = root => createDOMPurify(root);
+  /**
+   * Version label, exposed for easier checks
+   * if DOMPurify is up to date or not
+   */
+
+
+  DOMPurify.version = '3.0.2';
+  /**
+   * Array of elements that DOMPurify removed during sanitation.
+   * Empty if nothing was removed.
+   */
+
+  DOMPurify.removed = [];
+
+  if (!window || !window.document || window.document.nodeType !== 9) {
+    // Not running in a browser, provide a factory function
+    // so that you can pass your own Window
+    DOMPurify.isSupported = false;
+    return DOMPurify;
+  }
+
+  const originalDocument = window.document;
+  let {
+    document
+  } = window;
+  const {
+    DocumentFragment,
+    HTMLTemplateElement,
+    Node,
+    Element,
+    NodeFilter,
+    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,
+    HTMLFormElement,
+    DOMParser,
+    trustedTypes
+  } = window;
+  const ElementPrototype = Element.prototype;
+  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
+  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
+  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
+  const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a
+  // new document created via createHTMLDocument. As per the spec
+  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
+  // a new empty registry is used when creating a template contents owner
+  // document, so we use that as our parent document to ensure nothing
+  // is inherited.
+
+  if (typeof HTMLTemplateElement === 'function') {
+    const template = document.createElement('template');
+
+    if (template.content && template.content.ownerDocument) {
+      document = template.content.ownerDocument;
+    }
+  }
+
+  const trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);
+
+  const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
+  const {
+    implementation,
+    createNodeIterator,
+    createDocumentFragment,
+    getElementsByTagName
+  } = document;
+  const {
+    importNode
+  } = originalDocument;
+  let hooks = {};
+  /**
+   * Expose whether this browser supports running the full DOMPurify.
+   */
+
+  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined';
+  const {
+    MUSTACHE_EXPR,
+    ERB_EXPR,
+    TMPLIT_EXPR,
+    DATA_ATTR,
+    ARIA_ATTR,
+    IS_SCRIPT_OR_DATA,
+    ATTR_WHITESPACE
+  } = EXPRESSIONS;
+  let {
+    IS_ALLOWED_URI: IS_ALLOWED_URI$1
+  } = EXPRESSIONS;
+  /**
+   * We consider the elements and attributes below to be safe. Ideally
+   * don't add any new ones but feel free to remove unwanted ones.
+   */
+
+  /* allowed element names */
+
+  let ALLOWED_TAGS = null;
+  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
+  /* Allowed attribute names */
+
+  let ALLOWED_ATTR = null;
+  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
+  /*
+   * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.
+   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)
+   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)
+   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.
+   */
+
+  let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
+    tagNameCheck: {
+      writable: true,
+      configurable: false,
+      enumerable: true,
+      value: null
+    },
+    attributeNameCheck: {
+      writable: true,
+      configurable: false,
+      enumerable: true,
+      value: null
+    },
+    allowCustomizedBuiltInElements: {
+      writable: true,
+      configurable: false,
+      enumerable: true,
+      value: false
+    }
+  }));
+  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */
+
+  let FORBID_TAGS = null;
+  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */
+
+  let FORBID_ATTR = null;
+  /* Decide if ARIA attributes are okay */
+
+  let ALLOW_ARIA_ATTR = true;
+  /* Decide if custom data attributes are okay */
+
+  let ALLOW_DATA_ATTR = true;
+  /* Decide if unknown protocols are okay */
+
+  let ALLOW_UNKNOWN_PROTOCOLS = false;
+  /* Decide if self-closing tags in attributes are allowed.
+   * Usually removed due to a mXSS issue in jQuery 3.0 */
+
+  let ALLOW_SELF_CLOSE_IN_ATTR = true;
+  /* Output should be safe for common template engines.
+   * This means, DOMPurify removes data attributes, mustaches and ERB
+   */
+
+  let SAFE_FOR_TEMPLATES = false;
+  /* Decide if document with <html>... should be returned */
+
+  let WHOLE_DOCUMENT = false;
+  /* Track whether config is already set on this instance of DOMPurify. */
+
+  let SET_CONFIG = false;
+  /* Decide if all elements (e.g. style, script) must be children of
+   * document.body. By default, browsers might move them to document.head */
+
+  let FORCE_BODY = false;
+  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
+   * string (or a TrustedHTML object if Trusted Types are supported).
+   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
+   */
+
+  let RETURN_DOM = false;
+  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html
+   * string  (or a TrustedHTML object if Trusted Types are supported) */
+
+  let RETURN_DOM_FRAGMENT = false;
+  /* Try to return a Trusted Type object instead of a string, return a string in
+   * case Trusted Types are not supported  */
+
+  let RETURN_TRUSTED_TYPE = false;
+  /* Output should be free from DOM clobbering attacks?
+   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.
+   */
+
+  let SANITIZE_DOM = true;
+  /* Achieve full DOM Clobbering protection by isolating the namespace of named
+   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.
+   *
+   * HTML/DOM spec rules that enable DOM Clobbering:
+   *   - Named Access on Window (§7.3.3)
+   *   - DOM Tree Accessors (§3.1.5)
+   *   - Form Element Parent-Child Relations (§4.10.3)
+   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)
+   *   - HTMLCollection (§4.2.10.2)
+   *
+   * Namespace isolation is implemented by prefixing `id` and `name` attributes
+   * with a constant string, i.e., `user-content-`
+   */
+
+  let SANITIZE_NAMED_PROPS = false;
+  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';
+  /* Keep element content when removing element? */
+
+  let KEEP_CONTENT = true;
+  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
+   * of importing it into a new Document and returning a sanitized copy */
+
+  let IN_PLACE = false;
+  /* Allow usage of profiles like html, svg and mathMl */
+
+  let USE_PROFILES = {};
+  /* Tags to ignore content of when KEEP_CONTENT is true */
+
+  let FORBID_CONTENTS = null;
+  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']);
+  /* Tags that are safe for data: URIs */
+
+  let DATA_URI_TAGS = null;
+  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);
+  /* Attributes safe for values like "javascript:" */
+
+  let URI_SAFE_ATTRIBUTES = null;
+  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);
+  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+  /* Document namespace */
+
+  let NAMESPACE = HTML_NAMESPACE;
+  let IS_EMPTY_INPUT = false;
+  /* Allowed XHTML+XML namespaces */
+
+  let ALLOWED_NAMESPACES = null;
+  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
+  /* Parsing of strict XHTML documents */
+
+  let PARSER_MEDIA_TYPE;
+  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];
+  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
+  let transformCaseFunc;
+  /* Keep a reference to config to pass to hooks */
+
+  let CONFIG = null;
+  /* Ideally, do not touch anything below this line */
+
+  /* ______________________________________________ */
+
+  const formElement = document.createElement('form');
+
+  const isRegexOrFunction = function isRegexOrFunction(testValue) {
+    return testValue instanceof RegExp || testValue instanceof Function;
+  };
+  /**
+   * _parseConfig
+   *
+   * @param  {Object} cfg optional config literal
+   */
+  // eslint-disable-next-line complexity
+
+
+  const _parseConfig = function _parseConfig(cfg) {
+    if (CONFIG && CONFIG === cfg) {
+      return;
+    }
+    /* Shield configuration object from tampering */
+
+
+    if (!cfg || typeof cfg !== 'object') {
+      cfg = {};
+    }
+    /* Shield configuration object from prototype pollution */
+
+
+    cfg = clone(cfg);
+    PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
+    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.
+
+    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
+    /* Set configuration parameters */
+
+    ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
+    ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
+    ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
+    URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent
+    cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent
+    transformCaseFunc // eslint-disable-line indent
+    ) // eslint-disable-line indent
+    : DEFAULT_URI_SAFE_ATTRIBUTES;
+    DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent
+    cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent
+    transformCaseFunc // eslint-disable-line indent
+    ) // eslint-disable-line indent
+    : DEFAULT_DATA_URI_TAGS;
+    FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
+    FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};
+    FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};
+    USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
+    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true
+
+    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
+
+    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
+
+    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true
+
+    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false
+
+    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false
+
+    RETURN_DOM = cfg.RETURN_DOM || false; // Default false
+
+    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false
+
+    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false
+
+    FORCE_BODY = cfg.FORCE_BODY || false; // Default false
+
+    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true
+
+    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false
+
+    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
+
+    IN_PLACE = cfg.IN_PLACE || false; // Default false
+
+    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
+    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
+    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};
+
+    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
+      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
+    }
+
+    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
+      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
+    }
+
+    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
+      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
+    }
+
+    if (SAFE_FOR_TEMPLATES) {
+      ALLOW_DATA_ATTR = false;
+    }
+
+    if (RETURN_DOM_FRAGMENT) {
+      RETURN_DOM = true;
+    }
+    /* Parse profile info */
+
+
+    if (USE_PROFILES) {
+      ALLOWED_TAGS = addToSet({}, [...text]);
+      ALLOWED_ATTR = [];
+
+      if (USE_PROFILES.html === true) {
+        addToSet(ALLOWED_TAGS, html$1);
+        addToSet(ALLOWED_ATTR, html);
+      }
+
+      if (USE_PROFILES.svg === true) {
+        addToSet(ALLOWED_TAGS, svg$1);
+        addToSet(ALLOWED_ATTR, svg);
+        addToSet(ALLOWED_ATTR, xml);
+      }
+
+      if (USE_PROFILES.svgFilters === true) {
+        addToSet(ALLOWED_TAGS, svgFilters);
+        addToSet(ALLOWED_ATTR, svg);
+        addToSet(ALLOWED_ATTR, xml);
+      }
+
+      if (USE_PROFILES.mathMl === true) {
+        addToSet(ALLOWED_TAGS, mathMl$1);
+        addToSet(ALLOWED_ATTR, mathMl);
+        addToSet(ALLOWED_ATTR, xml);
+      }
+    }
+    /* Merge configuration parameters */
+
+
+    if (cfg.ADD_TAGS) {
+      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
+        ALLOWED_TAGS = clone(ALLOWED_TAGS);
+      }
+
+      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
+    }
+
+    if (cfg.ADD_ATTR) {
+      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
+        ALLOWED_ATTR = clone(ALLOWED_ATTR);
+      }
+
+      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
+    }
+
+    if (cfg.ADD_URI_SAFE_ATTR) {
+      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
+    }
+
+    if (cfg.FORBID_CONTENTS) {
+      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
+        FORBID_CONTENTS = clone(FORBID_CONTENTS);
+      }
+
+      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
+    }
+    /* Add #text in case KEEP_CONTENT is set to true */
+
+
+    if (KEEP_CONTENT) {
+      ALLOWED_TAGS['#text'] = true;
+    }
+    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */
+
+
+    if (WHOLE_DOCUMENT) {
+      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
+    }
+    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */
+
+
+    if (ALLOWED_TAGS.table) {
+      addToSet(ALLOWED_TAGS, ['tbody']);
+      delete FORBID_TAGS.tbody;
+    } // Prevent further manipulation of configuration.
+    // Not available in IE8, Safari 5, etc.
+
+
+    if (freeze) {
+      freeze(cfg);
+    }
+
+    CONFIG = cfg;
+  };
+
+  const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);
+  const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML
+  // namespace. We need to specify them explicitly
+  // so that they don't get erroneously deleted from
+  // HTML namespace.
+
+  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);
+  /* Keep track of all possible SVG and MathML tags
+   * so that we can perform the namespace checks
+   * correctly. */
+
+  const ALL_SVG_TAGS = addToSet({}, svg$1);
+  addToSet(ALL_SVG_TAGS, svgFilters);
+  addToSet(ALL_SVG_TAGS, svgDisallowed);
+  const ALL_MATHML_TAGS = addToSet({}, mathMl$1);
+  addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
+  /**
+   *
+   *
+   * @param  {Element} element a DOM element whose namespace is being checked
+   * @returns {boolean} Return false if the element has a
+   *  namespace that a spec-compliant parser would never
+   *  return. Return true otherwise.
+   */
+
+  const _checkValidNamespace = function _checkValidNamespace(element) {
+    let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode
+    // can be null. We just simulate parent in this case.
+
+    if (!parent || !parent.tagName) {
+      parent = {
+        namespaceURI: NAMESPACE,
+        tagName: 'template'
+      };
+    }
+
+    const tagName = stringToLowerCase(element.tagName);
+    const parentTagName = stringToLowerCase(parent.tagName);
+
+    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
+      return false;
+    }
+
+    if (element.namespaceURI === SVG_NAMESPACE) {
+      // The only way to switch from HTML namespace to SVG
+      // is via <svg>. If it happens via any other tag, then
+      // it should be killed.
+      if (parent.namespaceURI === HTML_NAMESPACE) {
+        return tagName === 'svg';
+      } // The only way to switch from MathML to SVG is via`
+      // svg if parent is either <annotation-xml> or MathML
+      // text integration points.
+
+
+      if (parent.namespaceURI === MATHML_NAMESPACE) {
+        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
+      } // We only allow elements that are defined in SVG
+      // spec. All others are disallowed in SVG namespace.
+
+
+      return Boolean(ALL_SVG_TAGS[tagName]);
+    }
+
+    if (element.namespaceURI === MATHML_NAMESPACE) {
+      // The only way to switch from HTML namespace to MathML
+      // is via <math>. If it happens via any other tag, then
+      // it should be killed.
+      if (parent.namespaceURI === HTML_NAMESPACE) {
+        return tagName === 'math';
+      } // The only way to switch from SVG to MathML is via
+      // <math> and HTML integration points
+
+
+      if (parent.namespaceURI === SVG_NAMESPACE) {
+        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
+      } // We only allow elements that are defined in MathML
+      // spec. All others are disallowed in MathML namespace.
+
+
+      return Boolean(ALL_MATHML_TAGS[tagName]);
+    }
+
+    if (element.namespaceURI === HTML_NAMESPACE) {
+      // The only way to switch from SVG to HTML is via
+      // HTML integration points, and from MathML to HTML
+      // is via MathML text integration points
+      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
+        return false;
+      }
+
+      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
+        return false;
+      } // We disallow tags that are specific for MathML
+      // or SVG and should never appear in HTML namespace
+
+
+      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
+    } // For XHTML and XML documents that support custom namespaces
+
+
+    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {
+      return true;
+    } // The code should never reach this place (this means
+    // that the element somehow got namespace that is not
+    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).
+    // Return false just in case.
+
+
+    return false;
+  };
+  /**
+   * _forceRemove
+   *
+   * @param  {Node} node a DOM node
+   */
+
+
+  const _forceRemove = function _forceRemove(node) {
+    arrayPush(DOMPurify.removed, {
+      element: node
+    });
+
+    try {
+      // eslint-disable-next-line unicorn/prefer-dom-node-remove
+      node.parentNode.removeChild(node);
+    } catch (_) {
+      node.remove();
+    }
+  };
+  /**
+   * _removeAttribute
+   *
+   * @param  {String} name an Attribute name
+   * @param  {Node} node a DOM node
+   */
+
+
+  const _removeAttribute = function _removeAttribute(name, node) {
+    try {
+      arrayPush(DOMPurify.removed, {
+        attribute: node.getAttributeNode(name),
+        from: node
+      });
+    } catch (_) {
+      arrayPush(DOMPurify.removed, {
+        attribute: null,
+        from: node
+      });
+    }
+
+    node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes
+
+    if (name === 'is' && !ALLOWED_ATTR[name]) {
+      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
+        try {
+          _forceRemove(node);
+        } catch (_) {}
+      } else {
+        try {
+          node.setAttribute(name, '');
+        } catch (_) {}
+      }
+    }
+  };
+  /**
+   * _initDocument
+   *
+   * @param  {String} dirty a string of dirty markup
+   * @return {Document} a DOM, filled with the dirty markup
+   */
+
+
+  const _initDocument = function _initDocument(dirty) {
+    /* Create a HTML document */
+    let doc;
+    let leadingWhitespace;
+
+    if (FORCE_BODY) {
+      dirty = '<remove></remove>' + dirty;
+    } else {
+      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
+      const matches = stringMatch(dirty, /^[\r\n\t ]+/);
+      leadingWhitespace = matches && matches[0];
+    }
+
+    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {
+      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)
+      dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
+    }
+
+    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
+    /*
+     * Use the DOMParser API by default, fallback later if needs be
+     * DOMParser not work for svg when has multiple root element.
+     */
+
+    if (NAMESPACE === HTML_NAMESPACE) {
+      try {
+        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
+      } catch (_) {}
+    }
+    /* Use createHTMLDocument in case DOMParser is not available */
+
+
+    if (!doc || !doc.documentElement) {
+      doc = implementation.createDocument(NAMESPACE, 'template', null);
+
+      try {
+        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
+      } catch (_) {// Syntax error if dirtyPayload is invalid xml
+      }
+    }
+
+    const body = doc.body || doc.documentElement;
+
+    if (dirty && leadingWhitespace) {
+      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
+    }
+    /* Work on whole document or just its body */
+
+
+    if (NAMESPACE === HTML_NAMESPACE) {
+      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
+    }
+
+    return WHOLE_DOCUMENT ? doc.documentElement : body;
+  };
+  /**
+   * _createIterator
+   *
+   * @param  {Document} root document/fragment to create iterator for
+   * @return {Iterator} iterator instance
+   */
+
+
+  const _createIterator = function _createIterator(root) {
+    return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise
+    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
+  };
+  /**
+   * _isClobbered
+   *
+   * @param  {Node} elm element to check for clobbering attacks
+   * @return {Boolean} true if clobbered, false if safe
+   */
+
+
+  const _isClobbered = function _isClobbered(elm) {
+    return 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');
+  };
+  /**
+   * _isNode
+   *
+   * @param  {Node} obj object to check whether it's a DOM node
+   * @return {Boolean} true is object is a DOM node
+   */
+
+
+  const _isNode = function _isNode(object) {
+    return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
+  };
+  /**
+   * _executeHook
+   * Execute user configurable hooks
+   *
+   * @param  {String} entryPoint  Name of the hook's entry point
+   * @param  {Node} currentNode node to work on with the hook
+   * @param  {Object} data additional hook parameters
+   */
+
+
+  const _executeHook = function _executeHook(entryPoint, currentNode, data) {
+    if (!hooks[entryPoint]) {
+      return;
+    }
+
+    arrayForEach(hooks[entryPoint], hook => {
+      hook.call(DOMPurify, currentNode, data, CONFIG);
+    });
+  };
+  /**
+   * _sanitizeElements
+   *
+   * @protect nodeName
+   * @protect textContent
+   * @protect removeChild
+   *
+   * @param   {Node} currentNode to check for permission to exist
+   * @return  {Boolean} true if node was killed, false if left alive
+   */
+
+
+  const _sanitizeElements = function _sanitizeElements(currentNode) {
+    let content;
+    /* Execute a hook if present */
+
+    _executeHook('beforeSanitizeElements', currentNode, null);
+    /* Check if element is clobbered or can clobber */
+
+
+    if (_isClobbered(currentNode)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Now let's check the element's type and name */
+
+
+    const tagName = transformCaseFunc(currentNode.nodeName);
+    /* Execute a hook if present */
+
+    _executeHook('uponSanitizeElement', currentNode, {
+      tagName,
+      allowedTags: ALLOWED_TAGS
+    });
+    /* Detect mXSS attempts abusing namespace confusion */
+
+
+    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Remove element if anything forbids its presence */
+
+
+    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+      /* Check if we have a custom element to handle */
+      if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
+        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
+        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
+      }
+      /* Keep content except for bad-listed elements */
+
+
+      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
+        const parentNode = getParentNode(currentNode) || currentNode.parentNode;
+        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;
+
+        if (childNodes && parentNode) {
+          const childCount = childNodes.length;
+
+          for (let i = childCount - 1; i >= 0; --i) {
+            parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
+          }
+        }
+      }
+
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Check whether element has a valid namespace */
+
+
+    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Make sure that older browsers don't get noscript mXSS */
+
+
+    if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
+      _forceRemove(currentNode);
+
+      return true;
+    }
+    /* Sanitize element content to be template-safe */
+
+
+    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
+      /* Get the element's text content */
+      content = currentNode.textContent;
+      content = stringReplace(content, MUSTACHE_EXPR, ' ');
+      content = stringReplace(content, ERB_EXPR, ' ');
+      content = stringReplace(content, TMPLIT_EXPR, ' ');
+
+      if (currentNode.textContent !== content) {
+        arrayPush(DOMPurify.removed, {
+          element: currentNode.cloneNode()
+        });
+        currentNode.textContent = content;
+      }
+    }
+    /* Execute a hook if present */
+
+
+    _executeHook('afterSanitizeElements', currentNode, null);
+
+    return false;
+  };
+  /**
+   * _isValidAttribute
+   *
+   * @param  {string} lcTag Lowercase tag name of containing element.
+   * @param  {string} lcName Lowercase attribute name.
+   * @param  {string} value Attribute value.
+   * @return {Boolean} Returns true if `value` is valid, otherwise false.
+   */
+  // eslint-disable-next-line complexity
+
+
+  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
+    /* Make sure attribute cannot clobber */
+    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
+      return false;
+    }
+    /* Allow valid data-* attributes: At least one character after "-"
+        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
+        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
+        We don't need to check the value; it's always URI safe. */
+
+
+    if (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]) {
+      if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND
+      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
+      _basicCustomElementTest(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)) || // Alternative, second condition checks if it's an `is`-attribute, AND
+      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+      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 {
+        return false;
+      }
+      /* Check value is safe. First, is attr inert? If so, is safe */
+
+    } 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) ; else {
+      return false;
+    }
+
+    return true;
+  };
+  /**
+   * _basicCustomElementCheck
+   * checks if at least one dash is included in tagName, and it's not the first char
+   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
+   * @param {string} tagName name of the tag of the node to sanitize
+   */
+
+
+  const _basicCustomElementTest = function _basicCustomElementTest(tagName) {
+    return tagName.indexOf('-') > 0;
+  };
+  /**
+   * _sanitizeAttributes
+   *
+   * @protect attributes
+   * @protect nodeName
+   * @protect removeAttribute
+   * @protect setAttribute
+   *
+   * @param  {Node} currentNode to sanitize
+   */
+
+
+  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
+    let attr;
+    let value;
+    let lcName;
+    let l;
+    /* Execute a hook if present */
+
+    _executeHook('beforeSanitizeAttributes', currentNode, null);
+
+    const {
+      attributes
+    } = currentNode;
+    /* Check if we have attributes; if not we might have a text node */
+
+    if (!attributes) {
+      return;
+    }
+
+    const hookEvent = {
+      attrName: '',
+      attrValue: '',
+      keepAttr: true,
+      allowedAttributes: ALLOWED_ATTR
+    };
+    l = attributes.length;
+    /* Go backwards over all attributes; safely remove bad ones */
+
+    while (l--) {
+      attr = attributes[l];
+      const {
+        name,
+        namespaceURI
+      } = attr;
+      value = name === 'value' ? attr.value : stringTrim(attr.value);
+      lcName = transformCaseFunc(name);
+      /* Execute a hook if present */
+
+      hookEvent.attrName = lcName;
+      hookEvent.attrValue = value;
+      hookEvent.keepAttr = true;
+      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
+
+      _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
+
+      value = hookEvent.attrValue;
+      /* Did the hooks approve of the attribute? */
+
+      if (hookEvent.forceKeepAttr) {
+        continue;
+      }
+      /* Remove attribute */
+
+
+      _removeAttribute(name, currentNode);
+      /* Did the hooks approve of the attribute? */
+
+
+      if (!hookEvent.keepAttr) {
+        continue;
+      }
+      /* Work around a security issue in jQuery 3.0 */
+
+
+      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) {
+        _removeAttribute(name, currentNode);
+
+        continue;
+      }
+      /* Sanitize attribute content to be template-safe */
+
+
+      if (SAFE_FOR_TEMPLATES) {
+        value = stringReplace(value, MUSTACHE_EXPR, ' ');
+        value = stringReplace(value, ERB_EXPR, ' ');
+        value = stringReplace(value, TMPLIT_EXPR, ' ');
+      }
+      /* Is `value` valid for this attribute? */
+
+
+      const lcTag = transformCaseFunc(currentNode.nodeName);
+
+      if (!_isValidAttribute(lcTag, lcName, value)) {
+        continue;
+      }
+      /* Full DOM Clobbering protection via namespace isolation,
+       * Prefix id and name attributes with `user-content-`
+       */
+
+
+      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
+        // Remove the attribute with this value
+        _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value
+
+
+        value = SANITIZE_NAMED_PROPS_PREFIX + value;
+      }
+      /* Handle attributes that require Trusted Types */
+
+
+      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {
+        if (namespaceURI) ; else {
+          switch (trustedTypes.getAttributeType(lcTag, lcName)) {
+            case 'TrustedHTML':
+              value = trustedTypesPolicy.createHTML(value);
+              break;
+
+            case 'TrustedScriptURL':
+              value = trustedTypesPolicy.createScriptURL(value);
+              break;
+          }
+        }
+      }
+      /* Handle invalid data-* attribute set by try-catching it */
+
+
+      try {
+        if (namespaceURI) {
+          currentNode.setAttributeNS(namespaceURI, name, value);
+        } else {
+          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
+          currentNode.setAttribute(name, value);
+        }
+
+        arrayPop(DOMPurify.removed);
+      } catch (_) {}
+    }
+    /* Execute a hook if present */
+
+
+    _executeHook('afterSanitizeAttributes', currentNode, null);
+  };
+  /**
+   * _sanitizeShadowDOM
+   *
+   * @param  {DocumentFragment} fragment to iterate over recursively
+   */
+
+
+  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
+    let shadowNode;
+
+    const shadowIterator = _createIterator(fragment);
+    /* Execute a hook if present */
+
+
+    _executeHook('beforeSanitizeShadowDOM', fragment, null);
+
+    while (shadowNode = shadowIterator.nextNode()) {
+      /* Execute a hook if present */
+      _executeHook('uponSanitizeShadowNode', shadowNode, null);
+      /* Sanitize tags and elements */
+
+
+      if (_sanitizeElements(shadowNode)) {
+        continue;
+      }
+      /* Deep shadow DOM detected */
+
+
+      if (shadowNode.content instanceof DocumentFragment) {
+        _sanitizeShadowDOM(shadowNode.content);
+      }
+      /* Check attributes, sanitize if necessary */
+
+
+      _sanitizeAttributes(shadowNode);
+    }
+    /* Execute a hook if present */
+
+
+    _executeHook('afterSanitizeShadowDOM', fragment, null);
+  };
+  /**
+   * Sanitize
+   * Public method providing core sanitation functionality
+   *
+   * @param {String|Node} dirty string or DOM node
+   * @param {Object} configuration object
+   */
+  // eslint-disable-next-line complexity
+
+
+  DOMPurify.sanitize = function (dirty) {
+    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+    let body;
+    let importedNode;
+    let currentNode;
+    let returnNode;
+    /* Make sure we have a string to sanitize.
+      DO NOT return early, as this will return the wrong type if
+      the user has requested a DOM object rather than a string */
+
+    IS_EMPTY_INPUT = !dirty;
+
+    if (IS_EMPTY_INPUT) {
+      dirty = '<!-->';
+    }
+    /* Stringify, in case dirty is an object */
+
+
+    if (typeof dirty !== 'string' && !_isNode(dirty)) {
+      // eslint-disable-next-line no-negated-condition
+      if (typeof dirty.toString !== 'function') {
+        throw typeErrorCreate('toString is not a function');
+      } else {
+        dirty = dirty.toString();
+
+        if (typeof dirty !== 'string') {
+          throw typeErrorCreate('dirty is not a string, aborting');
+        }
+      }
+    }
+    /* Return dirty HTML if DOMPurify cannot run */
+
+
+    if (!DOMPurify.isSupported) {
+      return dirty;
+    }
+    /* Assign config vars */
+
+
+    if (!SET_CONFIG) {
+      _parseConfig(cfg);
+    }
+    /* Clean up removed elements */
+
+
+    DOMPurify.removed = [];
+    /* Check if dirty is correctly typed for IN_PLACE */
+
+    if (typeof dirty === 'string') {
+      IN_PLACE = false;
+    }
+
+    if (IN_PLACE) {
+      /* Do some early pre-sanitization to avoid unsafe root nodes */
+      if (dirty.nodeName) {
+        const tagName = transformCaseFunc(dirty.nodeName);
+
+        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
+        }
+      }
+    } else if (dirty instanceof Node) {
+      /* If dirty is a DOM element, append to an empty document to avoid
+         elements being stripped by the parser */
+      body = _initDocument('<!---->');
+      importedNode = body.ownerDocument.importNode(dirty, true);
+
+      if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
+        /* Node is already a body, use as is */
+        body = importedNode;
+      } else if (importedNode.nodeName === 'HTML') {
+        body = importedNode;
+      } else {
+        // eslint-disable-next-line unicorn/prefer-dom-node-append
+        body.appendChild(importedNode);
+      }
+    } else {
+      /* Exit directly if we have nothing to do */
+      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
+      dirty.indexOf('<') === -1) {
+        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
+      }
+      /* Initialize the document to work on */
+
+
+      body = _initDocument(dirty);
+      /* Check we have a DOM node from the data */
+
+      if (!body) {
+        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
+      }
+    }
+    /* Remove first element node (ours) if FORCE_BODY is set */
+
+
+    if (body && FORCE_BODY) {
+      _forceRemove(body.firstChild);
+    }
+    /* Get node iterator */
+
+
+    const nodeIterator = _createIterator(IN_PLACE ? dirty : body);
+    /* Now start iterating over the created document */
+
+
+    while (currentNode = nodeIterator.nextNode()) {
+      /* Sanitize tags and elements */
+      if (_sanitizeElements(currentNode)) {
+        continue;
+      }
+      /* Shadow DOM detected, sanitize it */
+
+
+      if (currentNode.content instanceof DocumentFragment) {
+        _sanitizeShadowDOM(currentNode.content);
+      }
+      /* Check attributes, sanitize if necessary */
+
+
+      _sanitizeAttributes(currentNode);
+    }
+    /* If we sanitized `dirty` in-place, return it. */
+
+
+    if (IN_PLACE) {
+      return dirty;
+    }
+    /* Return sanitized string or DOM */
+
+
+    if (RETURN_DOM) {
+      if (RETURN_DOM_FRAGMENT) {
+        returnNode = createDocumentFragment.call(body.ownerDocument);
+
+        while (body.firstChild) {
+          // eslint-disable-next-line unicorn/prefer-dom-node-append
+          returnNode.appendChild(body.firstChild);
+        }
+      } else {
+        returnNode = body;
+      }
+
+      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {
+        /*
+          AdoptNode() is not used because internal state is not reset
+          (e.g. the past names map of a HTMLFormElement), this is safe
+          in theory but we would rather not risk another attack vector.
+          The state that is cloned by importNode() is explicitly defined
+          by the specs.
+        */
+        returnNode = importNode.call(originalDocument, returnNode, true);
+      }
+
+      return returnNode;
+    }
+
+    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
+    /* Serialize doctype if allowed */
+
+    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
+      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
+    }
+    /* Sanitize final string template-safe */
+
+
+    if (SAFE_FOR_TEMPLATES) {
+      serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');
+      serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');
+      serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');
+    }
+
+    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
+  };
+  /**
+   * Public method to set the configuration once
+   * setConfig
+   *
+   * @param {Object} cfg configuration object
+   */
+
+
+  DOMPurify.setConfig = function (cfg) {
+    _parseConfig(cfg);
+
+    SET_CONFIG = true;
+  };
+  /**
+   * Public method to remove the configuration
+   * clearConfig
+   *
+   */
+
+
+  DOMPurify.clearConfig = function () {
+    CONFIG = null;
+    SET_CONFIG = false;
+  };
+  /**
+   * Public method to check if an attribute value is valid.
+   * Uses last set config, if any. Otherwise, uses config defaults.
+   * isValidAttribute
+   *
+   * @param  {string} tag Tag name of containing element.
+   * @param  {string} attr Attribute name.
+   * @param  {string} value Attribute value.
+   * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
+   */
+
+
+  DOMPurify.isValidAttribute = function (tag, attr, value) {
+    /* Initialize shared config vars if necessary. */
+    if (!CONFIG) {
+      _parseConfig({});
+    }
+
+    const lcTag = transformCaseFunc(tag);
+    const lcName = transformCaseFunc(attr);
+    return _isValidAttribute(lcTag, lcName, value);
+  };
+  /**
+   * AddHook
+   * Public method to add DOMPurify hooks
+   *
+   * @param {String} entryPoint entry point for the hook to add
+   * @param {Function} hookFunction function to execute
+   */
+
+
+  DOMPurify.addHook = function (entryPoint, hookFunction) {
+    if (typeof hookFunction !== 'function') {
+      return;
+    }
+
+    hooks[entryPoint] = hooks[entryPoint] || [];
+    arrayPush(hooks[entryPoint], hookFunction);
+  };
+  /**
+   * RemoveHook
+   * Public method to remove a DOMPurify hook at a given entryPoint
+   * (pops it from the stack of hooks if more are present)
+   *
+   * @param {String} entryPoint entry point for the hook to remove
+   * @return {Function} removed(popped) hook
+   */
+
+
+  DOMPurify.removeHook = function (entryPoint) {
+    if (hooks[entryPoint]) {
+      return arrayPop(hooks[entryPoint]);
+    }
+  };
+  /**
+   * RemoveHooks
+   * Public method to remove all DOMPurify hooks at a given entryPoint
+   *
+   * @param  {String} entryPoint entry point for the hooks to remove
+   */
+
+
+  DOMPurify.removeHooks = function (entryPoint) {
+    if (hooks[entryPoint]) {
+      hooks[entryPoint] = [];
+    }
+  };
+  /**
+   * RemoveAllHooks
+   * Public method to remove all DOMPurify hooks
+   *
+   */
+
+
+  DOMPurify.removeAllHooks = function () {
+    hooks = {};
+  };
+
+  return DOMPurify;
+}
+
+var purify = createDOMPurify();
+
+export { purify as default };
+//# sourceMappingURL=purify.es.js.map
diff --git a/plugins/DOMPurify/purify.es.js.map b/plugins/DOMPurify/purify.es.js.map
new file mode 100644
index 000000000..65518dbb3
--- /dev/null
+++ b/plugins/DOMPurify/purify.es.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"purify.es.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","unconstruct","TypeError","func","thisArg","addToSet","set","array","transformCaseFunc","l","length","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","childCount","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":"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"}
\ No newline at end of file
diff --git a/plugins/DOMPurify/purify.js b/plugins/DOMPurify/purify.js
new file mode 100644
index 000000000..78211b80a
--- /dev/null
+++ b/plugins/DOMPurify/purify.js
@@ -0,0 +1,1603 @@
+/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define(factory) :
+  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());
+})(this, (function () { 'use strict';
+
+  const {
+    entries,
+    setPrototypeOf,
+    isFrozen,
+    getPrototypeOf,
+    getOwnPropertyDescriptor
+  } = Object;
+  let {
+    freeze,
+    seal,
+    create
+  } = Object; // eslint-disable-line import/no-mutable-exports
+
+  let {
+    apply,
+    construct
+  } = typeof Reflect !== 'undefined' && Reflect;
+
+  if (!apply) {
+    apply = function apply(fun, thisValue, args) {
+      return fun.apply(thisValue, args);
+    };
+  }
+
+  if (!freeze) {
+    freeze = function freeze(x) {
+      return x;
+    };
+  }
+
+  if (!seal) {
+    seal = function seal(x) {
+      return x;
+    };
+  }
+
+  if (!construct) {
+    construct = function construct(Func, args) {
+      return new Func(...args);
+    };
+  }
+
+  const arrayForEach = unapply(Array.prototype.forEach);
+  const arrayPop = unapply(Array.prototype.pop);
+  const arrayPush = unapply(Array.prototype.push);
+  const stringToLowerCase = unapply(String.prototype.toLowerCase);
+  const stringToString = unapply(String.prototype.toString);
+  const stringMatch = unapply(String.prototype.match);
+  const stringReplace = unapply(String.prototype.replace);
+  const stringIndexOf = unapply(String.prototype.indexOf);
+  const stringTrim = unapply(String.prototype.trim);
+  const regExpTest = unapply(RegExp.prototype.test);
+  const typeErrorCreate = unconstruct(TypeError);
+  function unapply(func) {
+    return function (thisArg) {
+      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+        args[_key - 1] = arguments[_key];
+      }
+
+      return apply(func, thisArg, args);
+    };
+  }
+  function unconstruct(func) {
+    return function () {
+      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+        args[_key2] = arguments[_key2];
+      }
+
+      return construct(func, args);
+    };
+  }
+  /* Add properties to a lookup table */
+
+  function addToSet(set, array, transformCaseFunc) {
+    transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;
+
+    if (setPrototypeOf) {
+      // Make 'in' and truthy checks like Boolean(set.constructor)
+      // independent of any properties defined on Object.prototype.
+      // Prevent prototype setters from intercepting set as a this value.
+      setPrototypeOf(set, null);
+    }
+
+    let l = array.length;
+
+    while (l--) {
+      let element = array[l];
+
+      if (typeof element === 'string') {
+        const lcElement = transformCaseFunc(element);
+
+        if (lcElement !== element) {
+          // Config presets (e.g. tags.js, attrs.js) are immutable.
+          if (!isFrozen(array)) {
+            array[l] = lcElement;
+          }
+
+          element = lcElement;
+        }
+      }
+
+      set[element] = true;
+    }
+
+    return set;
+  }
+  /* Shallow clone an object */
+
+  function clone(object) {
+    const newObject = create(null);
+
+    for (const [property, value] of entries(object)) {
+      newObject[property] = value;
+    }
+
+    return newObject;
+  }
+  /* This method automatically checks if the prop is function
+   * or getter and behaves accordingly. */
+
+  function lookupGetter(object, prop) {
+    while (object !== null) {
+      const desc = getOwnPropertyDescriptor(object, prop);
+
+      if (desc) {
+        if (desc.get) {
+          return unapply(desc.get);
+        }
+
+        if (typeof desc.value === 'function') {
+          return unapply(desc.value);
+        }
+      }
+
+      object = getPrototypeOf(object);
+    }
+
+    function fallbackValue(element) {
+      console.warn('fallback value for', element);
+      return null;
+    }
+
+    return fallbackValue;
+  }
+
+  const 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']); // SVG
+
+  const 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']);
+  const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.
+  // We still need to know them so that we can do namespace
+  // checks properly in case one wants to add them to
+  // allow-list.
+
+  const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', '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']);
+  const 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']); // Similarly to SVG, we want to know all MathML elements,
+  // even those that we disallow by default.
+
+  const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
+  const text = freeze(['#text']);
+
+  const 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']);
+  const 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']);
+  const 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']);
+  const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
+
+  const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
+
+  const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
+  const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
+  const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
+
+  const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
+
+  const 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
+  );
+  const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
+  const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex
+  );
+  const DOCTYPE_NAME = seal(/^html$/i);
+
+  var EXPRESSIONS = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    MUSTACHE_EXPR: MUSTACHE_EXPR,
+    ERB_EXPR: ERB_EXPR,
+    TMPLIT_EXPR: TMPLIT_EXPR,
+    DATA_ATTR: DATA_ATTR,
+    ARIA_ATTR: ARIA_ATTR,
+    IS_ALLOWED_URI: IS_ALLOWED_URI,
+    IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
+    ATTR_WHITESPACE: ATTR_WHITESPACE,
+    DOCTYPE_NAME: DOCTYPE_NAME
+  });
+
+  const getGlobal = () => typeof window === 'undefined' ? null : window;
+  /**
+   * Creates a no-op policy for internal use only.
+   * Don't export this function outside this module!
+   * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
+   * @param {Document} document The document object (to determine policy name suffix)
+   * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
+   * are not supported).
+   */
+
+
+  const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
+    if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
+      return null;
+    } // Allow the callers to control the unique policy name
+    // by adding a data-tt-policy-suffix to the script element with the DOMPurify.
+    // Policy creation with duplicate names throws in Trusted Types.
+
+
+    let suffix = null;
+    const ATTR_NAME = 'data-tt-policy-suffix';
+
+    if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
+      suffix = document.currentScript.getAttribute(ATTR_NAME);
+    }
+
+    const policyName = 'dompurify' + (suffix ? '#' + suffix : '');
+
+    try {
+      return trustedTypes.createPolicy(policyName, {
+        createHTML(html) {
+          return html;
+        },
+
+        createScriptURL(scriptUrl) {
+          return scriptUrl;
+        }
+
+      });
+    } catch (_) {
+      // Policy creation failed (most likely another DOMPurify script has
+      // already run). Skip creating the policy, as this will only cause errors
+      // if TT are enforced.
+      console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
+      return null;
+    }
+  };
+
+  function createDOMPurify() {
+    let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
+
+    const DOMPurify = root => createDOMPurify(root);
+    /**
+     * Version label, exposed for easier checks
+     * if DOMPurify is up to date or not
+     */
+
+
+    DOMPurify.version = '3.0.2';
+    /**
+     * Array of elements that DOMPurify removed during sanitation.
+     * Empty if nothing was removed.
+     */
+
+    DOMPurify.removed = [];
+
+    if (!window || !window.document || window.document.nodeType !== 9) {
+      // Not running in a browser, provide a factory function
+      // so that you can pass your own Window
+      DOMPurify.isSupported = false;
+      return DOMPurify;
+    }
+
+    const originalDocument = window.document;
+    let {
+      document
+    } = window;
+    const {
+      DocumentFragment,
+      HTMLTemplateElement,
+      Node,
+      Element,
+      NodeFilter,
+      NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,
+      HTMLFormElement,
+      DOMParser,
+      trustedTypes
+    } = window;
+    const ElementPrototype = Element.prototype;
+    const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
+    const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
+    const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
+    const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a
+    // new document created via createHTMLDocument. As per the spec
+    // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
+    // a new empty registry is used when creating a template contents owner
+    // document, so we use that as our parent document to ensure nothing
+    // is inherited.
+
+    if (typeof HTMLTemplateElement === 'function') {
+      const template = document.createElement('template');
+
+      if (template.content && template.content.ownerDocument) {
+        document = template.content.ownerDocument;
+      }
+    }
+
+    const trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);
+
+    const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
+    const {
+      implementation,
+      createNodeIterator,
+      createDocumentFragment,
+      getElementsByTagName
+    } = document;
+    const {
+      importNode
+    } = originalDocument;
+    let hooks = {};
+    /**
+     * Expose whether this browser supports running the full DOMPurify.
+     */
+
+    DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined';
+    const {
+      MUSTACHE_EXPR,
+      ERB_EXPR,
+      TMPLIT_EXPR,
+      DATA_ATTR,
+      ARIA_ATTR,
+      IS_SCRIPT_OR_DATA,
+      ATTR_WHITESPACE
+    } = EXPRESSIONS;
+    let {
+      IS_ALLOWED_URI: IS_ALLOWED_URI$1
+    } = EXPRESSIONS;
+    /**
+     * We consider the elements and attributes below to be safe. Ideally
+     * don't add any new ones but feel free to remove unwanted ones.
+     */
+
+    /* allowed element names */
+
+    let ALLOWED_TAGS = null;
+    const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
+    /* Allowed attribute names */
+
+    let ALLOWED_ATTR = null;
+    const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
+    /*
+     * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.
+     * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)
+     * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)
+     * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.
+     */
+
+    let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
+      tagNameCheck: {
+        writable: true,
+        configurable: false,
+        enumerable: true,
+        value: null
+      },
+      attributeNameCheck: {
+        writable: true,
+        configurable: false,
+        enumerable: true,
+        value: null
+      },
+      allowCustomizedBuiltInElements: {
+        writable: true,
+        configurable: false,
+        enumerable: true,
+        value: false
+      }
+    }));
+    /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */
+
+    let FORBID_TAGS = null;
+    /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */
+
+    let FORBID_ATTR = null;
+    /* Decide if ARIA attributes are okay */
+
+    let ALLOW_ARIA_ATTR = true;
+    /* Decide if custom data attributes are okay */
+
+    let ALLOW_DATA_ATTR = true;
+    /* Decide if unknown protocols are okay */
+
+    let ALLOW_UNKNOWN_PROTOCOLS = false;
+    /* Decide if self-closing tags in attributes are allowed.
+     * Usually removed due to a mXSS issue in jQuery 3.0 */
+
+    let ALLOW_SELF_CLOSE_IN_ATTR = true;
+    /* Output should be safe for common template engines.
+     * This means, DOMPurify removes data attributes, mustaches and ERB
+     */
+
+    let SAFE_FOR_TEMPLATES = false;
+    /* Decide if document with <html>... should be returned */
+
+    let WHOLE_DOCUMENT = false;
+    /* Track whether config is already set on this instance of DOMPurify. */
+
+    let SET_CONFIG = false;
+    /* Decide if all elements (e.g. style, script) must be children of
+     * document.body. By default, browsers might move them to document.head */
+
+    let FORCE_BODY = false;
+    /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
+     * string (or a TrustedHTML object if Trusted Types are supported).
+     * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
+     */
+
+    let RETURN_DOM = false;
+    /* Decide if a DOM `DocumentFragment` should be returned, instead of a html
+     * string  (or a TrustedHTML object if Trusted Types are supported) */
+
+    let RETURN_DOM_FRAGMENT = false;
+    /* Try to return a Trusted Type object instead of a string, return a string in
+     * case Trusted Types are not supported  */
+
+    let RETURN_TRUSTED_TYPE = false;
+    /* Output should be free from DOM clobbering attacks?
+     * This sanitizes markups named with colliding, clobberable built-in DOM APIs.
+     */
+
+    let SANITIZE_DOM = true;
+    /* Achieve full DOM Clobbering protection by isolating the namespace of named
+     * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.
+     *
+     * HTML/DOM spec rules that enable DOM Clobbering:
+     *   - Named Access on Window (§7.3.3)
+     *   - DOM Tree Accessors (§3.1.5)
+     *   - Form Element Parent-Child Relations (§4.10.3)
+     *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)
+     *   - HTMLCollection (§4.2.10.2)
+     *
+     * Namespace isolation is implemented by prefixing `id` and `name` attributes
+     * with a constant string, i.e., `user-content-`
+     */
+
+    let SANITIZE_NAMED_PROPS = false;
+    const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';
+    /* Keep element content when removing element? */
+
+    let KEEP_CONTENT = true;
+    /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
+     * of importing it into a new Document and returning a sanitized copy */
+
+    let IN_PLACE = false;
+    /* Allow usage of profiles like html, svg and mathMl */
+
+    let USE_PROFILES = {};
+    /* Tags to ignore content of when KEEP_CONTENT is true */
+
+    let FORBID_CONTENTS = null;
+    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']);
+    /* Tags that are safe for data: URIs */
+
+    let DATA_URI_TAGS = null;
+    const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);
+    /* Attributes safe for values like "javascript:" */
+
+    let URI_SAFE_ATTRIBUTES = null;
+    const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);
+    const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+    const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+    const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+    /* Document namespace */
+
+    let NAMESPACE = HTML_NAMESPACE;
+    let IS_EMPTY_INPUT = false;
+    /* Allowed XHTML+XML namespaces */
+
+    let ALLOWED_NAMESPACES = null;
+    const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
+    /* Parsing of strict XHTML documents */
+
+    let PARSER_MEDIA_TYPE;
+    const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];
+    const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
+    let transformCaseFunc;
+    /* Keep a reference to config to pass to hooks */
+
+    let CONFIG = null;
+    /* Ideally, do not touch anything below this line */
+
+    /* ______________________________________________ */
+
+    const formElement = document.createElement('form');
+
+    const isRegexOrFunction = function isRegexOrFunction(testValue) {
+      return testValue instanceof RegExp || testValue instanceof Function;
+    };
+    /**
+     * _parseConfig
+     *
+     * @param  {Object} cfg optional config literal
+     */
+    // eslint-disable-next-line complexity
+
+
+    const _parseConfig = function _parseConfig(cfg) {
+      if (CONFIG && CONFIG === cfg) {
+        return;
+      }
+      /* Shield configuration object from tampering */
+
+
+      if (!cfg || typeof cfg !== 'object') {
+        cfg = {};
+      }
+      /* Shield configuration object from prototype pollution */
+
+
+      cfg = clone(cfg);
+      PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
+      SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.
+
+      transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
+      /* Set configuration parameters */
+
+      ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
+      ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
+      ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
+      URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent
+      cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent
+      transformCaseFunc // eslint-disable-line indent
+      ) // eslint-disable-line indent
+      : DEFAULT_URI_SAFE_ATTRIBUTES;
+      DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent
+      cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent
+      transformCaseFunc // eslint-disable-line indent
+      ) // eslint-disable-line indent
+      : DEFAULT_DATA_URI_TAGS;
+      FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
+      FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};
+      FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};
+      USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
+      ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true
+
+      ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
+
+      ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
+
+      ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true
+
+      SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false
+
+      WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false
+
+      RETURN_DOM = cfg.RETURN_DOM || false; // Default false
+
+      RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false
+
+      RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false
+
+      FORCE_BODY = cfg.FORCE_BODY || false; // Default false
+
+      SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true
+
+      SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false
+
+      KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
+
+      IN_PLACE = cfg.IN_PLACE || false; // Default false
+
+      IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
+      NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
+      CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};
+
+      if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
+        CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
+      }
+
+      if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
+        CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
+      }
+
+      if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
+        CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
+      }
+
+      if (SAFE_FOR_TEMPLATES) {
+        ALLOW_DATA_ATTR = false;
+      }
+
+      if (RETURN_DOM_FRAGMENT) {
+        RETURN_DOM = true;
+      }
+      /* Parse profile info */
+
+
+      if (USE_PROFILES) {
+        ALLOWED_TAGS = addToSet({}, [...text]);
+        ALLOWED_ATTR = [];
+
+        if (USE_PROFILES.html === true) {
+          addToSet(ALLOWED_TAGS, html$1);
+          addToSet(ALLOWED_ATTR, html);
+        }
+
+        if (USE_PROFILES.svg === true) {
+          addToSet(ALLOWED_TAGS, svg$1);
+          addToSet(ALLOWED_ATTR, svg);
+          addToSet(ALLOWED_ATTR, xml);
+        }
+
+        if (USE_PROFILES.svgFilters === true) {
+          addToSet(ALLOWED_TAGS, svgFilters);
+          addToSet(ALLOWED_ATTR, svg);
+          addToSet(ALLOWED_ATTR, xml);
+        }
+
+        if (USE_PROFILES.mathMl === true) {
+          addToSet(ALLOWED_TAGS, mathMl$1);
+          addToSet(ALLOWED_ATTR, mathMl);
+          addToSet(ALLOWED_ATTR, xml);
+        }
+      }
+      /* Merge configuration parameters */
+
+
+      if (cfg.ADD_TAGS) {
+        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
+          ALLOWED_TAGS = clone(ALLOWED_TAGS);
+        }
+
+        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
+      }
+
+      if (cfg.ADD_ATTR) {
+        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
+          ALLOWED_ATTR = clone(ALLOWED_ATTR);
+        }
+
+        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
+      }
+
+      if (cfg.ADD_URI_SAFE_ATTR) {
+        addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
+      }
+
+      if (cfg.FORBID_CONTENTS) {
+        if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
+          FORBID_CONTENTS = clone(FORBID_CONTENTS);
+        }
+
+        addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
+      }
+      /* Add #text in case KEEP_CONTENT is set to true */
+
+
+      if (KEEP_CONTENT) {
+        ALLOWED_TAGS['#text'] = true;
+      }
+      /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */
+
+
+      if (WHOLE_DOCUMENT) {
+        addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
+      }
+      /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */
+
+
+      if (ALLOWED_TAGS.table) {
+        addToSet(ALLOWED_TAGS, ['tbody']);
+        delete FORBID_TAGS.tbody;
+      } // Prevent further manipulation of configuration.
+      // Not available in IE8, Safari 5, etc.
+
+
+      if (freeze) {
+        freeze(cfg);
+      }
+
+      CONFIG = cfg;
+    };
+
+    const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);
+    const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML
+    // namespace. We need to specify them explicitly
+    // so that they don't get erroneously deleted from
+    // HTML namespace.
+
+    const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);
+    /* Keep track of all possible SVG and MathML tags
+     * so that we can perform the namespace checks
+     * correctly. */
+
+    const ALL_SVG_TAGS = addToSet({}, svg$1);
+    addToSet(ALL_SVG_TAGS, svgFilters);
+    addToSet(ALL_SVG_TAGS, svgDisallowed);
+    const ALL_MATHML_TAGS = addToSet({}, mathMl$1);
+    addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
+    /**
+     *
+     *
+     * @param  {Element} element a DOM element whose namespace is being checked
+     * @returns {boolean} Return false if the element has a
+     *  namespace that a spec-compliant parser would never
+     *  return. Return true otherwise.
+     */
+
+    const _checkValidNamespace = function _checkValidNamespace(element) {
+      let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode
+      // can be null. We just simulate parent in this case.
+
+      if (!parent || !parent.tagName) {
+        parent = {
+          namespaceURI: NAMESPACE,
+          tagName: 'template'
+        };
+      }
+
+      const tagName = stringToLowerCase(element.tagName);
+      const parentTagName = stringToLowerCase(parent.tagName);
+
+      if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
+        return false;
+      }
+
+      if (element.namespaceURI === SVG_NAMESPACE) {
+        // The only way to switch from HTML namespace to SVG
+        // is via <svg>. If it happens via any other tag, then
+        // it should be killed.
+        if (parent.namespaceURI === HTML_NAMESPACE) {
+          return tagName === 'svg';
+        } // The only way to switch from MathML to SVG is via`
+        // svg if parent is either <annotation-xml> or MathML
+        // text integration points.
+
+
+        if (parent.namespaceURI === MATHML_NAMESPACE) {
+          return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
+        } // We only allow elements that are defined in SVG
+        // spec. All others are disallowed in SVG namespace.
+
+
+        return Boolean(ALL_SVG_TAGS[tagName]);
+      }
+
+      if (element.namespaceURI === MATHML_NAMESPACE) {
+        // The only way to switch from HTML namespace to MathML
+        // is via <math>. If it happens via any other tag, then
+        // it should be killed.
+        if (parent.namespaceURI === HTML_NAMESPACE) {
+          return tagName === 'math';
+        } // The only way to switch from SVG to MathML is via
+        // <math> and HTML integration points
+
+
+        if (parent.namespaceURI === SVG_NAMESPACE) {
+          return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
+        } // We only allow elements that are defined in MathML
+        // spec. All others are disallowed in MathML namespace.
+
+
+        return Boolean(ALL_MATHML_TAGS[tagName]);
+      }
+
+      if (element.namespaceURI === HTML_NAMESPACE) {
+        // The only way to switch from SVG to HTML is via
+        // HTML integration points, and from MathML to HTML
+        // is via MathML text integration points
+        if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
+          return false;
+        }
+
+        if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
+          return false;
+        } // We disallow tags that are specific for MathML
+        // or SVG and should never appear in HTML namespace
+
+
+        return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
+      } // For XHTML and XML documents that support custom namespaces
+
+
+      if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {
+        return true;
+      } // The code should never reach this place (this means
+      // that the element somehow got namespace that is not
+      // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).
+      // Return false just in case.
+
+
+      return false;
+    };
+    /**
+     * _forceRemove
+     *
+     * @param  {Node} node a DOM node
+     */
+
+
+    const _forceRemove = function _forceRemove(node) {
+      arrayPush(DOMPurify.removed, {
+        element: node
+      });
+
+      try {
+        // eslint-disable-next-line unicorn/prefer-dom-node-remove
+        node.parentNode.removeChild(node);
+      } catch (_) {
+        node.remove();
+      }
+    };
+    /**
+     * _removeAttribute
+     *
+     * @param  {String} name an Attribute name
+     * @param  {Node} node a DOM node
+     */
+
+
+    const _removeAttribute = function _removeAttribute(name, node) {
+      try {
+        arrayPush(DOMPurify.removed, {
+          attribute: node.getAttributeNode(name),
+          from: node
+        });
+      } catch (_) {
+        arrayPush(DOMPurify.removed, {
+          attribute: null,
+          from: node
+        });
+      }
+
+      node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes
+
+      if (name === 'is' && !ALLOWED_ATTR[name]) {
+        if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
+          try {
+            _forceRemove(node);
+          } catch (_) {}
+        } else {
+          try {
+            node.setAttribute(name, '');
+          } catch (_) {}
+        }
+      }
+    };
+    /**
+     * _initDocument
+     *
+     * @param  {String} dirty a string of dirty markup
+     * @return {Document} a DOM, filled with the dirty markup
+     */
+
+
+    const _initDocument = function _initDocument(dirty) {
+      /* Create a HTML document */
+      let doc;
+      let leadingWhitespace;
+
+      if (FORCE_BODY) {
+        dirty = '<remove></remove>' + dirty;
+      } else {
+        /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
+        const matches = stringMatch(dirty, /^[\r\n\t ]+/);
+        leadingWhitespace = matches && matches[0];
+      }
+
+      if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {
+        // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)
+        dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
+      }
+
+      const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
+      /*
+       * Use the DOMParser API by default, fallback later if needs be
+       * DOMParser not work for svg when has multiple root element.
+       */
+
+      if (NAMESPACE === HTML_NAMESPACE) {
+        try {
+          doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
+        } catch (_) {}
+      }
+      /* Use createHTMLDocument in case DOMParser is not available */
+
+
+      if (!doc || !doc.documentElement) {
+        doc = implementation.createDocument(NAMESPACE, 'template', null);
+
+        try {
+          doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
+        } catch (_) {// Syntax error if dirtyPayload is invalid xml
+        }
+      }
+
+      const body = doc.body || doc.documentElement;
+
+      if (dirty && leadingWhitespace) {
+        body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
+      }
+      /* Work on whole document or just its body */
+
+
+      if (NAMESPACE === HTML_NAMESPACE) {
+        return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
+      }
+
+      return WHOLE_DOCUMENT ? doc.documentElement : body;
+    };
+    /**
+     * _createIterator
+     *
+     * @param  {Document} root document/fragment to create iterator for
+     * @return {Iterator} iterator instance
+     */
+
+
+    const _createIterator = function _createIterator(root) {
+      return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise
+      NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
+    };
+    /**
+     * _isClobbered
+     *
+     * @param  {Node} elm element to check for clobbering attacks
+     * @return {Boolean} true if clobbered, false if safe
+     */
+
+
+    const _isClobbered = function _isClobbered(elm) {
+      return 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');
+    };
+    /**
+     * _isNode
+     *
+     * @param  {Node} obj object to check whether it's a DOM node
+     * @return {Boolean} true is object is a DOM node
+     */
+
+
+    const _isNode = function _isNode(object) {
+      return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
+    };
+    /**
+     * _executeHook
+     * Execute user configurable hooks
+     *
+     * @param  {String} entryPoint  Name of the hook's entry point
+     * @param  {Node} currentNode node to work on with the hook
+     * @param  {Object} data additional hook parameters
+     */
+
+
+    const _executeHook = function _executeHook(entryPoint, currentNode, data) {
+      if (!hooks[entryPoint]) {
+        return;
+      }
+
+      arrayForEach(hooks[entryPoint], hook => {
+        hook.call(DOMPurify, currentNode, data, CONFIG);
+      });
+    };
+    /**
+     * _sanitizeElements
+     *
+     * @protect nodeName
+     * @protect textContent
+     * @protect removeChild
+     *
+     * @param   {Node} currentNode to check for permission to exist
+     * @return  {Boolean} true if node was killed, false if left alive
+     */
+
+
+    const _sanitizeElements = function _sanitizeElements(currentNode) {
+      let content;
+      /* Execute a hook if present */
+
+      _executeHook('beforeSanitizeElements', currentNode, null);
+      /* Check if element is clobbered or can clobber */
+
+
+      if (_isClobbered(currentNode)) {
+        _forceRemove(currentNode);
+
+        return true;
+      }
+      /* Now let's check the element's type and name */
+
+
+      const tagName = transformCaseFunc(currentNode.nodeName);
+      /* Execute a hook if present */
+
+      _executeHook('uponSanitizeElement', currentNode, {
+        tagName,
+        allowedTags: ALLOWED_TAGS
+      });
+      /* Detect mXSS attempts abusing namespace confusion */
+
+
+      if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
+        _forceRemove(currentNode);
+
+        return true;
+      }
+      /* Remove element if anything forbids its presence */
+
+
+      if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+        /* Check if we have a custom element to handle */
+        if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
+          if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
+          if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
+        }
+        /* Keep content except for bad-listed elements */
+
+
+        if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
+          const parentNode = getParentNode(currentNode) || currentNode.parentNode;
+          const childNodes = getChildNodes(currentNode) || currentNode.childNodes;
+
+          if (childNodes && parentNode) {
+            const childCount = childNodes.length;
+
+            for (let i = childCount - 1; i >= 0; --i) {
+              parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
+            }
+          }
+        }
+
+        _forceRemove(currentNode);
+
+        return true;
+      }
+      /* Check whether element has a valid namespace */
+
+
+      if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
+        _forceRemove(currentNode);
+
+        return true;
+      }
+      /* Make sure that older browsers don't get noscript mXSS */
+
+
+      if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
+        _forceRemove(currentNode);
+
+        return true;
+      }
+      /* Sanitize element content to be template-safe */
+
+
+      if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
+        /* Get the element's text content */
+        content = currentNode.textContent;
+        content = stringReplace(content, MUSTACHE_EXPR, ' ');
+        content = stringReplace(content, ERB_EXPR, ' ');
+        content = stringReplace(content, TMPLIT_EXPR, ' ');
+
+        if (currentNode.textContent !== content) {
+          arrayPush(DOMPurify.removed, {
+            element: currentNode.cloneNode()
+          });
+          currentNode.textContent = content;
+        }
+      }
+      /* Execute a hook if present */
+
+
+      _executeHook('afterSanitizeElements', currentNode, null);
+
+      return false;
+    };
+    /**
+     * _isValidAttribute
+     *
+     * @param  {string} lcTag Lowercase tag name of containing element.
+     * @param  {string} lcName Lowercase attribute name.
+     * @param  {string} value Attribute value.
+     * @return {Boolean} Returns true if `value` is valid, otherwise false.
+     */
+    // eslint-disable-next-line complexity
+
+
+    const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
+      /* Make sure attribute cannot clobber */
+      if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
+        return false;
+      }
+      /* Allow valid data-* attributes: At least one character after "-"
+          (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
+          XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
+          We don't need to check the value; it's always URI safe. */
+
+
+      if (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]) {
+        if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND
+        // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+        // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
+        _basicCustomElementTest(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)) || // Alternative, second condition checks if it's an `is`-attribute, AND
+        // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
+        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 {
+          return false;
+        }
+        /* Check value is safe. First, is attr inert? If so, is safe */
+
+      } 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) ; else {
+        return false;
+      }
+
+      return true;
+    };
+    /**
+     * _basicCustomElementCheck
+     * checks if at least one dash is included in tagName, and it's not the first char
+     * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
+     * @param {string} tagName name of the tag of the node to sanitize
+     */
+
+
+    const _basicCustomElementTest = function _basicCustomElementTest(tagName) {
+      return tagName.indexOf('-') > 0;
+    };
+    /**
+     * _sanitizeAttributes
+     *
+     * @protect attributes
+     * @protect nodeName
+     * @protect removeAttribute
+     * @protect setAttribute
+     *
+     * @param  {Node} currentNode to sanitize
+     */
+
+
+    const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
+      let attr;
+      let value;
+      let lcName;
+      let l;
+      /* Execute a hook if present */
+
+      _executeHook('beforeSanitizeAttributes', currentNode, null);
+
+      const {
+        attributes
+      } = currentNode;
+      /* Check if we have attributes; if not we might have a text node */
+
+      if (!attributes) {
+        return;
+      }
+
+      const hookEvent = {
+        attrName: '',
+        attrValue: '',
+        keepAttr: true,
+        allowedAttributes: ALLOWED_ATTR
+      };
+      l = attributes.length;
+      /* Go backwards over all attributes; safely remove bad ones */
+
+      while (l--) {
+        attr = attributes[l];
+        const {
+          name,
+          namespaceURI
+        } = attr;
+        value = name === 'value' ? attr.value : stringTrim(attr.value);
+        lcName = transformCaseFunc(name);
+        /* Execute a hook if present */
+
+        hookEvent.attrName = lcName;
+        hookEvent.attrValue = value;
+        hookEvent.keepAttr = true;
+        hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
+
+        _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
+
+        value = hookEvent.attrValue;
+        /* Did the hooks approve of the attribute? */
+
+        if (hookEvent.forceKeepAttr) {
+          continue;
+        }
+        /* Remove attribute */
+
+
+        _removeAttribute(name, currentNode);
+        /* Did the hooks approve of the attribute? */
+
+
+        if (!hookEvent.keepAttr) {
+          continue;
+        }
+        /* Work around a security issue in jQuery 3.0 */
+
+
+        if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) {
+          _removeAttribute(name, currentNode);
+
+          continue;
+        }
+        /* Sanitize attribute content to be template-safe */
+
+
+        if (SAFE_FOR_TEMPLATES) {
+          value = stringReplace(value, MUSTACHE_EXPR, ' ');
+          value = stringReplace(value, ERB_EXPR, ' ');
+          value = stringReplace(value, TMPLIT_EXPR, ' ');
+        }
+        /* Is `value` valid for this attribute? */
+
+
+        const lcTag = transformCaseFunc(currentNode.nodeName);
+
+        if (!_isValidAttribute(lcTag, lcName, value)) {
+          continue;
+        }
+        /* Full DOM Clobbering protection via namespace isolation,
+         * Prefix id and name attributes with `user-content-`
+         */
+
+
+        if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
+          // Remove the attribute with this value
+          _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value
+
+
+          value = SANITIZE_NAMED_PROPS_PREFIX + value;
+        }
+        /* Handle attributes that require Trusted Types */
+
+
+        if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {
+          if (namespaceURI) ; else {
+            switch (trustedTypes.getAttributeType(lcTag, lcName)) {
+              case 'TrustedHTML':
+                value = trustedTypesPolicy.createHTML(value);
+                break;
+
+              case 'TrustedScriptURL':
+                value = trustedTypesPolicy.createScriptURL(value);
+                break;
+            }
+          }
+        }
+        /* Handle invalid data-* attribute set by try-catching it */
+
+
+        try {
+          if (namespaceURI) {
+            currentNode.setAttributeNS(namespaceURI, name, value);
+          } else {
+            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
+            currentNode.setAttribute(name, value);
+          }
+
+          arrayPop(DOMPurify.removed);
+        } catch (_) {}
+      }
+      /* Execute a hook if present */
+
+
+      _executeHook('afterSanitizeAttributes', currentNode, null);
+    };
+    /**
+     * _sanitizeShadowDOM
+     *
+     * @param  {DocumentFragment} fragment to iterate over recursively
+     */
+
+
+    const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
+      let shadowNode;
+
+      const shadowIterator = _createIterator(fragment);
+      /* Execute a hook if present */
+
+
+      _executeHook('beforeSanitizeShadowDOM', fragment, null);
+
+      while (shadowNode = shadowIterator.nextNode()) {
+        /* Execute a hook if present */
+        _executeHook('uponSanitizeShadowNode', shadowNode, null);
+        /* Sanitize tags and elements */
+
+
+        if (_sanitizeElements(shadowNode)) {
+          continue;
+        }
+        /* Deep shadow DOM detected */
+
+
+        if (shadowNode.content instanceof DocumentFragment) {
+          _sanitizeShadowDOM(shadowNode.content);
+        }
+        /* Check attributes, sanitize if necessary */
+
+
+        _sanitizeAttributes(shadowNode);
+      }
+      /* Execute a hook if present */
+
+
+      _executeHook('afterSanitizeShadowDOM', fragment, null);
+    };
+    /**
+     * Sanitize
+     * Public method providing core sanitation functionality
+     *
+     * @param {String|Node} dirty string or DOM node
+     * @param {Object} configuration object
+     */
+    // eslint-disable-next-line complexity
+
+
+    DOMPurify.sanitize = function (dirty) {
+      let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+      let body;
+      let importedNode;
+      let currentNode;
+      let returnNode;
+      /* Make sure we have a string to sanitize.
+        DO NOT return early, as this will return the wrong type if
+        the user has requested a DOM object rather than a string */
+
+      IS_EMPTY_INPUT = !dirty;
+
+      if (IS_EMPTY_INPUT) {
+        dirty = '<!-->';
+      }
+      /* Stringify, in case dirty is an object */
+
+
+      if (typeof dirty !== 'string' && !_isNode(dirty)) {
+        // eslint-disable-next-line no-negated-condition
+        if (typeof dirty.toString !== 'function') {
+          throw typeErrorCreate('toString is not a function');
+        } else {
+          dirty = dirty.toString();
+
+          if (typeof dirty !== 'string') {
+            throw typeErrorCreate('dirty is not a string, aborting');
+          }
+        }
+      }
+      /* Return dirty HTML if DOMPurify cannot run */
+
+
+      if (!DOMPurify.isSupported) {
+        return dirty;
+      }
+      /* Assign config vars */
+
+
+      if (!SET_CONFIG) {
+        _parseConfig(cfg);
+      }
+      /* Clean up removed elements */
+
+
+      DOMPurify.removed = [];
+      /* Check if dirty is correctly typed for IN_PLACE */
+
+      if (typeof dirty === 'string') {
+        IN_PLACE = false;
+      }
+
+      if (IN_PLACE) {
+        /* Do some early pre-sanitization to avoid unsafe root nodes */
+        if (dirty.nodeName) {
+          const tagName = transformCaseFunc(dirty.nodeName);
+
+          if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
+            throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
+          }
+        }
+      } else if (dirty instanceof Node) {
+        /* If dirty is a DOM element, append to an empty document to avoid
+           elements being stripped by the parser */
+        body = _initDocument('<!---->');
+        importedNode = body.ownerDocument.importNode(dirty, true);
+
+        if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
+          /* Node is already a body, use as is */
+          body = importedNode;
+        } else if (importedNode.nodeName === 'HTML') {
+          body = importedNode;
+        } else {
+          // eslint-disable-next-line unicorn/prefer-dom-node-append
+          body.appendChild(importedNode);
+        }
+      } else {
+        /* Exit directly if we have nothing to do */
+        if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
+        dirty.indexOf('<') === -1) {
+          return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
+        }
+        /* Initialize the document to work on */
+
+
+        body = _initDocument(dirty);
+        /* Check we have a DOM node from the data */
+
+        if (!body) {
+          return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
+        }
+      }
+      /* Remove first element node (ours) if FORCE_BODY is set */
+
+
+      if (body && FORCE_BODY) {
+        _forceRemove(body.firstChild);
+      }
+      /* Get node iterator */
+
+
+      const nodeIterator = _createIterator(IN_PLACE ? dirty : body);
+      /* Now start iterating over the created document */
+
+
+      while (currentNode = nodeIterator.nextNode()) {
+        /* Sanitize tags and elements */
+        if (_sanitizeElements(currentNode)) {
+          continue;
+        }
+        /* Shadow DOM detected, sanitize it */
+
+
+        if (currentNode.content instanceof DocumentFragment) {
+          _sanitizeShadowDOM(currentNode.content);
+        }
+        /* Check attributes, sanitize if necessary */
+
+
+        _sanitizeAttributes(currentNode);
+      }
+      /* If we sanitized `dirty` in-place, return it. */
+
+
+      if (IN_PLACE) {
+        return dirty;
+      }
+      /* Return sanitized string or DOM */
+
+
+      if (RETURN_DOM) {
+        if (RETURN_DOM_FRAGMENT) {
+          returnNode = createDocumentFragment.call(body.ownerDocument);
+
+          while (body.firstChild) {
+            // eslint-disable-next-line unicorn/prefer-dom-node-append
+            returnNode.appendChild(body.firstChild);
+          }
+        } else {
+          returnNode = body;
+        }
+
+        if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {
+          /*
+            AdoptNode() is not used because internal state is not reset
+            (e.g. the past names map of a HTMLFormElement), this is safe
+            in theory but we would rather not risk another attack vector.
+            The state that is cloned by importNode() is explicitly defined
+            by the specs.
+          */
+          returnNode = importNode.call(originalDocument, returnNode, true);
+        }
+
+        return returnNode;
+      }
+
+      let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
+      /* Serialize doctype if allowed */
+
+      if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
+        serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
+      }
+      /* Sanitize final string template-safe */
+
+
+      if (SAFE_FOR_TEMPLATES) {
+        serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');
+        serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');
+        serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');
+      }
+
+      return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
+    };
+    /**
+     * Public method to set the configuration once
+     * setConfig
+     *
+     * @param {Object} cfg configuration object
+     */
+
+
+    DOMPurify.setConfig = function (cfg) {
+      _parseConfig(cfg);
+
+      SET_CONFIG = true;
+    };
+    /**
+     * Public method to remove the configuration
+     * clearConfig
+     *
+     */
+
+
+    DOMPurify.clearConfig = function () {
+      CONFIG = null;
+      SET_CONFIG = false;
+    };
+    /**
+     * Public method to check if an attribute value is valid.
+     * Uses last set config, if any. Otherwise, uses config defaults.
+     * isValidAttribute
+     *
+     * @param  {string} tag Tag name of containing element.
+     * @param  {string} attr Attribute name.
+     * @param  {string} value Attribute value.
+     * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
+     */
+
+
+    DOMPurify.isValidAttribute = function (tag, attr, value) {
+      /* Initialize shared config vars if necessary. */
+      if (!CONFIG) {
+        _parseConfig({});
+      }
+
+      const lcTag = transformCaseFunc(tag);
+      const lcName = transformCaseFunc(attr);
+      return _isValidAttribute(lcTag, lcName, value);
+    };
+    /**
+     * AddHook
+     * Public method to add DOMPurify hooks
+     *
+     * @param {String} entryPoint entry point for the hook to add
+     * @param {Function} hookFunction function to execute
+     */
+
+
+    DOMPurify.addHook = function (entryPoint, hookFunction) {
+      if (typeof hookFunction !== 'function') {
+        return;
+      }
+
+      hooks[entryPoint] = hooks[entryPoint] || [];
+      arrayPush(hooks[entryPoint], hookFunction);
+    };
+    /**
+     * RemoveHook
+     * Public method to remove a DOMPurify hook at a given entryPoint
+     * (pops it from the stack of hooks if more are present)
+     *
+     * @param {String} entryPoint entry point for the hook to remove
+     * @return {Function} removed(popped) hook
+     */
+
+
+    DOMPurify.removeHook = function (entryPoint) {
+      if (hooks[entryPoint]) {
+        return arrayPop(hooks[entryPoint]);
+      }
+    };
+    /**
+     * RemoveHooks
+     * Public method to remove all DOMPurify hooks at a given entryPoint
+     *
+     * @param  {String} entryPoint entry point for the hooks to remove
+     */
+
+
+    DOMPurify.removeHooks = function (entryPoint) {
+      if (hooks[entryPoint]) {
+        hooks[entryPoint] = [];
+      }
+    };
+    /**
+     * RemoveAllHooks
+     * Public method to remove all DOMPurify hooks
+     *
+     */
+
+
+    DOMPurify.removeAllHooks = function () {
+      hooks = {};
+    };
+
+    return DOMPurify;
+  }
+
+  var purify = createDOMPurify();
+
+  return purify;
+
+}));
+//# sourceMappingURL=purify.js.map
diff --git a/plugins/DOMPurify/purify.js.map b/plugins/DOMPurify/purify.js.map
new file mode 100644
index 000000000..7e36eb2c3
--- /dev/null
+++ b/plugins/DOMPurify/purify.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"purify.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","unconstruct","TypeError","func","thisArg","addToSet","set","array","transformCaseFunc","l","length","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","childCount","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":";;;;;;;;EAAA,MAAM;EACJA,EAAAA,OADI;EAEJC,EAAAA,cAFI;EAGJC,EAAAA,QAHI;EAIJC,EAAAA,cAJI;EAKJC,EAAAA,wBAAAA;EALI,CAAA,GAMFC,MANJ,CAAA;EAQA,IAAI;EAAEC,EAAAA,MAAF;EAAUC,EAAAA,IAAV;EAAgBC,EAAAA,MAAAA;EAAhB,CAA2BH,GAAAA,MAA/B;;EACA,IAAI;EAAEI,EAAAA,KAAF;EAASC,EAAAA,SAAAA;EAAT,CAAA,GAAuB,OAAOC,OAAP,KAAmB,WAAnB,IAAkCA,OAA7D,CAAA;;EAEA,IAAI,CAACF,KAAL,EAAY;EACVA,EAAAA,KAAK,GAAG,SAAUG,KAAAA,CAAAA,GAAV,EAAeC,SAAf,EAA0BC,IAA1B,EAAgC;EACtC,IAAA,OAAOF,GAAG,CAACH,KAAJ,CAAUI,SAAV,EAAqBC,IAArB,CAAP,CAAA;EACD,GAFD,CAAA;EAGD,CAAA;;EAED,IAAI,CAACR,MAAL,EAAa;EACXA,EAAAA,MAAM,GAAG,SAAUS,MAAAA,CAAAA,CAAV,EAAa;EACpB,IAAA,OAAOA,CAAP,CAAA;EACD,GAFD,CAAA;EAGD,CAAA;;EAED,IAAI,CAACR,IAAL,EAAW;EACTA,EAAAA,IAAI,GAAG,SAAUQ,IAAAA,CAAAA,CAAV,EAAa;EAClB,IAAA,OAAOA,CAAP,CAAA;EACD,GAFD,CAAA;EAGD,CAAA;;EAED,IAAI,CAACL,SAAL,EAAgB;EACdA,EAAAA,SAAS,GAAG,SAAA,SAAA,CAAUM,IAAV,EAAgBF,IAAhB,EAAsB;EAChC,IAAA,OAAO,IAAIE,IAAJ,CAAS,GAAGF,IAAZ,CAAP,CAAA;EACD,GAFD,CAAA;EAGD,CAAA;;EAED,MAAMG,YAAY,GAAGC,OAAO,CAACC,KAAK,CAACC,SAAN,CAAgBC,OAAjB,CAA5B,CAAA;EAEA,MAAMC,QAAQ,GAAGJ,OAAO,CAACC,KAAK,CAACC,SAAN,CAAgBG,GAAjB,CAAxB,CAAA;EACA,MAAMC,SAAS,GAAGN,OAAO,CAACC,KAAK,CAACC,SAAN,CAAgBK,IAAjB,CAAzB,CAAA;EAGA,MAAMC,iBAAiB,GAAGR,OAAO,CAACS,MAAM,CAACP,SAAP,CAAiBQ,WAAlB,CAAjC,CAAA;EACA,MAAMC,cAAc,GAAGX,OAAO,CAACS,MAAM,CAACP,SAAP,CAAiBU,QAAlB,CAA9B,CAAA;EACA,MAAMC,WAAW,GAAGb,OAAO,CAACS,MAAM,CAACP,SAAP,CAAiBY,KAAlB,CAA3B,CAAA;EACA,MAAMC,aAAa,GAAGf,OAAO,CAACS,MAAM,CAACP,SAAP,CAAiBc,OAAlB,CAA7B,CAAA;EACA,MAAMC,aAAa,GAAGjB,OAAO,CAACS,MAAM,CAACP,SAAP,CAAiBgB,OAAlB,CAA7B,CAAA;EACA,MAAMC,UAAU,GAAGnB,OAAO,CAACS,MAAM,CAACP,SAAP,CAAiBkB,IAAlB,CAA1B,CAAA;EAEA,MAAMC,UAAU,GAAGrB,OAAO,CAACsB,MAAM,CAACpB,SAAP,CAAiBqB,IAAlB,CAA1B,CAAA;EAEA,MAAMC,eAAe,GAAGC,WAAW,CAACC,SAAD,CAAnC,CAAA;EAEO,SAAS1B,OAAT,CAAiB2B,IAAjB,EAAuB;EAC5B,EAAA,OAAO,UAACC,OAAD,EAAA;EAAA,IAAA,KAAA,IAAA,IAAA,GAAA,SAAA,CAAA,MAAA,EAAahC,IAAb,GAAA,IAAA,KAAA,CAAA,IAAA,GAAA,CAAA,GAAA,IAAA,GAAA,CAAA,GAAA,CAAA,CAAA,EAAA,IAAA,GAAA,CAAA,EAAA,IAAA,GAAA,IAAA,EAAA,IAAA,EAAA,EAAA;EAAaA,MAAAA,IAAb,CAAA,IAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA,IAAA,CAAA,CAAA;EAAA,KAAA;;EAAA,IAAA,OAAsBL,KAAK,CAACoC,IAAD,EAAOC,OAAP,EAAgBhC,IAAhB,CAA3B,CAAA;EAAA,GAAP,CAAA;EACD,CAAA;EAEM,SAAS6B,WAAT,CAAqBE,IAArB,EAA2B;EAChC,EAAO,OAAA,YAAA;EAAA,IAAA,KAAA,IAAA,KAAA,GAAA,SAAA,CAAA,MAAA,EAAI/B,IAAJ,GAAA,IAAA,KAAA,CAAA,KAAA,CAAA,EAAA,KAAA,GAAA,CAAA,EAAA,KAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA;EAAIA,MAAAA,IAAJ,CAAA,KAAA,CAAA,GAAA,SAAA,CAAA,KAAA,CAAA,CAAA;EAAA,KAAA;;EAAA,IAAA,OAAaJ,SAAS,CAACmC,IAAD,EAAO/B,IAAP,CAAtB,CAAA;EAAA,GAAP,CAAA;EACD,CAAA;EAED;;EACO,SAASiC,QAAT,CAAkBC,GAAlB,EAAuBC,KAAvB,EAA8BC,iBAA9B,EAAiD;EACtDA,EAAAA,iBAAiB,GAAGA,iBAAiB,GAAGA,iBAAH,GAAuBxB,iBAA5D,CAAA;;EACA,EAAA,IAAIzB,cAAJ,EAAoB;EAClB;EACA;EACA;EACAA,IAAAA,cAAc,CAAC+C,GAAD,EAAM,IAAN,CAAd,CAAA;EACD,GAAA;;EAED,EAAA,IAAIG,CAAC,GAAGF,KAAK,CAACG,MAAd,CAAA;;EACA,EAAOD,OAAAA,CAAC,EAAR,EAAY;EACV,IAAA,IAAIE,OAAO,GAAGJ,KAAK,CAACE,CAAD,CAAnB,CAAA;;EACA,IAAA,IAAI,OAAOE,OAAP,KAAmB,QAAvB,EAAiC;EAC/B,MAAA,MAAMC,SAAS,GAAGJ,iBAAiB,CAACG,OAAD,CAAnC,CAAA;;EACA,MAAIC,IAAAA,SAAS,KAAKD,OAAlB,EAA2B;EACzB;EACA,QAAA,IAAI,CAACnD,QAAQ,CAAC+C,KAAD,CAAb,EAAsB;EACpBA,UAAAA,KAAK,CAACE,CAAD,CAAL,GAAWG,SAAX,CAAA;EACD,SAAA;;EAEDD,QAAAA,OAAO,GAAGC,SAAV,CAAA;EACD,OAAA;EACF,KAAA;;EAEDN,IAAAA,GAAG,CAACK,OAAD,CAAH,GAAe,IAAf,CAAA;EACD,GAAA;;EAED,EAAA,OAAOL,GAAP,CAAA;EACD,CAAA;EAED;;EACO,SAASO,KAAT,CAAeC,MAAf,EAAuB;EAC5B,EAAA,MAAMC,SAAS,GAAGjD,MAAM,CAAC,IAAD,CAAxB,CAAA;;EAEA,EAAK,KAAA,MAAM,CAACkD,QAAD,EAAWC,KAAX,CAAX,IAAgC3D,OAAO,CAACwD,MAAD,CAAvC,EAAiD;EAC/CC,IAAAA,SAAS,CAACC,QAAD,CAAT,GAAsBC,KAAtB,CAAA;EACD,GAAA;;EAED,EAAA,OAAOF,SAAP,CAAA;EACD,CAAA;EAED;EACA;;EACA,SAASG,YAAT,CAAsBJ,MAAtB,EAA8BK,IAA9B,EAAoC;EAClC,EAAOL,OAAAA,MAAM,KAAK,IAAlB,EAAwB;EACtB,IAAA,MAAMM,IAAI,GAAG1D,wBAAwB,CAACoD,MAAD,EAASK,IAAT,CAArC,CAAA;;EACA,IAAA,IAAIC,IAAJ,EAAU;EACR,MAAIA,IAAAA,IAAI,CAACC,GAAT,EAAc;EACZ,QAAA,OAAO7C,OAAO,CAAC4C,IAAI,CAACC,GAAN,CAAd,CAAA;EACD,OAAA;;EAED,MAAA,IAAI,OAAOD,IAAI,CAACH,KAAZ,KAAsB,UAA1B,EAAsC;EACpC,QAAA,OAAOzC,OAAO,CAAC4C,IAAI,CAACH,KAAN,CAAd,CAAA;EACD,OAAA;EACF,KAAA;;EAEDH,IAAAA,MAAM,GAAGrD,cAAc,CAACqD,MAAD,CAAvB,CAAA;EACD,GAAA;;EAED,EAASQ,SAAAA,aAAT,CAAuBX,OAAvB,EAAgC;EAC9BY,IAAAA,OAAO,CAACC,IAAR,CAAa,oBAAb,EAAmCb,OAAnC,CAAA,CAAA;EACA,IAAA,OAAO,IAAP,CAAA;EACD,GAAA;;EAED,EAAA,OAAOW,aAAP,CAAA;EACD;;EC5HM,MAAMG,MAAI,GAAG7D,MAAM,CAAC,CACzB,GADyB,EAEzB,MAFyB,EAGzB,SAHyB,EAIzB,SAJyB,EAKzB,MALyB,EAMzB,SANyB,EAOzB,OAPyB,EAQzB,OARyB,EASzB,GATyB,EAUzB,KAVyB,EAWzB,KAXyB,EAYzB,KAZyB,EAazB,OAbyB,EAczB,YAdyB,EAezB,MAfyB,EAgBzB,IAhByB,EAiBzB,QAjByB,EAkBzB,QAlByB,EAmBzB,SAnByB,EAoBzB,QApByB,EAqBzB,MArByB,EAsBzB,MAtByB,EAuBzB,KAvByB,EAwBzB,UAxByB,EAyBzB,SAzByB,EA0BzB,MA1ByB,EA2BzB,UA3ByB,EA4BzB,IA5ByB,EA6BzB,WA7ByB,EA8BzB,KA9ByB,EA+BzB,SA/ByB,EAgCzB,KAhCyB,EAiCzB,QAjCyB,EAkCzB,KAlCyB,EAmCzB,KAnCyB,EAoCzB,IApCyB,EAqCzB,IArCyB,EAsCzB,SAtCyB,EAuCzB,IAvCyB,EAwCzB,UAxCyB,EAyCzB,YAzCyB,EA0CzB,QA1CyB,EA2CzB,MA3CyB,EA4CzB,QA5CyB,EA6CzB,MA7CyB,EA8CzB,IA9CyB,EA+CzB,IA/CyB,EAgDzB,IAhDyB,EAiDzB,IAjDyB,EAkDzB,IAlDyB,EAmDzB,IAnDyB,EAoDzB,MApDyB,EAqDzB,QArDyB,EAsDzB,QAtDyB,EAuDzB,IAvDyB,EAwDzB,MAxDyB,EAyDzB,GAzDyB,EA0DzB,KA1DyB,EA2DzB,OA3DyB,EA4DzB,KA5DyB,EA6DzB,KA7DyB,EA8DzB,OA9DyB,EA+DzB,QA/DyB,EAgEzB,IAhEyB,EAiEzB,MAjEyB,EAkEzB,KAlEyB,EAmEzB,MAnEyB,EAoEzB,SApEyB,EAqEzB,MArEyB,EAsEzB,UAtEyB,EAuEzB,OAvEyB,EAwEzB,KAxEyB,EAyEzB,MAzEyB,EA0EzB,IA1EyB,EA2EzB,UA3EyB,EA4EzB,QA5EyB,EA6EzB,QA7EyB,EA8EzB,GA9EyB,EA+EzB,SA/EyB,EAgFzB,KAhFyB,EAiFzB,UAjFyB,EAkFzB,GAlFyB,EAmFzB,IAnFyB,EAoFzB,IApFyB,EAqFzB,MArFyB,EAsFzB,GAtFyB,EAuFzB,MAvFyB,EAwFzB,SAxFyB,EAyFzB,QAzFyB,EA0FzB,QA1FyB,EA2FzB,OA3FyB,EA4FzB,QA5FyB,EA6FzB,QA7FyB,EA8FzB,MA9FyB,EA+FzB,QA/FyB,EAgGzB,QAhGyB,EAiGzB,OAjGyB,EAkGzB,KAlGyB,EAmGzB,SAnGyB,EAoGzB,KApGyB,EAqGzB,OArGyB,EAsGzB,OAtGyB,EAuGzB,IAvGyB,EAwGzB,UAxGyB,EAyGzB,UAzGyB,EA0GzB,OA1GyB,EA2GzB,IA3GyB,EA4GzB,OA5GyB,EA6GzB,MA7GyB,EA8GzB,IA9GyB,EA+GzB,OA/GyB,EAgHzB,IAhHyB,EAiHzB,GAjHyB,EAkHzB,IAlHyB,EAmHzB,KAnHyB,EAoHzB,OApHyB,EAqHzB,KArHyB,CAAD,CAAnB;;EAyHA,MAAM8D,KAAG,GAAG9D,MAAM,CAAC,CACxB,KADwB,EAExB,GAFwB,EAGxB,UAHwB,EAIxB,aAJwB,EAKxB,cALwB,EAMxB,cANwB,EAOxB,eAPwB,EAQxB,kBARwB,EASxB,QATwB,EAUxB,UAVwB,EAWxB,MAXwB,EAYxB,MAZwB,EAaxB,SAbwB,EAcxB,QAdwB,EAexB,MAfwB,EAgBxB,GAhBwB,EAiBxB,OAjBwB,EAkBxB,UAlBwB,EAmBxB,OAnBwB,EAoBxB,OApBwB,EAqBxB,MArBwB,EAsBxB,gBAtBwB,EAuBxB,QAvBwB,EAwBxB,MAxBwB,EAyBxB,UAzBwB,EA0BxB,OA1BwB,EA2BxB,MA3BwB,EA4BxB,SA5BwB,EA6BxB,SA7BwB,EA8BxB,UA9BwB,EA+BxB,gBA/BwB,EAgCxB,MAhCwB,EAiCxB,MAjCwB,EAkCxB,OAlCwB,EAmCxB,QAnCwB,EAoCxB,QApCwB,EAqCxB,MArCwB,EAsCxB,UAtCwB,EAuCxB,OAvCwB,EAwCxB,MAxCwB,EAyCxB,OAzCwB,EA0CxB,MA1CwB,EA2CxB,OA3CwB,CAAD,CAAlB,CAAA;EA8CA,MAAM+D,UAAU,GAAG/D,MAAM,CAAC,CAC/B,SAD+B,EAE/B,eAF+B,EAG/B,qBAH+B,EAI/B,aAJ+B,EAK/B,kBAL+B,EAM/B,mBAN+B,EAO/B,mBAP+B,EAQ/B,gBAR+B,EAS/B,SAT+B,EAU/B,SAV+B,EAW/B,SAX+B,EAY/B,SAZ+B,EAa/B,SAb+B,EAc/B,gBAd+B,EAe/B,SAf+B,EAgB/B,SAhB+B,EAiB/B,aAjB+B,EAkB/B,cAlB+B,EAmB/B,UAnB+B,EAoB/B,cApB+B,EAqB/B,oBArB+B,EAsB/B,aAtB+B,EAuB/B,QAvB+B,EAwB/B,cAxB+B,CAAD,CAAzB;EA4BP;EACA;EACA;;EACO,MAAMgE,aAAa,GAAGhE,MAAM,CAAC,CAClC,SADkC,EAElC,eAFkC,EAGlC,QAHkC,EAIlC,SAJkC,EAKlC,cALkC,EAMlC,WANkC,EAOlC,kBAPkC,EAQlC,gBARkC,EASlC,eATkC,EAUlC,eAVkC,EAWlC,eAXkC,EAYlC,OAZkC,EAalC,WAbkC,EAclC,MAdkC,EAelC,cAfkC,EAgBlC,WAhBkC,EAiBlC,SAjBkC,EAkBlC,eAlBkC,EAmBlC,QAnBkC,EAoBlC,KApBkC,EAqBlC,YArBkC,EAsBlC,SAtBkC,EAuBlC,KAvBkC,CAAD,CAA5B,CAAA;EA0BA,MAAMiE,QAAM,GAAGjE,MAAM,CAAC,CAC3B,MAD2B,EAE3B,UAF2B,EAG3B,QAH2B,EAI3B,SAJ2B,EAK3B,OAL2B,EAM3B,QAN2B,EAO3B,IAP2B,EAQ3B,YAR2B,EAS3B,eAT2B,EAU3B,IAV2B,EAW3B,IAX2B,EAY3B,OAZ2B,EAa3B,SAb2B,EAc3B,UAd2B,EAe3B,OAf2B,EAgB3B,MAhB2B,EAiB3B,IAjB2B,EAkB3B,QAlB2B,EAmB3B,OAnB2B,EAoB3B,QApB2B,EAqB3B,MArB2B,EAsB3B,MAtB2B,EAuB3B,SAvB2B,EAwB3B,QAxB2B,EAyB3B,KAzB2B,EA0B3B,OA1B2B,EA2B3B,KA3B2B,EA4B3B,QA5B2B,EA6B3B,YA7B2B,EA8B3B,aA9B2B,CAAD,CAArB;EAkCP;;EACO,MAAMkE,gBAAgB,GAAGlE,MAAM,CAAC,CACrC,SADqC,EAErC,aAFqC,EAGrC,YAHqC,EAIrC,UAJqC,EAKrC,WALqC,EAMrC,SANqC,EAOrC,SAPqC,EAQrC,QARqC,EASrC,QATqC,EAUrC,OAVqC,EAWrC,WAXqC,EAYrC,YAZqC,EAarC,gBAbqC,EAcrC,aAdqC,EAerC,MAfqC,CAAD,CAA/B,CAAA;EAkBA,MAAMmE,IAAI,GAAGnE,MAAM,CAAC,CAAC,OAAD,CAAD,CAAnB;;ECrRA,MAAM6D,IAAI,GAAG7D,MAAM,CAAC,CACzB,QADyB,EAEzB,QAFyB,EAGzB,OAHyB,EAIzB,KAJyB,EAKzB,gBALyB,EAMzB,cANyB,EAOzB,sBAPyB,EAQzB,UARyB,EASzB,YATyB,EAUzB,SAVyB,EAWzB,QAXyB,EAYzB,SAZyB,EAazB,aAbyB,EAczB,aAdyB,EAezB,SAfyB,EAgBzB,MAhByB,EAiBzB,OAjByB,EAkBzB,OAlByB,EAmBzB,OAnByB,EAoBzB,MApByB,EAqBzB,SArByB,EAsBzB,UAtByB,EAuBzB,cAvByB,EAwBzB,QAxByB,EAyBzB,aAzByB,EA0BzB,UA1ByB,EA2BzB,UA3ByB,EA4BzB,SA5ByB,EA6BzB,KA7ByB,EA8BzB,UA9ByB,EA+BzB,yBA/ByB,EAgCzB,uBAhCyB,EAiCzB,UAjCyB,EAkCzB,WAlCyB,EAmCzB,SAnCyB,EAoCzB,cApCyB,EAqCzB,MArCyB,EAsCzB,KAtCyB,EAuCzB,SAvCyB,EAwCzB,QAxCyB,EAyCzB,QAzCyB,EA0CzB,MA1CyB,EA2CzB,MA3CyB,EA4CzB,UA5CyB,EA6CzB,IA7CyB,EA8CzB,WA9CyB,EA+CzB,WA/CyB,EAgDzB,OAhDyB,EAiDzB,MAjDyB,EAkDzB,OAlDyB,EAmDzB,MAnDyB,EAoDzB,MApDyB,EAqDzB,SArDyB,EAsDzB,MAtDyB,EAuDzB,KAvDyB,EAwDzB,KAxDyB,EAyDzB,WAzDyB,EA0DzB,OA1DyB,EA2DzB,QA3DyB,EA4DzB,KA5DyB,EA6DzB,WA7DyB,EA8DzB,UA9DyB,EA+DzB,OA/DyB,EAgEzB,MAhEyB,EAiEzB,OAjEyB,EAkEzB,SAlEyB,EAmEzB,YAnEyB,EAoEzB,QApEyB,EAqEzB,MArEyB,EAsEzB,SAtEyB,EAuEzB,SAvEyB,EAwEzB,aAxEyB,EAyEzB,aAzEyB,EA0EzB,QA1EyB,EA2EzB,SA3EyB,EA4EzB,SA5EyB,EA6EzB,YA7EyB,EA8EzB,UA9EyB,EA+EzB,KA/EyB,EAgFzB,UAhFyB,EAiFzB,KAjFyB,EAkFzB,UAlFyB,EAmFzB,MAnFyB,EAoFzB,MApFyB,EAqFzB,SArFyB,EAsFzB,YAtFyB,EAuFzB,OAvFyB,EAwFzB,UAxFyB,EAyFzB,OAzFyB,EA0FzB,MA1FyB,EA2FzB,OA3FyB,EA4FzB,MA5FyB,EA6FzB,SA7FyB,EA8FzB,OA9FyB,EA+FzB,KA/FyB,EAgGzB,QAhGyB,EAiGzB,MAjGyB,EAkGzB,OAlGyB,EAmGzB,SAnGyB,EAoGzB,UApGyB,EAqGzB,OArGyB,EAsGzB,WAtGyB,EAuGzB,MAvGyB,EAwGzB,QAxGyB,EAyGzB,QAzGyB,EA0GzB,OA1GyB,EA2GzB,OA3GyB,EA4GzB,OA5GyB,EA6GzB,MA7GyB,CAAD,CAAnB,CAAA;EAgHA,MAAM8D,GAAG,GAAG9D,MAAM,CAAC,CACxB,eADwB,EAExB,YAFwB,EAGxB,UAHwB,EAIxB,oBAJwB,EAKxB,QALwB,EAMxB,eANwB,EAOxB,eAPwB,EAQxB,SARwB,EASxB,eATwB,EAUxB,gBAVwB,EAWxB,OAXwB,EAYxB,MAZwB,EAaxB,IAbwB,EAcxB,OAdwB,EAexB,MAfwB,EAgBxB,eAhBwB,EAiBxB,WAjBwB,EAkBxB,WAlBwB,EAmBxB,OAnBwB,EAoBxB,qBApBwB,EAqBxB,6BArBwB,EAsBxB,eAtBwB,EAuBxB,iBAvBwB,EAwBxB,IAxBwB,EAyBxB,IAzBwB,EA0BxB,GA1BwB,EA2BxB,IA3BwB,EA4BxB,IA5BwB,EA6BxB,iBA7BwB,EA8BxB,WA9BwB,EA+BxB,SA/BwB,EAgCxB,SAhCwB,EAiCxB,KAjCwB,EAkCxB,UAlCwB,EAmCxB,WAnCwB,EAoCxB,KApCwB,EAqCxB,MArCwB,EAsCxB,cAtCwB,EAuCxB,WAvCwB,EAwCxB,QAxCwB,EAyCxB,aAzCwB,EA0CxB,aA1CwB,EA2CxB,eA3CwB,EA4CxB,aA5CwB,EA6CxB,WA7CwB,EA8CxB,kBA9CwB,EA+CxB,cA/CwB,EAgDxB,YAhDwB,EAiDxB,cAjDwB,EAkDxB,aAlDwB,EAmDxB,IAnDwB,EAoDxB,IApDwB,EAqDxB,IArDwB,EAsDxB,IAtDwB,EAuDxB,YAvDwB,EAwDxB,UAxDwB,EAyDxB,eAzDwB,EA0DxB,mBA1DwB,EA2DxB,QA3DwB,EA4DxB,MA5DwB,EA6DxB,IA7DwB,EA8DxB,iBA9DwB,EA+DxB,IA/DwB,EAgExB,KAhEwB,EAiExB,GAjEwB,EAkExB,IAlEwB,EAmExB,IAnEwB,EAoExB,IApEwB,EAqExB,IArEwB,EAsExB,SAtEwB,EAuExB,WAvEwB,EAwExB,YAxEwB,EAyExB,UAzEwB,EA0ExB,MA1EwB,EA2ExB,cA3EwB,EA4ExB,gBA5EwB,EA6ExB,cA7EwB,EA8ExB,kBA9EwB,EA+ExB,gBA/EwB,EAgFxB,OAhFwB,EAiFxB,YAjFwB,EAkFxB,YAlFwB,EAmFxB,cAnFwB,EAoFxB,cApFwB,EAqFxB,aArFwB,EAsFxB,aAtFwB,EAuFxB,kBAvFwB,EAwFxB,WAxFwB,EAyFxB,KAzFwB,EA0FxB,MA1FwB,EA2FxB,OA3FwB,EA4FxB,QA5FwB,EA6FxB,MA7FwB,EA8FxB,KA9FwB,EA+FxB,MA/FwB,EAgGxB,YAhGwB,EAiGxB,QAjGwB,EAkGxB,UAlGwB,EAmGxB,SAnGwB,EAoGxB,OApGwB,EAqGxB,QArGwB,EAsGxB,aAtGwB,EAuGxB,QAvGwB,EAwGxB,UAxGwB,EAyGxB,aAzGwB,EA0GxB,MA1GwB,EA2GxB,YA3GwB,EA4GxB,qBA5GwB,EA6GxB,kBA7GwB,EA8GxB,cA9GwB,EA+GxB,QA/GwB,EAgHxB,eAhHwB,EAiHxB,qBAjHwB,EAkHxB,gBAlHwB,EAmHxB,GAnHwB,EAoHxB,IApHwB,EAqHxB,IArHwB,EAsHxB,QAtHwB,EAuHxB,MAvHwB,EAwHxB,MAxHwB,EAyHxB,aAzHwB,EA0HxB,WA1HwB,EA2HxB,SA3HwB,EA4HxB,QA5HwB,EA6HxB,QA7HwB,EA8HxB,OA9HwB,EA+HxB,MA/HwB,EAgIxB,iBAhIwB,EAiIxB,kBAjIwB,EAkIxB,kBAlIwB,EAmIxB,cAnIwB,EAoIxB,aApIwB,EAqIxB,cArIwB,EAsIxB,aAtIwB,EAuIxB,YAvIwB,EAwIxB,cAxIwB,EAyIxB,kBAzIwB,EA0IxB,mBA1IwB,EA2IxB,gBA3IwB,EA4IxB,iBA5IwB,EA6IxB,mBA7IwB,EA8IxB,gBA9IwB,EA+IxB,QA/IwB,EAgJxB,cAhJwB,EAiJxB,OAjJwB,EAkJxB,cAlJwB,EAmJxB,gBAnJwB,EAoJxB,UApJwB,EAqJxB,SArJwB,EAsJxB,SAtJwB,EAuJxB,WAvJwB,EAwJxB,kBAxJwB,EAyJxB,aAzJwB,EA0JxB,iBA1JwB,EA2JxB,gBA3JwB,EA4JxB,YA5JwB,EA6JxB,MA7JwB,EA8JxB,IA9JwB,EA+JxB,IA/JwB,EAgKxB,SAhKwB,EAiKxB,QAjKwB,EAkKxB,SAlKwB,EAmKxB,YAnKwB,EAoKxB,SApKwB,EAqKxB,YArKwB,EAsKxB,eAtKwB,EAuKxB,eAvKwB,EAwKxB,OAxKwB,EAyKxB,cAzKwB,EA0KxB,MA1KwB,EA2KxB,cA3KwB,EA4KxB,kBA5KwB,EA6KxB,kBA7KwB,EA8KxB,GA9KwB,EA+KxB,IA/KwB,EAgLxB,IAhLwB,EAiLxB,OAjLwB,EAkLxB,GAlLwB,EAmLxB,IAnLwB,EAoLxB,IApLwB,EAqLxB,GArLwB,EAsLxB,YAtLwB,CAAD,CAAlB,CAAA;EAyLA,MAAMiE,MAAM,GAAGjE,MAAM,CAAC,CAC3B,QAD2B,EAE3B,aAF2B,EAG3B,OAH2B,EAI3B,UAJ2B,EAK3B,OAL2B,EAM3B,cAN2B,EAO3B,aAP2B,EAQ3B,YAR2B,EAS3B,YAT2B,EAU3B,OAV2B,EAW3B,KAX2B,EAY3B,SAZ2B,EAa3B,cAb2B,EAc3B,UAd2B,EAe3B,OAf2B,EAgB3B,OAhB2B,EAiB3B,QAjB2B,EAkB3B,MAlB2B,EAmB3B,IAnB2B,EAoB3B,SApB2B,EAqB3B,QArB2B,EAsB3B,eAtB2B,EAuB3B,QAvB2B,EAwB3B,QAxB2B,EAyB3B,gBAzB2B,EA0B3B,WA1B2B,EA2B3B,UA3B2B,EA4B3B,aA5B2B,EA6B3B,SA7B2B,EA8B3B,SA9B2B,EA+B3B,eA/B2B,EAgC3B,UAhC2B,EAiC3B,UAjC2B,EAkC3B,MAlC2B,EAmC3B,UAnC2B,EAoC3B,UApC2B,EAqC3B,YArC2B,EAsC3B,SAtC2B,EAuC3B,QAvC2B,EAwC3B,QAxC2B,EAyC3B,aAzC2B,EA0C3B,eA1C2B,EA2C3B,sBA3C2B,EA4C3B,WA5C2B,EA6C3B,WA7C2B,EA8C3B,YA9C2B,EA+C3B,UA/C2B,EAgD3B,gBAhD2B,EAiD3B,gBAjD2B,EAkD3B,WAlD2B,EAmD3B,SAnD2B,EAoD3B,OApD2B,EAqD3B,OArD2B,CAAD,CAArB,CAAA;EAwDA,MAAMoE,GAAG,GAAGpE,MAAM,CAAC,CACxB,YADwB,EAExB,QAFwB,EAGxB,aAHwB,EAIxB,WAJwB,EAKxB,aALwB,CAAD,CAAlB;;EChWA,MAAMqE,aAAa,GAAGpE,IAAI,CAAC,2BAAD,CAA1B;;EACA,MAAMqE,QAAQ,GAAGrE,IAAI,CAAC,uBAAD,CAArB,CAAA;EACA,MAAMsE,WAAW,GAAGtE,IAAI,CAAC,eAAD,CAAxB,CAAA;EACA,MAAMuE,SAAS,GAAGvE,IAAI,CAAC,4BAAD,CAAtB;;EACA,MAAMwE,SAAS,GAAGxE,IAAI,CAAC,gBAAD,CAAtB;;EACA,MAAMyE,cAAc,GAAGzE,IAAI,CAChC,2FADgC;EAAA,CAA3B,CAAA;EAGA,MAAM0E,iBAAiB,GAAG1E,IAAI,CAAC,uBAAD,CAA9B,CAAA;EACA,MAAM2E,eAAe,GAAG3E,IAAI,CACjC,6DADiC;EAAA,CAA5B,CAAA;EAGA,MAAM4E,YAAY,GAAG5E,IAAI,CAAC,SAAD,CAAzB;;;;;;;;;;;;;;;ECOP,MAAM6E,SAAS,GAAG,MAAO,OAAOC,MAAP,KAAkB,WAAlB,GAAgC,IAAhC,GAAuCA,MAAhE,CAAA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EACA,MAAMC,yBAAyB,GAAG,SAA5BA,yBAA4B,CAAUC,YAAV,EAAwBC,QAAxB,EAAkC;EAClE,EACE,IAAA,OAAOD,YAAP,KAAwB,QAAxB,IACA,OAAOA,YAAY,CAACE,YAApB,KAAqC,UAFvC,EAGE;EACA,IAAA,OAAO,IAAP,CAAA;EACD,GANiE;EASlE;EACA;;;EACA,EAAIC,IAAAA,MAAM,GAAG,IAAb,CAAA;EACA,EAAMC,MAAAA,SAAS,GAAG,uBAAlB,CAAA;;EACA,EAAA,IACEH,QAAQ,CAACI,aAAT,IACAJ,QAAQ,CAACI,aAAT,CAAuBC,YAAvB,CAAoCF,SAApC,CAFF,EAGE;EACAD,IAAAA,MAAM,GAAGF,QAAQ,CAACI,aAAT,CAAuBE,YAAvB,CAAoCH,SAApC,CAAT,CAAA;EACD,GAAA;;EAED,EAAMI,MAAAA,UAAU,GAAG,WAAeL,IAAAA,MAAM,GAAG,GAAMA,GAAAA,MAAT,GAAkB,EAAvC,CAAnB,CAAA;;EAEA,EAAI,IAAA;EACF,IAAA,OAAOH,YAAY,CAACE,YAAb,CAA0BM,UAA1B,EAAsC;EAC3CC,MAAAA,UAAU,CAAC7B,IAAD,EAAO;EACf,QAAA,OAAOA,IAAP,CAAA;EACD,OAH0C;;EAI3C8B,MAAAA,eAAe,CAACC,SAAD,EAAY;EACzB,QAAA,OAAOA,SAAP,CAAA;EACD,OAAA;;EAN0C,KAAtC,CAAP,CAAA;EAQD,GATD,CASE,OAAOC,CAAP,EAAU;EACV;EACA;EACA;EACAlC,IAAAA,OAAO,CAACC,IAAR,CACE,sBAAyB6B,GAAAA,UAAzB,GAAsC,wBADxC,CAAA,CAAA;EAGA,IAAA,OAAO,IAAP,CAAA;EACD,GAAA;EACF,CAxCD,CAAA;;EA0CA,SAASK,eAAT,GAA+C;EAAA,EAAtBf,IAAAA,MAAsB,GAAbD,SAAAA,CAAAA,MAAAA,GAAAA,CAAAA,IAAAA,SAAAA,CAAAA,CAAAA,CAAAA,KAAAA,SAAAA,GAAAA,SAAAA,CAAAA,CAAAA,CAAAA,GAAAA,SAAS,EAAI,CAAA;;EAC7C,EAAA,MAAMiB,SAAS,GAAIC,IAAD,IAAUF,eAAe,CAACE,IAAD,CAA3C,CAAA;EAEA;EACF;EACA;EACA;;;EACED,EAAAA,SAAS,CAACE,OAAV,GAAoBC,OAApB,CAAA;EAEA;EACF;EACA;EACA;;EACEH,EAAAA,SAAS,CAACI,OAAV,GAAoB,EAApB,CAAA;;EAEA,EAAA,IAAI,CAACpB,MAAD,IAAW,CAACA,MAAM,CAACG,QAAnB,IAA+BH,MAAM,CAACG,QAAP,CAAgBkB,QAAhB,KAA6B,CAAhE,EAAmE;EACjE;EACA;EACAL,IAAAA,SAAS,CAACM,WAAV,GAAwB,KAAxB,CAAA;EAEA,IAAA,OAAON,SAAP,CAAA;EACD,GAAA;;EAED,EAAA,MAAMO,gBAAgB,GAAGvB,MAAM,CAACG,QAAhC,CAAA;EAEA,EAAI,IAAA;EAAEA,IAAAA,QAAAA;EAAF,GAAA,GAAeH,MAAnB,CAAA;EACA,EAAM,MAAA;EACJwB,IAAAA,gBADI;EAEJC,IAAAA,mBAFI;EAGJC,IAAAA,IAHI;EAIJC,IAAAA,OAJI;EAKJC,IAAAA,UALI;EAMJC,IAAAA,YAAY,GAAG7B,MAAM,CAAC6B,YAAP,IAAuB7B,MAAM,CAAC8B,eANzC;EAOJC,IAAAA,eAPI;EAQJC,IAAAA,SARI;EASJ9B,IAAAA,YAAAA;EATI,GAAA,GAUFF,MAVJ,CAAA;EAYA,EAAA,MAAMiC,gBAAgB,GAAGN,OAAO,CAAC5F,SAAjC,CAAA;EAEA,EAAA,MAAMmG,SAAS,GAAG3D,YAAY,CAAC0D,gBAAD,EAAmB,WAAnB,CAA9B,CAAA;EACA,EAAA,MAAME,cAAc,GAAG5D,YAAY,CAAC0D,gBAAD,EAAmB,aAAnB,CAAnC,CAAA;EACA,EAAA,MAAMG,aAAa,GAAG7D,YAAY,CAAC0D,gBAAD,EAAmB,YAAnB,CAAlC,CAAA;EACA,EAAMI,MAAAA,aAAa,GAAG9D,YAAY,CAAC0D,gBAAD,EAAmB,YAAnB,CAAlC,CA3C6C;EA8C7C;EACA;EACA;EACA;EACA;;EACA,EAAA,IAAI,OAAOR,mBAAP,KAA+B,UAAnC,EAA+C;EAC7C,IAAA,MAAMa,QAAQ,GAAGnC,QAAQ,CAACoC,aAAT,CAAuB,UAAvB,CAAjB,CAAA;;EACA,IAAID,IAAAA,QAAQ,CAACE,OAAT,IAAoBF,QAAQ,CAACE,OAAT,CAAiBC,aAAzC,EAAwD;EACtDtC,MAAAA,QAAQ,GAAGmC,QAAQ,CAACE,OAAT,CAAiBC,aAA5B,CAAA;EACD,KAAA;EACF,GAAA;;EAED,EAAA,MAAMC,kBAAkB,GAAGzC,yBAAyB,CAClDC,YADkD,EAElDqB,gBAFkD,CAApD,CAAA;;EAIA,EAAMoB,MAAAA,SAAS,GAAGD,kBAAkB,GAAGA,kBAAkB,CAAC/B,UAAnB,CAA8B,EAA9B,CAAH,GAAuC,EAA3E,CAAA;EAEA,EAAM,MAAA;EACJiC,IAAAA,cADI;EAEJC,IAAAA,kBAFI;EAGJC,IAAAA,sBAHI;EAIJC,IAAAA,oBAAAA;EAJI,GAAA,GAKF5C,QALJ,CAAA;EAMA,EAAM,MAAA;EAAE6C,IAAAA,UAAAA;EAAF,GAAA,GAAiBzB,gBAAvB,CAAA;EAEA,EAAI0B,IAAAA,KAAK,GAAG,EAAZ,CAAA;EAEA;EACF;EACA;;EACEjC,EAAAA,SAAS,CAACM,WAAV,GACE,OAAO3G,OAAP,KAAmB,UAAnB,IACA,OAAO0H,aAAP,KAAyB,UADzB,IAEAO,cAFA,IAGA,OAAOA,cAAc,CAACM,kBAAtB,KAA6C,WAJ/C,CAAA;EAMA,EAAM,MAAA;EACJ5D,IAAAA,aADI;EAEJC,IAAAA,QAFI;EAGJC,IAAAA,WAHI;EAIJC,IAAAA,SAJI;EAKJC,IAAAA,SALI;EAMJE,IAAAA,iBANI;EAOJC,IAAAA,eAAAA;EAPI,GAAA,GAQFsD,WARJ,CAAA;EAUA,EAAI,IAAA;EAAExD,oBAAAA,gBAAAA;EAAF,GAAA,GAAqBwD,WAAzB,CAAA;EAEA;EACF;EACA;EACA;;EAEE;;EACA,EAAIC,IAAAA,YAAY,GAAG,IAAnB,CAAA;EACA,EAAA,MAAMC,oBAAoB,GAAG3F,QAAQ,CAAC,EAAD,EAAK,CACxC,GAAG4F,MADqC,EAExC,GAAGA,KAFqC,EAGxC,GAAGA,UAHqC,EAIxC,GAAGA,QAJqC,EAKxC,GAAGA,IALqC,CAAL,CAArC,CAAA;EAQA;;EACA,EAAIC,IAAAA,YAAY,GAAG,IAAnB,CAAA;EACA,EAAMC,MAAAA,oBAAoB,GAAG9F,QAAQ,CAAC,EAAD,EAAK,CACxC,GAAG+F,IADqC,EAExC,GAAGA,GAFqC,EAGxC,GAAGA,MAHqC,EAIxC,GAAGA,GAJqC,CAAL,CAArC,CAAA;EAOA;EACF;EACA;EACA;EACA;EACA;;EACE,EAAIC,IAAAA,uBAAuB,GAAG1I,MAAM,CAACE,IAAP,CAC5BF,MAAM,CAACG,MAAP,CAAc,IAAd,EAAoB;EAClBwI,IAAAA,YAAY,EAAE;EACZC,MAAAA,QAAQ,EAAE,IADE;EAEZC,MAAAA,YAAY,EAAE,KAFF;EAGZC,MAAAA,UAAU,EAAE,IAHA;EAIZxF,MAAAA,KAAK,EAAE,IAAA;EAJK,KADI;EAOlByF,IAAAA,kBAAkB,EAAE;EAClBH,MAAAA,QAAQ,EAAE,IADQ;EAElBC,MAAAA,YAAY,EAAE,KAFI;EAGlBC,MAAAA,UAAU,EAAE,IAHM;EAIlBxF,MAAAA,KAAK,EAAE,IAAA;EAJW,KAPF;EAalB0F,IAAAA,8BAA8B,EAAE;EAC9BJ,MAAAA,QAAQ,EAAE,IADoB;EAE9BC,MAAAA,YAAY,EAAE,KAFgB;EAG9BC,MAAAA,UAAU,EAAE,IAHkB;EAI9BxF,MAAAA,KAAK,EAAE,KAAA;EAJuB,KAAA;EAbd,GAApB,CAD4B,CAA9B,CAAA;EAuBA;;EACA,EAAI2F,IAAAA,WAAW,GAAG,IAAlB,CAAA;EAEA;;EACA,EAAIC,IAAAA,WAAW,GAAG,IAAlB,CAAA;EAEA;;EACA,EAAIC,IAAAA,eAAe,GAAG,IAAtB,CAAA;EAEA;;EACA,EAAIC,IAAAA,eAAe,GAAG,IAAtB,CAAA;EAEA;;EACA,EAAIC,IAAAA,uBAAuB,GAAG,KAA9B,CAAA;EAEA;EACF;;EACE,EAAIC,IAAAA,wBAAwB,GAAG,IAA/B,CAAA;EAEA;EACF;EACA;;EACE,EAAIC,IAAAA,kBAAkB,GAAG,KAAzB,CAAA;EAEA;;EACA,EAAIC,IAAAA,cAAc,GAAG,KAArB,CAAA;EAEA;;EACA,EAAIC,IAAAA,UAAU,GAAG,KAAjB,CAAA;EAEA;EACF;;EACE,EAAIC,IAAAA,UAAU,GAAG,KAAjB,CAAA;EAEA;EACF;EACA;EACA;;EACE,EAAIC,IAAAA,UAAU,GAAG,KAAjB,CAAA;EAEA;EACF;;EACE,EAAIC,IAAAA,mBAAmB,GAAG,KAA1B,CAAA;EAEA;EACF;;EACE,EAAIC,IAAAA,mBAAmB,GAAG,KAA1B,CAAA;EAEA;EACF;EACA;;EACE,EAAIC,IAAAA,YAAY,GAAG,IAAnB,CAAA;EAEA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EACE,EAAIC,IAAAA,oBAAoB,GAAG,KAA3B,CAAA;EACA,EAAMC,MAAAA,2BAA2B,GAAG,eAApC,CAAA;EAEA;;EACA,EAAIC,IAAAA,YAAY,GAAG,IAAnB,CAAA;EAEA;EACF;;EACE,EAAIC,IAAAA,QAAQ,GAAG,KAAf,CAAA;EAEA;;EACA,EAAIC,IAAAA,YAAY,GAAG,EAAnB,CAAA;EAEA;;EACA,EAAIC,IAAAA,eAAe,GAAG,IAAtB,CAAA;EACA,EAAMC,MAAAA,uBAAuB,GAAG3H,QAAQ,CAAC,EAAD,EAAK,CAC3C,gBAD2C,EAE3C,OAF2C,EAG3C,UAH2C,EAI3C,MAJ2C,EAK3C,eAL2C,EAM3C,MAN2C,EAO3C,QAP2C,EAQ3C,MAR2C,EAS3C,IAT2C,EAU3C,IAV2C,EAW3C,IAX2C,EAY3C,IAZ2C,EAa3C,OAb2C,EAc3C,SAd2C,EAe3C,UAf2C,EAgB3C,UAhB2C,EAiB3C,WAjB2C,EAkB3C,QAlB2C,EAmB3C,OAnB2C,EAoB3C,KApB2C,EAqB3C,UArB2C,EAsB3C,OAtB2C,EAuB3C,OAvB2C,EAwB3C,OAxB2C,EAyB3C,KAzB2C,CAAL,CAAxC,CAAA;EA4BA;;EACA,EAAI4H,IAAAA,aAAa,GAAG,IAApB,CAAA;EACA,EAAA,MAAMC,qBAAqB,GAAG7H,QAAQ,CAAC,EAAD,EAAK,CACzC,OADyC,EAEzC,OAFyC,EAGzC,KAHyC,EAIzC,QAJyC,EAKzC,OALyC,EAMzC,OANyC,CAAL,CAAtC,CAAA;EASA;;EACA,EAAI8H,IAAAA,mBAAmB,GAAG,IAA1B,CAAA;EACA,EAAA,MAAMC,2BAA2B,GAAG/H,QAAQ,CAAC,EAAD,EAAK,CAC/C,KAD+C,EAE/C,OAF+C,EAG/C,KAH+C,EAI/C,IAJ+C,EAK/C,OAL+C,EAM/C,MAN+C,EAO/C,SAP+C,EAQ/C,aAR+C,EAS/C,MAT+C,EAU/C,SAV+C,EAW/C,OAX+C,EAY/C,OAZ+C,EAa/C,OAb+C,EAc/C,OAd+C,CAAL,CAA5C,CAAA;EAiBA,EAAMgI,MAAAA,gBAAgB,GAAG,oCAAzB,CAAA;EACA,EAAMC,MAAAA,aAAa,GAAG,4BAAtB,CAAA;EACA,EAAMC,MAAAA,cAAc,GAAG,8BAAvB,CAAA;EACA;;EACA,EAAIC,IAAAA,SAAS,GAAGD,cAAhB,CAAA;EACA,EAAIE,IAAAA,cAAc,GAAG,KAArB,CAAA;EAEA;;EACA,EAAIC,IAAAA,kBAAkB,GAAG,IAAzB,CAAA;EACA,EAAA,MAAMC,0BAA0B,GAAGtI,QAAQ,CACzC,EADyC,EAEzC,CAACgI,gBAAD,EAAmBC,aAAnB,EAAkCC,cAAlC,CAFyC,EAGzCpJ,cAHyC,CAA3C,CAAA;EAMA;;EACA,EAAA,IAAIyJ,iBAAJ,CAAA;EACA,EAAA,MAAMC,4BAA4B,GAAG,CAAC,uBAAD,EAA0B,WAA1B,CAArC,CAAA;EACA,EAAMC,MAAAA,yBAAyB,GAAG,WAAlC,CAAA;EACA,EAAA,IAAItI,iBAAJ,CAAA;EAEA;;EACA,EAAIuI,IAAAA,MAAM,GAAG,IAAb,CAAA;EAEA;;EACA;;EAEA,EAAA,MAAMC,WAAW,GAAGlG,QAAQ,CAACoC,aAAT,CAAuB,MAAvB,CAApB,CAAA;;EAEA,EAAA,MAAM+D,iBAAiB,GAAG,SAApBA,iBAAoB,CAAUC,SAAV,EAAqB;EAC7C,IAAA,OAAOA,SAAS,YAAYpJ,MAArB,IAA+BoJ,SAAS,YAAYC,QAA3D,CAAA;EACD,GAFD,CAAA;EAIA;EACF;EACA;EACA;EACA;EACE;;;EACA,EAAA,MAAMC,YAAY,GAAG,SAAfA,YAAe,CAAUC,GAAV,EAAe;EAClC,IAAA,IAAIN,MAAM,IAAIA,MAAM,KAAKM,GAAzB,EAA8B;EAC5B,MAAA,OAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAI,CAACA,GAAD,IAAQ,OAAOA,GAAP,KAAe,QAA3B,EAAqC;EACnCA,MAAAA,GAAG,GAAG,EAAN,CAAA;EACD,KAAA;EAED;;;EACAA,IAAAA,GAAG,GAAGxI,KAAK,CAACwI,GAAD,CAAX,CAAA;EAEAT,IAAAA,iBAAiB;EAEfC,IAAAA,4BAA4B,CAACnJ,OAA7B,CAAqC2J,GAAG,CAACT,iBAAzC,MAAgE,CAAC,CAAjE,GACKA,iBAAiB,GAAGE,yBADzB,GAEKF,iBAAiB,GAAGS,GAAG,CAACT,iBAJ/B,CAbkC;;EAoBlCpI,IAAAA,iBAAiB,GACfoI,iBAAiB,KAAK,uBAAtB,GACIzJ,cADJ,GAEIH,iBAHN,CAAA;EAKA;;EACA+G,IAAAA,YAAY,GACV,cAAA,IAAkBsD,GAAlB,GACIhJ,QAAQ,CAAC,EAAD,EAAKgJ,GAAG,CAACtD,YAAT,EAAuBvF,iBAAvB,CADZ,GAEIwF,oBAHN,CAAA;EAIAE,IAAAA,YAAY,GACV,cAAA,IAAkBmD,GAAlB,GACIhJ,QAAQ,CAAC,EAAD,EAAKgJ,GAAG,CAACnD,YAAT,EAAuB1F,iBAAvB,CADZ,GAEI2F,oBAHN,CAAA;EAIAuC,IAAAA,kBAAkB,GAChB,oBAAA,IAAwBW,GAAxB,GACIhJ,QAAQ,CAAC,EAAD,EAAKgJ,GAAG,CAACX,kBAAT,EAA6BvJ,cAA7B,CADZ,GAEIwJ,0BAHN,CAAA;EAIAR,IAAAA,mBAAmB,GACjB,mBAAA,IAAuBkB,GAAvB,GACIhJ,QAAQ,CACNQ,KAAK,CAACuH,2BAAD,CADC;EAENiB,IAAAA,GAAG,CAACC,iBAFE;EAGN9I,IAAAA,iBAHM;EAAA,KADZ;EAAA,MAMI4H,2BAPN,CAAA;EAQAH,IAAAA,aAAa,GACX,mBAAA,IAAuBoB,GAAvB,GACIhJ,QAAQ,CACNQ,KAAK,CAACqH,qBAAD,CADC;EAENmB,IAAAA,GAAG,CAACE,iBAFE;EAGN/I,IAAAA,iBAHM;EAAA,KADZ;EAAA,MAMI0H,qBAPN,CAAA;EAQAH,IAAAA,eAAe,GACb,iBAAA,IAAqBsB,GAArB,GACIhJ,QAAQ,CAAC,EAAD,EAAKgJ,GAAG,CAACtB,eAAT,EAA0BvH,iBAA1B,CADZ,GAEIwH,uBAHN,CAAA;EAIApB,IAAAA,WAAW,GACT,aAAA,IAAiByC,GAAjB,GACIhJ,QAAQ,CAAC,EAAD,EAAKgJ,GAAG,CAACzC,WAAT,EAAsBpG,iBAAtB,CADZ,GAEI,EAHN,CAAA;EAIAqG,IAAAA,WAAW,GACT,aAAA,IAAiBwC,GAAjB,GACIhJ,QAAQ,CAAC,EAAD,EAAKgJ,GAAG,CAACxC,WAAT,EAAsBrG,iBAAtB,CADZ,GAEI,EAHN,CAAA;EAIAsH,IAAAA,YAAY,GAAG,cAAkBuB,IAAAA,GAAlB,GAAwBA,GAAG,CAACvB,YAA5B,GAA2C,KAA1D,CAAA;EACAhB,IAAAA,eAAe,GAAGuC,GAAG,CAACvC,eAAJ,KAAwB,KAA1C,CAnEkC;;EAoElCC,IAAAA,eAAe,GAAGsC,GAAG,CAACtC,eAAJ,KAAwB,KAA1C,CApEkC;;EAqElCC,IAAAA,uBAAuB,GAAGqC,GAAG,CAACrC,uBAAJ,IAA+B,KAAzD,CArEkC;;EAsElCC,IAAAA,wBAAwB,GAAGoC,GAAG,CAACpC,wBAAJ,KAAiC,KAA5D,CAtEkC;;EAuElCC,IAAAA,kBAAkB,GAAGmC,GAAG,CAACnC,kBAAJ,IAA0B,KAA/C,CAvEkC;;EAwElCC,IAAAA,cAAc,GAAGkC,GAAG,CAAClC,cAAJ,IAAsB,KAAvC,CAxEkC;;EAyElCG,IAAAA,UAAU,GAAG+B,GAAG,CAAC/B,UAAJ,IAAkB,KAA/B,CAzEkC;;EA0ElCC,IAAAA,mBAAmB,GAAG8B,GAAG,CAAC9B,mBAAJ,IAA2B,KAAjD,CA1EkC;;EA2ElCC,IAAAA,mBAAmB,GAAG6B,GAAG,CAAC7B,mBAAJ,IAA2B,KAAjD,CA3EkC;;EA4ElCH,IAAAA,UAAU,GAAGgC,GAAG,CAAChC,UAAJ,IAAkB,KAA/B,CA5EkC;;EA6ElCI,IAAAA,YAAY,GAAG4B,GAAG,CAAC5B,YAAJ,KAAqB,KAApC,CA7EkC;;EA8ElCC,IAAAA,oBAAoB,GAAG2B,GAAG,CAAC3B,oBAAJ,IAA4B,KAAnD,CA9EkC;;EA+ElCE,IAAAA,YAAY,GAAGyB,GAAG,CAACzB,YAAJ,KAAqB,KAApC,CA/EkC;;EAgFlCC,IAAAA,QAAQ,GAAGwB,GAAG,CAACxB,QAAJ,IAAgB,KAA3B,CAhFkC;;EAiFlCvF,IAAAA,gBAAc,GAAG+G,GAAG,CAACG,kBAAJ,IAA0B1D,cAA3C,CAAA;EACA0C,IAAAA,SAAS,GAAGa,GAAG,CAACb,SAAJ,IAAiBD,cAA7B,CAAA;EACAlC,IAAAA,uBAAuB,GAAGgD,GAAG,CAAChD,uBAAJ,IAA+B,EAAzD,CAAA;;EACA,IAAA,IACEgD,GAAG,CAAChD,uBAAJ,IACA4C,iBAAiB,CAACI,GAAG,CAAChD,uBAAJ,CAA4BC,YAA7B,CAFnB,EAGE;EACAD,MAAAA,uBAAuB,CAACC,YAAxB,GACE+C,GAAG,CAAChD,uBAAJ,CAA4BC,YAD9B,CAAA;EAED,KAAA;;EAED,IAAA,IACE+C,GAAG,CAAChD,uBAAJ,IACA4C,iBAAiB,CAACI,GAAG,CAAChD,uBAAJ,CAA4BK,kBAA7B,CAFnB,EAGE;EACAL,MAAAA,uBAAuB,CAACK,kBAAxB,GACE2C,GAAG,CAAChD,uBAAJ,CAA4BK,kBAD9B,CAAA;EAED,KAAA;;EAED,IAAA,IACE2C,GAAG,CAAChD,uBAAJ,IACA,OAAOgD,GAAG,CAAChD,uBAAJ,CAA4BM,8BAAnC,KACE,SAHJ,EAIE;EACAN,MAAAA,uBAAuB,CAACM,8BAAxB,GACE0C,GAAG,CAAChD,uBAAJ,CAA4BM,8BAD9B,CAAA;EAED,KAAA;;EAED,IAAA,IAAIO,kBAAJ,EAAwB;EACtBH,MAAAA,eAAe,GAAG,KAAlB,CAAA;EACD,KAAA;;EAED,IAAA,IAAIQ,mBAAJ,EAAyB;EACvBD,MAAAA,UAAU,GAAG,IAAb,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAIQ,YAAJ,EAAkB;EAChB/B,MAAAA,YAAY,GAAG1F,QAAQ,CAAC,EAAD,EAAK,CAAC,GAAG4F,IAAJ,CAAL,CAAvB,CAAA;EACAC,MAAAA,YAAY,GAAG,EAAf,CAAA;;EACA,MAAA,IAAI4B,YAAY,CAACrG,IAAb,KAAsB,IAA1B,EAAgC;EAC9BpB,QAAAA,QAAQ,CAAC0F,YAAD,EAAeE,MAAf,CAAR,CAAA;EACA5F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,IAAf,CAAR,CAAA;EACD,OAAA;;EAED,MAAA,IAAI0B,YAAY,CAACpG,GAAb,KAAqB,IAAzB,EAA+B;EAC7BrB,QAAAA,QAAQ,CAAC0F,YAAD,EAAeE,KAAf,CAAR,CAAA;EACA5F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,GAAf,CAAR,CAAA;EACA/F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,GAAf,CAAR,CAAA;EACD,OAAA;;EAED,MAAA,IAAI0B,YAAY,CAACnG,UAAb,KAA4B,IAAhC,EAAsC;EACpCtB,QAAAA,QAAQ,CAAC0F,YAAD,EAAeE,UAAf,CAAR,CAAA;EACA5F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,GAAf,CAAR,CAAA;EACA/F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,GAAf,CAAR,CAAA;EACD,OAAA;;EAED,MAAA,IAAI0B,YAAY,CAACjG,MAAb,KAAwB,IAA5B,EAAkC;EAChCxB,QAAAA,QAAQ,CAAC0F,YAAD,EAAeE,QAAf,CAAR,CAAA;EACA5F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,MAAf,CAAR,CAAA;EACA/F,QAAAA,QAAQ,CAAC6F,YAAD,EAAeE,GAAf,CAAR,CAAA;EACD,OAAA;EACF,KAAA;EAED;;;EACA,IAAIiD,IAAAA,GAAG,CAACI,QAAR,EAAkB;EAChB,MAAI1D,IAAAA,YAAY,KAAKC,oBAArB,EAA2C;EACzCD,QAAAA,YAAY,GAAGlF,KAAK,CAACkF,YAAD,CAApB,CAAA;EACD,OAAA;;EAED1F,MAAAA,QAAQ,CAAC0F,YAAD,EAAesD,GAAG,CAACI,QAAnB,EAA6BjJ,iBAA7B,CAAR,CAAA;EACD,KAAA;;EAED,IAAI6I,IAAAA,GAAG,CAACK,QAAR,EAAkB;EAChB,MAAIxD,IAAAA,YAAY,KAAKC,oBAArB,EAA2C;EACzCD,QAAAA,YAAY,GAAGrF,KAAK,CAACqF,YAAD,CAApB,CAAA;EACD,OAAA;;EAED7F,MAAAA,QAAQ,CAAC6F,YAAD,EAAemD,GAAG,CAACK,QAAnB,EAA6BlJ,iBAA7B,CAAR,CAAA;EACD,KAAA;;EAED,IAAI6I,IAAAA,GAAG,CAACC,iBAAR,EAA2B;EACzBjJ,MAAAA,QAAQ,CAAC8H,mBAAD,EAAsBkB,GAAG,CAACC,iBAA1B,EAA6C9I,iBAA7C,CAAR,CAAA;EACD,KAAA;;EAED,IAAI6I,IAAAA,GAAG,CAACtB,eAAR,EAAyB;EACvB,MAAIA,IAAAA,eAAe,KAAKC,uBAAxB,EAAiD;EAC/CD,QAAAA,eAAe,GAAGlH,KAAK,CAACkH,eAAD,CAAvB,CAAA;EACD,OAAA;;EAED1H,MAAAA,QAAQ,CAAC0H,eAAD,EAAkBsB,GAAG,CAACtB,eAAtB,EAAuCvH,iBAAvC,CAAR,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAIoH,YAAJ,EAAkB;EAChB7B,MAAAA,YAAY,CAAC,OAAD,CAAZ,GAAwB,IAAxB,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAIoB,cAAJ,EAAoB;EAClB9G,MAAAA,QAAQ,CAAC0F,YAAD,EAAe,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,CAAf,CAAR,CAAA;EACD,KAAA;EAED;;;EACA,IAAIA,IAAAA,YAAY,CAAC4D,KAAjB,EAAwB;EACtBtJ,MAAAA,QAAQ,CAAC0F,YAAD,EAAe,CAAC,OAAD,CAAf,CAAR,CAAA;EACA,MAAOa,OAAAA,WAAW,CAACgD,KAAnB,CAAA;EACD,KA5LiC;EA+LlC;;;EACA,IAAA,IAAIhM,MAAJ,EAAY;EACVA,MAAAA,MAAM,CAACyL,GAAD,CAAN,CAAA;EACD,KAAA;;EAEDN,IAAAA,MAAM,GAAGM,GAAT,CAAA;EACD,GArMD,CAAA;;EAuMA,EAAA,MAAMQ,8BAA8B,GAAGxJ,QAAQ,CAAC,EAAD,EAAK,CAClD,IADkD,EAElD,IAFkD,EAGlD,IAHkD,EAIlD,IAJkD,EAKlD,OALkD,CAAL,CAA/C,CAAA;EAQA,EAAA,MAAMyJ,uBAAuB,GAAGzJ,QAAQ,CAAC,EAAD,EAAK,CAC3C,eAD2C,EAE3C,MAF2C,EAG3C,OAH2C,EAI3C,gBAJ2C,CAAL,CAAxC,CArhB6C;EA6hB7C;EACA;EACA;;EACA,EAAA,MAAM0J,4BAA4B,GAAG1J,QAAQ,CAAC,EAAD,EAAK,CAChD,OADgD,EAEhD,OAFgD,EAGhD,MAHgD,EAIhD,GAJgD,EAKhD,QALgD,CAAL,CAA7C,CAAA;EAQA;EACF;EACA;;EACE,EAAM2J,MAAAA,YAAY,GAAG3J,QAAQ,CAAC,EAAD,EAAK4F,KAAL,CAA7B,CAAA;EACA5F,EAAAA,QAAQ,CAAC2J,YAAD,EAAe/D,UAAf,CAAR,CAAA;EACA5F,EAAAA,QAAQ,CAAC2J,YAAD,EAAe/D,aAAf,CAAR,CAAA;EAEA,EAAMgE,MAAAA,eAAe,GAAG5J,QAAQ,CAAC,EAAD,EAAK4F,QAAL,CAAhC,CAAA;EACA5F,EAAAA,QAAQ,CAAC4J,eAAD,EAAkBhE,gBAAlB,CAAR,CAAA;EAEA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;;EACE,EAAA,MAAMiE,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAUvJ,OAAV,EAAmB;EAC9C,IAAA,IAAIwJ,MAAM,GAAGnF,aAAa,CAACrE,OAAD,CAA1B,CAD8C;EAI9C;;EACA,IAAA,IAAI,CAACwJ,MAAD,IAAW,CAACA,MAAM,CAACC,OAAvB,EAAgC;EAC9BD,MAAAA,MAAM,GAAG;EACPE,QAAAA,YAAY,EAAE7B,SADP;EAEP4B,QAAAA,OAAO,EAAE,UAAA;EAFF,OAAT,CAAA;EAID,KAAA;;EAED,IAAA,MAAMA,OAAO,GAAGpL,iBAAiB,CAAC2B,OAAO,CAACyJ,OAAT,CAAjC,CAAA;EACA,IAAA,MAAME,aAAa,GAAGtL,iBAAiB,CAACmL,MAAM,CAACC,OAAR,CAAvC,CAAA;;EAEA,IAAA,IAAI,CAAC1B,kBAAkB,CAAC/H,OAAO,CAAC0J,YAAT,CAAvB,EAA+C;EAC7C,MAAA,OAAO,KAAP,CAAA;EACD,KAAA;;EAED,IAAA,IAAI1J,OAAO,CAAC0J,YAAR,KAAyB/B,aAA7B,EAA4C;EAC1C;EACA;EACA;EACA,MAAA,IAAI6B,MAAM,CAACE,YAAP,KAAwB9B,cAA5B,EAA4C;EAC1C,QAAO6B,OAAAA,OAAO,KAAK,KAAnB,CAAA;EACD,OANyC;EAS1C;EACA;;;EACA,MAAA,IAAID,MAAM,CAACE,YAAP,KAAwBhC,gBAA5B,EAA8C;EAC5C,QAAA,OACE+B,OAAO,KAAK,KAAZ,KACCE,aAAa,KAAK,gBAAlB,IACCT,8BAA8B,CAACS,aAAD,CAFhC,CADF,CAAA;EAKD,OAjByC;EAoB1C;;;EACA,MAAA,OAAOC,OAAO,CAACP,YAAY,CAACI,OAAD,CAAb,CAAd,CAAA;EACD,KAAA;;EAED,IAAA,IAAIzJ,OAAO,CAAC0J,YAAR,KAAyBhC,gBAA7B,EAA+C;EAC7C;EACA;EACA;EACA,MAAA,IAAI8B,MAAM,CAACE,YAAP,KAAwB9B,cAA5B,EAA4C;EAC1C,QAAO6B,OAAAA,OAAO,KAAK,MAAnB,CAAA;EACD,OAN4C;EAS7C;;;EACA,MAAA,IAAID,MAAM,CAACE,YAAP,KAAwB/B,aAA5B,EAA2C;EACzC,QAAA,OAAO8B,OAAO,KAAK,MAAZ,IAAsBN,uBAAuB,CAACQ,aAAD,CAApD,CAAA;EACD,OAZ4C;EAe7C;;;EACA,MAAA,OAAOC,OAAO,CAACN,eAAe,CAACG,OAAD,CAAhB,CAAd,CAAA;EACD,KAAA;;EAED,IAAA,IAAIzJ,OAAO,CAAC0J,YAAR,KAAyB9B,cAA7B,EAA6C;EAC3C;EACA;EACA;EACA,MACE4B,IAAAA,MAAM,CAACE,YAAP,KAAwB/B,aAAxB,IACA,CAACwB,uBAAuB,CAACQ,aAAD,CAF1B,EAGE;EACA,QAAA,OAAO,KAAP,CAAA;EACD,OAAA;;EAED,MACEH,IAAAA,MAAM,CAACE,YAAP,KAAwBhC,gBAAxB,IACA,CAACwB,8BAA8B,CAACS,aAAD,CAFjC,EAGE;EACA,QAAA,OAAO,KAAP,CAAA;EACD,OAhB0C;EAmB3C;;;EACA,MAAA,OACE,CAACL,eAAe,CAACG,OAAD,CAAhB,KACCL,4BAA4B,CAACK,OAAD,CAA5B,IAAyC,CAACJ,YAAY,CAACI,OAAD,CADvD,CADF,CAAA;EAID,KAtF6C;;;EAyF9C,IACExB,IAAAA,iBAAiB,KAAK,uBAAtB,IACAF,kBAAkB,CAAC/H,OAAO,CAAC0J,YAAT,CAFpB,EAGE;EACA,MAAA,OAAO,IAAP,CAAA;EACD,KA9F6C;EAiG9C;EACA;EACA;;;EACA,IAAA,OAAO,KAAP,CAAA;EACD,GArGD,CAAA;EAuGA;EACF;EACA;EACA;EACA;;;EACE,EAAA,MAAMG,YAAY,GAAG,SAAfA,YAAe,CAAUC,IAAV,EAAgB;EACnC3L,IAAAA,SAAS,CAAC6E,SAAS,CAACI,OAAX,EAAoB;EAAEpD,MAAAA,OAAO,EAAE8J,IAAAA;EAAX,KAApB,CAAT,CAAA;;EACA,IAAI,IAAA;EACF;EACAA,MAAAA,IAAI,CAACC,UAAL,CAAgBC,WAAhB,CAA4BF,IAA5B,CAAA,CAAA;EACD,KAHD,CAGE,OAAOhH,CAAP,EAAU;EACVgH,MAAAA,IAAI,CAACG,MAAL,EAAA,CAAA;EACD,KAAA;EACF,GARD,CAAA;EAUA;EACF;EACA;EACA;EACA;EACA;;;EACE,EAAMC,MAAAA,gBAAgB,GAAG,SAAnBA,gBAAmB,CAAUC,IAAV,EAAgBL,IAAhB,EAAsB;EAC7C,IAAI,IAAA;EACF3L,MAAAA,SAAS,CAAC6E,SAAS,CAACI,OAAX,EAAoB;EAC3BgH,QAAAA,SAAS,EAAEN,IAAI,CAACO,gBAAL,CAAsBF,IAAtB,CADgB;EAE3BG,QAAAA,IAAI,EAAER,IAAAA;EAFqB,OAApB,CAAT,CAAA;EAID,KALD,CAKE,OAAOhH,CAAP,EAAU;EACV3E,MAAAA,SAAS,CAAC6E,SAAS,CAACI,OAAX,EAAoB;EAC3BgH,QAAAA,SAAS,EAAE,IADgB;EAE3BE,QAAAA,IAAI,EAAER,IAAAA;EAFqB,OAApB,CAAT,CAAA;EAID,KAAA;;EAEDA,IAAAA,IAAI,CAACS,eAAL,CAAqBJ,IAArB,EAb6C;;EAgB7C,IAAIA,IAAAA,IAAI,KAAK,IAAT,IAAiB,CAAC5E,YAAY,CAAC4E,IAAD,CAAlC,EAA0C;EACxC,MAAIxD,IAAAA,UAAU,IAAIC,mBAAlB,EAAuC;EACrC,QAAI,IAAA;EACFiD,UAAAA,YAAY,CAACC,IAAD,CAAZ,CAAA;EACD,SAFD,CAEE,OAAOhH,CAAP,EAAU,EAAE;EACf,OAJD,MAIO;EACL,QAAI,IAAA;EACFgH,UAAAA,IAAI,CAACU,YAAL,CAAkBL,IAAlB,EAAwB,EAAxB,CAAA,CAAA;EACD,SAFD,CAEE,OAAOrH,CAAP,EAAU,EAAE;EACf,OAAA;EACF,KAAA;EACF,GA3BD,CAAA;EA6BA;EACF;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAM2H,aAAa,GAAG,SAAhBA,aAAgB,CAAUC,KAAV,EAAiB;EACrC;EACA,IAAA,IAAIC,GAAJ,CAAA;EACA,IAAA,IAAIC,iBAAJ,CAAA;;EAEA,IAAA,IAAIlE,UAAJ,EAAgB;EACdgE,MAAAA,KAAK,GAAG,mBAAA,GAAsBA,KAA9B,CAAA;EACD,KAFD,MAEO;EACL;EACA,MAAA,MAAMG,OAAO,GAAGnM,WAAW,CAACgM,KAAD,EAAQ,aAAR,CAA3B,CAAA;EACAE,MAAAA,iBAAiB,GAAGC,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAtC,CAAA;EACD,KAAA;;EAED,IAAA,IACE5C,iBAAiB,KAAK,uBAAtB,IACAJ,SAAS,KAAKD,cAFhB,EAGE;EACA;EACA8C,MAAAA,KAAK,GACH,gEACAA,GAAAA,KADA,GAEA,gBAHF,CAAA;EAID,KAAA;;EAED,IAAMI,MAAAA,YAAY,GAAGpG,kBAAkB,GACnCA,kBAAkB,CAAC/B,UAAnB,CAA8B+H,KAA9B,CADmC,GAEnCA,KAFJ,CAAA;EAGA;EACJ;EACA;EACA;;EACI,IAAI7C,IAAAA,SAAS,KAAKD,cAAlB,EAAkC;EAChC,MAAI,IAAA;EACF+C,QAAAA,GAAG,GAAG,IAAI3G,SAAJ,EAAA,CAAgB+G,eAAhB,CAAgCD,YAAhC,EAA8C7C,iBAA9C,CAAN,CAAA;EACD,OAFD,CAEE,OAAOnF,CAAP,EAAU,EAAE;EACf,KAAA;EAED;;;EACA,IAAA,IAAI,CAAC6H,GAAD,IAAQ,CAACA,GAAG,CAACK,eAAjB,EAAkC;EAChCL,MAAAA,GAAG,GAAG/F,cAAc,CAACqG,cAAf,CAA8BpD,SAA9B,EAAyC,UAAzC,EAAqD,IAArD,CAAN,CAAA;;EACA,MAAI,IAAA;EACF8C,QAAAA,GAAG,CAACK,eAAJ,CAAoBE,SAApB,GAAgCpD,cAAc,GAC1CnD,SAD0C,GAE1CmG,YAFJ,CAAA;EAGD,OAJD,CAIE,OAAOhI,CAAP,EAAU;EAEX,OAAA;EACF,KAAA;;EAED,IAAMqI,MAAAA,IAAI,GAAGR,GAAG,CAACQ,IAAJ,IAAYR,GAAG,CAACK,eAA7B,CAAA;;EAEA,IAAIN,IAAAA,KAAK,IAAIE,iBAAb,EAAgC;EAC9BO,MAAAA,IAAI,CAACC,YAAL,CACEjJ,QAAQ,CAACkJ,cAAT,CAAwBT,iBAAxB,CADF,EAEEO,IAAI,CAACG,UAAL,CAAgB,CAAhB,KAAsB,IAFxB,CAAA,CAAA;EAID,KAAA;EAED;;;EACA,IAAIzD,IAAAA,SAAS,KAAKD,cAAlB,EAAkC;EAChC,MAAA,OAAO7C,oBAAoB,CAACwG,IAArB,CACLZ,GADK,EAELnE,cAAc,GAAG,MAAH,GAAY,MAFrB,CAAA,CAGL,CAHK,CAAP,CAAA;EAID,KAAA;;EAED,IAAA,OAAOA,cAAc,GAAGmE,GAAG,CAACK,eAAP,GAAyBG,IAA9C,CAAA;EACD,GAnED,CAAA;EAqEA;EACF;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAMK,eAAe,GAAG,SAAlBA,eAAkB,CAAUvI,IAAV,EAAgB;EACtC,IAAO4B,OAAAA,kBAAkB,CAAC0G,IAAnB,CACLtI,IAAI,CAACwB,aAAL,IAAsBxB,IADjB,EAELA,IAFK;EAILW,IAAAA,UAAU,CAAC6H,YAAX,GAA0B7H,UAAU,CAAC8H,YAArC,GAAoD9H,UAAU,CAAC+H,SAJ1D,EAKL,IALK,EAML,KANK,CAAP,CAAA;EAQD,GATD,CAAA;EAWA;EACF;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAMC,YAAY,GAAG,SAAfA,YAAe,CAAUC,GAAV,EAAe;EAClC,IAAA,OACEA,GAAG,YAAY9H,eAAf,KACC,OAAO8H,GAAG,CAACC,QAAX,KAAwB,QAAxB,IACC,OAAOD,GAAG,CAACE,WAAX,KAA2B,QAD5B,IAEC,OAAOF,GAAG,CAAC7B,WAAX,KAA2B,UAF5B,IAGC,EAAE6B,GAAG,CAACG,UAAJ,YAA0BnI,YAA5B,CAHD,IAIC,OAAOgI,GAAG,CAACtB,eAAX,KAA+B,UAJhC,IAKC,OAAOsB,GAAG,CAACrB,YAAX,KAA4B,UAL7B,IAMC,OAAOqB,GAAG,CAACnC,YAAX,KAA4B,QAN7B,IAOC,OAAOmC,GAAG,CAACT,YAAX,KAA4B,UAP7B,IAQC,OAAOS,GAAG,CAACI,aAAX,KAA6B,UAT/B,CADF,CAAA;EAYD,GAbD,CAAA;EAeA;EACF;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAMC,OAAO,GAAG,SAAVA,OAAU,CAAU/L,MAAV,EAAkB;EAChC,IAAA,OAAO,OAAOuD,IAAP,KAAgB,QAAhB,GACHvD,MAAM,YAAYuD,IADf,GAEHvD,MAAM,IACJ,OAAOA,MAAP,KAAkB,QADpB,IAEE,OAAOA,MAAM,CAACkD,QAAd,KAA2B,QAF7B,IAGE,OAAOlD,MAAM,CAAC2L,QAAd,KAA2B,QALjC,CAAA;EAMD,GAPD,CAAA;EASA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;;;EACE,EAAMK,MAAAA,YAAY,GAAG,SAAfA,YAAe,CAAUC,UAAV,EAAsBC,WAAtB,EAAmCC,IAAnC,EAAyC;EAC5D,IAAA,IAAI,CAACrH,KAAK,CAACmH,UAAD,CAAV,EAAwB;EACtB,MAAA,OAAA;EACD,KAAA;;EAEDxO,IAAAA,YAAY,CAACqH,KAAK,CAACmH,UAAD,CAAN,EAAqBG,IAAD,IAAU;EACxCA,MAAAA,IAAI,CAAChB,IAAL,CAAUvI,SAAV,EAAqBqJ,WAArB,EAAkCC,IAAlC,EAAwClE,MAAxC,CAAA,CAAA;EACD,KAFW,CAAZ,CAAA;EAGD,GARD,CAAA;EAUA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAMoE,iBAAiB,GAAG,SAApBA,iBAAoB,CAAUH,WAAV,EAAuB;EAC/C,IAAA,IAAI7H,OAAJ,CAAA;EAEA;;EACA2H,IAAAA,YAAY,CAAC,wBAAD,EAA2BE,WAA3B,EAAwC,IAAxC,CAAZ,CAAA;EAEA;;;EACA,IAAA,IAAIT,YAAY,CAACS,WAAD,CAAhB,EAA+B;EAC7BxC,MAAAA,YAAY,CAACwC,WAAD,CAAZ,CAAA;;EACA,MAAA,OAAO,IAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,MAAM5C,OAAO,GAAG5J,iBAAiB,CAACwM,WAAW,CAACP,QAAb,CAAjC,CAAA;EAEA;;EACAK,IAAAA,YAAY,CAAC,qBAAD,EAAwBE,WAAxB,EAAqC;EAC/C5C,MAAAA,OAD+C;EAE/CgD,MAAAA,WAAW,EAAErH,YAAAA;EAFkC,KAArC,CAAZ,CAAA;EAKA;;;EACA,IACEiH,IAAAA,WAAW,CAACJ,aAAZ,EAAA,IACA,CAACC,OAAO,CAACG,WAAW,CAACK,iBAAb,CADR,KAEC,CAACR,OAAO,CAACG,WAAW,CAAC7H,OAAb,CAAR,IACC,CAAC0H,OAAO,CAACG,WAAW,CAAC7H,OAAZ,CAAoBkI,iBAArB,CAHV,KAIAxN,UAAU,CAAC,SAAD,EAAYmN,WAAW,CAACnB,SAAxB,CAJV,IAKAhM,UAAU,CAAC,SAAD,EAAYmN,WAAW,CAACN,WAAxB,CANZ,EAOE;EACAlC,MAAAA,YAAY,CAACwC,WAAD,CAAZ,CAAA;;EACA,MAAA,OAAO,IAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAI,IAAA,CAACjH,YAAY,CAACqE,OAAD,CAAb,IAA0BxD,WAAW,CAACwD,OAAD,CAAzC,EAAoD;EAClD;EACA,MAAI,IAAA,CAACxD,WAAW,CAACwD,OAAD,CAAZ,IAAyBkD,uBAAuB,CAAClD,OAAD,CAApD,EAA+D;EAC7D,QAAA,IACE/D,uBAAuB,CAACC,YAAxB,YAAgDxG,MAAhD,IACAD,UAAU,CAACwG,uBAAuB,CAACC,YAAzB,EAAuC8D,OAAvC,CAFZ,EAIE,OAAO,KAAP,CAAA;EACF,QAAA,IACE/D,uBAAuB,CAACC,YAAxB,YAAgD6C,QAAhD,IACA9C,uBAAuB,CAACC,YAAxB,CAAqC8D,OAArC,CAFF,EAIE,OAAO,KAAP,CAAA;EACH,OAAA;EAED;;;EACA,MAAA,IAAIxC,YAAY,IAAI,CAACG,eAAe,CAACqC,OAAD,CAApC,EAA+C;EAC7C,QAAMM,MAAAA,UAAU,GAAG1F,aAAa,CAACgI,WAAD,CAAb,IAA8BA,WAAW,CAACtC,UAA7D,CAAA;EACA,QAAMuB,MAAAA,UAAU,GAAGlH,aAAa,CAACiI,WAAD,CAAb,IAA8BA,WAAW,CAACf,UAA7D,CAAA;;EAEA,QAAIA,IAAAA,UAAU,IAAIvB,UAAlB,EAA8B;EAC5B,UAAA,MAAM6C,UAAU,GAAGtB,UAAU,CAACvL,MAA9B,CAAA;;EAEA,UAAA,KAAK,IAAI8M,CAAC,GAAGD,UAAU,GAAG,CAA1B,EAA6BC,CAAC,IAAI,CAAlC,EAAqC,EAAEA,CAAvC,EAA0C;EACxC9C,YAAAA,UAAU,CAACqB,YAAX,CACElH,SAAS,CAACoH,UAAU,CAACuB,CAAD,CAAX,EAAgB,IAAhB,CADX,EAEE1I,cAAc,CAACkI,WAAD,CAFhB,CAAA,CAAA;EAID,WAAA;EACF,SAAA;EACF,OAAA;;EAEDxC,MAAAA,YAAY,CAACwC,WAAD,CAAZ,CAAA;;EACA,MAAA,OAAO,IAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAIA,IAAAA,WAAW,YAAY1I,OAAvB,IAAkC,CAAC4F,oBAAoB,CAAC8C,WAAD,CAA3D,EAA0E;EACxExC,MAAAA,YAAY,CAACwC,WAAD,CAAZ,CAAA;;EACA,MAAA,OAAO,IAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IACE,CAAC5C,OAAO,KAAK,UAAZ,IAA0BA,OAAO,KAAK,SAAvC,KACAvK,UAAU,CAAC,sBAAD,EAAyBmN,WAAW,CAACnB,SAArC,CAFZ,EAGE;EACArB,MAAAA,YAAY,CAACwC,WAAD,CAAZ,CAAA;;EACA,MAAA,OAAO,IAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAI9F,kBAAkB,IAAI8F,WAAW,CAAChJ,QAAZ,KAAyB,CAAnD,EAAsD;EACpD;EACAmB,MAAAA,OAAO,GAAG6H,WAAW,CAACN,WAAtB,CAAA;EACAvH,MAAAA,OAAO,GAAG5F,aAAa,CAAC4F,OAAD,EAAUlD,aAAV,EAAyB,GAAzB,CAAvB,CAAA;EACAkD,MAAAA,OAAO,GAAG5F,aAAa,CAAC4F,OAAD,EAAUjD,QAAV,EAAoB,GAApB,CAAvB,CAAA;EACAiD,MAAAA,OAAO,GAAG5F,aAAa,CAAC4F,OAAD,EAAUhD,WAAV,EAAuB,GAAvB,CAAvB,CAAA;;EACA,MAAA,IAAI6K,WAAW,CAACN,WAAZ,KAA4BvH,OAAhC,EAAyC;EACvCrG,QAAAA,SAAS,CAAC6E,SAAS,CAACI,OAAX,EAAoB;EAAEpD,UAAAA,OAAO,EAAEqM,WAAW,CAACnI,SAAZ,EAAA;EAAX,SAApB,CAAT,CAAA;EACAmI,QAAAA,WAAW,CAACN,WAAZ,GAA0BvH,OAA1B,CAAA;EACD,OAAA;EACF,KAAA;EAED;;;EACA2H,IAAAA,YAAY,CAAC,uBAAD,EAA0BE,WAA1B,EAAuC,IAAvC,CAAZ,CAAA;;EAEA,IAAA,OAAO,KAAP,CAAA;EACD,GAvGD,CAAA;EAyGA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACE;;;EACA,EAAMS,MAAAA,iBAAiB,GAAG,SAApBA,iBAAoB,CAAUC,KAAV,EAAiBC,MAAjB,EAAyB1M,KAAzB,EAAgC;EACxD;EACA,IAAA,IACEwG,YAAY,KACXkG,MAAM,KAAK,IAAX,IAAmBA,MAAM,KAAK,MADnB,CAAZ,KAEC1M,KAAK,IAAI6B,QAAT,IAAqB7B,KAAK,IAAI+H,WAF/B,CADF,EAIE;EACA,MAAA,OAAO,KAAP,CAAA;EACD,KAAA;EAED;EACJ;EACA;EACA;;;EACI,IAAA,IACEjC,eAAe,IACf,CAACF,WAAW,CAAC8G,MAAD,CADZ,IAEA9N,UAAU,CAACuC,SAAD,EAAYuL,MAAZ,CAHZ,EAIE,CAJF,MAMO,IAAI7G,eAAe,IAAIjH,UAAU,CAACwC,SAAD,EAAYsL,MAAZ,CAAjC,EAAsD,CAAtD,MAGA,IAAI,CAACzH,YAAY,CAACyH,MAAD,CAAb,IAAyB9G,WAAW,CAAC8G,MAAD,CAAxC,EAAkD;EACvD,MACE;EACA;EACA;EACCL,MAAAA,uBAAuB,CAACI,KAAD,CAAvB,KACGrH,uBAAuB,CAACC,YAAxB,YAAgDxG,MAAhD,IACAD,UAAU,CAACwG,uBAAuB,CAACC,YAAzB,EAAuCoH,KAAvC,CADX,IAEErH,uBAAuB,CAACC,YAAxB,YAAgD6C,QAAhD,IACC9C,uBAAuB,CAACC,YAAxB,CAAqCoH,KAArC,CAJL,CAKGrH,KAAAA,uBAAuB,CAACK,kBAAxB,YAAsD5G,MAAtD,IACAD,UAAU,CAACwG,uBAAuB,CAACK,kBAAzB,EAA6CiH,MAA7C,CADX,IAEEtH,uBAAuB,CAACK,kBAAxB,YAAsDyC,QAAtD,IACC9C,uBAAuB,CAACK,kBAAxB,CAA2CiH,MAA3C,CARL,CAAD;EAUA;EACCA,MAAAA,MAAM,KAAK,IAAX,IACCtH,uBAAuB,CAACM,8BADzB,KAEGN,uBAAuB,CAACC,YAAxB,YAAgDxG,MAAhD,IACAD,UAAU,CAACwG,uBAAuB,CAACC,YAAzB,EAAuCrF,KAAvC,CADX,IAEEoF,uBAAuB,CAACC,YAAxB,YAAgD6C,QAAhD,IACC9C,uBAAuB,CAACC,YAAxB,CAAqCrF,KAArC,CALL,CAfH,EAqBE,CArBF,MAwBO;EACL,QAAA,OAAO,KAAP,CAAA;EACD,OAAA;EACD;;EACD,KA7BM,MA6BA,IAAIkH,mBAAmB,CAACwF,MAAD,CAAvB,EAAiC,CAAjC,MAIA,IACL9N,UAAU,CAACyC,gBAAD,EAAiB/C,aAAa,CAAC0B,KAAD,EAAQuB,eAAR,EAAyB,EAAzB,CAA9B,CADL,EAEL,CAFK,MAMA,IACL,CAACmL,MAAM,KAAK,KAAX,IAAoBA,MAAM,KAAK,YAA/B,IAA+CA,MAAM,KAAK,MAA3D,KACAD,KAAK,KAAK,QADV,IAEAjO,aAAa,CAACwB,KAAD,EAAQ,OAAR,CAAb,KAAkC,CAFlC,IAGAgH,aAAa,CAACyF,KAAD,CAJR,EAKL,CALK,MAUA,IACL1G,uBAAuB,IACvB,CAACnH,UAAU,CAAC0C,iBAAD,EAAoBhD,aAAa,CAAC0B,KAAD,EAAQuB,eAAR,EAAyB,EAAzB,CAAjC,CAFN,EAGL,CAHK,MAOA,IAAI,CAACvB,KAAL,EAAY,CAAZ,MAGA;EACL,MAAA,OAAO,KAAP,CAAA;EACD,KAAA;;EAED,IAAA,OAAO,IAAP,CAAA;EACD,GAvFD,CAAA;EAyFA;EACF;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAMqM,uBAAuB,GAAG,SAA1BA,uBAA0B,CAAUlD,OAAV,EAAmB;EACjD,IAAA,OAAOA,OAAO,CAAC1K,OAAR,CAAgB,GAAhB,IAAuB,CAA9B,CAAA;EACD,GAFD,CAAA;EAIA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EACE,EAAA,MAAMkO,mBAAmB,GAAG,SAAtBA,mBAAsB,CAAUZ,WAAV,EAAuB;EACjD,IAAA,IAAIa,IAAJ,CAAA;EACA,IAAA,IAAI5M,KAAJ,CAAA;EACA,IAAA,IAAI0M,MAAJ,CAAA;EACA,IAAA,IAAIlN,CAAJ,CAAA;EACA;;EACAqM,IAAAA,YAAY,CAAC,0BAAD,EAA6BE,WAA7B,EAA0C,IAA1C,CAAZ,CAAA;;EAEA,IAAM,MAAA;EAAEL,MAAAA,UAAAA;EAAF,KAAA,GAAiBK,WAAvB,CAAA;EAEA;;EACA,IAAI,IAAA,CAACL,UAAL,EAAiB;EACf,MAAA,OAAA;EACD,KAAA;;EAED,IAAA,MAAMmB,SAAS,GAAG;EAChBC,MAAAA,QAAQ,EAAE,EADM;EAEhBC,MAAAA,SAAS,EAAE,EAFK;EAGhBC,MAAAA,QAAQ,EAAE,IAHM;EAIhBC,MAAAA,iBAAiB,EAAEhI,YAAAA;EAJH,KAAlB,CAAA;EAMAzF,IAAAA,CAAC,GAAGkM,UAAU,CAACjM,MAAf,CAAA;EAEA;;EACA,IAAOD,OAAAA,CAAC,EAAR,EAAY;EACVoN,MAAAA,IAAI,GAAGlB,UAAU,CAAClM,CAAD,CAAjB,CAAA;EACA,MAAM,MAAA;EAAEqK,QAAAA,IAAF;EAAQT,QAAAA,YAAAA;EAAR,OAAA,GAAyBwD,IAA/B,CAAA;EACA5M,MAAAA,KAAK,GAAG6J,IAAI,KAAK,OAAT,GAAmB+C,IAAI,CAAC5M,KAAxB,GAAgCtB,UAAU,CAACkO,IAAI,CAAC5M,KAAN,CAAlD,CAAA;EACA0M,MAAAA,MAAM,GAAGnN,iBAAiB,CAACsK,IAAD,CAA1B,CAAA;EAEA;;EACAgD,MAAAA,SAAS,CAACC,QAAV,GAAqBJ,MAArB,CAAA;EACAG,MAAAA,SAAS,CAACE,SAAV,GAAsB/M,KAAtB,CAAA;EACA6M,MAAAA,SAAS,CAACG,QAAV,GAAqB,IAArB,CAAA;EACAH,MAAAA,SAAS,CAACK,aAAV,GAA0BC,SAA1B,CAVU;;EAWVtB,MAAAA,YAAY,CAAC,uBAAD,EAA0BE,WAA1B,EAAuCc,SAAvC,CAAZ,CAAA;;EACA7M,MAAAA,KAAK,GAAG6M,SAAS,CAACE,SAAlB,CAAA;EACA;;EACA,MAAIF,IAAAA,SAAS,CAACK,aAAd,EAA6B;EAC3B,QAAA,SAAA;EACD,OAAA;EAED;;;EACAtD,MAAAA,gBAAgB,CAACC,IAAD,EAAOkC,WAAP,CAAhB,CAAA;EAEA;;;EACA,MAAA,IAAI,CAACc,SAAS,CAACG,QAAf,EAAyB;EACvB,QAAA,SAAA;EACD,OAAA;EAED;;;EACA,MAAI,IAAA,CAAChH,wBAAD,IAA6BpH,UAAU,CAAC,MAAD,EAASoB,KAAT,CAA3C,EAA4D;EAC1D4J,QAAAA,gBAAgB,CAACC,IAAD,EAAOkC,WAAP,CAAhB,CAAA;;EACA,QAAA,SAAA;EACD,OAAA;EAED;;;EACA,MAAA,IAAI9F,kBAAJ,EAAwB;EACtBjG,QAAAA,KAAK,GAAG1B,aAAa,CAAC0B,KAAD,EAAQgB,aAAR,EAAuB,GAAvB,CAArB,CAAA;EACAhB,QAAAA,KAAK,GAAG1B,aAAa,CAAC0B,KAAD,EAAQiB,QAAR,EAAkB,GAAlB,CAArB,CAAA;EACAjB,QAAAA,KAAK,GAAG1B,aAAa,CAAC0B,KAAD,EAAQkB,WAAR,EAAqB,GAArB,CAArB,CAAA;EACD,OAAA;EAED;;;EACA,MAAA,MAAMuL,KAAK,GAAGlN,iBAAiB,CAACwM,WAAW,CAACP,QAAb,CAA/B,CAAA;;EACA,MAAI,IAAA,CAACgB,iBAAiB,CAACC,KAAD,EAAQC,MAAR,EAAgB1M,KAAhB,CAAtB,EAA8C;EAC5C,QAAA,SAAA;EACD,OAAA;EAED;EACN;EACA;;;EACM,MAAIyG,IAAAA,oBAAoB,KAAKiG,MAAM,KAAK,IAAX,IAAmBA,MAAM,KAAK,MAAnC,CAAxB,EAAoE;EAClE;EACA9C,QAAAA,gBAAgB,CAACC,IAAD,EAAOkC,WAAP,CAAhB,CAFkE;;;EAKlE/L,QAAAA,KAAK,GAAG0G,2BAA2B,GAAG1G,KAAtC,CAAA;EACD,OAAA;EAED;;;EACA,MAAA,IACEoE,kBAAkB,IAClB,OAAOxC,YAAP,KAAwB,QADxB,IAEA,OAAOA,YAAY,CAACwL,gBAApB,KAAyC,UAH3C,EAIE;EACA,QAAA,IAAIhE,YAAJ,EAAkB,CAAlB,MAEO;EACL,UAAA,QAAQxH,YAAY,CAACwL,gBAAb,CAA8BX,KAA9B,EAAqCC,MAArC,CAAR;EACE,YAAA,KAAK,aAAL;EACE1M,cAAAA,KAAK,GAAGoE,kBAAkB,CAAC/B,UAAnB,CAA8BrC,KAA9B,CAAR,CAAA;EACA,cAAA,MAAA;;EACF,YAAA,KAAK,kBAAL;EACEA,cAAAA,KAAK,GAAGoE,kBAAkB,CAAC9B,eAAnB,CAAmCtC,KAAnC,CAAR,CAAA;EACA,cAAA,MAAA;EANJ,WAAA;EAUD,SAAA;EACF,OAAA;EAED;;;EACA,MAAI,IAAA;EACF,QAAA,IAAIoJ,YAAJ,EAAkB;EAChB2C,UAAAA,WAAW,CAACsB,cAAZ,CAA2BjE,YAA3B,EAAyCS,IAAzC,EAA+C7J,KAA/C,CAAA,CAAA;EACD,SAFD,MAEO;EACL;EACA+L,UAAAA,WAAW,CAAC7B,YAAZ,CAAyBL,IAAzB,EAA+B7J,KAA/B,CAAA,CAAA;EACD,SAAA;;EAEDrC,QAAAA,QAAQ,CAAC+E,SAAS,CAACI,OAAX,CAAR,CAAA;EACD,OATD,CASE,OAAON,CAAP,EAAU,EAAE;EACf,KAAA;EAED;;;EACAqJ,IAAAA,YAAY,CAAC,yBAAD,EAA4BE,WAA5B,EAAyC,IAAzC,CAAZ,CAAA;EACD,GArHD,CAAA;EAuHA;EACF;EACA;EACA;EACA;;;EACE,EAAA,MAAMuB,kBAAkB,GAAG,SAArBA,kBAAqB,CAAUC,QAAV,EAAoB;EAC7C,IAAA,IAAIC,UAAJ,CAAA;;EACA,IAAA,MAAMC,cAAc,GAAGvC,eAAe,CAACqC,QAAD,CAAtC,CAAA;EAEA;;;EACA1B,IAAAA,YAAY,CAAC,yBAAD,EAA4B0B,QAA5B,EAAsC,IAAtC,CAAZ,CAAA;;EAEA,IAAA,OAAQC,UAAU,GAAGC,cAAc,CAACC,QAAf,EAArB,EAAiD;EAC/C;EACA7B,MAAAA,YAAY,CAAC,wBAAD,EAA2B2B,UAA3B,EAAuC,IAAvC,CAAZ,CAAA;EAEA;;;EACA,MAAA,IAAItB,iBAAiB,CAACsB,UAAD,CAArB,EAAmC;EACjC,QAAA,SAAA;EACD,OAAA;EAED;;;EACA,MAAA,IAAIA,UAAU,CAACtJ,OAAX,YAA8BhB,gBAAlC,EAAoD;EAClDoK,QAAAA,kBAAkB,CAACE,UAAU,CAACtJ,OAAZ,CAAlB,CAAA;EACD,OAAA;EAED;;;EACAyI,MAAAA,mBAAmB,CAACa,UAAD,CAAnB,CAAA;EACD,KAAA;EAED;;;EACA3B,IAAAA,YAAY,CAAC,wBAAD,EAA2B0B,QAA3B,EAAqC,IAArC,CAAZ,CAAA;EACD,GA3BD,CAAA;EA6BA;EACF;EACA;EACA;EACA;EACA;EACA;EACE;;;EACA7K,EAAAA,SAAS,CAACiL,QAAV,GAAqB,UAAUvD,KAAV,EAA2B;EAAA,IAAVhC,IAAAA,GAAU,uEAAJ,EAAI,CAAA;EAC9C,IAAA,IAAIyC,IAAJ,CAAA;EACA,IAAA,IAAI+C,YAAJ,CAAA;EACA,IAAA,IAAI7B,WAAJ,CAAA;EACA,IAAA,IAAI8B,UAAJ,CAAA;EACA;EACJ;EACA;;EACIrG,IAAAA,cAAc,GAAG,CAAC4C,KAAlB,CAAA;;EACA,IAAA,IAAI5C,cAAJ,EAAoB;EAClB4C,MAAAA,KAAK,GAAG,OAAR,CAAA;EACD,KAAA;EAED;;;EACA,IAAI,IAAA,OAAOA,KAAP,KAAiB,QAAjB,IAA6B,CAACwB,OAAO,CAACxB,KAAD,CAAzC,EAAkD;EAChD;EACA,MAAA,IAAI,OAAOA,KAAK,CAACjM,QAAb,KAA0B,UAA9B,EAA0C;EACxC,QAAMY,MAAAA,eAAe,CAAC,4BAAD,CAArB,CAAA;EACD,OAFD,MAEO;EACLqL,QAAAA,KAAK,GAAGA,KAAK,CAACjM,QAAN,EAAR,CAAA;;EACA,QAAA,IAAI,OAAOiM,KAAP,KAAiB,QAArB,EAA+B;EAC7B,UAAMrL,MAAAA,eAAe,CAAC,iCAAD,CAArB,CAAA;EACD,SAAA;EACF,OAAA;EACF,KAAA;EAED;;;EACA,IAAA,IAAI,CAAC2D,SAAS,CAACM,WAAf,EAA4B;EAC1B,MAAA,OAAOoH,KAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAI,IAAA,CAACjE,UAAL,EAAiB;EACfgC,MAAAA,YAAY,CAACC,GAAD,CAAZ,CAAA;EACD,KAAA;EAED;;;EACA1F,IAAAA,SAAS,CAACI,OAAV,GAAoB,EAApB,CAAA;EAEA;;EACA,IAAA,IAAI,OAAOsH,KAAP,KAAiB,QAArB,EAA+B;EAC7BxD,MAAAA,QAAQ,GAAG,KAAX,CAAA;EACD,KAAA;;EAED,IAAA,IAAIA,QAAJ,EAAc;EACZ;EACA,MAAIwD,IAAAA,KAAK,CAACoB,QAAV,EAAoB;EAClB,QAAA,MAAMrC,OAAO,GAAG5J,iBAAiB,CAAC6K,KAAK,CAACoB,QAAP,CAAjC,CAAA;;EACA,QAAI,IAAA,CAAC1G,YAAY,CAACqE,OAAD,CAAb,IAA0BxD,WAAW,CAACwD,OAAD,CAAzC,EAAoD;EAClD,UAAMpK,MAAAA,eAAe,CACnB,yDADmB,CAArB,CAAA;EAGD,SAAA;EACF,OAAA;EACF,KAVD,MAUO,IAAIqL,KAAK,YAAYhH,IAArB,EAA2B;EAChC;EACN;EACMyH,MAAAA,IAAI,GAAGV,aAAa,CAAC,SAAD,CAApB,CAAA;EACAyD,MAAAA,YAAY,GAAG/C,IAAI,CAAC1G,aAAL,CAAmBO,UAAnB,CAA8B0F,KAA9B,EAAqC,IAArC,CAAf,CAAA;;EACA,MAAIwD,IAAAA,YAAY,CAAC7K,QAAb,KAA0B,CAA1B,IAA+B6K,YAAY,CAACpC,QAAb,KAA0B,MAA7D,EAAqE;EACnE;EACAX,QAAAA,IAAI,GAAG+C,YAAP,CAAA;EACD,OAHD,MAGO,IAAIA,YAAY,CAACpC,QAAb,KAA0B,MAA9B,EAAsC;EAC3CX,QAAAA,IAAI,GAAG+C,YAAP,CAAA;EACD,OAFM,MAEA;EACL;EACA/C,QAAAA,IAAI,CAACiD,WAAL,CAAiBF,YAAjB,CAAA,CAAA;EACD,OAAA;EACF,KAdM,MAcA;EACL;EACA,MACE,IAAA,CAACvH,UAAD,IACA,CAACJ,kBADD,IAEA,CAACC,cAFD;EAIAkE,MAAAA,KAAK,CAAC3L,OAAN,CAAc,GAAd,CAAuB,KAAA,CAAC,CAL1B,EAME;EACA,QAAO2F,OAAAA,kBAAkB,IAAImC,mBAAtB,GACHnC,kBAAkB,CAAC/B,UAAnB,CAA8B+H,KAA9B,CADG,GAEHA,KAFJ,CAAA;EAGD,OAAA;EAED;;;EACAS,MAAAA,IAAI,GAAGV,aAAa,CAACC,KAAD,CAApB,CAAA;EAEA;;EACA,MAAI,IAAA,CAACS,IAAL,EAAW;EACT,QAAOxE,OAAAA,UAAU,GAAG,IAAH,GAAUE,mBAAmB,GAAGlC,SAAH,GAAe,EAA7D,CAAA;EACD,OAAA;EACF,KAAA;EAED;;;EACA,IAAIwG,IAAAA,IAAI,IAAIzE,UAAZ,EAAwB;EACtBmD,MAAAA,YAAY,CAACsB,IAAI,CAACkD,UAAN,CAAZ,CAAA;EACD,KAAA;EAED;;;EACA,IAAMC,MAAAA,YAAY,GAAG9C,eAAe,CAACtE,QAAQ,GAAGwD,KAAH,GAAWS,IAApB,CAApC,CAAA;EAEA;;;EACA,IAAA,OAAQkB,WAAW,GAAGiC,YAAY,CAACN,QAAb,EAAtB,EAAgD;EAC9C;EACA,MAAA,IAAIxB,iBAAiB,CAACH,WAAD,CAArB,EAAoC;EAClC,QAAA,SAAA;EACD,OAAA;EAED;;;EACA,MAAA,IAAIA,WAAW,CAAC7H,OAAZ,YAA+BhB,gBAAnC,EAAqD;EACnDoK,QAAAA,kBAAkB,CAACvB,WAAW,CAAC7H,OAAb,CAAlB,CAAA;EACD,OAAA;EAED;;;EACAyI,MAAAA,mBAAmB,CAACZ,WAAD,CAAnB,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAInF,QAAJ,EAAc;EACZ,MAAA,OAAOwD,KAAP,CAAA;EACD,KAAA;EAED;;;EACA,IAAA,IAAI/D,UAAJ,EAAgB;EACd,MAAA,IAAIC,mBAAJ,EAAyB;EACvBuH,QAAAA,UAAU,GAAGrJ,sBAAsB,CAACyG,IAAvB,CAA4BJ,IAAI,CAAC1G,aAAjC,CAAb,CAAA;;EAEA,QAAO0G,OAAAA,IAAI,CAACkD,UAAZ,EAAwB;EACtB;EACAF,UAAAA,UAAU,CAACC,WAAX,CAAuBjD,IAAI,CAACkD,UAA5B,CAAA,CAAA;EACD,SAAA;EACF,OAPD,MAOO;EACLF,QAAAA,UAAU,GAAGhD,IAAb,CAAA;EACD,OAAA;;EAED,MAAA,IAAI5F,YAAY,CAACgJ,UAAb,IAA2BhJ,YAAY,CAACiJ,aAA5C,EAA2D;EACzD;EACR;EACA;EACA;EACA;EACA;EACA;EACQL,QAAAA,UAAU,GAAGnJ,UAAU,CAACuG,IAAX,CAAgBhI,gBAAhB,EAAkC4K,UAAlC,EAA8C,IAA9C,CAAb,CAAA;EACD,OAAA;;EAED,MAAA,OAAOA,UAAP,CAAA;EACD,KAAA;;EAED,IAAIM,IAAAA,cAAc,GAAGjI,cAAc,GAAG2E,IAAI,CAACuD,SAAR,GAAoBvD,IAAI,CAACD,SAA5D,CAAA;EAEA;;EACA,IAAA,IACE1E,cAAc,IACdpB,YAAY,CAAC,UAAD,CADZ,IAEA+F,IAAI,CAAC1G,aAFL,IAGA0G,IAAI,CAAC1G,aAAL,CAAmBkK,OAHnB,IAIAxD,IAAI,CAAC1G,aAAL,CAAmBkK,OAAnB,CAA2BxE,IAJ3B,IAKAjL,UAAU,CAACiG,YAAD,EAA2BgG,IAAI,CAAC1G,aAAL,CAAmBkK,OAAnB,CAA2BxE,IAAtD,CANZ,EAOE;EACAsE,MAAAA,cAAc,GACZ,YAAetD,GAAAA,IAAI,CAAC1G,aAAL,CAAmBkK,OAAnB,CAA2BxE,IAA1C,GAAiD,KAAjD,GAAyDsE,cAD3D,CAAA;EAED,KAAA;EAED;;;EACA,IAAA,IAAIlI,kBAAJ,EAAwB;EACtBkI,MAAAA,cAAc,GAAG7P,aAAa,CAAC6P,cAAD,EAAiBnN,aAAjB,EAAgC,GAAhC,CAA9B,CAAA;EACAmN,MAAAA,cAAc,GAAG7P,aAAa,CAAC6P,cAAD,EAAiBlN,QAAjB,EAA2B,GAA3B,CAA9B,CAAA;EACAkN,MAAAA,cAAc,GAAG7P,aAAa,CAAC6P,cAAD,EAAiBjN,WAAjB,EAA8B,GAA9B,CAA9B,CAAA;EACD,KAAA;;EAED,IAAOkD,OAAAA,kBAAkB,IAAImC,mBAAtB,GACHnC,kBAAkB,CAAC/B,UAAnB,CAA8B8L,cAA9B,CADG,GAEHA,cAFJ,CAAA;EAGD,GA5KD,CAAA;EA8KA;EACF;EACA;EACA;EACA;EACA;;;EACEzL,EAAAA,SAAS,CAAC4L,SAAV,GAAsB,UAAUlG,GAAV,EAAe;EACnCD,IAAAA,YAAY,CAACC,GAAD,CAAZ,CAAA;;EACAjC,IAAAA,UAAU,GAAG,IAAb,CAAA;EACD,GAHD,CAAA;EAKA;EACF;EACA;EACA;EACA;;;EACEzD,EAAAA,SAAS,CAAC6L,WAAV,GAAwB,YAAY;EAClCzG,IAAAA,MAAM,GAAG,IAAT,CAAA;EACA3B,IAAAA,UAAU,GAAG,KAAb,CAAA;EACD,GAHD,CAAA;EAKA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;EACEzD,EAAAA,SAAS,CAAC8L,gBAAV,GAA6B,UAAUC,GAAV,EAAe7B,IAAf,EAAqB5M,KAArB,EAA4B;EACvD;EACA,IAAI,IAAA,CAAC8H,MAAL,EAAa;EACXK,MAAAA,YAAY,CAAC,EAAD,CAAZ,CAAA;EACD,KAAA;;EAED,IAAA,MAAMsE,KAAK,GAAGlN,iBAAiB,CAACkP,GAAD,CAA/B,CAAA;EACA,IAAA,MAAM/B,MAAM,GAAGnN,iBAAiB,CAACqN,IAAD,CAAhC,CAAA;EACA,IAAA,OAAOJ,iBAAiB,CAACC,KAAD,EAAQC,MAAR,EAAgB1M,KAAhB,CAAxB,CAAA;EACD,GATD,CAAA;EAWA;EACF;EACA;EACA;EACA;EACA;EACA;;;EACE0C,EAAAA,SAAS,CAACgM,OAAV,GAAoB,UAAU5C,UAAV,EAAsB6C,YAAtB,EAAoC;EACtD,IAAA,IAAI,OAAOA,YAAP,KAAwB,UAA5B,EAAwC;EACtC,MAAA,OAAA;EACD,KAAA;;EAEDhK,IAAAA,KAAK,CAACmH,UAAD,CAAL,GAAoBnH,KAAK,CAACmH,UAAD,CAAL,IAAqB,EAAzC,CAAA;EACAjO,IAAAA,SAAS,CAAC8G,KAAK,CAACmH,UAAD,CAAN,EAAoB6C,YAApB,CAAT,CAAA;EACD,GAPD,CAAA;EASA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;;;EACEjM,EAAAA,SAAS,CAACkM,UAAV,GAAuB,UAAU9C,UAAV,EAAsB;EAC3C,IAAA,IAAInH,KAAK,CAACmH,UAAD,CAAT,EAAuB;EACrB,MAAA,OAAOnO,QAAQ,CAACgH,KAAK,CAACmH,UAAD,CAAN,CAAf,CAAA;EACD,KAAA;EACF,GAJD,CAAA;EAMA;EACF;EACA;EACA;EACA;EACA;;;EACEpJ,EAAAA,SAAS,CAACmM,WAAV,GAAwB,UAAU/C,UAAV,EAAsB;EAC5C,IAAA,IAAInH,KAAK,CAACmH,UAAD,CAAT,EAAuB;EACrBnH,MAAAA,KAAK,CAACmH,UAAD,CAAL,GAAoB,EAApB,CAAA;EACD,KAAA;EACF,GAJD,CAAA;EAMA;EACF;EACA;EACA;EACA;;;EACEpJ,EAAAA,SAAS,CAACoM,cAAV,GAA2B,YAAY;EACrCnK,IAAAA,KAAK,GAAG,EAAR,CAAA;EACD,GAFD,CAAA;;EAIA,EAAA,OAAOjC,SAAP,CAAA;EACD,CAAA;;AAED,eAAeD,eAAe,EAA9B;;;;;;;;"}
\ No newline at end of file
diff --git a/plugins/DOMPurify/purify.min.js b/plugins/DOMPurify/purify.min.js
new file mode 100644
index 000000000..62d1235a6
--- /dev/null
+++ b/plugins/DOMPurify/purify.min.js
@@ -0,0 +1,3 @@
+/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;c||(c=function(e,t,n){return e.apply(t,n)}),i||(i=function(e){return e}),a||(a=function(e){return e}),s||(s=function(e,t){return new e(...t)});const m=N(Array.prototype.forEach),u=N(Array.prototype.pop),p=N(Array.prototype.push),f=N(String.prototype.toLowerCase),d=N(String.prototype.toString),h=N(String.prototype.match),g=N(String.prototype.replace),y=N(String.prototype.indexOf),T=N(String.prototype.trim),E=N(RegExp.prototype.test),A=(b=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return s(b,t)});var b;function N(e){return function(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function _(e,o,r){r=r||f,t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function w(t){const n=l(null);for(const[o,r]of e(t))n[o]=r;return n}function R(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return N(n.get);if("function"==typeof n.value)return N(n.value)}e=o(e)}return function(e){return console.warn("fallback value for",e),null}}const S=i(["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"]),x=i(["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"]),D=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),k=i(["animate","color-profile","cursor","discard","fedropshadow","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"]),v=i(["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"]),C=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),L=i(["#text"]),O=i(["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"]),M=i(["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"]),I=i(["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"]),U=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),F=a(/\{\{[\w\W]*|[\w\W]*\}\}/gm),P=a(/<%[\w\W]*|[\w\W]*%>/gm),H=a(/\${[\w\W]*}/gm),z=a(/^data-[\-\w.\u00B7-\uFFFF]/),B=a(/^aria-[\-\w]+$/),W=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),G=a(/^(?:\w+script|data):/i),j=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i);var X=Object.freeze({__proto__:null,MUSTACHE_EXPR:F,ERB_EXPR:P,TMPLIT_EXPR:H,DATA_ATTR:z,ARIA_ATTR:B,IS_ALLOWED_URI:W,IS_SCRIPT_OR_DATA:G,ATTR_WHITESPACE:j,DOCTYPE_NAME:q});const Y=()=>"undefined"==typeof window?null:window,K=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(o)&&(n=t.currentScript.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}};var V=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Y();const o=e=>t(e);if(o.version="3.0.2",o.removed=[],!n||!n.document||9!==n.document.nodeType)return o.isSupported=!1,o;const r=n.document;let{document:a}=n;const{DocumentFragment:l,HTMLTemplateElement:c,Node:s,Element:b,NodeFilter:N,NamedNodeMap:F=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:P,DOMParser:H,trustedTypes:z}=n,B=b.prototype,G=R(B,"cloneNode"),j=R(B,"nextSibling"),V=R(B,"childNodes"),$=R(B,"parentNode");if("function"==typeof c){const e=a.createElement("template");e.content&&e.content.ownerDocument&&(a=e.content.ownerDocument)}const Z=K(z,r),J=Z?Z.createHTML(""):"",{implementation:Q,createNodeIterator:ee,createDocumentFragment:te,getElementsByTagName:ne}=a,{importNode:oe}=r;let re={};o.isSupported="function"==typeof e&&"function"==typeof $&&Q&&void 0!==Q.createHTMLDocument;const{MUSTACHE_EXPR:ie,ERB_EXPR:ae,TMPLIT_EXPR:le,DATA_ATTR:ce,ARIA_ATTR:se,IS_SCRIPT_OR_DATA:me,ATTR_WHITESPACE:ue}=X;let{IS_ALLOWED_URI:pe}=X,fe=null;const de=_({},[...S,...x,...D,...v,...L]);let he=null;const ge=_({},[...O,...M,...I,...U]);let ye=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Te=null,Ee=null,Ae=!0,be=!0,Ne=!1,_e=!0,we=!1,Re=!1,Se=!1,xe=!1,De=!1,ke=!1,ve=!1,Ce=!0,Le=!1;const Oe="user-content-";let Me=!0,Ie=!1,Ue={},Fe=null;const Pe=_({},["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"]);let He=null;const ze=_({},["audio","video","img","source","image","track"]);let Be=null;const We=_({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ge="http://www.w3.org/1998/Math/MathML",je="http://www.w3.org/2000/svg",qe="http://www.w3.org/1999/xhtml";let Xe=qe,Ye=!1,Ke=null;const Ve=_({},[Ge,je,qe],d);let $e;const Ze=["application/xhtml+xml","text/html"],Je="text/html";let Qe,et=null;const tt=a.createElement("form"),nt=function(e){return e instanceof RegExp||e instanceof Function},ot=function(e){et&&et===e||(e&&"object"==typeof e||(e={}),e=w(e),$e=$e=-1===Ze.indexOf(e.PARSER_MEDIA_TYPE)?Je:e.PARSER_MEDIA_TYPE,Qe="application/xhtml+xml"===$e?d:f,fe="ALLOWED_TAGS"in e?_({},e.ALLOWED_TAGS,Qe):de,he="ALLOWED_ATTR"in e?_({},e.ALLOWED_ATTR,Qe):ge,Ke="ALLOWED_NAMESPACES"in e?_({},e.ALLOWED_NAMESPACES,d):Ve,Be="ADD_URI_SAFE_ATTR"in e?_(w(We),e.ADD_URI_SAFE_ATTR,Qe):We,He="ADD_DATA_URI_TAGS"in e?_(w(ze),e.ADD_DATA_URI_TAGS,Qe):ze,Fe="FORBID_CONTENTS"in e?_({},e.FORBID_CONTENTS,Qe):Pe,Te="FORBID_TAGS"in e?_({},e.FORBID_TAGS,Qe):{},Ee="FORBID_ATTR"in e?_({},e.FORBID_ATTR,Qe):{},Ue="USE_PROFILES"in e&&e.USE_PROFILES,Ae=!1!==e.ALLOW_ARIA_ATTR,be=!1!==e.ALLOW_DATA_ATTR,Ne=e.ALLOW_UNKNOWN_PROTOCOLS||!1,_e=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,we=e.SAFE_FOR_TEMPLATES||!1,Re=e.WHOLE_DOCUMENT||!1,De=e.RETURN_DOM||!1,ke=e.RETURN_DOM_FRAGMENT||!1,ve=e.RETURN_TRUSTED_TYPE||!1,xe=e.FORCE_BODY||!1,Ce=!1!==e.SANITIZE_DOM,Le=e.SANITIZE_NAMED_PROPS||!1,Me=!1!==e.KEEP_CONTENT,Ie=e.IN_PLACE||!1,pe=e.ALLOWED_URI_REGEXP||W,Xe=e.NAMESPACE||qe,ye=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&nt(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ye.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&nt(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ye.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ye.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),we&&(be=!1),ke&&(De=!0),Ue&&(fe=_({},[...L]),he=[],!0===Ue.html&&(_(fe,S),_(he,O)),!0===Ue.svg&&(_(fe,x),_(he,M),_(he,U)),!0===Ue.svgFilters&&(_(fe,D),_(he,M),_(he,U)),!0===Ue.mathMl&&(_(fe,v),_(he,I),_(he,U))),e.ADD_TAGS&&(fe===de&&(fe=w(fe)),_(fe,e.ADD_TAGS,Qe)),e.ADD_ATTR&&(he===ge&&(he=w(he)),_(he,e.ADD_ATTR,Qe)),e.ADD_URI_SAFE_ATTR&&_(Be,e.ADD_URI_SAFE_ATTR,Qe),e.FORBID_CONTENTS&&(Fe===Pe&&(Fe=w(Fe)),_(Fe,e.FORBID_CONTENTS,Qe)),Me&&(fe["#text"]=!0),Re&&_(fe,["html","head","body"]),fe.table&&(_(fe,["tbody"]),delete Te.tbody),i&&i(e),et=e)},rt=_({},["mi","mo","mn","ms","mtext"]),it=_({},["foreignobject","desc","title","annotation-xml"]),at=_({},["title","style","font","a","script"]),lt=_({},x);_(lt,D),_(lt,k);const ct=_({},v);_(ct,C);const st=function(e){let t=$(e);t&&t.tagName||(t={namespaceURI:Xe,tagName:"template"});const n=f(e.tagName),o=f(t.tagName);return!!Ke[e.namespaceURI]&&(e.namespaceURI===je?t.namespaceURI===qe?"svg"===n:t.namespaceURI===Ge?"svg"===n&&("annotation-xml"===o||rt[o]):Boolean(lt[n]):e.namespaceURI===Ge?t.namespaceURI===qe?"math"===n:t.namespaceURI===je?"math"===n&&it[o]:Boolean(ct[n]):e.namespaceURI===qe?!(t.namespaceURI===je&&!it[o])&&(!(t.namespaceURI===Ge&&!rt[o])&&(!ct[n]&&(at[n]||!lt[n]))):!("application/xhtml+xml"!==$e||!Ke[e.namespaceURI]))},mt=function(e){p(o.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},ut=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!he[e])if(De||ke)try{mt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},pt=function(e){let t,n;if(xe)e="<remove></remove>"+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===$e&&Xe===qe&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=Z?Z.createHTML(e):e;if(Xe===qe)try{t=(new H).parseFromString(o,$e)}catch(e){}if(!t||!t.documentElement){t=Q.createDocument(Xe,"template",null);try{t.documentElement.innerHTML=Ye?J:o}catch(e){}}const r=t.body||t.documentElement;return e&&n&&r.insertBefore(a.createTextNode(n),r.childNodes[0]||null),Xe===qe?ne.call(t,Re?"html":"body")[0]:Re?t.documentElement:r},ft=function(e){return ee.call(e.ownerDocument||e,e,N.SHOW_ELEMENT|N.SHOW_COMMENT|N.SHOW_TEXT,null,!1)},dt=function(e){return e instanceof P&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof F)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},ht=function(e){return"object"==typeof s?e instanceof s:e&&"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},gt=function(e,t,n){re[e]&&m(re[e],(e=>{e.call(o,t,n,et)}))},yt=function(e){let t;if(gt("beforeSanitizeElements",e,null),dt(e))return mt(e),!0;const n=Qe(e.nodeName);if(gt("uponSanitizeElement",e,{tagName:n,allowedTags:fe}),e.hasChildNodes()&&!ht(e.firstElementChild)&&(!ht(e.content)||!ht(e.content.firstElementChild))&&E(/<[/\w]/g,e.innerHTML)&&E(/<[/\w]/g,e.textContent))return mt(e),!0;if(!fe[n]||Te[n]){if(!Te[n]&&Et(n)){if(ye.tagNameCheck instanceof RegExp&&E(ye.tagNameCheck,n))return!1;if(ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))return!1}if(Me&&!Fe[n]){const t=$(e)||e.parentNode,n=V(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o)t.insertBefore(G(n[o],!0),j(e))}}return mt(e),!0}return e instanceof b&&!st(e)?(mt(e),!0):"noscript"!==n&&"noembed"!==n||!E(/<\/no(script|embed)/i,e.innerHTML)?(we&&3===e.nodeType&&(t=e.textContent,t=g(t,ie," "),t=g(t,ae," "),t=g(t,le," "),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),gt("afterSanitizeElements",e,null),!1):(mt(e),!0)},Tt=function(e,t,n){if(Ce&&("id"===t||"name"===t)&&(n in a||n in tt))return!1;if(be&&!Ee[t]&&E(ce,t));else if(Ae&&E(se,t));else if(!he[t]||Ee[t]){if(!(Et(e)&&(ye.tagNameCheck instanceof RegExp&&E(ye.tagNameCheck,e)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(e))&&(ye.attributeNameCheck instanceof RegExp&&E(ye.attributeNameCheck,t)||ye.attributeNameCheck instanceof Function&&ye.attributeNameCheck(t))||"is"===t&&ye.allowCustomizedBuiltInElements&&(ye.tagNameCheck instanceof RegExp&&E(ye.tagNameCheck,n)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))))return!1}else if(Be[t]);else if(E(pe,g(n,ue,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==y(n,"data:")||!He[e]){if(Ne&&!E(me,g(n,ue,"")));else if(n)return!1}else;return!0},Et=function(e){return e.indexOf("-")>0},At=function(e){let t,n,r,i;gt("beforeSanitizeAttributes",e,null);const{attributes:a}=e;if(!a)return;const l={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:he};for(i=a.length;i--;){t=a[i];const{name:c,namespaceURI:s}=t;if(n="value"===c?t.value:T(t.value),r=Qe(c),l.attrName=r,l.attrValue=n,l.keepAttr=!0,l.forceKeepAttr=void 0,gt("uponSanitizeAttribute",e,l),n=l.attrValue,l.forceKeepAttr)continue;if(ut(c,e),!l.keepAttr)continue;if(!_e&&E(/\/>/i,n)){ut(c,e);continue}we&&(n=g(n,ie," "),n=g(n,ae," "),n=g(n,le," "));const m=Qe(e.nodeName);if(Tt(m,r,n)){if(!Le||"id"!==r&&"name"!==r||(ut(c,e),n=Oe+n),Z&&"object"==typeof z&&"function"==typeof z.getAttributeType)if(s);else switch(z.getAttributeType(m,r)){case"TrustedHTML":n=Z.createHTML(n);break;case"TrustedScriptURL":n=Z.createScriptURL(n)}try{s?e.setAttributeNS(s,c,n):e.setAttribute(c,n),u(o.removed)}catch(e){}}}gt("afterSanitizeAttributes",e,null)},bt=function e(t){let n;const o=ft(t);for(gt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)gt("uponSanitizeShadowNode",n,null),yt(n)||(n.content instanceof l&&e(n.content),At(n));gt("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(e){let t,n,i,a,c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Ye=!e,Ye&&(e="\x3c!--\x3e"),"string"!=typeof e&&!ht(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Se||ot(c),o.removed=[],"string"==typeof e&&(Ie=!1),Ie){if(e.nodeName){const t=Qe(e.nodeName);if(!fe[t]||Te[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof s)t=pt("\x3c!----\x3e"),n=t.ownerDocument.importNode(e,!0),1===n.nodeType&&"BODY"===n.nodeName||"HTML"===n.nodeName?t=n:t.appendChild(n);else{if(!De&&!we&&!Re&&-1===e.indexOf("<"))return Z&&ve?Z.createHTML(e):e;if(t=pt(e),!t)return De?null:ve?J:""}t&&xe&&mt(t.firstChild);const m=ft(Ie?e:t);for(;i=m.nextNode();)yt(i)||(i.content instanceof l&&bt(i.content),At(i));if(Ie)return e;if(De){if(ke)for(a=te.call(t.ownerDocument);t.firstChild;)a.appendChild(t.firstChild);else a=t;return(he.shadowroot||he.shadowrootmod)&&(a=oe.call(r,a,!0)),a}let u=Re?t.outerHTML:t.innerHTML;return Re&&fe["!doctype"]&&t.ownerDocument&&t.ownerDocument.doctype&&t.ownerDocument.doctype.name&&E(q,t.ownerDocument.doctype.name)&&(u="<!DOCTYPE "+t.ownerDocument.doctype.name+">\n"+u),we&&(u=g(u,ie," "),u=g(u,ae," "),u=g(u,le," ")),Z&&ve?Z.createHTML(u):u},o.setConfig=function(e){ot(e),Se=!0},o.clearConfig=function(){et=null,Se=!1},o.isValidAttribute=function(e,t,n){et||ot({});const o=Qe(e),r=Qe(t);return Tt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&(re[e]=re[e]||[],p(re[e],t))},o.removeHook=function(e){if(re[e])return u(re[e])},o.removeHooks=function(e){re[e]&&(re[e]=[])},o.removeAllHooks=function(){re={}},o}();return V}));
+//# sourceMappingURL=purify.min.js.map
diff --git a/plugins/DOMPurify/purify.min.js.map b/plugins/DOMPurify/purify.min.js.map
new file mode 100644
index 000000000..467a29879
--- /dev/null
+++ b/plugins/DOMPurify/purify.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"purify.min.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","func","TypeError","_len2","arguments","length","_key2","thisArg","_len","_key","addToSet","set","array","transformCaseFunc","l","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","purify","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":";0OAAA,MAAMA,QACJA,EADIC,eAEJA,EAFIC,SAGJA,EAHIC,eAIJA,EAJIC,yBAKJA,GACEC,OAEJ,IAAIC,OAAEA,EAAFC,KAAUA,EAAVC,OAAgBA,GAAWH,QAC3BI,MAAEA,EAAFC,UAASA,GAAiC,oBAAZC,SAA2BA,QAExDF,IACHA,EAAQ,SAAUG,EAAKC,EAAWC,GAChC,OAAOF,EAAIH,MAAMI,EAAWC,EAC7B,GAGER,IACHA,EAAS,SAAUS,GACjB,OAAOA,CACR,GAGER,IACHA,EAAO,SAAUQ,GACf,OAAOA,CACR,GAGEL,IACHA,EAAY,SAAUM,EAAMF,GAC1B,OAAO,IAAIE,KAAQF,EACpB,GAGH,MAAMG,EAAeC,EAAQC,MAAMC,UAAUC,SAEvCC,EAAWJ,EAAQC,MAAMC,UAAUG,KACnCC,EAAYN,EAAQC,MAAMC,UAAUK,MAGpCC,EAAoBR,EAAQS,OAAOP,UAAUQ,aAC7CC,EAAiBX,EAAQS,OAAOP,UAAUU,UAC1CC,EAAcb,EAAQS,OAAOP,UAAUY,OACvCC,EAAgBf,EAAQS,OAAOP,UAAUc,SACzCC,EAAgBjB,EAAQS,OAAOP,UAAUgB,SACzCC,EAAanB,EAAQS,OAAOP,UAAUkB,MAEtCC,EAAarB,EAAQsB,OAAOpB,UAAUqB,MAEtCC,GAMsBC,EANQC,UAO3B,WAAA,IAAA,IAAAC,EAAAC,UAAAC,OAAIjC,EAAJ,IAAAK,MAAA0B,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAIlC,EAAJkC,GAAAF,UAAAE,GAAA,OAAatC,EAAUiC,EAAM7B,EAA7B,GADF,IAAqB6B,EAJrB,SAASzB,EAAQyB,GACtB,OAAO,SAACM,GAAD,IAAA,IAAAC,EAAAJ,UAAAC,OAAajC,EAAb,IAAAK,MAAA+B,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAarC,EAAbqC,EAAA,GAAAL,UAAAK,GAAA,OAAsB1C,EAAMkC,EAAMM,EAASnC,EAA3C,CACR,CAOM,SAASsC,EAASC,EAAKC,EAAOC,GACnCA,EAAoBA,GAAwC7B,EACxDzB,GAIFA,EAAeoD,EAAK,MAGtB,IAAIG,EAAIF,EAAMP,OACPS,KAAAA,KAAK,CACV,IAAIC,EAAUH,EAAME,GACpB,GAAuB,iBAAZC,EAAsB,CAC/B,MAAMC,EAAYH,EAAkBE,GAChCC,IAAcD,IAEXvD,EAASoD,KACZA,EAAME,GAAKE,GAGbD,EAAUC,EAEb,CAEDL,EAAII,IAAW,CAChB,CAED,OAAOJ,CACR,CAGM,SAASM,EAAMC,GACpB,MAAMC,EAAYrD,EAAO,MAEpB,IAAA,MAAOsD,EAAUC,KAAU/D,EAAQ4D,GACtCC,EAAUC,GAAYC,EAGxB,OAAOF,CACR,CAID,SAASG,EAAaJ,EAAQK,GACrBL,KAAW,OAAXA,GAAiB,CACtB,MAAMM,EAAO9D,EAAyBwD,EAAQK,GAC9C,GAAIC,EAAM,CACJA,GAAAA,EAAKC,IACP,OAAOjD,EAAQgD,EAAKC,KAGtB,GAA0B,mBAAfD,EAAKH,MACd,OAAO7C,EAAQgD,EAAKH,MAEvB,CAEDH,EAASzD,EAAeyD,EACzB,CAOD,OALSQ,SAAcX,GAErB,OADAY,QAAQC,KAAK,qBAAsBb,GAC5B,IACR,CAGF,CC5HM,MAAMc,EAAOjE,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,QAIWkE,EAAMlE,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,UAGWmE,EAAanE,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,iBAOWoE,EAAgBpE,EAAO,CAClC,UACA,gBACA,SACA,UACA,eACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,QAGWqE,EAASrE,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,aACA,gBAKWsE,EAAmBtE,EAAO,CACrC,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,SAGWuE,EAAOvE,EAAO,CAAC,UCrRfiE,EAAOjE,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,SAGWkE,EAAMlE,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,eAGWqE,EAASrE,EAAO,CAC3B,SACA,cAC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"}
\ No newline at end of file

Vulnerable code:                     'description': $('#form-item-description').summernote('code') !== "<p><br></p>" ? $('#form-item-description').summernote('code') : '',
                    'email': $('#form-item-email').val(),
                    'label': $('#form-item-label').val(),
                    'login': $('#form-item-login').val(),
                    'tags': $('#form-item-tags').val(),
                    'url': $('#form-item-url').val(),
                    'fa_icon': $('#form-item-icon').val(),
Fixed code:     <!-- DOMPurify -->
    <script type="text/javascript" src="plugins/DOMPurify/purify.min.js"></script>
                    'description': $('#form-item-description').summernote('code') !== "<p><br></p>" ? DOMPurify.sanitize($('#form-item-description').summernote('code'), {USE_PROFILES: {html: true}}) : '',
                    'email': DOMPurify.sanitize($('#form-item-email').val()),
                    'label': DOMPurify.sanitize($('#form-item-label').val()),
                    'login': DOMPurify.sanitize($('#form-item-login').val()),
                    'tags': DOMPurify.sanitize($('#form-item-tags').val()),
                    'url': DOMPurify.sanitize($('#form-item-url').val()),
                    'fa_icon': DOMPurify.sanitize($('#form-item-icon').val()),
/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */

'use strict';

const {
  entries,
  setPrototypeOf,
  isFrozen,
  getPrototypeOf,
  getOwnPropertyDescriptor
} = Object;
let {
  freeze,
  seal,
  create
} = Object; // eslint-disable-line import/no-mutable-exports

let {
  apply,
  construct
} = typeof Reflect !== 'undefined' && Reflect;

if (!apply) {
  apply = function apply(fun, thisValue, args) {
    return fun.apply(thisValue, args);
  };
}

if (!freeze) {
  freeze = function freeze(x) {
    return x;
  };
}

if (!seal) {
  seal = function seal(x) {
    return x;
  };
}

if (!construct) {
  construct = function construct(Func, args) {
    return new Func(...args);
  };
}

const arrayForEach = unapply(Array.prototype.forEach);
const arrayPop = unapply(Array.prototype.pop);
const arrayPush = unapply(Array.prototype.push);
const stringToLowerCase = unapply(String.prototype.toLowerCase);
const stringToString = unapply(String.prototype.toString);
const stringMatch = unapply(String.prototype.match);
const stringReplace = unapply(String.prototype.replace);
const stringIndexOf = unapply(String.prototype.indexOf);
const stringTrim = unapply(String.prototype.trim);
const regExpTest = unapply(RegExp.prototype.test);
const typeErrorCreate = unconstruct(TypeError);
function unapply(func) {
  return function (thisArg) {
    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
      args[_key - 1] = arguments[_key];
    }

    return apply(func, thisArg, args);
  };
}
function unconstruct(func) {
  return function () {
    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
      args[_key2] = arguments[_key2];
    }

    return construct(func, args);
  };
}
/* Add properties to a lookup table */

function addToSet(set, array, transformCaseFunc) {
  transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;

  if (setPrototypeOf) {
    // Make 'in' and truthy checks like Boolean(set.constructor)
    // independent of any properties defined on Object.prototype.
    // Prevent prototype setters from intercepting set as a this value.
    setPrototypeOf(set, null);
  }

  let l = array.length;

  while (l--) {
    let element = array[l];

    if (typeof element === 'string') {
      const lcElement = transformCaseFunc(element);

      if (lcElement !== element) {
        // Config presets (e.g. tags.js, attrs.js) are immutable.
        if (!isFrozen(array)) {
          array[l] = lcElement;
        }

        element = lcElement;
      }
    }

    set[element] = true;
  }

  return set;
}
/* Shallow clone an object */

function clone(object) {
  const newObject = create(null);

  for (const [property, value] of entries(object)) {
    newObject[property] = value;
  }

  return newObject;
}
/* This method automatically checks if the prop is function
 * or getter and behaves accordingly. */

function lookupGetter(object, prop) {
  while (object !== null) {
    const desc = getOwnPropertyDescriptor(object, prop);

    if (desc) {
      if (desc.get) {
        return unapply(desc.get);
      }

      if (typeof desc.value === 'function') {
        return unapply(desc.value);
      }
    }

    object = getPrototypeOf(object);
  }

  function fallbackValue(element) {
    console.warn('fallback value for', element);
    return null;
  }

  return fallbackValue;
}

const 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']); // SVG

const 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']);
const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.
// We still need to know them so that we can do namespace
// checks properly in case one wants to add them to
// allow-list.

const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', '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']);
const 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']); // Similarly to SVG, we want to know all MathML elements,
// even those that we disallow by default.

const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
const text = freeze(['#text']);

const 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']);
const 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']);
const 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']);
const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);

const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode

const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape

const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape

const 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
);
const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex
);
const DOCTYPE_NAME = seal(/^html$/i);

var EXPRESSIONS = /*#__PURE__*/Object.freeze({
  __proto__: null,
  MUSTACHE_EXPR: MUSTACHE_EXPR,
  ERB_EXPR: ERB_EXPR,
  TMPLIT_EXPR: TMPLIT_EXPR,
  DATA_ATTR: DATA_ATTR,
  ARIA_ATTR: ARIA_ATTR,
  IS_ALLOWED_URI: IS_ALLOWED_URI,
  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
  ATTR_WHITESPACE: ATTR_WHITESPACE,
  DOCTYPE_NAME: DOCTYPE_NAME
});

const getGlobal = () => typeof window === 'undefined' ? null : window;
/**
 * Creates a no-op policy for internal use only.
 * Don't export this function outside this module!
 * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
 * @param {Document} document The document object (to determine policy name suffix)
 * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
 * are not supported).
 */


const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
    return null;
  } // Allow the callers to control the unique policy name
  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.
  // Policy creation with duplicate names throws in Trusted Types.


  let suffix = null;
  const ATTR_NAME = 'data-tt-policy-suffix';

  if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
    suffix = document.currentScript.getAttribute(ATTR_NAME);
  }

  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');

  try {
    return trustedTypes.createPolicy(policyName, {
      createHTML(html) {
        return html;
      },

      createScriptURL(scriptUrl) {
        return scriptUrl;
      }

    });
  } catch (_) {
    // Policy creation failed (most likely another DOMPurify script has
    // already run). Skip creating the policy, as this will only cause errors
    // if TT are enforced.
    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
    return null;
  }
};

function createDOMPurify() {
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();

  const DOMPurify = root => createDOMPurify(root);
  /**
   * Version label, exposed for easier checks
   * if DOMPurify is up to date or not
   */


  DOMPurify.version = '3.0.2';
  /**
   * Array of elements that DOMPurify removed during sanitation.
   * Empty if nothing was removed.
   */

  DOMPurify.removed = [];

  if (!window || !window.document || window.document.nodeType !== 9) {
    // Not running in a browser, provide a factory function
    // so that you can pass your own Window
    DOMPurify.isSupported = false;
    return DOMPurify;
  }

  const originalDocument = window.document;
  let {
    document
  } = window;
  const {
    DocumentFragment,
    HTMLTemplateElement,
    Node,
    Element,
    NodeFilter,
    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,
    HTMLFormElement,
    DOMParser,
    trustedTypes
  } = window;
  const ElementPrototype = Element.prototype;
  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
  const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a
  // new document created via createHTMLDocument. As per the spec
  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
  // a new empty registry is used when creating a template contents owner
  // document, so we use that as our parent document to ensure nothing
  // is inherited.

  if (typeof HTMLTemplateElement === 'function') {
    const template = document.createElement('template');

    if (template.content && template.content.ownerDocument) {
      document = template.content.ownerDocument;
    }
  }

  const trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);

  const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
  const {
    implementation,
    createNodeIterator,
    createDocumentFragment,
    getElementsByTagName
  } = document;
  const {
    importNode
  } = originalDocument;
  let hooks = {};
  /**
   * Expose whether this browser supports running the full DOMPurify.
   */

  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined';
  const {
    MUSTACHE_EXPR,
    ERB_EXPR,
    TMPLIT_EXPR,
    DATA_ATTR,
    ARIA_ATTR,
    IS_SCRIPT_OR_DATA,
    ATTR_WHITESPACE
  } = EXPRESSIONS;
  let {
    IS_ALLOWED_URI: IS_ALLOWED_URI$1
  } = EXPRESSIONS;
  /**
   * We consider the elements and attributes below to be safe. Ideally
   * don't add any new ones but feel free to remove unwanted ones.
   */

  /* allowed element names */

  let ALLOWED_TAGS = null;
  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
  /* Allowed attribute names */

  let ALLOWED_ATTR = null;
  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
  /*
   * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.
   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)
   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)
   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.
   */

  let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
    tagNameCheck: {
      writable: true,
      configurable: false,
      enumerable: true,
      value: null
    },
    attributeNameCheck: {
      writable: true,
      configurable: false,
      enumerable: true,
      value: null
    },
    allowCustomizedBuiltInElements: {
      writable: true,
      configurable: false,
      enumerable: true,
      value: false
    }
  }));
  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */

  let FORBID_TAGS = null;
  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */

  let FORBID_ATTR = null;
  /* Decide if ARIA attributes are okay */

  let ALLOW_ARIA_ATTR = true;
  /* Decide if custom data attributes are okay */

  let ALLOW_DATA_ATTR = true;
  /* Decide if unknown protocols are okay */

  let ALLOW_UNKNOWN_PROTOCOLS = false;
  /* Decide if self-closing tags in attributes are allowed.
   * Usually removed due to a mXSS issue in jQuery 3.0 */

  let ALLOW_SELF_CLOSE_IN_ATTR = true;
  /* Output should be safe for common template engines.
   * This means, DOMPurify removes data attributes, mustaches and ERB
   */

  let SAFE_FOR_TEMPLATES = false;
  /* Decide if document with <html>... should be returned */

  let WHOLE_DOCUMENT = false;
  /* Track whether config is already set on this instance of DOMPurify. */

  let SET_CONFIG = false;
  /* Decide if all elements (e.g. style, script) must be children of
   * document.body. By default, browsers might move them to document.head */

  let FORCE_BODY = false;
  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
   * string (or a TrustedHTML object if Trusted Types are supported).
   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
   */

  let RETURN_DOM = false;
  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html
   * string  (or a TrustedHTML object if Trusted Types are supported) */

  let RETURN_DOM_FRAGMENT = false;
  /* Try to return a Trusted Type object instead of a string, return a string in
   * case Trusted Types are not supported  */

  let RETURN_TRUSTED_TYPE = false;
  /* Output should be free from DOM clobbering attacks?
   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.
   */

  let SANITIZE_DOM = true;
  /* Achieve full DOM Clobbering protection by isolating the namespace of named
   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.
   *
   * HTML/DOM spec rules that enable DOM Clobbering:
   *   - Named Access on Window (§7.3.3)
   *   - DOM Tree Accessors (§3.1.5)
   *   - Form Element Parent-Child Relations (§4.10.3)
   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)
   *   - HTMLCollection (§4.2.10.2)
   *
   * Namespace isolation is implemented by prefixing `id` and `name` attributes
   * with a constant string, i.e., `user-content-`
   */

  let SANITIZE_NAMED_PROPS = false;
  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';
  /* Keep element content when removing element? */

  let KEEP_CONTENT = true;
  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
   * of importing it into a new Document and returning a sanitized copy */

  let IN_PLACE = false;
  /* Allow usage of profiles like html, svg and mathMl */

  let USE_PROFILES = {};
  /* Tags to ignore content of when KEEP_CONTENT is true */

  let FORBID_CONTENTS = null;
  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']);
  /* Tags that are safe for data: URIs */

  let DATA_URI_TAGS = null;
  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);
  /* Attributes safe for values like "javascript:" */

  let URI_SAFE_ATTRIBUTES = null;
  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);
  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
  /* Document namespace */

  let NAMESPACE = HTML_NAMESPACE;
  let IS_EMPTY_INPUT = false;
  /* Allowed XHTML+XML namespaces */

  let ALLOWED_NAMESPACES = null;
  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
  /* Parsing of strict XHTML documents */

  let PARSER_MEDIA_TYPE;
  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];
  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
  let transformCaseFunc;
  /* Keep a reference to config to pass to hooks */

  let CONFIG = null;
  /* Ideally, do not touch anything below this line */

  /* ______________________________________________ */

  const formElement = document.createElement('form');

  const isRegexOrFunction = function isRegexOrFunction(testValue) {
    return testValue instanceof RegExp || testValue instanceof Function;
  };
  /**
   * _parseConfig
   *
   * @param  {Object} cfg optional config literal
   */
  // eslint-disable-next-line complexity


  const _parseConfig = function _parseConfig(cfg) {
    if (CONFIG && CONFIG === cfg) {
      return;
    }
    /* Shield configuration object from tampering */


    if (!cfg || typeof cfg !== 'object') {
      cfg = {};
    }
    /* Shield configuration object from prototype pollution */


    cfg = clone(cfg);
    PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.

    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
    /* Set configuration parameters */

    ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
    ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
    ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
    URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent
    cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent
    transformCaseFunc // eslint-disable-line indent
    ) // eslint-disable-line indent
    : DEFAULT_URI_SAFE_ATTRIBUTES;
    DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent
    cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent
    transformCaseFunc // eslint-disable-line indent
    ) // eslint-disable-line indent
    : DEFAULT_DATA_URI_TAGS;
    FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
    FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};
    FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};
    USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true

    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true

    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false

    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true

    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false

    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false

    RETURN_DOM = cfg.RETURN_DOM || false; // Default false

    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false

    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false

    FORCE_BODY = cfg.FORCE_BODY || false; // Default false

    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true

    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false

    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true

    IN_PLACE = cfg.IN_PLACE || false; // Default false

    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};

    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
    }

    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
    }

    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
    }

    if (SAFE_FOR_TEMPLATES) {
      ALLOW_DATA_ATTR = false;
    }

    if (RETURN_DOM_FRAGMENT) {
      RETURN_DOM = true;
    }
    /* Parse profile info */


    if (USE_PROFILES) {
      ALLOWED_TAGS = addToSet({}, [...text]);
      ALLOWED_ATTR = [];

      if (USE_PROFILES.html === true) {
        addToSet(ALLOWED_TAGS, html$1);
        addToSet(ALLOWED_ATTR, html);
      }

      if (USE_PROFILES.svg === true) {
        addToSet(ALLOWED_TAGS, svg$1);
        addToSet(ALLOWED_ATTR, svg);
        addToSet(ALLOWED_ATTR, xml);
      }

      if (USE_PROFILES.svgFilters === true) {
        addToSet(ALLOWED_TAGS, svgFilters);
        addToSet(ALLOWED_ATTR, svg);
        addToSet(ALLOWED_ATTR, xml);
      }

      if (USE_PROFILES.mathMl === true) {
        addToSet(ALLOWED_TAGS, mathMl$1);
        addToSet(ALLOWED_ATTR, mathMl);
        addToSet(ALLOWED_ATTR, xml);
      }
    }
    /* Merge configuration parameters */


    if (cfg.ADD_TAGS) {
      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
        ALLOWED_TAGS = clone(ALLOWED_TAGS);
      }

      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
    }

    if (cfg.ADD_ATTR) {
      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
        ALLOWED_ATTR = clone(ALLOWED_ATTR);
      }

      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
    }

    if (cfg.ADD_URI_SAFE_ATTR) {
      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
    }

    if (cfg.FORBID_CONTENTS) {
      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
        FORBID_CONTENTS = clone(FORBID_CONTENTS);
      }

      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
    }
    /* Add #text in case KEEP_CONTENT is set to true */


    if (KEEP_CONTENT) {
      ALLOWED_TAGS['#text'] = true;
    }
    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */


    if (WHOLE_DOCUMENT) {
      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
    }
    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */


    if (ALLOWED_TAGS.table) {
      addToSet(ALLOWED_TAGS, ['tbody']);
      delete FORBID_TAGS.tbody;
    } // Prevent further manipulation of configuration.
    // Not available in IE8, Safari 5, etc.


    if (freeze) {
      freeze(cfg);
    }

    CONFIG = cfg;
  };

  const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);
  const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML
  // namespace. We need to specify them explicitly
  // so that they don't get erroneously deleted from
  // HTML namespace.

  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);
  /* Keep track of all possible SVG and MathML tags
   * so that we can perform the namespace checks
   * correctly. */

  const ALL_SVG_TAGS = addToSet({}, svg$1);
  addToSet(ALL_SVG_TAGS, svgFilters);
  addToSet(ALL_SVG_TAGS, svgDisallowed);
  const ALL_MATHML_TAGS = addToSet({}, mathMl$1);
  addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
  /**
   *
   *
   * @param  {Element} element a DOM element whose namespace is being checked
   * @returns {boolean} Return false if the element has a
   *  namespace that a spec-compliant parser would never
   *  return. Return true otherwise.
   */

  const _checkValidNamespace = function _checkValidNamespace(element) {
    let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode
    // can be null. We just simulate parent in this case.

    if (!parent || !parent.tagName) {
      parent = {
        namespaceURI: NAMESPACE,
        tagName: 'template'
      };
    }

    const tagName = stringToLowerCase(element.tagName);
    const parentTagName = stringToLowerCase(parent.tagName);

    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
      return false;
    }

    if (element.namespaceURI === SVG_NAMESPACE) {
      // The only way to switch from HTML namespace to SVG
      // is via <svg>. If it happens via any other tag, then
      // it should be killed.
      if (parent.namespaceURI === HTML_NAMESPACE) {
        return tagName === 'svg';
      } // The only way to switch from MathML to SVG is via`
      // svg if parent is either <annotation-xml> or MathML
      // text integration points.


      if (parent.namespaceURI === MATHML_NAMESPACE) {
        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
      } // We only allow elements that are defined in SVG
      // spec. All others are disallowed in SVG namespace.


      return Boolean(ALL_SVG_TAGS[tagName]);
    }

    if (element.namespaceURI === MATHML_NAMESPACE) {
      // The only way to switch from HTML namespace to MathML
      // is via <math>. If it happens via any other tag, then
      // it should be killed.
      if (parent.namespaceURI === HTML_NAMESPACE) {
        return tagName === 'math';
      } // The only way to switch from SVG to MathML is via
      // <math> and HTML integration points


      if (parent.namespaceURI === SVG_NAMESPACE) {
        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
      } // We only allow elements that are defined in MathML
      // spec. All others are disallowed in MathML namespace.


      return Boolean(ALL_MATHML_TAGS[tagName]);
    }

    if (element.namespaceURI === HTML_NAMESPACE) {
      // The only way to switch from SVG to HTML is via
      // HTML integration points, and from MathML to HTML
      // is via MathML text integration points
      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
        return false;
      }

      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
        return false;
      } // We disallow tags that are specific for MathML
      // or SVG and should never appear in HTML namespace


      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
    } // For XHTML and XML documents that support custom namespaces


    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {
      return true;
    } // The code should never reach this place (this means
    // that the element somehow got namespace that is not
    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).
    // Return false just in case.


    return false;
  };
  /**
   * _forceRemove
   *
   * @param  {Node} node a DOM node
   */


  const _forceRemove = function _forceRemove(node) {
    arrayPush(DOMPurify.removed, {
      element: node
    });

    try {
      // eslint-disable-next-line unicorn/prefer-dom-node-remove
      node.parentNode.removeChild(node);
    } catch (_) {
      node.remove();
    }
  };
  /**
   * _removeAttribute
   *
   * @param  {String} name an Attribute name
   * @param  {Node} node a DOM node
   */


  const _removeAttribute = function _removeAttribute(name, node) {
    try {
      arrayPush(DOMPurify.removed, {
        attribute: node.getAttributeNode(name),
        from: node
      });
    } catch (_) {
      arrayPush(DOMPurify.removed, {
        attribute: null,
        from: node
      });
    }

    node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes

    if (name === 'is' && !ALLOWED_ATTR[name]) {
      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
        try {
          _forceRemove(node);
        } catch (_) {}
      } else {
        try {
          node.setAttribute(name, '');
        } catch (_) {}
      }
    }
  };
  /**
   * _initDocument
   *
   * @param  {String} dirty a string of dirty markup
   * @return {Document} a DOM, filled with the dirty markup
   */


  const _initDocument = function _initDocument(dirty) {
    /* Create a HTML document */
    let doc;
    let leadingWhitespace;

    if (FORCE_BODY) {
      dirty = '<remove></remove>' + dirty;
    } else {
      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
      const matches = stringMatch(dirty, /^[\r\n\t ]+/);
      leadingWhitespace = matches && matches[0];
    }

    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {
      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)
      dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
    }

    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
    /*
     * Use the DOMParser API by default, fallback later if needs be
     * DOMParser not work for svg when has multiple root element.
     */

    if (NAMESPACE === HTML_NAMESPACE) {
      try {
        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
      } catch (_) {}
    }
    /* Use createHTMLDocument in case DOMParser is not available */


    if (!doc || !doc.documentElement) {
      doc = implementation.createDocument(NAMESPACE, 'template', null);

      try {
        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
      } catch (_) {// Syntax error if dirtyPayload is invalid xml
      }
    }

    const body = doc.body || doc.documentElement;

    if (dirty && leadingWhitespace) {
      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
    }
    /* Work on whole document or just its body */


    if (NAMESPACE === HTML_NAMESPACE) {
      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
    }

    return WHOLE_DOCUMENT ? doc.documentElement : body;
  };
  /**
   * _createIterator
   *
   * @param  {Document} root document/fragment to create iterator for
   * @return {Iterator} iterator instance
   */


  const _createIterator = function _createIterator(root) {
    return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise
    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
  };
  /**
   * _isClobbered
   *
   * @param  {Node} elm element to check for clobbering attacks
   * @return {Boolean} true if clobbered, false if safe
   */


  const _isClobbered = function _isClobbered(elm) {
    return 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');
  };
  /**
   * _isNode
   *
   * @param  {Node} obj object to check whether it's a DOM node
   * @return {Boolean} true is object is a DOM node
   */


  const _isNode = function _isNode(object) {
    return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
  };
  /**
   * _executeHook
   * Execute user configurable hooks
   *
   * @param  {String} entryPoint  Name of the hook's entry point
   * @param  {Node} currentNode node to work on with the hook
   * @param  {Object} data additional hook parameters
   */


  const _executeHook = function _executeHook(entryPoint, currentNode, data) {
    if (!hooks[entryPoint]) {
      return;
    }

    arrayForEach(hooks[entryPoint], hook => {
      hook.call(DOMPurify, currentNode, data, CONFIG);
    });
  };
  /**
   * _sanitizeElements
   *
   * @protect nodeName
   * @protect textContent
   * @protect removeChild
   *
   * @param   {Node} currentNode to check for permission to exist
   * @return  {Boolean} true if node was killed, false if left alive
   */


  const _sanitizeElements = function _sanitizeElements(currentNode) {
    let content;
    /* Execute a hook if present */

    _executeHook('beforeSanitizeElements', currentNode, null);
    /* Check if element is clobbered or can clobber */


    if (_isClobbered(currentNode)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Now let's check the element's type and name */


    const tagName = transformCaseFunc(currentNode.nodeName);
    /* Execute a hook if present */

    _executeHook('uponSanitizeElement', currentNode, {
      tagName,
      allowedTags: ALLOWED_TAGS
    });
    /* Detect mXSS attempts abusing namespace confusion */


    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Remove element if anything forbids its presence */


    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
      /* Check if we have a custom element to handle */
      if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
      }
      /* Keep content except for bad-listed elements */


      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
        const parentNode = getParentNode(currentNode) || currentNode.parentNode;
        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;

        if (childNodes && parentNode) {
          const childCount = childNodes.length;

          for (let i = childCount - 1; i >= 0; --i) {
            parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
          }
        }
      }

      _forceRemove(currentNode);

      return true;
    }
    /* Check whether element has a valid namespace */


    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Make sure that older browsers don't get noscript mXSS */


    if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Sanitize element content to be template-safe */


    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
      /* Get the element's text content */
      content = currentNode.textContent;
      content = stringReplace(content, MUSTACHE_EXPR, ' ');
      content = stringReplace(content, ERB_EXPR, ' ');
      content = stringReplace(content, TMPLIT_EXPR, ' ');

      if (currentNode.textContent !== content) {
        arrayPush(DOMPurify.removed, {
          element: currentNode.cloneNode()
        });
        currentNode.textContent = content;
      }
    }
    /* Execute a hook if present */


    _executeHook('afterSanitizeElements', currentNode, null);

    return false;
  };
  /**
   * _isValidAttribute
   *
   * @param  {string} lcTag Lowercase tag name of containing element.
   * @param  {string} lcName Lowercase attribute name.
   * @param  {string} value Attribute value.
   * @return {Boolean} Returns true if `value` is valid, otherwise false.
   */
  // eslint-disable-next-line complexity


  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
    /* Make sure attribute cannot clobber */
    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
      return false;
    }
    /* Allow valid data-* attributes: At least one character after "-"
        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
        We don't need to check the value; it's always URI safe. */


    if (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]) {
      if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND
      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
      _basicCustomElementTest(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)) || // Alternative, second condition checks if it's an `is`-attribute, AND
      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
      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 {
        return false;
      }
      /* Check value is safe. First, is attr inert? If so, is safe */

    } 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) ; else {
      return false;
    }

    return true;
  };
  /**
   * _basicCustomElementCheck
   * checks if at least one dash is included in tagName, and it's not the first char
   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
   * @param {string} tagName name of the tag of the node to sanitize
   */


  const _basicCustomElementTest = function _basicCustomElementTest(tagName) {
    return tagName.indexOf('-') > 0;
  };
  /**
   * _sanitizeAttributes
   *
   * @protect attributes
   * @protect nodeName
   * @protect removeAttribute
   * @protect setAttribute
   *
   * @param  {Node} currentNode to sanitize
   */


  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
    let attr;
    let value;
    let lcName;
    let l;
    /* Execute a hook if present */

    _executeHook('beforeSanitizeAttributes', currentNode, null);

    const {
      attributes
    } = currentNode;
    /* Check if we have attributes; if not we might have a text node */

    if (!attributes) {
      return;
    }

    const hookEvent = {
      attrName: '',
      attrValue: '',
      keepAttr: true,
      allowedAttributes: ALLOWED_ATTR
    };
    l = attributes.length;
    /* Go backwards over all attributes; safely remove bad ones */

    while (l--) {
      attr = attributes[l];
      const {
        name,
        namespaceURI
      } = attr;
      value = name === 'value' ? attr.value : stringTrim(attr.value);
      lcName = transformCaseFunc(name);
      /* Execute a hook if present */

      hookEvent.attrName = lcName;
      hookEvent.attrValue = value;
      hookEvent.keepAttr = true;
      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set

      _executeHook('uponSanitizeAttribute', currentNode, hookEvent);

      value = hookEvent.attrValue;
      /* Did the hooks approve of the attribute? */

      if (hookEvent.forceKeepAttr) {
        continue;
      }
      /* Remove attribute */


      _removeAttribute(name, currentNode);
      /* Did the hooks approve of the attribute? */


      if (!hookEvent.keepAttr) {
        continue;
      }
      /* Work around a security issue in jQuery 3.0 */


      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) {
        _removeAttribute(name, currentNode);

        continue;
      }
      /* Sanitize attribute content to be template-safe */


      if (SAFE_FOR_TEMPLATES) {
        value = stringReplace(value, MUSTACHE_EXPR, ' ');
        value = stringReplace(value, ERB_EXPR, ' ');
        value = stringReplace(value, TMPLIT_EXPR, ' ');
      }
      /* Is `value` valid for this attribute? */


      const lcTag = transformCaseFunc(currentNode.nodeName);

      if (!_isValidAttribute(lcTag, lcName, value)) {
        continue;
      }
      /* Full DOM Clobbering protection via namespace isolation,
       * Prefix id and name attributes with `user-content-`
       */


      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
        // Remove the attribute with this value
        _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value


        value = SANITIZE_NAMED_PROPS_PREFIX + value;
      }
      /* Handle attributes that require Trusted Types */


      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {
        if (namespaceURI) ; else {
          switch (trustedTypes.getAttributeType(lcTag, lcName)) {
            case 'TrustedHTML':
              value = trustedTypesPolicy.createHTML(value);
              break;

            case 'TrustedScriptURL':
              value = trustedTypesPolicy.createScriptURL(value);
              break;
          }
        }
      }
      /* Handle invalid data-* attribute set by try-catching it */


      try {
        if (namespaceURI) {
          currentNode.setAttributeNS(namespaceURI, name, value);
        } else {
          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
          currentNode.setAttribute(name, value);
        }

        arrayPop(DOMPurify.removed);
      } catch (_) {}
    }
    /* Execute a hook if present */


    _executeHook('afterSanitizeAttributes', currentNode, null);
  };
  /**
   * _sanitizeShadowDOM
   *
   * @param  {DocumentFragment} fragment to iterate over recursively
   */


  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
    let shadowNode;

    const shadowIterator = _createIterator(fragment);
    /* Execute a hook if present */


    _executeHook('beforeSanitizeShadowDOM', fragment, null);

    while (shadowNode = shadowIterator.nextNode()) {
      /* Execute a hook if present */
      _executeHook('uponSanitizeShadowNode', shadowNode, null);
      /* Sanitize tags and elements */


      if (_sanitizeElements(shadowNode)) {
        continue;
      }
      /* Deep shadow DOM detected */


      if (shadowNode.content instanceof DocumentFragment) {
        _sanitizeShadowDOM(shadowNode.content);
      }
      /* Check attributes, sanitize if necessary */


      _sanitizeAttributes(shadowNode);
    }
    /* Execute a hook if present */


    _executeHook('afterSanitizeShadowDOM', fragment, null);
  };
  /**
   * Sanitize
   * Public method providing core sanitation functionality
   *
   * @param {String|Node} dirty string or DOM node
   * @param {Object} configuration object
   */
  // eslint-disable-next-line complexity


  DOMPurify.sanitize = function (dirty) {
    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
    let body;
    let importedNode;
    let currentNode;
    let returnNode;
    /* Make sure we have a string to sanitize.
      DO NOT return early, as this will return the wrong type if
      the user has requested a DOM object rather than a string */

    IS_EMPTY_INPUT = !dirty;

    if (IS_EMPTY_INPUT) {
      dirty = '<!-->';
    }
    /* Stringify, in case dirty is an object */


    if (typeof dirty !== 'string' && !_isNode(dirty)) {
      // eslint-disable-next-line no-negated-condition
      if (typeof dirty.toString !== 'function') {
        throw typeErrorCreate('toString is not a function');
      } else {
        dirty = dirty.toString();

        if (typeof dirty !== 'string') {
          throw typeErrorCreate('dirty is not a string, aborting');
        }
      }
    }
    /* Return dirty HTML if DOMPurify cannot run */


    if (!DOMPurify.isSupported) {
      return dirty;
    }
    /* Assign config vars */


    if (!SET_CONFIG) {
      _parseConfig(cfg);
    }
    /* Clean up removed elements */


    DOMPurify.removed = [];
    /* Check if dirty is correctly typed for IN_PLACE */

    if (typeof dirty === 'string') {
      IN_PLACE = false;
    }

    if (IN_PLACE) {
      /* Do some early pre-sanitization to avoid unsafe root nodes */
      if (dirty.nodeName) {
        const tagName = transformCaseFunc(dirty.nodeName);

        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
        }
      }
    } else if (dirty instanceof Node) {
      /* If dirty is a DOM element, append to an empty document to avoid
         elements being stripped by the parser */
      body = _initDocument('<!---->');
      importedNode = body.ownerDocument.importNode(dirty, true);

      if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
        /* Node is already a body, use as is */
        body = importedNode;
      } else if (importedNode.nodeName === 'HTML') {
        body = importedNode;
      } else {
        // eslint-disable-next-line unicorn/prefer-dom-node-append
        body.appendChild(importedNode);
      }
    } else {
      /* Exit directly if we have nothing to do */
      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
      dirty.indexOf('<') === -1) {
        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
      }
      /* Initialize the document to work on */


      body = _initDocument(dirty);
      /* Check we have a DOM node from the data */

      if (!body) {
        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
      }
    }
    /* Remove first element node (ours) if FORCE_BODY is set */


    if (body && FORCE_BODY) {
      _forceRemove(body.firstChild);
    }
    /* Get node iterator */


    const nodeIterator = _createIterator(IN_PLACE ? dirty : body);
    /* Now start iterating over the created document */


    while (currentNode = nodeIterator.nextNode()) {
      /* Sanitize tags and elements */
      if (_sanitizeElements(currentNode)) {
        continue;
      }
      /* Shadow DOM detected, sanitize it */


      if (currentNode.content instanceof DocumentFragment) {
        _sanitizeShadowDOM(currentNode.content);
      }
      /* Check attributes, sanitize if necessary */


      _sanitizeAttributes(currentNode);
    }
    /* If we sanitized `dirty` in-place, return it. */


    if (IN_PLACE) {
      return dirty;
    }
    /* Return sanitized string or DOM */


    if (RETURN_DOM) {
      if (RETURN_DOM_FRAGMENT) {
        returnNode = createDocumentFragment.call(body.ownerDocument);

        while (body.firstChild) {
          // eslint-disable-next-line unicorn/prefer-dom-node-append
          returnNode.appendChild(body.firstChild);
        }
      } else {
        returnNode = body;
      }

      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {
        /*
          AdoptNode() is not used because internal state is not reset
          (e.g. the past names map of a HTMLFormElement), this is safe
          in theory but we would rather not risk another attack vector.
          The state that is cloned by importNode() is explicitly defined
          by the specs.
        */
        returnNode = importNode.call(originalDocument, returnNode, true);
      }

      return returnNode;
    }

    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
    /* Serialize doctype if allowed */

    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
    }
    /* Sanitize final string template-safe */


    if (SAFE_FOR_TEMPLATES) {
      serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');
      serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');
      serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');
    }

    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
  };
  /**
   * Public method to set the configuration once
   * setConfig
   *
   * @param {Object} cfg configuration object
   */


  DOMPurify.setConfig = function (cfg) {
    _parseConfig(cfg);

    SET_CONFIG = true;
  };
  /**
   * Public method to remove the configuration
   * clearConfig
   *
   */


  DOMPurify.clearConfig = function () {
    CONFIG = null;
    SET_CONFIG = false;
  };
  /**
   * Public method to check if an attribute value is valid.
   * Uses last set config, if any. Otherwise, uses config defaults.
   * isValidAttribute
   *
   * @param  {string} tag Tag name of containing element.
   * @param  {string} attr Attribute name.
   * @param  {string} value Attribute value.
   * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
   */


  DOMPurify.isValidAttribute = function (tag, attr, value) {
    /* Initialize shared config vars if necessary. */
    if (!CONFIG) {
      _parseConfig({});
    }

    const lcTag = transformCaseFunc(tag);
    const lcName = transformCaseFunc(attr);
    return _isValidAttribute(lcTag, lcName, value);
  };
  /**
   * AddHook
   * Public method to add DOMPurify hooks
   *
   * @param {String} entryPoint entry point for the hook to add
   * @param {Function} hookFunction function to execute
   */


  DOMPurify.addHook = function (entryPoint, hookFunction) {
    if (typeof hookFunction !== 'function') {
      return;
    }

    hooks[entryPoint] = hooks[entryPoint] || [];
    arrayPush(hooks[entryPoint], hookFunction);
  };
  /**
   * RemoveHook
   * Public method to remove a DOMPurify hook at a given entryPoint
   * (pops it from the stack of hooks if more are present)
   *
   * @param {String} entryPoint entry point for the hook to remove
   * @return {Function} removed(popped) hook
   */


  DOMPurify.removeHook = function (entryPoint) {
    if (hooks[entryPoint]) {
      return arrayPop(hooks[entryPoint]);
    }
  };
  /**
   * RemoveHooks
   * Public method to remove all DOMPurify hooks at a given entryPoint
   *
   * @param  {String} entryPoint entry point for the hooks to remove
   */


  DOMPurify.removeHooks = function (entryPoint) {
    if (hooks[entryPoint]) {
      hooks[entryPoint] = [];
    }
  };
  /**
   * RemoveAllHooks
   * Public method to remove all DOMPurify hooks
   *
   */


  DOMPurify.removeAllHooks = function () {
    hooks = {};
  };

  return DOMPurify;
}

var purify = createDOMPurify();

module.exports = purify;
//# sourceMappingURL=purify.cjs.js.map
{"version":3,"file":"purify.cjs.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","unconstruct","TypeError","func","thisArg","addToSet","set","array","transformCaseFunc","l","length","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","childCount","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":"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"}
/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */

const {
  entries,
  setPrototypeOf,
  isFrozen,
  getPrototypeOf,
  getOwnPropertyDescriptor
} = Object;
let {
  freeze,
  seal,
  create
} = Object; // eslint-disable-line import/no-mutable-exports

let {
  apply,
  construct
} = typeof Reflect !== 'undefined' && Reflect;

if (!apply) {
  apply = function apply(fun, thisValue, args) {
    return fun.apply(thisValue, args);
  };
}

if (!freeze) {
  freeze = function freeze(x) {
    return x;
  };
}

if (!seal) {
  seal = function seal(x) {
    return x;
  };
}

if (!construct) {
  construct = function construct(Func, args) {
    return new Func(...args);
  };
}

const arrayForEach = unapply(Array.prototype.forEach);
const arrayPop = unapply(Array.prototype.pop);
const arrayPush = unapply(Array.prototype.push);
const stringToLowerCase = unapply(String.prototype.toLowerCase);
const stringToString = unapply(String.prototype.toString);
const stringMatch = unapply(String.prototype.match);
const stringReplace = unapply(String.prototype.replace);
const stringIndexOf = unapply(String.prototype.indexOf);
const stringTrim = unapply(String.prototype.trim);
const regExpTest = unapply(RegExp.prototype.test);
const typeErrorCreate = unconstruct(TypeError);
function unapply(func) {
  return function (thisArg) {
    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
      args[_key - 1] = arguments[_key];
    }

    return apply(func, thisArg, args);
  };
}
function unconstruct(func) {
  return function () {
    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
      args[_key2] = arguments[_key2];
    }

    return construct(func, args);
  };
}
/* Add properties to a lookup table */

function addToSet(set, array, transformCaseFunc) {
  transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;

  if (setPrototypeOf) {
    // Make 'in' and truthy checks like Boolean(set.constructor)
    // independent of any properties defined on Object.prototype.
    // Prevent prototype setters from intercepting set as a this value.
    setPrototypeOf(set, null);
  }

  let l = array.length;

  while (l--) {
    let element = array[l];

    if (typeof element === 'string') {
      const lcElement = transformCaseFunc(element);

      if (lcElement !== element) {
        // Config presets (e.g. tags.js, attrs.js) are immutable.
        if (!isFrozen(array)) {
          array[l] = lcElement;
        }

        element = lcElement;
      }
    }

    set[element] = true;
  }

  return set;
}
/* Shallow clone an object */

function clone(object) {
  const newObject = create(null);

  for (const [property, value] of entries(object)) {
    newObject[property] = value;
  }

  return newObject;
}
/* This method automatically checks if the prop is function
 * or getter and behaves accordingly. */

function lookupGetter(object, prop) {
  while (object !== null) {
    const desc = getOwnPropertyDescriptor(object, prop);

    if (desc) {
      if (desc.get) {
        return unapply(desc.get);
      }

      if (typeof desc.value === 'function') {
        return unapply(desc.value);
      }
    }

    object = getPrototypeOf(object);
  }

  function fallbackValue(element) {
    console.warn('fallback value for', element);
    return null;
  }

  return fallbackValue;
}

const 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']); // SVG

const 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']);
const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.
// We still need to know them so that we can do namespace
// checks properly in case one wants to add them to
// allow-list.

const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', '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']);
const 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']); // Similarly to SVG, we want to know all MathML elements,
// even those that we disallow by default.

const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
const text = freeze(['#text']);

const 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']);
const 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']);
const 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']);
const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);

const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode

const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape

const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape

const 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
);
const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex
);
const DOCTYPE_NAME = seal(/^html$/i);

var EXPRESSIONS = /*#__PURE__*/Object.freeze({
  __proto__: null,
  MUSTACHE_EXPR: MUSTACHE_EXPR,
  ERB_EXPR: ERB_EXPR,
  TMPLIT_EXPR: TMPLIT_EXPR,
  DATA_ATTR: DATA_ATTR,
  ARIA_ATTR: ARIA_ATTR,
  IS_ALLOWED_URI: IS_ALLOWED_URI,
  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
  ATTR_WHITESPACE: ATTR_WHITESPACE,
  DOCTYPE_NAME: DOCTYPE_NAME
});

const getGlobal = () => typeof window === 'undefined' ? null : window;
/**
 * Creates a no-op policy for internal use only.
 * Don't export this function outside this module!
 * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
 * @param {Document} document The document object (to determine policy name suffix)
 * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
 * are not supported).
 */


const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
    return null;
  } // Allow the callers to control the unique policy name
  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.
  // Policy creation with duplicate names throws in Trusted Types.


  let suffix = null;
  const ATTR_NAME = 'data-tt-policy-suffix';

  if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
    suffix = document.currentScript.getAttribute(ATTR_NAME);
  }

  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');

  try {
    return trustedTypes.createPolicy(policyName, {
      createHTML(html) {
        return html;
      },

      createScriptURL(scriptUrl) {
        return scriptUrl;
      }

    });
  } catch (_) {
    // Policy creation failed (most likely another DOMPurify script has
    // already run). Skip creating the policy, as this will only cause errors
    // if TT are enforced.
    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
    return null;
  }
};

function createDOMPurify() {
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();

  const DOMPurify = root => createDOMPurify(root);
  /**
   * Version label, exposed for easier checks
   * if DOMPurify is up to date or not
   */


  DOMPurify.version = '3.0.2';
  /**
   * Array of elements that DOMPurify removed during sanitation.
   * Empty if nothing was removed.
   */

  DOMPurify.removed = [];

  if (!window || !window.document || window.document.nodeType !== 9) {
    // Not running in a browser, provide a factory function
    // so that you can pass your own Window
    DOMPurify.isSupported = false;
    return DOMPurify;
  }

  const originalDocument = window.document;
  let {
    document
  } = window;
  const {
    DocumentFragment,
    HTMLTemplateElement,
    Node,
    Element,
    NodeFilter,
    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,
    HTMLFormElement,
    DOMParser,
    trustedTypes
  } = window;
  const ElementPrototype = Element.prototype;
  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
  const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a
  // new document created via createHTMLDocument. As per the spec
  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
  // a new empty registry is used when creating a template contents owner
  // document, so we use that as our parent document to ensure nothing
  // is inherited.

  if (typeof HTMLTemplateElement === 'function') {
    const template = document.createElement('template');

    if (template.content && template.content.ownerDocument) {
      document = template.content.ownerDocument;
    }
  }

  const trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);

  const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
  const {
    implementation,
    createNodeIterator,
    createDocumentFragment,
    getElementsByTagName
  } = document;
  const {
    importNode
  } = originalDocument;
  let hooks = {};
  /**
   * Expose whether this browser supports running the full DOMPurify.
   */

  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined';
  const {
    MUSTACHE_EXPR,
    ERB_EXPR,
    TMPLIT_EXPR,
    DATA_ATTR,
    ARIA_ATTR,
    IS_SCRIPT_OR_DATA,
    ATTR_WHITESPACE
  } = EXPRESSIONS;
  let {
    IS_ALLOWED_URI: IS_ALLOWED_URI$1
  } = EXPRESSIONS;
  /**
   * We consider the elements and attributes below to be safe. Ideally
   * don't add any new ones but feel free to remove unwanted ones.
   */

  /* allowed element names */

  let ALLOWED_TAGS = null;
  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
  /* Allowed attribute names */

  let ALLOWED_ATTR = null;
  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
  /*
   * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.
   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)
   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)
   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.
   */

  let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
    tagNameCheck: {
      writable: true,
      configurable: false,
      enumerable: true,
      value: null
    },
    attributeNameCheck: {
      writable: true,
      configurable: false,
      enumerable: true,
      value: null
    },
    allowCustomizedBuiltInElements: {
      writable: true,
      configurable: false,
      enumerable: true,
      value: false
    }
  }));
  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */

  let FORBID_TAGS = null;
  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */

  let FORBID_ATTR = null;
  /* Decide if ARIA attributes are okay */

  let ALLOW_ARIA_ATTR = true;
  /* Decide if custom data attributes are okay */

  let ALLOW_DATA_ATTR = true;
  /* Decide if unknown protocols are okay */

  let ALLOW_UNKNOWN_PROTOCOLS = false;
  /* Decide if self-closing tags in attributes are allowed.
   * Usually removed due to a mXSS issue in jQuery 3.0 */

  let ALLOW_SELF_CLOSE_IN_ATTR = true;
  /* Output should be safe for common template engines.
   * This means, DOMPurify removes data attributes, mustaches and ERB
   */

  let SAFE_FOR_TEMPLATES = false;
  /* Decide if document with <html>... should be returned */

  let WHOLE_DOCUMENT = false;
  /* Track whether config is already set on this instance of DOMPurify. */

  let SET_CONFIG = false;
  /* Decide if all elements (e.g. style, script) must be children of
   * document.body. By default, browsers might move them to document.head */

  let FORCE_BODY = false;
  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
   * string (or a TrustedHTML object if Trusted Types are supported).
   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
   */

  let RETURN_DOM = false;
  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html
   * string  (or a TrustedHTML object if Trusted Types are supported) */

  let RETURN_DOM_FRAGMENT = false;
  /* Try to return a Trusted Type object instead of a string, return a string in
   * case Trusted Types are not supported  */

  let RETURN_TRUSTED_TYPE = false;
  /* Output should be free from DOM clobbering attacks?
   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.
   */

  let SANITIZE_DOM = true;
  /* Achieve full DOM Clobbering protection by isolating the namespace of named
   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.
   *
   * HTML/DOM spec rules that enable DOM Clobbering:
   *   - Named Access on Window (§7.3.3)
   *   - DOM Tree Accessors (§3.1.5)
   *   - Form Element Parent-Child Relations (§4.10.3)
   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)
   *   - HTMLCollection (§4.2.10.2)
   *
   * Namespace isolation is implemented by prefixing `id` and `name` attributes
   * with a constant string, i.e., `user-content-`
   */

  let SANITIZE_NAMED_PROPS = false;
  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';
  /* Keep element content when removing element? */

  let KEEP_CONTENT = true;
  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
   * of importing it into a new Document and returning a sanitized copy */

  let IN_PLACE = false;
  /* Allow usage of profiles like html, svg and mathMl */

  let USE_PROFILES = {};
  /* Tags to ignore content of when KEEP_CONTENT is true */

  let FORBID_CONTENTS = null;
  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']);
  /* Tags that are safe for data: URIs */

  let DATA_URI_TAGS = null;
  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);
  /* Attributes safe for values like "javascript:" */

  let URI_SAFE_ATTRIBUTES = null;
  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);
  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
  /* Document namespace */

  let NAMESPACE = HTML_NAMESPACE;
  let IS_EMPTY_INPUT = false;
  /* Allowed XHTML+XML namespaces */

  let ALLOWED_NAMESPACES = null;
  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
  /* Parsing of strict XHTML documents */

  let PARSER_MEDIA_TYPE;
  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];
  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
  let transformCaseFunc;
  /* Keep a reference to config to pass to hooks */

  let CONFIG = null;
  /* Ideally, do not touch anything below this line */

  /* ______________________________________________ */

  const formElement = document.createElement('form');

  const isRegexOrFunction = function isRegexOrFunction(testValue) {
    return testValue instanceof RegExp || testValue instanceof Function;
  };
  /**
   * _parseConfig
   *
   * @param  {Object} cfg optional config literal
   */
  // eslint-disable-next-line complexity


  const _parseConfig = function _parseConfig(cfg) {
    if (CONFIG && CONFIG === cfg) {
      return;
    }
    /* Shield configuration object from tampering */


    if (!cfg || typeof cfg !== 'object') {
      cfg = {};
    }
    /* Shield configuration object from prototype pollution */


    cfg = clone(cfg);
    PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.

    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
    /* Set configuration parameters */

    ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
    ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
    ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
    URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent
    cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent
    transformCaseFunc // eslint-disable-line indent
    ) // eslint-disable-line indent
    : DEFAULT_URI_SAFE_ATTRIBUTES;
    DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent
    cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent
    transformCaseFunc // eslint-disable-line indent
    ) // eslint-disable-line indent
    : DEFAULT_DATA_URI_TAGS;
    FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
    FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};
    FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};
    USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true

    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true

    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false

    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true

    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false

    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false

    RETURN_DOM = cfg.RETURN_DOM || false; // Default false

    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false

    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false

    FORCE_BODY = cfg.FORCE_BODY || false; // Default false

    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true

    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false

    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true

    IN_PLACE = cfg.IN_PLACE || false; // Default false

    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};

    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
    }

    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
    }

    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
    }

    if (SAFE_FOR_TEMPLATES) {
      ALLOW_DATA_ATTR = false;
    }

    if (RETURN_DOM_FRAGMENT) {
      RETURN_DOM = true;
    }
    /* Parse profile info */


    if (USE_PROFILES) {
      ALLOWED_TAGS = addToSet({}, [...text]);
      ALLOWED_ATTR = [];

      if (USE_PROFILES.html === true) {
        addToSet(ALLOWED_TAGS, html$1);
        addToSet(ALLOWED_ATTR, html);
      }

      if (USE_PROFILES.svg === true) {
        addToSet(ALLOWED_TAGS, svg$1);
        addToSet(ALLOWED_ATTR, svg);
        addToSet(ALLOWED_ATTR, xml);
      }

      if (USE_PROFILES.svgFilters === true) {
        addToSet(ALLOWED_TAGS, svgFilters);
        addToSet(ALLOWED_ATTR, svg);
        addToSet(ALLOWED_ATTR, xml);
      }

      if (USE_PROFILES.mathMl === true) {
        addToSet(ALLOWED_TAGS, mathMl$1);
        addToSet(ALLOWED_ATTR, mathMl);
        addToSet(ALLOWED_ATTR, xml);
      }
    }
    /* Merge configuration parameters */


    if (cfg.ADD_TAGS) {
      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
        ALLOWED_TAGS = clone(ALLOWED_TAGS);
      }

      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
    }

    if (cfg.ADD_ATTR) {
      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
        ALLOWED_ATTR = clone(ALLOWED_ATTR);
      }

      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
    }

    if (cfg.ADD_URI_SAFE_ATTR) {
      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
    }

    if (cfg.FORBID_CONTENTS) {
      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
        FORBID_CONTENTS = clone(FORBID_CONTENTS);
      }

      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
    }
    /* Add #text in case KEEP_CONTENT is set to true */


    if (KEEP_CONTENT) {
      ALLOWED_TAGS['#text'] = true;
    }
    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */


    if (WHOLE_DOCUMENT) {
      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
    }
    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */


    if (ALLOWED_TAGS.table) {
      addToSet(ALLOWED_TAGS, ['tbody']);
      delete FORBID_TAGS.tbody;
    } // Prevent further manipulation of configuration.
    // Not available in IE8, Safari 5, etc.


    if (freeze) {
      freeze(cfg);
    }

    CONFIG = cfg;
  };

  const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);
  const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML
  // namespace. We need to specify them explicitly
  // so that they don't get erroneously deleted from
  // HTML namespace.

  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);
  /* Keep track of all possible SVG and MathML tags
   * so that we can perform the namespace checks
   * correctly. */

  const ALL_SVG_TAGS = addToSet({}, svg$1);
  addToSet(ALL_SVG_TAGS, svgFilters);
  addToSet(ALL_SVG_TAGS, svgDisallowed);
  const ALL_MATHML_TAGS = addToSet({}, mathMl$1);
  addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
  /**
   *
   *
   * @param  {Element} element a DOM element whose namespace is being checked
   * @returns {boolean} Return false if the element has a
   *  namespace that a spec-compliant parser would never
   *  return. Return true otherwise.
   */

  const _checkValidNamespace = function _checkValidNamespace(element) {
    let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode
    // can be null. We just simulate parent in this case.

    if (!parent || !parent.tagName) {
      parent = {
        namespaceURI: NAMESPACE,
        tagName: 'template'
      };
    }

    const tagName = stringToLowerCase(element.tagName);
    const parentTagName = stringToLowerCase(parent.tagName);

    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
      return false;
    }

    if (element.namespaceURI === SVG_NAMESPACE) {
      // The only way to switch from HTML namespace to SVG
      // is via <svg>. If it happens via any other tag, then
      // it should be killed.
      if (parent.namespaceURI === HTML_NAMESPACE) {
        return tagName === 'svg';
      } // The only way to switch from MathML to SVG is via`
      // svg if parent is either <annotation-xml> or MathML
      // text integration points.


      if (parent.namespaceURI === MATHML_NAMESPACE) {
        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
      } // We only allow elements that are defined in SVG
      // spec. All others are disallowed in SVG namespace.


      return Boolean(ALL_SVG_TAGS[tagName]);
    }

    if (element.namespaceURI === MATHML_NAMESPACE) {
      // The only way to switch from HTML namespace to MathML
      // is via <math>. If it happens via any other tag, then
      // it should be killed.
      if (parent.namespaceURI === HTML_NAMESPACE) {
        return tagName === 'math';
      } // The only way to switch from SVG to MathML is via
      // <math> and HTML integration points


      if (parent.namespaceURI === SVG_NAMESPACE) {
        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
      } // We only allow elements that are defined in MathML
      // spec. All others are disallowed in MathML namespace.


      return Boolean(ALL_MATHML_TAGS[tagName]);
    }

    if (element.namespaceURI === HTML_NAMESPACE) {
      // The only way to switch from SVG to HTML is via
      // HTML integration points, and from MathML to HTML
      // is via MathML text integration points
      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
        return false;
      }

      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
        return false;
      } // We disallow tags that are specific for MathML
      // or SVG and should never appear in HTML namespace


      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
    } // For XHTML and XML documents that support custom namespaces


    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {
      return true;
    } // The code should never reach this place (this means
    // that the element somehow got namespace that is not
    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).
    // Return false just in case.


    return false;
  };
  /**
   * _forceRemove
   *
   * @param  {Node} node a DOM node
   */


  const _forceRemove = function _forceRemove(node) {
    arrayPush(DOMPurify.removed, {
      element: node
    });

    try {
      // eslint-disable-next-line unicorn/prefer-dom-node-remove
      node.parentNode.removeChild(node);
    } catch (_) {
      node.remove();
    }
  };
  /**
   * _removeAttribute
   *
   * @param  {String} name an Attribute name
   * @param  {Node} node a DOM node
   */


  const _removeAttribute = function _removeAttribute(name, node) {
    try {
      arrayPush(DOMPurify.removed, {
        attribute: node.getAttributeNode(name),
        from: node
      });
    } catch (_) {
      arrayPush(DOMPurify.removed, {
        attribute: null,
        from: node
      });
    }

    node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes

    if (name === 'is' && !ALLOWED_ATTR[name]) {
      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
        try {
          _forceRemove(node);
        } catch (_) {}
      } else {
        try {
          node.setAttribute(name, '');
        } catch (_) {}
      }
    }
  };
  /**
   * _initDocument
   *
   * @param  {String} dirty a string of dirty markup
   * @return {Document} a DOM, filled with the dirty markup
   */


  const _initDocument = function _initDocument(dirty) {
    /* Create a HTML document */
    let doc;
    let leadingWhitespace;

    if (FORCE_BODY) {
      dirty = '<remove></remove>' + dirty;
    } else {
      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
      const matches = stringMatch(dirty, /^[\r\n\t ]+/);
      leadingWhitespace = matches && matches[0];
    }

    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {
      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)
      dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
    }

    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
    /*
     * Use the DOMParser API by default, fallback later if needs be
     * DOMParser not work for svg when has multiple root element.
     */

    if (NAMESPACE === HTML_NAMESPACE) {
      try {
        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
      } catch (_) {}
    }
    /* Use createHTMLDocument in case DOMParser is not available */


    if (!doc || !doc.documentElement) {
      doc = implementation.createDocument(NAMESPACE, 'template', null);

      try {
        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
      } catch (_) {// Syntax error if dirtyPayload is invalid xml
      }
    }

    const body = doc.body || doc.documentElement;

    if (dirty && leadingWhitespace) {
      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
    }
    /* Work on whole document or just its body */


    if (NAMESPACE === HTML_NAMESPACE) {
      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
    }

    return WHOLE_DOCUMENT ? doc.documentElement : body;
  };
  /**
   * _createIterator
   *
   * @param  {Document} root document/fragment to create iterator for
   * @return {Iterator} iterator instance
   */


  const _createIterator = function _createIterator(root) {
    return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise
    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
  };
  /**
   * _isClobbered
   *
   * @param  {Node} elm element to check for clobbering attacks
   * @return {Boolean} true if clobbered, false if safe
   */


  const _isClobbered = function _isClobbered(elm) {
    return 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');
  };
  /**
   * _isNode
   *
   * @param  {Node} obj object to check whether it's a DOM node
   * @return {Boolean} true is object is a DOM node
   */


  const _isNode = function _isNode(object) {
    return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
  };
  /**
   * _executeHook
   * Execute user configurable hooks
   *
   * @param  {String} entryPoint  Name of the hook's entry point
   * @param  {Node} currentNode node to work on with the hook
   * @param  {Object} data additional hook parameters
   */


  const _executeHook = function _executeHook(entryPoint, currentNode, data) {
    if (!hooks[entryPoint]) {
      return;
    }

    arrayForEach(hooks[entryPoint], hook => {
      hook.call(DOMPurify, currentNode, data, CONFIG);
    });
  };
  /**
   * _sanitizeElements
   *
   * @protect nodeName
   * @protect textContent
   * @protect removeChild
   *
   * @param   {Node} currentNode to check for permission to exist
   * @return  {Boolean} true if node was killed, false if left alive
   */


  const _sanitizeElements = function _sanitizeElements(currentNode) {
    let content;
    /* Execute a hook if present */

    _executeHook('beforeSanitizeElements', currentNode, null);
    /* Check if element is clobbered or can clobber */


    if (_isClobbered(currentNode)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Now let's check the element's type and name */


    const tagName = transformCaseFunc(currentNode.nodeName);
    /* Execute a hook if present */

    _executeHook('uponSanitizeElement', currentNode, {
      tagName,
      allowedTags: ALLOWED_TAGS
    });
    /* Detect mXSS attempts abusing namespace confusion */


    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Remove element if anything forbids its presence */


    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
      /* Check if we have a custom element to handle */
      if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
      }
      /* Keep content except for bad-listed elements */


      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
        const parentNode = getParentNode(currentNode) || currentNode.parentNode;
        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;

        if (childNodes && parentNode) {
          const childCount = childNodes.length;

          for (let i = childCount - 1; i >= 0; --i) {
            parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
          }
        }
      }

      _forceRemove(currentNode);

      return true;
    }
    /* Check whether element has a valid namespace */


    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Make sure that older browsers don't get noscript mXSS */


    if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
      _forceRemove(currentNode);

      return true;
    }
    /* Sanitize element content to be template-safe */


    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
      /* Get the element's text content */
      content = currentNode.textContent;
      content = stringReplace(content, MUSTACHE_EXPR, ' ');
      content = stringReplace(content, ERB_EXPR, ' ');
      content = stringReplace(content, TMPLIT_EXPR, ' ');

      if (currentNode.textContent !== content) {
        arrayPush(DOMPurify.removed, {
          element: currentNode.cloneNode()
        });
        currentNode.textContent = content;
      }
    }
    /* Execute a hook if present */


    _executeHook('afterSanitizeElements', currentNode, null);

    return false;
  };
  /**
   * _isValidAttribute
   *
   * @param  {string} lcTag Lowercase tag name of containing element.
   * @param  {string} lcName Lowercase attribute name.
   * @param  {string} value Attribute value.
   * @return {Boolean} Returns true if `value` is valid, otherwise false.
   */
  // eslint-disable-next-line complexity


  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
    /* Make sure attribute cannot clobber */
    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
      return false;
    }
    /* Allow valid data-* attributes: At least one character after "-"
        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
        We don't need to check the value; it's always URI safe. */


    if (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]) {
      if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND
      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
      _basicCustomElementTest(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)) || // Alternative, second condition checks if it's an `is`-attribute, AND
      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
      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 {
        return false;
      }
      /* Check value is safe. First, is attr inert? If so, is safe */

    } 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) ; else {
      return false;
    }

    return true;
  };
  /**
   * _basicCustomElementCheck
   * checks if at least one dash is included in tagName, and it's not the first char
   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
   * @param {string} tagName name of the tag of the node to sanitize
   */


  const _basicCustomElementTest = function _basicCustomElementTest(tagName) {
    return tagName.indexOf('-') > 0;
  };
  /**
   * _sanitizeAttributes
   *
   * @protect attributes
   * @protect nodeName
   * @protect removeAttribute
   * @protect setAttribute
   *
   * @param  {Node} currentNode to sanitize
   */


  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
    let attr;
    let value;
    let lcName;
    let l;
    /* Execute a hook if present */

    _executeHook('beforeSanitizeAttributes', currentNode, null);

    const {
      attributes
    } = currentNode;
    /* Check if we have attributes; if not we might have a text node */

    if (!attributes) {
      return;
    }

    const hookEvent = {
      attrName: '',
      attrValue: '',
      keepAttr: true,
      allowedAttributes: ALLOWED_ATTR
    };
    l = attributes.length;
    /* Go backwards over all attributes; safely remove bad ones */

    while (l--) {
      attr = attributes[l];
      const {
        name,
        namespaceURI
      } = attr;
      value = name === 'value' ? attr.value : stringTrim(attr.value);
      lcName = transformCaseFunc(name);
      /* Execute a hook if present */

      hookEvent.attrName = lcName;
      hookEvent.attrValue = value;
      hookEvent.keepAttr = true;
      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set

      _executeHook('uponSanitizeAttribute', currentNode, hookEvent);

      value = hookEvent.attrValue;
      /* Did the hooks approve of the attribute? */

      if (hookEvent.forceKeepAttr) {
        continue;
      }
      /* Remove attribute */


      _removeAttribute(name, currentNode);
      /* Did the hooks approve of the attribute? */


      if (!hookEvent.keepAttr) {
        continue;
      }
      /* Work around a security issue in jQuery 3.0 */


      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) {
        _removeAttribute(name, currentNode);

        continue;
      }
      /* Sanitize attribute content to be template-safe */


      if (SAFE_FOR_TEMPLATES) {
        value = stringReplace(value, MUSTACHE_EXPR, ' ');
        value = stringReplace(value, ERB_EXPR, ' ');
        value = stringReplace(value, TMPLIT_EXPR, ' ');
      }
      /* Is `value` valid for this attribute? */


      const lcTag = transformCaseFunc(currentNode.nodeName);

      if (!_isValidAttribute(lcTag, lcName, value)) {
        continue;
      }
      /* Full DOM Clobbering protection via namespace isolation,
       * Prefix id and name attributes with `user-content-`
       */


      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
        // Remove the attribute with this value
        _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value


        value = SANITIZE_NAMED_PROPS_PREFIX + value;
      }
      /* Handle attributes that require Trusted Types */


      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {
        if (namespaceURI) ; else {
          switch (trustedTypes.getAttributeType(lcTag, lcName)) {
            case 'TrustedHTML':
              value = trustedTypesPolicy.createHTML(value);
              break;

            case 'TrustedScriptURL':
              value = trustedTypesPolicy.createScriptURL(value);
              break;
          }
        }
      }
      /* Handle invalid data-* attribute set by try-catching it */


      try {
        if (namespaceURI) {
          currentNode.setAttributeNS(namespaceURI, name, value);
        } else {
          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
          currentNode.setAttribute(name, value);
        }

        arrayPop(DOMPurify.removed);
      } catch (_) {}
    }
    /* Execute a hook if present */


    _executeHook('afterSanitizeAttributes', currentNode, null);
  };
  /**
   * _sanitizeShadowDOM
   *
   * @param  {DocumentFragment} fragment to iterate over recursively
   */


  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
    let shadowNode;

    const shadowIterator = _createIterator(fragment);
    /* Execute a hook if present */


    _executeHook('beforeSanitizeShadowDOM', fragment, null);

    while (shadowNode = shadowIterator.nextNode()) {
      /* Execute a hook if present */
      _executeHook('uponSanitizeShadowNode', shadowNode, null);
      /* Sanitize tags and elements */


      if (_sanitizeElements(shadowNode)) {
        continue;
      }
      /* Deep shadow DOM detected */


      if (shadowNode.content instanceof DocumentFragment) {
        _sanitizeShadowDOM(shadowNode.content);
      }
      /* Check attributes, sanitize if necessary */


      _sanitizeAttributes(shadowNode);
    }
    /* Execute a hook if present */


    _executeHook('afterSanitizeShadowDOM', fragment, null);
  };
  /**
   * Sanitize
   * Public method providing core sanitation functionality
   *
   * @param {String|Node} dirty string or DOM node
   * @param {Object} configuration object
   */
  // eslint-disable-next-line complexity


  DOMPurify.sanitize = function (dirty) {
    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
    let body;
    let importedNode;
    let currentNode;
    let returnNode;
    /* Make sure we have a string to sanitize.
      DO NOT return early, as this will return the wrong type if
      the user has requested a DOM object rather than a string */

    IS_EMPTY_INPUT = !dirty;

    if (IS_EMPTY_INPUT) {
      dirty = '<!-->';
    }
    /* Stringify, in case dirty is an object */


    if (typeof dirty !== 'string' && !_isNode(dirty)) {
      // eslint-disable-next-line no-negated-condition
      if (typeof dirty.toString !== 'function') {
        throw typeErrorCreate('toString is not a function');
      } else {
        dirty = dirty.toString();

        if (typeof dirty !== 'string') {
          throw typeErrorCreate('dirty is not a string, aborting');
        }
      }
    }
    /* Return dirty HTML if DOMPurify cannot run */


    if (!DOMPurify.isSupported) {
      return dirty;
    }
    /* Assign config vars */


    if (!SET_CONFIG) {
      _parseConfig(cfg);
    }
    /* Clean up removed elements */


    DOMPurify.removed = [];
    /* Check if dirty is correctly typed for IN_PLACE */

    if (typeof dirty === 'string') {
      IN_PLACE = false;
    }

    if (IN_PLACE) {
      /* Do some early pre-sanitization to avoid unsafe root nodes */
      if (dirty.nodeName) {
        const tagName = transformCaseFunc(dirty.nodeName);

        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
        }
      }
    } else if (dirty instanceof Node) {
      /* If dirty is a DOM element, append to an empty document to avoid
         elements being stripped by the parser */
      body = _initDocument('<!---->');
      importedNode = body.ownerDocument.importNode(dirty, true);

      if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
        /* Node is already a body, use as is */
        body = importedNode;
      } else if (importedNode.nodeName === 'HTML') {
        body = importedNode;
      } else {
        // eslint-disable-next-line unicorn/prefer-dom-node-append
        body.appendChild(importedNode);
      }
    } else {
      /* Exit directly if we have nothing to do */
      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
      dirty.indexOf('<') === -1) {
        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
      }
      /* Initialize the document to work on */


      body = _initDocument(dirty);
      /* Check we have a DOM node from the data */

      if (!body) {
        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
      }
    }
    /* Remove first element node (ours) if FORCE_BODY is set */


    if (body && FORCE_BODY) {
      _forceRemove(body.firstChild);
    }
    /* Get node iterator */


    const nodeIterator = _createIterator(IN_PLACE ? dirty : body);
    /* Now start iterating over the created document */


    while (currentNode = nodeIterator.nextNode()) {
      /* Sanitize tags and elements */
      if (_sanitizeElements(currentNode)) {
        continue;
      }
      /* Shadow DOM detected, sanitize it */


      if (currentNode.content instanceof DocumentFragment) {
        _sanitizeShadowDOM(currentNode.content);
      }
      /* Check attributes, sanitize if necessary */


      _sanitizeAttributes(currentNode);
    }
    /* If we sanitized `dirty` in-place, return it. */


    if (IN_PLACE) {
      return dirty;
    }
    /* Return sanitized string or DOM */


    if (RETURN_DOM) {
      if (RETURN_DOM_FRAGMENT) {
        returnNode = createDocumentFragment.call(body.ownerDocument);

        while (body.firstChild) {
          // eslint-disable-next-line unicorn/prefer-dom-node-append
          returnNode.appendChild(body.firstChild);
        }
      } else {
        returnNode = body;
      }

      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {
        /*
          AdoptNode() is not used because internal state is not reset
          (e.g. the past names map of a HTMLFormElement), this is safe
          in theory but we would rather not risk another attack vector.
          The state that is cloned by importNode() is explicitly defined
          by the specs.
        */
        returnNode = importNode.call(originalDocument, returnNode, true);
      }

      return returnNode;
    }

    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
    /* Serialize doctype if allowed */

    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
    }
    /* Sanitize final string template-safe */


    if (SAFE_FOR_TEMPLATES) {
      serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');
      serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');
      serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');
    }

    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
  };
  /**
   * Public method to set the configuration once
   * setConfig
   *
   * @param {Object} cfg configuration object
   */


  DOMPurify.setConfig = function (cfg) {
    _parseConfig(cfg);

    SET_CONFIG = true;
  };
  /**
   * Public method to remove the configuration
   * clearConfig
   *
   */


  DOMPurify.clearConfig = function () {
    CONFIG = null;
    SET_CONFIG = false;
  };
  /**
   * Public method to check if an attribute value is valid.
   * Uses last set config, if any. Otherwise, uses config defaults.
   * isValidAttribute
   *
   * @param  {string} tag Tag name of containing element.
   * @param  {string} attr Attribute name.
   * @param  {string} value Attribute value.
   * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
   */


  DOMPurify.isValidAttribute = function (tag, attr, value) {
    /* Initialize shared config vars if necessary. */
    if (!CONFIG) {
      _parseConfig({});
    }

    const lcTag = transformCaseFunc(tag);
    const lcName = transformCaseFunc(attr);
    return _isValidAttribute(lcTag, lcName, value);
  };
  /**
   * AddHook
   * Public method to add DOMPurify hooks
   *
   * @param {String} entryPoint entry point for the hook to add
   * @param {Function} hookFunction function to execute
   */


  DOMPurify.addHook = function (entryPoint, hookFunction) {
    if (typeof hookFunction !== 'function') {
      return;
    }

    hooks[entryPoint] = hooks[entryPoint] || [];
    arrayPush(hooks[entryPoint], hookFunction);
  };
  /**
   * RemoveHook
   * Public method to remove a DOMPurify hook at a given entryPoint
   * (pops it from the stack of hooks if more are present)
   *
   * @param {String} entryPoint entry point for the hook to remove
   * @return {Function} removed(popped) hook
   */


  DOMPurify.removeHook = function (entryPoint) {
    if (hooks[entryPoint]) {
      return arrayPop(hooks[entryPoint]);
    }
  };
  /**
   * RemoveHooks
   * Public method to remove all DOMPurify hooks at a given entryPoint
   *
   * @param  {String} entryPoint entry point for the hooks to remove
   */


  DOMPurify.removeHooks = function (entryPoint) {
    if (hooks[entryPoint]) {
      hooks[entryPoint] = [];
    }
  };
  /**
   * RemoveAllHooks
   * Public method to remove all DOMPurify hooks
   *
   */


  DOMPurify.removeAllHooks = function () {
    hooks = {};
  };

  return DOMPurify;
}

var purify = createDOMPurify();

export { purify as default };
//# sourceMappingURL=purify.es.js.map
{"version":3,"file":"purify.es.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","unconstruct","TypeError","func","thisArg","addToSet","set","array","transformCaseFunc","l","length","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","childCount","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":"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"}
/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());
})(this, (function () { 'use strict';

  const {
    entries,
    setPrototypeOf,
    isFrozen,
    getPrototypeOf,
    getOwnPropertyDescriptor
  } = Object;
  let {
    freeze,
    seal,
    create
  } = Object; // eslint-disable-line import/no-mutable-exports

  let {
    apply,
    construct
  } = typeof Reflect !== 'undefined' && Reflect;

  if (!apply) {
    apply = function apply(fun, thisValue, args) {
      return fun.apply(thisValue, args);
    };
  }

  if (!freeze) {
    freeze = function freeze(x) {
      return x;
    };
  }

  if (!seal) {
    seal = function seal(x) {
      return x;
    };
  }

  if (!construct) {
    construct = function construct(Func, args) {
      return new Func(...args);
    };
  }

  const arrayForEach = unapply(Array.prototype.forEach);
  const arrayPop = unapply(Array.prototype.pop);
  const arrayPush = unapply(Array.prototype.push);
  const stringToLowerCase = unapply(String.prototype.toLowerCase);
  const stringToString = unapply(String.prototype.toString);
  const stringMatch = unapply(String.prototype.match);
  const stringReplace = unapply(String.prototype.replace);
  const stringIndexOf = unapply(String.prototype.indexOf);
  const stringTrim = unapply(String.prototype.trim);
  const regExpTest = unapply(RegExp.prototype.test);
  const typeErrorCreate = unconstruct(TypeError);
  function unapply(func) {
    return function (thisArg) {
      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }

      return apply(func, thisArg, args);
    };
  }
  function unconstruct(func) {
    return function () {
      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
        args[_key2] = arguments[_key2];
      }

      return construct(func, args);
    };
  }
  /* Add properties to a lookup table */

  function addToSet(set, array, transformCaseFunc) {
    transformCaseFunc = transformCaseFunc ? transformCaseFunc : stringToLowerCase;

    if (setPrototypeOf) {
      // Make 'in' and truthy checks like Boolean(set.constructor)
      // independent of any properties defined on Object.prototype.
      // Prevent prototype setters from intercepting set as a this value.
      setPrototypeOf(set, null);
    }

    let l = array.length;

    while (l--) {
      let element = array[l];

      if (typeof element === 'string') {
        const lcElement = transformCaseFunc(element);

        if (lcElement !== element) {
          // Config presets (e.g. tags.js, attrs.js) are immutable.
          if (!isFrozen(array)) {
            array[l] = lcElement;
          }

          element = lcElement;
        }
      }

      set[element] = true;
    }

    return set;
  }
  /* Shallow clone an object */

  function clone(object) {
    const newObject = create(null);

    for (const [property, value] of entries(object)) {
      newObject[property] = value;
    }

    return newObject;
  }
  /* This method automatically checks if the prop is function
   * or getter and behaves accordingly. */

  function lookupGetter(object, prop) {
    while (object !== null) {
      const desc = getOwnPropertyDescriptor(object, prop);

      if (desc) {
        if (desc.get) {
          return unapply(desc.get);
        }

        if (typeof desc.value === 'function') {
          return unapply(desc.value);
        }
      }

      object = getPrototypeOf(object);
    }

    function fallbackValue(element) {
      console.warn('fallback value for', element);
      return null;
    }

    return fallbackValue;
  }

  const 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']); // SVG

  const 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']);
  const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); // List of SVG elements that are disallowed by default.
  // We still need to know them so that we can do namespace
  // checks properly in case one wants to add them to
  // allow-list.

  const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', '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']);
  const 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']); // Similarly to SVG, we want to know all MathML elements,
  // even those that we disallow by default.

  const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
  const text = freeze(['#text']);

  const 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']);
  const 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']);
  const 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']);
  const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);

  const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode

  const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
  const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
  const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape

  const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape

  const 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
  );
  const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
  const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex
  );
  const DOCTYPE_NAME = seal(/^html$/i);

  var EXPRESSIONS = /*#__PURE__*/Object.freeze({
    __proto__: null,
    MUSTACHE_EXPR: MUSTACHE_EXPR,
    ERB_EXPR: ERB_EXPR,
    TMPLIT_EXPR: TMPLIT_EXPR,
    DATA_ATTR: DATA_ATTR,
    ARIA_ATTR: ARIA_ATTR,
    IS_ALLOWED_URI: IS_ALLOWED_URI,
    IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
    ATTR_WHITESPACE: ATTR_WHITESPACE,
    DOCTYPE_NAME: DOCTYPE_NAME
  });

  const getGlobal = () => typeof window === 'undefined' ? null : window;
  /**
   * Creates a no-op policy for internal use only.
   * Don't export this function outside this module!
   * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
   * @param {Document} document The document object (to determine policy name suffix)
   * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
   * are not supported).
   */


  const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
    if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
      return null;
    } // Allow the callers to control the unique policy name
    // by adding a data-tt-policy-suffix to the script element with the DOMPurify.
    // Policy creation with duplicate names throws in Trusted Types.


    let suffix = null;
    const ATTR_NAME = 'data-tt-policy-suffix';

    if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
      suffix = document.currentScript.getAttribute(ATTR_NAME);
    }

    const policyName = 'dompurify' + (suffix ? '#' + suffix : '');

    try {
      return trustedTypes.createPolicy(policyName, {
        createHTML(html) {
          return html;
        },

        createScriptURL(scriptUrl) {
          return scriptUrl;
        }

      });
    } catch (_) {
      // Policy creation failed (most likely another DOMPurify script has
      // already run). Skip creating the policy, as this will only cause errors
      // if TT are enforced.
      console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
      return null;
    }
  };

  function createDOMPurify() {
    let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();

    const DOMPurify = root => createDOMPurify(root);
    /**
     * Version label, exposed for easier checks
     * if DOMPurify is up to date or not
     */


    DOMPurify.version = '3.0.2';
    /**
     * Array of elements that DOMPurify removed during sanitation.
     * Empty if nothing was removed.
     */

    DOMPurify.removed = [];

    if (!window || !window.document || window.document.nodeType !== 9) {
      // Not running in a browser, provide a factory function
      // so that you can pass your own Window
      DOMPurify.isSupported = false;
      return DOMPurify;
    }

    const originalDocument = window.document;
    let {
      document
    } = window;
    const {
      DocumentFragment,
      HTMLTemplateElement,
      Node,
      Element,
      NodeFilter,
      NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,
      HTMLFormElement,
      DOMParser,
      trustedTypes
    } = window;
    const ElementPrototype = Element.prototype;
    const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
    const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');
    const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');
    const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); // As per issue #47, the web-components registry is inherited by a
    // new document created via createHTMLDocument. As per the spec
    // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
    // a new empty registry is used when creating a template contents owner
    // document, so we use that as our parent document to ensure nothing
    // is inherited.

    if (typeof HTMLTemplateElement === 'function') {
      const template = document.createElement('template');

      if (template.content && template.content.ownerDocument) {
        document = template.content.ownerDocument;
      }
    }

    const trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);

    const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
    const {
      implementation,
      createNodeIterator,
      createDocumentFragment,
      getElementsByTagName
    } = document;
    const {
      importNode
    } = originalDocument;
    let hooks = {};
    /**
     * Expose whether this browser supports running the full DOMPurify.
     */

    DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined';
    const {
      MUSTACHE_EXPR,
      ERB_EXPR,
      TMPLIT_EXPR,
      DATA_ATTR,
      ARIA_ATTR,
      IS_SCRIPT_OR_DATA,
      ATTR_WHITESPACE
    } = EXPRESSIONS;
    let {
      IS_ALLOWED_URI: IS_ALLOWED_URI$1
    } = EXPRESSIONS;
    /**
     * We consider the elements and attributes below to be safe. Ideally
     * don't add any new ones but feel free to remove unwanted ones.
     */

    /* allowed element names */

    let ALLOWED_TAGS = null;
    const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
    /* Allowed attribute names */

    let ALLOWED_ATTR = null;
    const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
    /*
     * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.
     * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)
     * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)
     * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.
     */

    let CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, {
      tagNameCheck: {
        writable: true,
        configurable: false,
        enumerable: true,
        value: null
      },
      attributeNameCheck: {
        writable: true,
        configurable: false,
        enumerable: true,
        value: null
      },
      allowCustomizedBuiltInElements: {
        writable: true,
        configurable: false,
        enumerable: true,
        value: false
      }
    }));
    /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */

    let FORBID_TAGS = null;
    /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */

    let FORBID_ATTR = null;
    /* Decide if ARIA attributes are okay */

    let ALLOW_ARIA_ATTR = true;
    /* Decide if custom data attributes are okay */

    let ALLOW_DATA_ATTR = true;
    /* Decide if unknown protocols are okay */

    let ALLOW_UNKNOWN_PROTOCOLS = false;
    /* Decide if self-closing tags in attributes are allowed.
     * Usually removed due to a mXSS issue in jQuery 3.0 */

    let ALLOW_SELF_CLOSE_IN_ATTR = true;
    /* Output should be safe for common template engines.
     * This means, DOMPurify removes data attributes, mustaches and ERB
     */

    let SAFE_FOR_TEMPLATES = false;
    /* Decide if document with <html>... should be returned */

    let WHOLE_DOCUMENT = false;
    /* Track whether config is already set on this instance of DOMPurify. */

    let SET_CONFIG = false;
    /* Decide if all elements (e.g. style, script) must be children of
     * document.body. By default, browsers might move them to document.head */

    let FORCE_BODY = false;
    /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
     * string (or a TrustedHTML object if Trusted Types are supported).
     * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
     */

    let RETURN_DOM = false;
    /* Decide if a DOM `DocumentFragment` should be returned, instead of a html
     * string  (or a TrustedHTML object if Trusted Types are supported) */

    let RETURN_DOM_FRAGMENT = false;
    /* Try to return a Trusted Type object instead of a string, return a string in
     * case Trusted Types are not supported  */

    let RETURN_TRUSTED_TYPE = false;
    /* Output should be free from DOM clobbering attacks?
     * This sanitizes markups named with colliding, clobberable built-in DOM APIs.
     */

    let SANITIZE_DOM = true;
    /* Achieve full DOM Clobbering protection by isolating the namespace of named
     * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.
     *
     * HTML/DOM spec rules that enable DOM Clobbering:
     *   - Named Access on Window (§7.3.3)
     *   - DOM Tree Accessors (§3.1.5)
     *   - Form Element Parent-Child Relations (§4.10.3)
     *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)
     *   - HTMLCollection (§4.2.10.2)
     *
     * Namespace isolation is implemented by prefixing `id` and `name` attributes
     * with a constant string, i.e., `user-content-`
     */

    let SANITIZE_NAMED_PROPS = false;
    const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';
    /* Keep element content when removing element? */

    let KEEP_CONTENT = true;
    /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
     * of importing it into a new Document and returning a sanitized copy */

    let IN_PLACE = false;
    /* Allow usage of profiles like html, svg and mathMl */

    let USE_PROFILES = {};
    /* Tags to ignore content of when KEEP_CONTENT is true */

    let FORBID_CONTENTS = null;
    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']);
    /* Tags that are safe for data: URIs */

    let DATA_URI_TAGS = null;
    const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);
    /* Attributes safe for values like "javascript:" */

    let URI_SAFE_ATTRIBUTES = null;
    const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);
    const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
    const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
    const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
    /* Document namespace */

    let NAMESPACE = HTML_NAMESPACE;
    let IS_EMPTY_INPUT = false;
    /* Allowed XHTML+XML namespaces */

    let ALLOWED_NAMESPACES = null;
    const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
    /* Parsing of strict XHTML documents */

    let PARSER_MEDIA_TYPE;
    const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];
    const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';
    let transformCaseFunc;
    /* Keep a reference to config to pass to hooks */

    let CONFIG = null;
    /* Ideally, do not touch anything below this line */

    /* ______________________________________________ */

    const formElement = document.createElement('form');

    const isRegexOrFunction = function isRegexOrFunction(testValue) {
      return testValue instanceof RegExp || testValue instanceof Function;
    };
    /**
     * _parseConfig
     *
     * @param  {Object} cfg optional config literal
     */
    // eslint-disable-next-line complexity


    const _parseConfig = function _parseConfig(cfg) {
      if (CONFIG && CONFIG === cfg) {
        return;
      }
      /* Shield configuration object from tampering */


      if (!cfg || typeof cfg !== 'object') {
        cfg = {};
      }
      /* Shield configuration object from prototype pollution */


      cfg = clone(cfg);
      PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
      SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.

      transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
      /* Set configuration parameters */

      ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
      ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
      ALLOWED_NAMESPACES = 'ALLOWED_NAMESPACES' in cfg ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
      URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent
      cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent
      transformCaseFunc // eslint-disable-line indent
      ) // eslint-disable-line indent
      : DEFAULT_URI_SAFE_ATTRIBUTES;
      DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent
      cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent
      transformCaseFunc // eslint-disable-line indent
      ) // eslint-disable-line indent
      : DEFAULT_DATA_URI_TAGS;
      FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
      FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};
      FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};
      USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
      ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true

      ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true

      ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false

      ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true

      SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false

      WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false

      RETURN_DOM = cfg.RETURN_DOM || false; // Default false

      RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false

      RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false

      FORCE_BODY = cfg.FORCE_BODY || false; // Default false

      SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true

      SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false

      KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true

      IN_PLACE = cfg.IN_PLACE || false; // Default false

      IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
      NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
      CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};

      if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
        CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
      }

      if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
        CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
      }

      if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
        CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
      }

      if (SAFE_FOR_TEMPLATES) {
        ALLOW_DATA_ATTR = false;
      }

      if (RETURN_DOM_FRAGMENT) {
        RETURN_DOM = true;
      }
      /* Parse profile info */


      if (USE_PROFILES) {
        ALLOWED_TAGS = addToSet({}, [...text]);
        ALLOWED_ATTR = [];

        if (USE_PROFILES.html === true) {
          addToSet(ALLOWED_TAGS, html$1);
          addToSet(ALLOWED_ATTR, html);
        }

        if (USE_PROFILES.svg === true) {
          addToSet(ALLOWED_TAGS, svg$1);
          addToSet(ALLOWED_ATTR, svg);
          addToSet(ALLOWED_ATTR, xml);
        }

        if (USE_PROFILES.svgFilters === true) {
          addToSet(ALLOWED_TAGS, svgFilters);
          addToSet(ALLOWED_ATTR, svg);
          addToSet(ALLOWED_ATTR, xml);
        }

        if (USE_PROFILES.mathMl === true) {
          addToSet(ALLOWED_TAGS, mathMl$1);
          addToSet(ALLOWED_ATTR, mathMl);
          addToSet(ALLOWED_ATTR, xml);
        }
      }
      /* Merge configuration parameters */


      if (cfg.ADD_TAGS) {
        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
          ALLOWED_TAGS = clone(ALLOWED_TAGS);
        }

        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
      }

      if (cfg.ADD_ATTR) {
        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
          ALLOWED_ATTR = clone(ALLOWED_ATTR);
        }

        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
      }

      if (cfg.ADD_URI_SAFE_ATTR) {
        addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
      }

      if (cfg.FORBID_CONTENTS) {
        if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
          FORBID_CONTENTS = clone(FORBID_CONTENTS);
        }

        addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
      }
      /* Add #text in case KEEP_CONTENT is set to true */


      if (KEEP_CONTENT) {
        ALLOWED_TAGS['#text'] = true;
      }
      /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */


      if (WHOLE_DOCUMENT) {
        addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
      }
      /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */


      if (ALLOWED_TAGS.table) {
        addToSet(ALLOWED_TAGS, ['tbody']);
        delete FORBID_TAGS.tbody;
      } // Prevent further manipulation of configuration.
      // Not available in IE8, Safari 5, etc.


      if (freeze) {
        freeze(cfg);
      }

      CONFIG = cfg;
    };

    const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);
    const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'desc', 'title', 'annotation-xml']); // Certain elements are allowed in both SVG and HTML
    // namespace. We need to specify them explicitly
    // so that they don't get erroneously deleted from
    // HTML namespace.

    const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);
    /* Keep track of all possible SVG and MathML tags
     * so that we can perform the namespace checks
     * correctly. */

    const ALL_SVG_TAGS = addToSet({}, svg$1);
    addToSet(ALL_SVG_TAGS, svgFilters);
    addToSet(ALL_SVG_TAGS, svgDisallowed);
    const ALL_MATHML_TAGS = addToSet({}, mathMl$1);
    addToSet(ALL_MATHML_TAGS, mathMlDisallowed);
    /**
     *
     *
     * @param  {Element} element a DOM element whose namespace is being checked
     * @returns {boolean} Return false if the element has a
     *  namespace that a spec-compliant parser would never
     *  return. Return true otherwise.
     */

    const _checkValidNamespace = function _checkValidNamespace(element) {
      let parent = getParentNode(element); // In JSDOM, if we're inside shadow DOM, then parentNode
      // can be null. We just simulate parent in this case.

      if (!parent || !parent.tagName) {
        parent = {
          namespaceURI: NAMESPACE,
          tagName: 'template'
        };
      }

      const tagName = stringToLowerCase(element.tagName);
      const parentTagName = stringToLowerCase(parent.tagName);

      if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
        return false;
      }

      if (element.namespaceURI === SVG_NAMESPACE) {
        // The only way to switch from HTML namespace to SVG
        // is via <svg>. If it happens via any other tag, then
        // it should be killed.
        if (parent.namespaceURI === HTML_NAMESPACE) {
          return tagName === 'svg';
        } // The only way to switch from MathML to SVG is via`
        // svg if parent is either <annotation-xml> or MathML
        // text integration points.


        if (parent.namespaceURI === MATHML_NAMESPACE) {
          return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
        } // We only allow elements that are defined in SVG
        // spec. All others are disallowed in SVG namespace.


        return Boolean(ALL_SVG_TAGS[tagName]);
      }

      if (element.namespaceURI === MATHML_NAMESPACE) {
        // The only way to switch from HTML namespace to MathML
        // is via <math>. If it happens via any other tag, then
        // it should be killed.
        if (parent.namespaceURI === HTML_NAMESPACE) {
          return tagName === 'math';
        } // The only way to switch from SVG to MathML is via
        // <math> and HTML integration points


        if (parent.namespaceURI === SVG_NAMESPACE) {
          return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];
        } // We only allow elements that are defined in MathML
        // spec. All others are disallowed in MathML namespace.


        return Boolean(ALL_MATHML_TAGS[tagName]);
      }

      if (element.namespaceURI === HTML_NAMESPACE) {
        // The only way to switch from SVG to HTML is via
        // HTML integration points, and from MathML to HTML
        // is via MathML text integration points
        if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
          return false;
        }

        if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
          return false;
        } // We disallow tags that are specific for MathML
        // or SVG and should never appear in HTML namespace


        return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
      } // For XHTML and XML documents that support custom namespaces


      if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {
        return true;
      } // The code should never reach this place (this means
      // that the element somehow got namespace that is not
      // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).
      // Return false just in case.


      return false;
    };
    /**
     * _forceRemove
     *
     * @param  {Node} node a DOM node
     */


    const _forceRemove = function _forceRemove(node) {
      arrayPush(DOMPurify.removed, {
        element: node
      });

      try {
        // eslint-disable-next-line unicorn/prefer-dom-node-remove
        node.parentNode.removeChild(node);
      } catch (_) {
        node.remove();
      }
    };
    /**
     * _removeAttribute
     *
     * @param  {String} name an Attribute name
     * @param  {Node} node a DOM node
     */


    const _removeAttribute = function _removeAttribute(name, node) {
      try {
        arrayPush(DOMPurify.removed, {
          attribute: node.getAttributeNode(name),
          from: node
        });
      } catch (_) {
        arrayPush(DOMPurify.removed, {
          attribute: null,
          from: node
        });
      }

      node.removeAttribute(name); // We void attribute values for unremovable "is"" attributes

      if (name === 'is' && !ALLOWED_ATTR[name]) {
        if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
          try {
            _forceRemove(node);
          } catch (_) {}
        } else {
          try {
            node.setAttribute(name, '');
          } catch (_) {}
        }
      }
    };
    /**
     * _initDocument
     *
     * @param  {String} dirty a string of dirty markup
     * @return {Document} a DOM, filled with the dirty markup
     */


    const _initDocument = function _initDocument(dirty) {
      /* Create a HTML document */
      let doc;
      let leadingWhitespace;

      if (FORCE_BODY) {
        dirty = '<remove></remove>' + dirty;
      } else {
        /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
        const matches = stringMatch(dirty, /^[\r\n\t ]+/);
        leadingWhitespace = matches && matches[0];
      }

      if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {
        // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)
        dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + '</body></html>';
      }

      const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
      /*
       * Use the DOMParser API by default, fallback later if needs be
       * DOMParser not work for svg when has multiple root element.
       */

      if (NAMESPACE === HTML_NAMESPACE) {
        try {
          doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
        } catch (_) {}
      }
      /* Use createHTMLDocument in case DOMParser is not available */


      if (!doc || !doc.documentElement) {
        doc = implementation.createDocument(NAMESPACE, 'template', null);

        try {
          doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
        } catch (_) {// Syntax error if dirtyPayload is invalid xml
        }
      }

      const body = doc.body || doc.documentElement;

      if (dirty && leadingWhitespace) {
        body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
      }
      /* Work on whole document or just its body */


      if (NAMESPACE === HTML_NAMESPACE) {
        return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
      }

      return WHOLE_DOCUMENT ? doc.documentElement : body;
    };
    /**
     * _createIterator
     *
     * @param  {Document} root document/fragment to create iterator for
     * @return {Iterator} iterator instance
     */


    const _createIterator = function _createIterator(root) {
      return createNodeIterator.call(root.ownerDocument || root, root, // eslint-disable-next-line no-bitwise
      NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false);
    };
    /**
     * _isClobbered
     *
     * @param  {Node} elm element to check for clobbering attacks
     * @return {Boolean} true if clobbered, false if safe
     */


    const _isClobbered = function _isClobbered(elm) {
      return 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');
    };
    /**
     * _isNode
     *
     * @param  {Node} obj object to check whether it's a DOM node
     * @return {Boolean} true is object is a DOM node
     */


    const _isNode = function _isNode(object) {
      return typeof Node === 'object' ? object instanceof Node : object && typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string';
    };
    /**
     * _executeHook
     * Execute user configurable hooks
     *
     * @param  {String} entryPoint  Name of the hook's entry point
     * @param  {Node} currentNode node to work on with the hook
     * @param  {Object} data additional hook parameters
     */


    const _executeHook = function _executeHook(entryPoint, currentNode, data) {
      if (!hooks[entryPoint]) {
        return;
      }

      arrayForEach(hooks[entryPoint], hook => {
        hook.call(DOMPurify, currentNode, data, CONFIG);
      });
    };
    /**
     * _sanitizeElements
     *
     * @protect nodeName
     * @protect textContent
     * @protect removeChild
     *
     * @param   {Node} currentNode to check for permission to exist
     * @return  {Boolean} true if node was killed, false if left alive
     */


    const _sanitizeElements = function _sanitizeElements(currentNode) {
      let content;
      /* Execute a hook if present */

      _executeHook('beforeSanitizeElements', currentNode, null);
      /* Check if element is clobbered or can clobber */


      if (_isClobbered(currentNode)) {
        _forceRemove(currentNode);

        return true;
      }
      /* Now let's check the element's type and name */


      const tagName = transformCaseFunc(currentNode.nodeName);
      /* Execute a hook if present */

      _executeHook('uponSanitizeElement', currentNode, {
        tagName,
        allowedTags: ALLOWED_TAGS
      });
      /* Detect mXSS attempts abusing namespace confusion */


      if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
        _forceRemove(currentNode);

        return true;
      }
      /* Remove element if anything forbids its presence */


      if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
        /* Check if we have a custom element to handle */
        if (!FORBID_TAGS[tagName] && _basicCustomElementTest(tagName)) {
          if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
          if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
        }
        /* Keep content except for bad-listed elements */


        if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
          const parentNode = getParentNode(currentNode) || currentNode.parentNode;
          const childNodes = getChildNodes(currentNode) || currentNode.childNodes;

          if (childNodes && parentNode) {
            const childCount = childNodes.length;

            for (let i = childCount - 1; i >= 0; --i) {
              parentNode.insertBefore(cloneNode(childNodes[i], true), getNextSibling(currentNode));
            }
          }
        }

        _forceRemove(currentNode);

        return true;
      }
      /* Check whether element has a valid namespace */


      if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {
        _forceRemove(currentNode);

        return true;
      }
      /* Make sure that older browsers don't get noscript mXSS */


      if ((tagName === 'noscript' || tagName === 'noembed') && regExpTest(/<\/no(script|embed)/i, currentNode.innerHTML)) {
        _forceRemove(currentNode);

        return true;
      }
      /* Sanitize element content to be template-safe */


      if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
        /* Get the element's text content */
        content = currentNode.textContent;
        content = stringReplace(content, MUSTACHE_EXPR, ' ');
        content = stringReplace(content, ERB_EXPR, ' ');
        content = stringReplace(content, TMPLIT_EXPR, ' ');

        if (currentNode.textContent !== content) {
          arrayPush(DOMPurify.removed, {
            element: currentNode.cloneNode()
          });
          currentNode.textContent = content;
        }
      }
      /* Execute a hook if present */


      _executeHook('afterSanitizeElements', currentNode, null);

      return false;
    };
    /**
     * _isValidAttribute
     *
     * @param  {string} lcTag Lowercase tag name of containing element.
     * @param  {string} lcName Lowercase attribute name.
     * @param  {string} value Attribute value.
     * @return {Boolean} Returns true if `value` is valid, otherwise false.
     */
    // eslint-disable-next-line complexity


    const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
      /* Make sure attribute cannot clobber */
      if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
        return false;
      }
      /* Allow valid data-* attributes: At least one character after "-"
          (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
          XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
          We don't need to check the value; it's always URI safe. */


      if (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]) {
        if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND
        // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
        // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
        _basicCustomElementTest(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)) || // Alternative, second condition checks if it's an `is`-attribute, AND
        // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
        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 {
          return false;
        }
        /* Check value is safe. First, is attr inert? If so, is safe */

      } 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) ; else {
        return false;
      }

      return true;
    };
    /**
     * _basicCustomElementCheck
     * checks if at least one dash is included in tagName, and it's not the first char
     * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
     * @param {string} tagName name of the tag of the node to sanitize
     */


    const _basicCustomElementTest = function _basicCustomElementTest(tagName) {
      return tagName.indexOf('-') > 0;
    };
    /**
     * _sanitizeAttributes
     *
     * @protect attributes
     * @protect nodeName
     * @protect removeAttribute
     * @protect setAttribute
     *
     * @param  {Node} currentNode to sanitize
     */


    const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
      let attr;
      let value;
      let lcName;
      let l;
      /* Execute a hook if present */

      _executeHook('beforeSanitizeAttributes', currentNode, null);

      const {
        attributes
      } = currentNode;
      /* Check if we have attributes; if not we might have a text node */

      if (!attributes) {
        return;
      }

      const hookEvent = {
        attrName: '',
        attrValue: '',
        keepAttr: true,
        allowedAttributes: ALLOWED_ATTR
      };
      l = attributes.length;
      /* Go backwards over all attributes; safely remove bad ones */

      while (l--) {
        attr = attributes[l];
        const {
          name,
          namespaceURI
        } = attr;
        value = name === 'value' ? attr.value : stringTrim(attr.value);
        lcName = transformCaseFunc(name);
        /* Execute a hook if present */

        hookEvent.attrName = lcName;
        hookEvent.attrValue = value;
        hookEvent.keepAttr = true;
        hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set

        _executeHook('uponSanitizeAttribute', currentNode, hookEvent);

        value = hookEvent.attrValue;
        /* Did the hooks approve of the attribute? */

        if (hookEvent.forceKeepAttr) {
          continue;
        }
        /* Remove attribute */


        _removeAttribute(name, currentNode);
        /* Did the hooks approve of the attribute? */


        if (!hookEvent.keepAttr) {
          continue;
        }
        /* Work around a security issue in jQuery 3.0 */


        if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) {
          _removeAttribute(name, currentNode);

          continue;
        }
        /* Sanitize attribute content to be template-safe */


        if (SAFE_FOR_TEMPLATES) {
          value = stringReplace(value, MUSTACHE_EXPR, ' ');
          value = stringReplace(value, ERB_EXPR, ' ');
          value = stringReplace(value, TMPLIT_EXPR, ' ');
        }
        /* Is `value` valid for this attribute? */


        const lcTag = transformCaseFunc(currentNode.nodeName);

        if (!_isValidAttribute(lcTag, lcName, value)) {
          continue;
        }
        /* Full DOM Clobbering protection via namespace isolation,
         * Prefix id and name attributes with `user-content-`
         */


        if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
          // Remove the attribute with this value
          _removeAttribute(name, currentNode); // Prefix the value and later re-create the attribute with the sanitized value


          value = SANITIZE_NAMED_PROPS_PREFIX + value;
        }
        /* Handle attributes that require Trusted Types */


        if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {
          if (namespaceURI) ; else {
            switch (trustedTypes.getAttributeType(lcTag, lcName)) {
              case 'TrustedHTML':
                value = trustedTypesPolicy.createHTML(value);
                break;

              case 'TrustedScriptURL':
                value = trustedTypesPolicy.createScriptURL(value);
                break;
            }
          }
        }
        /* Handle invalid data-* attribute set by try-catching it */


        try {
          if (namespaceURI) {
            currentNode.setAttributeNS(namespaceURI, name, value);
          } else {
            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
            currentNode.setAttribute(name, value);
          }

          arrayPop(DOMPurify.removed);
        } catch (_) {}
      }
      /* Execute a hook if present */


      _executeHook('afterSanitizeAttributes', currentNode, null);
    };
    /**
     * _sanitizeShadowDOM
     *
     * @param  {DocumentFragment} fragment to iterate over recursively
     */


    const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
      let shadowNode;

      const shadowIterator = _createIterator(fragment);
      /* Execute a hook if present */


      _executeHook('beforeSanitizeShadowDOM', fragment, null);

      while (shadowNode = shadowIterator.nextNode()) {
        /* Execute a hook if present */
        _executeHook('uponSanitizeShadowNode', shadowNode, null);
        /* Sanitize tags and elements */


        if (_sanitizeElements(shadowNode)) {
          continue;
        }
        /* Deep shadow DOM detected */


        if (shadowNode.content instanceof DocumentFragment) {
          _sanitizeShadowDOM(shadowNode.content);
        }
        /* Check attributes, sanitize if necessary */


        _sanitizeAttributes(shadowNode);
      }
      /* Execute a hook if present */


      _executeHook('afterSanitizeShadowDOM', fragment, null);
    };
    /**
     * Sanitize
     * Public method providing core sanitation functionality
     *
     * @param {String|Node} dirty string or DOM node
     * @param {Object} configuration object
     */
    // eslint-disable-next-line complexity


    DOMPurify.sanitize = function (dirty) {
      let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      let body;
      let importedNode;
      let currentNode;
      let returnNode;
      /* Make sure we have a string to sanitize.
        DO NOT return early, as this will return the wrong type if
        the user has requested a DOM object rather than a string */

      IS_EMPTY_INPUT = !dirty;

      if (IS_EMPTY_INPUT) {
        dirty = '<!-->';
      }
      /* Stringify, in case dirty is an object */


      if (typeof dirty !== 'string' && !_isNode(dirty)) {
        // eslint-disable-next-line no-negated-condition
        if (typeof dirty.toString !== 'function') {
          throw typeErrorCreate('toString is not a function');
        } else {
          dirty = dirty.toString();

          if (typeof dirty !== 'string') {
            throw typeErrorCreate('dirty is not a string, aborting');
          }
        }
      }
      /* Return dirty HTML if DOMPurify cannot run */


      if (!DOMPurify.isSupported) {
        return dirty;
      }
      /* Assign config vars */


      if (!SET_CONFIG) {
        _parseConfig(cfg);
      }
      /* Clean up removed elements */


      DOMPurify.removed = [];
      /* Check if dirty is correctly typed for IN_PLACE */

      if (typeof dirty === 'string') {
        IN_PLACE = false;
      }

      if (IN_PLACE) {
        /* Do some early pre-sanitization to avoid unsafe root nodes */
        if (dirty.nodeName) {
          const tagName = transformCaseFunc(dirty.nodeName);

          if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
            throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
          }
        }
      } else if (dirty instanceof Node) {
        /* If dirty is a DOM element, append to an empty document to avoid
           elements being stripped by the parser */
        body = _initDocument('<!---->');
        importedNode = body.ownerDocument.importNode(dirty, true);

        if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
          /* Node is already a body, use as is */
          body = importedNode;
        } else if (importedNode.nodeName === 'HTML') {
          body = importedNode;
        } else {
          // eslint-disable-next-line unicorn/prefer-dom-node-append
          body.appendChild(importedNode);
        }
      } else {
        /* Exit directly if we have nothing to do */
        if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
        dirty.indexOf('<') === -1) {
          return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;
        }
        /* Initialize the document to work on */


        body = _initDocument(dirty);
        /* Check we have a DOM node from the data */

        if (!body) {
          return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';
        }
      }
      /* Remove first element node (ours) if FORCE_BODY is set */


      if (body && FORCE_BODY) {
        _forceRemove(body.firstChild);
      }
      /* Get node iterator */


      const nodeIterator = _createIterator(IN_PLACE ? dirty : body);
      /* Now start iterating over the created document */


      while (currentNode = nodeIterator.nextNode()) {
        /* Sanitize tags and elements */
        if (_sanitizeElements(currentNode)) {
          continue;
        }
        /* Shadow DOM detected, sanitize it */


        if (currentNode.content instanceof DocumentFragment) {
          _sanitizeShadowDOM(currentNode.content);
        }
        /* Check attributes, sanitize if necessary */


        _sanitizeAttributes(currentNode);
      }
      /* If we sanitized `dirty` in-place, return it. */


      if (IN_PLACE) {
        return dirty;
      }
      /* Return sanitized string or DOM */


      if (RETURN_DOM) {
        if (RETURN_DOM_FRAGMENT) {
          returnNode = createDocumentFragment.call(body.ownerDocument);

          while (body.firstChild) {
            // eslint-disable-next-line unicorn/prefer-dom-node-append
            returnNode.appendChild(body.firstChild);
          }
        } else {
          returnNode = body;
        }

        if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmod) {
          /*
            AdoptNode() is not used because internal state is not reset
            (e.g. the past names map of a HTMLFormElement), this is safe
            in theory but we would rather not risk another attack vector.
            The state that is cloned by importNode() is explicitly defined
            by the specs.
          */
          returnNode = importNode.call(originalDocument, returnNode, true);
        }

        return returnNode;
      }

      let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
      /* Serialize doctype if allowed */

      if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
        serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\n' + serializedHTML;
      }
      /* Sanitize final string template-safe */


      if (SAFE_FOR_TEMPLATES) {
        serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');
        serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');
        serializedHTML = stringReplace(serializedHTML, TMPLIT_EXPR, ' ');
      }

      return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
    };
    /**
     * Public method to set the configuration once
     * setConfig
     *
     * @param {Object} cfg configuration object
     */


    DOMPurify.setConfig = function (cfg) {
      _parseConfig(cfg);

      SET_CONFIG = true;
    };
    /**
     * Public method to remove the configuration
     * clearConfig
     *
     */


    DOMPurify.clearConfig = function () {
      CONFIG = null;
      SET_CONFIG = false;
    };
    /**
     * Public method to check if an attribute value is valid.
     * Uses last set config, if any. Otherwise, uses config defaults.
     * isValidAttribute
     *
     * @param  {string} tag Tag name of containing element.
     * @param  {string} attr Attribute name.
     * @param  {string} value Attribute value.
     * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
     */


    DOMPurify.isValidAttribute = function (tag, attr, value) {
      /* Initialize shared config vars if necessary. */
      if (!CONFIG) {
        _parseConfig({});
      }

      const lcTag = transformCaseFunc(tag);
      const lcName = transformCaseFunc(attr);
      return _isValidAttribute(lcTag, lcName, value);
    };
    /**
     * AddHook
     * Public method to add DOMPurify hooks
     *
     * @param {String} entryPoint entry point for the hook to add
     * @param {Function} hookFunction function to execute
     */


    DOMPurify.addHook = function (entryPoint, hookFunction) {
      if (typeof hookFunction !== 'function') {
        return;
      }

      hooks[entryPoint] = hooks[entryPoint] || [];
      arrayPush(hooks[entryPoint], hookFunction);
    };
    /**
     * RemoveHook
     * Public method to remove a DOMPurify hook at a given entryPoint
     * (pops it from the stack of hooks if more are present)
     *
     * @param {String} entryPoint entry point for the hook to remove
     * @return {Function} removed(popped) hook
     */


    DOMPurify.removeHook = function (entryPoint) {
      if (hooks[entryPoint]) {
        return arrayPop(hooks[entryPoint]);
      }
    };
    /**
     * RemoveHooks
     * Public method to remove all DOMPurify hooks at a given entryPoint
     *
     * @param  {String} entryPoint entry point for the hooks to remove
     */


    DOMPurify.removeHooks = function (entryPoint) {
      if (hooks[entryPoint]) {
        hooks[entryPoint] = [];
      }
    };
    /**
     * RemoveAllHooks
     * Public method to remove all DOMPurify hooks
     *
     */


    DOMPurify.removeAllHooks = function () {
      hooks = {};
    };

    return DOMPurify;
  }

  var purify = createDOMPurify();

  return purify;

}));
//# sourceMappingURL=purify.js.map
{"version":3,"file":"purify.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","unconstruct","TypeError","func","thisArg","addToSet","set","array","transformCaseFunc","l","length","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","childCount","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":"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"}
/*! @license DOMPurify 3.0.2 | (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.2/LICENSE */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;c||(c=function(e,t,n){return e.apply(t,n)}),i||(i=function(e){return e}),a||(a=function(e){return e}),s||(s=function(e,t){return new e(...t)});const m=N(Array.prototype.forEach),u=N(Array.prototype.pop),p=N(Array.prototype.push),f=N(String.prototype.toLowerCase),d=N(String.prototype.toString),h=N(String.prototype.match),g=N(String.prototype.replace),y=N(String.prototype.indexOf),T=N(String.prototype.trim),E=N(RegExp.prototype.test),A=(b=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return s(b,t)});var b;function N(e){return function(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function _(e,o,r){r=r||f,t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function w(t){const n=l(null);for(const[o,r]of e(t))n[o]=r;return n}function R(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return N(n.get);if("function"==typeof n.value)return N(n.value)}e=o(e)}return function(e){return console.warn("fallback value for",e),null}}const S=i(["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"]),x=i(["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"]),D=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),k=i(["animate","color-profile","cursor","discard","fedropshadow","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"]),v=i(["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"]),C=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),L=i(["#text"]),O=i(["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"]),M=i(["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"]),I=i(["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"]),U=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),F=a(/\{\{[\w\W]*|[\w\W]*\}\}/gm),P=a(/<%[\w\W]*|[\w\W]*%>/gm),H=a(/\${[\w\W]*}/gm),z=a(/^data-[\-\w.\u00B7-\uFFFF]/),B=a(/^aria-[\-\w]+$/),W=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),G=a(/^(?:\w+script|data):/i),j=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i);var X=Object.freeze({__proto__:null,MUSTACHE_EXPR:F,ERB_EXPR:P,TMPLIT_EXPR:H,DATA_ATTR:z,ARIA_ATTR:B,IS_ALLOWED_URI:W,IS_SCRIPT_OR_DATA:G,ATTR_WHITESPACE:j,DOCTYPE_NAME:q});const Y=()=>"undefined"==typeof window?null:window,K=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(o)&&(n=t.currentScript.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}};var V=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Y();const o=e=>t(e);if(o.version="3.0.2",o.removed=[],!n||!n.document||9!==n.document.nodeType)return o.isSupported=!1,o;const r=n.document;let{document:a}=n;const{DocumentFragment:l,HTMLTemplateElement:c,Node:s,Element:b,NodeFilter:N,NamedNodeMap:F=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:P,DOMParser:H,trustedTypes:z}=n,B=b.prototype,G=R(B,"cloneNode"),j=R(B,"nextSibling"),V=R(B,"childNodes"),$=R(B,"parentNode");if("function"==typeof c){const e=a.createElement("template");e.content&&e.content.ownerDocument&&(a=e.content.ownerDocument)}const Z=K(z,r),J=Z?Z.createHTML(""):"",{implementation:Q,createNodeIterator:ee,createDocumentFragment:te,getElementsByTagName:ne}=a,{importNode:oe}=r;let re={};o.isSupported="function"==typeof e&&"function"==typeof $&&Q&&void 0!==Q.createHTMLDocument;const{MUSTACHE_EXPR:ie,ERB_EXPR:ae,TMPLIT_EXPR:le,DATA_ATTR:ce,ARIA_ATTR:se,IS_SCRIPT_OR_DATA:me,ATTR_WHITESPACE:ue}=X;let{IS_ALLOWED_URI:pe}=X,fe=null;const de=_({},[...S,...x,...D,...v,...L]);let he=null;const ge=_({},[...O,...M,...I,...U]);let ye=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Te=null,Ee=null,Ae=!0,be=!0,Ne=!1,_e=!0,we=!1,Re=!1,Se=!1,xe=!1,De=!1,ke=!1,ve=!1,Ce=!0,Le=!1;const Oe="user-content-";let Me=!0,Ie=!1,Ue={},Fe=null;const Pe=_({},["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"]);let He=null;const ze=_({},["audio","video","img","source","image","track"]);let Be=null;const We=_({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ge="http://www.w3.org/1998/Math/MathML",je="http://www.w3.org/2000/svg",qe="http://www.w3.org/1999/xhtml";let Xe=qe,Ye=!1,Ke=null;const Ve=_({},[Ge,je,qe],d);let $e;const Ze=["application/xhtml+xml","text/html"],Je="text/html";let Qe,et=null;const tt=a.createElement("form"),nt=function(e){return e instanceof RegExp||e instanceof Function},ot=function(e){et&&et===e||(e&&"object"==typeof e||(e={}),e=w(e),$e=$e=-1===Ze.indexOf(e.PARSER_MEDIA_TYPE)?Je:e.PARSER_MEDIA_TYPE,Qe="application/xhtml+xml"===$e?d:f,fe="ALLOWED_TAGS"in e?_({},e.ALLOWED_TAGS,Qe):de,he="ALLOWED_ATTR"in e?_({},e.ALLOWED_ATTR,Qe):ge,Ke="ALLOWED_NAMESPACES"in e?_({},e.ALLOWED_NAMESPACES,d):Ve,Be="ADD_URI_SAFE_ATTR"in e?_(w(We),e.ADD_URI_SAFE_ATTR,Qe):We,He="ADD_DATA_URI_TAGS"in e?_(w(ze),e.ADD_DATA_URI_TAGS,Qe):ze,Fe="FORBID_CONTENTS"in e?_({},e.FORBID_CONTENTS,Qe):Pe,Te="FORBID_TAGS"in e?_({},e.FORBID_TAGS,Qe):{},Ee="FORBID_ATTR"in e?_({},e.FORBID_ATTR,Qe):{},Ue="USE_PROFILES"in e&&e.USE_PROFILES,Ae=!1!==e.ALLOW_ARIA_ATTR,be=!1!==e.ALLOW_DATA_ATTR,Ne=e.ALLOW_UNKNOWN_PROTOCOLS||!1,_e=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,we=e.SAFE_FOR_TEMPLATES||!1,Re=e.WHOLE_DOCUMENT||!1,De=e.RETURN_DOM||!1,ke=e.RETURN_DOM_FRAGMENT||!1,ve=e.RETURN_TRUSTED_TYPE||!1,xe=e.FORCE_BODY||!1,Ce=!1!==e.SANITIZE_DOM,Le=e.SANITIZE_NAMED_PROPS||!1,Me=!1!==e.KEEP_CONTENT,Ie=e.IN_PLACE||!1,pe=e.ALLOWED_URI_REGEXP||W,Xe=e.NAMESPACE||qe,ye=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&nt(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ye.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&nt(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ye.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(ye.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),we&&(be=!1),ke&&(De=!0),Ue&&(fe=_({},[...L]),he=[],!0===Ue.html&&(_(fe,S),_(he,O)),!0===Ue.svg&&(_(fe,x),_(he,M),_(he,U)),!0===Ue.svgFilters&&(_(fe,D),_(he,M),_(he,U)),!0===Ue.mathMl&&(_(fe,v),_(he,I),_(he,U))),e.ADD_TAGS&&(fe===de&&(fe=w(fe)),_(fe,e.ADD_TAGS,Qe)),e.ADD_ATTR&&(he===ge&&(he=w(he)),_(he,e.ADD_ATTR,Qe)),e.ADD_URI_SAFE_ATTR&&_(Be,e.ADD_URI_SAFE_ATTR,Qe),e.FORBID_CONTENTS&&(Fe===Pe&&(Fe=w(Fe)),_(Fe,e.FORBID_CONTENTS,Qe)),Me&&(fe["#text"]=!0),Re&&_(fe,["html","head","body"]),fe.table&&(_(fe,["tbody"]),delete Te.tbody),i&&i(e),et=e)},rt=_({},["mi","mo","mn","ms","mtext"]),it=_({},["foreignobject","desc","title","annotation-xml"]),at=_({},["title","style","font","a","script"]),lt=_({},x);_(lt,D),_(lt,k);const ct=_({},v);_(ct,C);const st=function(e){let t=$(e);t&&t.tagName||(t={namespaceURI:Xe,tagName:"template"});const n=f(e.tagName),o=f(t.tagName);return!!Ke[e.namespaceURI]&&(e.namespaceURI===je?t.namespaceURI===qe?"svg"===n:t.namespaceURI===Ge?"svg"===n&&("annotation-xml"===o||rt[o]):Boolean(lt[n]):e.namespaceURI===Ge?t.namespaceURI===qe?"math"===n:t.namespaceURI===je?"math"===n&&it[o]:Boolean(ct[n]):e.namespaceURI===qe?!(t.namespaceURI===je&&!it[o])&&(!(t.namespaceURI===Ge&&!rt[o])&&(!ct[n]&&(at[n]||!lt[n]))):!("application/xhtml+xml"!==$e||!Ke[e.namespaceURI]))},mt=function(e){p(o.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},ut=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!he[e])if(De||ke)try{mt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},pt=function(e){let t,n;if(xe)e="<remove></remove>"+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===$e&&Xe===qe&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=Z?Z.createHTML(e):e;if(Xe===qe)try{t=(new H).parseFromString(o,$e)}catch(e){}if(!t||!t.documentElement){t=Q.createDocument(Xe,"template",null);try{t.documentElement.innerHTML=Ye?J:o}catch(e){}}const r=t.body||t.documentElement;return e&&n&&r.insertBefore(a.createTextNode(n),r.childNodes[0]||null),Xe===qe?ne.call(t,Re?"html":"body")[0]:Re?t.documentElement:r},ft=function(e){return ee.call(e.ownerDocument||e,e,N.SHOW_ELEMENT|N.SHOW_COMMENT|N.SHOW_TEXT,null,!1)},dt=function(e){return e instanceof P&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof F)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},ht=function(e){return"object"==typeof s?e instanceof s:e&&"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},gt=function(e,t,n){re[e]&&m(re[e],(e=>{e.call(o,t,n,et)}))},yt=function(e){let t;if(gt("beforeSanitizeElements",e,null),dt(e))return mt(e),!0;const n=Qe(e.nodeName);if(gt("uponSanitizeElement",e,{tagName:n,allowedTags:fe}),e.hasChildNodes()&&!ht(e.firstElementChild)&&(!ht(e.content)||!ht(e.content.firstElementChild))&&E(/<[/\w]/g,e.innerHTML)&&E(/<[/\w]/g,e.textContent))return mt(e),!0;if(!fe[n]||Te[n]){if(!Te[n]&&Et(n)){if(ye.tagNameCheck instanceof RegExp&&E(ye.tagNameCheck,n))return!1;if(ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))return!1}if(Me&&!Fe[n]){const t=$(e)||e.parentNode,n=V(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o)t.insertBefore(G(n[o],!0),j(e))}}return mt(e),!0}return e instanceof b&&!st(e)?(mt(e),!0):"noscript"!==n&&"noembed"!==n||!E(/<\/no(script|embed)/i,e.innerHTML)?(we&&3===e.nodeType&&(t=e.textContent,t=g(t,ie," "),t=g(t,ae," "),t=g(t,le," "),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),gt("afterSanitizeElements",e,null),!1):(mt(e),!0)},Tt=function(e,t,n){if(Ce&&("id"===t||"name"===t)&&(n in a||n in tt))return!1;if(be&&!Ee[t]&&E(ce,t));else if(Ae&&E(se,t));else if(!he[t]||Ee[t]){if(!(Et(e)&&(ye.tagNameCheck instanceof RegExp&&E(ye.tagNameCheck,e)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(e))&&(ye.attributeNameCheck instanceof RegExp&&E(ye.attributeNameCheck,t)||ye.attributeNameCheck instanceof Function&&ye.attributeNameCheck(t))||"is"===t&&ye.allowCustomizedBuiltInElements&&(ye.tagNameCheck instanceof RegExp&&E(ye.tagNameCheck,n)||ye.tagNameCheck instanceof Function&&ye.tagNameCheck(n))))return!1}else if(Be[t]);else if(E(pe,g(n,ue,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==y(n,"data:")||!He[e]){if(Ne&&!E(me,g(n,ue,"")));else if(n)return!1}else;return!0},Et=function(e){return e.indexOf("-")>0},At=function(e){let t,n,r,i;gt("beforeSanitizeAttributes",e,null);const{attributes:a}=e;if(!a)return;const l={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:he};for(i=a.length;i--;){t=a[i];const{name:c,namespaceURI:s}=t;if(n="value"===c?t.value:T(t.value),r=Qe(c),l.attrName=r,l.attrValue=n,l.keepAttr=!0,l.forceKeepAttr=void 0,gt("uponSanitizeAttribute",e,l),n=l.attrValue,l.forceKeepAttr)continue;if(ut(c,e),!l.keepAttr)continue;if(!_e&&E(/\/>/i,n)){ut(c,e);continue}we&&(n=g(n,ie," "),n=g(n,ae," "),n=g(n,le," "));const m=Qe(e.nodeName);if(Tt(m,r,n)){if(!Le||"id"!==r&&"name"!==r||(ut(c,e),n=Oe+n),Z&&"object"==typeof z&&"function"==typeof z.getAttributeType)if(s);else switch(z.getAttributeType(m,r)){case"TrustedHTML":n=Z.createHTML(n);break;case"TrustedScriptURL":n=Z.createScriptURL(n)}try{s?e.setAttributeNS(s,c,n):e.setAttribute(c,n),u(o.removed)}catch(e){}}}gt("afterSanitizeAttributes",e,null)},bt=function e(t){let n;const o=ft(t);for(gt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)gt("uponSanitizeShadowNode",n,null),yt(n)||(n.content instanceof l&&e(n.content),At(n));gt("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(e){let t,n,i,a,c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Ye=!e,Ye&&(e="\x3c!--\x3e"),"string"!=typeof e&&!ht(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Se||ot(c),o.removed=[],"string"==typeof e&&(Ie=!1),Ie){if(e.nodeName){const t=Qe(e.nodeName);if(!fe[t]||Te[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof s)t=pt("\x3c!----\x3e"),n=t.ownerDocument.importNode(e,!0),1===n.nodeType&&"BODY"===n.nodeName||"HTML"===n.nodeName?t=n:t.appendChild(n);else{if(!De&&!we&&!Re&&-1===e.indexOf("<"))return Z&&ve?Z.createHTML(e):e;if(t=pt(e),!t)return De?null:ve?J:""}t&&xe&&mt(t.firstChild);const m=ft(Ie?e:t);for(;i=m.nextNode();)yt(i)||(i.content instanceof l&&bt(i.content),At(i));if(Ie)return e;if(De){if(ke)for(a=te.call(t.ownerDocument);t.firstChild;)a.appendChild(t.firstChild);else a=t;return(he.shadowroot||he.shadowrootmod)&&(a=oe.call(r,a,!0)),a}let u=Re?t.outerHTML:t.innerHTML;return Re&&fe["!doctype"]&&t.ownerDocument&&t.ownerDocument.doctype&&t.ownerDocument.doctype.name&&E(q,t.ownerDocument.doctype.name)&&(u="<!DOCTYPE "+t.ownerDocument.doctype.name+">\n"+u),we&&(u=g(u,ie," "),u=g(u,ae," "),u=g(u,le," ")),Z&&ve?Z.createHTML(u):u},o.setConfig=function(e){ot(e),Se=!0},o.clearConfig=function(){et=null,Se=!1},o.isValidAttribute=function(e,t,n){et||ot({});const o=Qe(e),r=Qe(t);return Tt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&(re[e]=re[e]||[],p(re[e],t))},o.removeHook=function(e){if(re[e])return u(re[e])},o.removeHooks=function(e){re[e]&&(re[e]=[])},o.removeAllHooks=function(){re={}},o}();return V}));
//# sourceMappingURL=purify.min.js.map
{"version":3,"file":"purify.min.js","sources":["../src/utils.js","../src/tags.js","../src/attrs.js","../src/regexp.js","../src/purify.js"],"sourcesContent":["const {\n  entries,\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  for (const [property, value] of entries(object)) {\n    newObject[property] = value;\n  }\n\n  return newObject;\n}\n\n/* This method automatically checks if the prop is function\n * or getter and behaves 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  entries,\n  freeze,\n  getPrototypeOf,\n  getOwnPropertyDescriptor,\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  'mprescripts',\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|sms|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  entries,\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 hooks = {};\n\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported =\n    typeof entries === 'function' &&\n    typeof getParentNode === 'function' &&\n    implementation &&\n    typeof implementation.createHTMLDocument !== 'undefined';\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  let 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 (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.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 || EXPRESSIONS.IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\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      node.remove();\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    /* 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    /* 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    /* Make sure that older browsers don't get noscript mXSS */\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 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    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\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      /* 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\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"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","Object","freeze","seal","create","apply","construct","Reflect","fun","thisValue","args","x","Func","arrayForEach","unapply","Array","prototype","forEach","arrayPop","pop","arrayPush","push","stringToLowerCase","String","toLowerCase","stringToString","toString","stringMatch","match","stringReplace","replace","stringIndexOf","indexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","func","TypeError","_len2","arguments","length","_key2","thisArg","_len","_key","addToSet","set","array","transformCaseFunc","l","element","lcElement","clone","object","newObject","property","value","lookupGetter","prop","desc","get","fallbackValue","console","warn","html","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","document","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createHTML","createScriptURL","scriptUrl","_","purify","createDOMPurify","DOMPurify","root","version","VERSION","removed","nodeType","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","createElement","content","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","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","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","namespaceURI","parentTagName","Boolean","_forceRemove","node","parentNode","removeChild","remove","_removeAttribute","name","attribute","getAttributeNode","from","removeAttribute","setAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","innerHTML","body","insertBefore","createTextNode","childNodes","call","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","nodeName","textContent","attributes","hasChildNodes","_isNode","_executeHook","entryPoint","currentNode","data","hook","_sanitizeElements","allowedTags","firstElementChild","_basicCustomElementTest","i","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","undefined","getAttributeType","setAttributeNS","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","appendChild","firstChild","nodeIterator","shadowroot","shadowrootmod","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks"],"mappings":";0OAAA,MAAMA,QACJA,EADIC,eAEJA,EAFIC,SAGJA,EAHIC,eAIJA,EAJIC,yBAKJA,GACEC,OAEJ,IAAIC,OAAEA,EAAFC,KAAUA,EAAVC,OAAgBA,GAAWH,QAC3BI,MAAEA,EAAFC,UAASA,GAAiC,oBAAZC,SAA2BA,QAExDF,IACHA,EAAQ,SAAUG,EAAKC,EAAWC,GAChC,OAAOF,EAAIH,MAAMI,EAAWC,EAC7B,GAGER,IACHA,EAAS,SAAUS,GACjB,OAAOA,CACR,GAGER,IACHA,EAAO,SAAUQ,GACf,OAAOA,CACR,GAGEL,IACHA,EAAY,SAAUM,EAAMF,GAC1B,OAAO,IAAIE,KAAQF,EACpB,GAGH,MAAMG,EAAeC,EAAQC,MAAMC,UAAUC,SAEvCC,EAAWJ,EAAQC,MAAMC,UAAUG,KACnCC,EAAYN,EAAQC,MAAMC,UAAUK,MAGpCC,EAAoBR,EAAQS,OAAOP,UAAUQ,aAC7CC,EAAiBX,EAAQS,OAAOP,UAAUU,UAC1CC,EAAcb,EAAQS,OAAOP,UAAUY,OACvCC,EAAgBf,EAAQS,OAAOP,UAAUc,SACzCC,EAAgBjB,EAAQS,OAAOP,UAAUgB,SACzCC,EAAanB,EAAQS,OAAOP,UAAUkB,MAEtCC,EAAarB,EAAQsB,OAAOpB,UAAUqB,MAEtCC,GAMsBC,EANQC,UAO3B,WAAA,IAAA,IAAAC,EAAAC,UAAAC,OAAIjC,EAAJ,IAAAK,MAAA0B,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAIlC,EAAJkC,GAAAF,UAAAE,GAAA,OAAatC,EAAUiC,EAAM7B,EAA7B,GADF,IAAqB6B,EAJrB,SAASzB,EAAQyB,GACtB,OAAO,SAACM,GAAD,IAAA,IAAAC,EAAAJ,UAAAC,OAAajC,EAAb,IAAAK,MAAA+B,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAarC,EAAbqC,EAAA,GAAAL,UAAAK,GAAA,OAAsB1C,EAAMkC,EAAMM,EAASnC,EAA3C,CACR,CAOM,SAASsC,EAASC,EAAKC,EAAOC,GACnCA,EAAoBA,GAAwC7B,EACxDzB,GAIFA,EAAeoD,EAAK,MAGtB,IAAIG,EAAIF,EAAMP,OACPS,KAAAA,KAAK,CACV,IAAIC,EAAUH,EAAME,GACpB,GAAuB,iBAAZC,EAAsB,CAC/B,MAAMC,EAAYH,EAAkBE,GAChCC,IAAcD,IAEXvD,EAASoD,KACZA,EAAME,GAAKE,GAGbD,EAAUC,EAEb,CAEDL,EAAII,IAAW,CAChB,CAED,OAAOJ,CACR,CAGM,SAASM,EAAMC,GACpB,MAAMC,EAAYrD,EAAO,MAEpB,IAAA,MAAOsD,EAAUC,KAAU/D,EAAQ4D,GACtCC,EAAUC,GAAYC,EAGxB,OAAOF,CACR,CAID,SAASG,EAAaJ,EAAQK,GACrBL,KAAW,OAAXA,GAAiB,CACtB,MAAMM,EAAO9D,EAAyBwD,EAAQK,GAC9C,GAAIC,EAAM,CACJA,GAAAA,EAAKC,IACP,OAAOjD,EAAQgD,EAAKC,KAGtB,GAA0B,mBAAfD,EAAKH,MACd,OAAO7C,EAAQgD,EAAKH,MAEvB,CAEDH,EAASzD,EAAeyD,EACzB,CAOD,OALSQ,SAAcX,GAErB,OADAY,QAAQC,KAAK,qBAAsBb,GAC5B,IACR,CAGF,CC5HM,MAAMc,EAAOjE,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,QAIWkE,EAAMlE,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,UAGWmE,EAAanE,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,iBAOWoE,EAAgBpE,EAAO,CAClC,UACA,gBACA,SACA,UACA,eACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,QAGWqE,EAASrE,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,aACA,gBAKWsE,EAAmBtE,EAAO,CACrC,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,SAGWuE,EAAOvE,EAAO,CAAC,UCrRfiE,EAAOjE,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,SAGWkE,EAAMlE,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,eAGWqE,EAASrE,EAAO,CAC3B,SACA,cAC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"}