url-sanitizer 2.3.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/constant.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/uri-util.js", "../bundle_wo_dompurify/mjs/sanitizer.js"],
4
- "sourcesContent": ["/**\n * dompurify.js\n */\n\nconst domPurify = {\n sanitize: (...args) => {\n if (globalThis?.DOMPurify) {\n return globalThis.DOMPurify.sanitize(...args);\n }\n\n const msg = [\n 'DOMPurify is not available.',\n 'Ensure DOMPurify is exposed globally (e.g., window.DOMPurify).'\n ];\n throw new Error(msg.join(' '));\n }\n};\n\nexport {\n domPurify\n};\n", "/**\n * constant.js\n */\n\n/* numeric */\nexport const CHUNK_SIZE = 8 * 1024;\nexport const HEX = 16;\nexport const MAX_BLOB_SIZE = 32 * 1024 * 1024;\nexport const TYPE_FROM = 8;\nexport const TYPE_TO = -1;\n\n/* regexp */\nexport const REG_B64 = /^[\\w+/=-]+$/;\nexport const REG_CHARSET = /^charset=([\\w#&.;-]+)$/;\nexport const REG_DATA_URL = /data:[\\w#&+./;=-]*,/;\nexport const REG_DATA_URL_B64 = /data:[\\w#&+./;=^]*base64,[\\w+/=-]+/i;\nexport const REG_DATA_URL_G = /data:[\\w#&+./;=-]*,[^\\x22]+/g;\nexport const REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/gi;\nexport const REG_MIME_DOM =\n /^(?:application\\/(?:[\\w#&.;-]+\\+)?x|image\\/svg\\+x|text\\/(?:ht|x))ml;?/;\nexport const REG_MIME_TEXT = /^text\\/[\\w#&.;-]+/;\nexport const REG_SCHEME = /^[a-z][\\da-z+.-]*$/;\nexport const REG_SCHEME_EXT = /^(?:ext|web)\\+[a-z]+$/;\nexport const REG_SCRIPT = /(?:java|vb)script/;\nexport const REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nexport const REG_TAG_QUOT = /%(?:22|27|3C|3E)|[\\x22\\x27<>]/;\nexport const REG_URL_ENC = /^%[\\dA-F]{2}$/i;\n", "/**\n * common.js\n */\n\n/* shared */\nimport { TYPE_FROM, TYPE_TO } from './constant.js';\n\n/**\n * get type\n * @param {object} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n * @param {object} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = globalThis;\n\nexport {\n FileReader\n};\n", "[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]\n", "[\"aaa\",\"aaas\",\"about\",\"acap\",\"acct\",\"acd\",\"acr\",\"adiumxtra\",\"adt\",\"afp\",\"afs\",\"agtp\",\"aim\",\"amss\",\"android\",\"appdata\",\"apt\",\"ar\",\"ari\",\"ark\",\"at\",\"attachment\",\"aw\",\"barion\",\"beshare\",\"bitcoin\",\"bitcoincash\",\"bl\",\"blob\",\"bluetooth\",\"bolo\",\"brid\",\"browserext\",\"cabal\",\"caip\",\"calculator\",\"callto\",\"cap\",\"cast\",\"casts\",\"chrome\",\"chrome-extension\",\"cid\",\"coap\",\"coaps\",\"com-eventbrite-attendee\",\"content\",\"content-type\",\"crid\",\"cstr\",\"cttps\",\"cvs\",\"dab\",\"dat\",\"data\",\"dav\",\"dhttp\",\"diaspora\",\"dict\",\"did\",\"dilithium3\",\"dis\",\"dlna-playcontainer\",\"dlna-playsingle\",\"dnp\",\"dns\",\"dntp\",\"doi\",\"donau\",\"dpp\",\"drm\",\"dtmi\",\"dtn\",\"dvb\",\"dvx\",\"dweb\",\"ed2k\",\"eid\",\"elsi\",\"embedded\",\"ens\",\"esim\",\"ethereum\",\"example\",\"facetime\",\"feed\",\"feedready\",\"fido\",\"file\",\"finger\",\"first-run-pen-experience\",\"fish\",\"fm\",\"ftp\",\"fuchsia-pkg\",\"geo\",\"gg\",\"git\",\"gitoid\",\"gizmoproject\",\"go\",\"gopher\",\"graph\",\"gtalk\",\"h323\",\"ham\",\"hcap\",\"hcp\",\"hs20\",\"http\",\"https\",\"hxxp\",\"hxxps\",\"hydrazone\",\"hyper\",\"i0\",\"iax\",\"ibi\",\"ibi-\",\"icap\",\"icon\",\"ilstring\",\"im\",\"imap\",\"info\",\"iotdisco\",\"ipfs\",\"ipn\",\"ipns\",\"ipp\",\"ipps\",\"irc\",\"irc6\",\"ircs\",\"iris\",\"iris.beep\",\"iris.lwz\",\"iris.xpc\",\"iris.xpcs\",\"isostore\",\"itms\",\"jabber\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"lbry\",\"ldap\",\"ldaps\",\"leaptofrogans\",\"lid\",\"linkid\",\"lorawan\",\"lpa\",\"lvlt\",\"machineProvisioningProgressReporter\",\"magnet\",\"mailto\",\"maps\",\"market\",\"matrix\",\"message\",\"microsoft.windows.camera\",\"microsoft.windows.camera.multipicker\",\"microsoft.windows.camera.picker\",\"mid\",\"mms\",\"mongodb\",\"moz\",\"moz-extension\",\"mqtt\",\"mqtts\",\"ms-access\",\"ms-appinstaller\",\"ms-browser-extension\",\"ms-calculator\",\"ms-drive-to\",\"ms-enrollment\",\"ms-excel\",\"ms-eyecontrolspeech\",\"ms-gamebarservices\",\"ms-gamingoverlay\",\"ms-getoffice\",\"ms-help\",\"ms-infopath\",\"ms-inputapp\",\"ms-launchremotedesktop\",\"ms-lockscreencomponent-config\",\"ms-media-stream-id\",\"ms-meetnow\",\"ms-mixedrealitycapture\",\"ms-mobileplans\",\"ms-newsandinterests\",\"ms-officeapp\",\"ms-people\",\"ms-personacard\",\"ms-powerpoint\",\"ms-project\",\"ms-publisher\",\"ms-recall\",\"ms-remotedesktop\",\"ms-remotedesktop-launch\",\"ms-restoretabcompanion\",\"ms-screenclip\",\"ms-screensketch\",\"ms-search\",\"ms-search-repair\",\"ms-secondary-screen-controller\",\"ms-secondary-screen-setup\",\"ms-settings\",\"ms-settings-airplanemode\",\"ms-settings-bluetooth\",\"ms-settings-camera\",\"ms-settings-cellular\",\"ms-settings-cloudstorage\",\"ms-settings-connectabledevices\",\"ms-settings-displays-topology\",\"ms-settings-emailandaccounts\",\"ms-settings-language\",\"ms-settings-location\",\"ms-settings-lock\",\"ms-settings-nfctransactions\",\"ms-settings-notifications\",\"ms-settings-power\",\"ms-settings-privacy\",\"ms-settings-proximity\",\"ms-settings-screenrotation\",\"ms-settings-wifi\",\"ms-settings-workplace\",\"ms-spd\",\"ms-stickers\",\"ms-sttoverlay\",\"ms-transit-to\",\"ms-useractivityset\",\"ms-uup\",\"ms-virtualtouchpad\",\"ms-visio\",\"ms-walk-to\",\"ms-whiteboard\",\"ms-whiteboard-cmd\",\"ms-widgetboard\",\"ms-widgets\",\"ms-word\",\"msnim\",\"msrp\",\"msrps\",\"mss\",\"mt\",\"mtqp\",\"mtrust\",\"mumble\",\"mupdate\",\"mvn\",\"mvrp\",\"mvrps\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"notes\",\"num\",\"ocf\",\"oid\",\"onenote\",\"onenote-cmd\",\"opaquelocktoken\",\"openid\",\"openpgp4fpr\",\"otpauth\",\"palm\",\"paparazzi\",\"payto\",\"pkcs11\",\"platform\",\"pop\",\"pres\",\"proxy\",\"psyc\",\"pttp\",\"pwid\",\"qb\",\"query\",\"quic-transport\",\"redis\",\"rediss\",\"reload\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmfp\",\"rtmp\",\"rtsp\",\"rtsps\",\"rtspu\",\"sarif\",\"secondlife\",\"secret-token\",\"service\",\"session\",\"sftp\",\"sgn\",\"shc\",\"shelter\",\"sieve\",\"simpleledger\",\"simplex\",\"sip\",\"sips\",\"skype\",\"smb\",\"smp\",\"sms\",\"smtp\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"soldat\",\"spacify\",\"spiffe\",\"spotify\",\"ssb\",\"ssh\",\"starknet\",\"steam\",\"stun\",\"stuns\",\"submit\",\"svn\",\"swh\",\"swid\",\"swidpath\",\"tag\",\"taler\",\"teamspeak\",\"teapot\",\"teapots\",\"tel\",\"teliaeid\",\"telnet\",\"tftp\",\"things\",\"thismessage\",\"tip\",\"tn3270\",\"tool\",\"turn\",\"turns\",\"tv\",\"udp\",\"unreal\",\"upn\",\"urn\",\"ut2004\",\"uuid-in-package\",\"v-event\",\"vemmi\",\"ventrilo\",\"ves\",\"view-source\",\"vnc\",\"vscode\",\"vscode-insiders\",\"vsls\",\"w3\",\"wasm\",\"wasm-js\",\"wcr\",\"web3\",\"webcal\",\"wifi\",\"ws\",\"wss\",\"wtai\",\"wyciwyg\",\"xcompute\",\"xcon\",\"xcon-userid\",\"xfire\",\"xftp\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"xrcp\",\"xri\",\"ymsgr\",\"z39.50r\",\"z39.50s\",\"ztdnaid\"]\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\nimport { textChars, uriSchemes } from './lib-util.js';\n\nimport {\n HEX, MAX_BLOB_SIZE, REG_B64, REG_NUM_REF, REG_SCHEME, REG_SCHEME_EXT,\n REG_SCRIPT, REG_URL_ENC\n} from './constant.js';\n\n/**\n * get URL encoded string\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getURLEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeURLEncodedHTMLChars = ch => {\n if (isString(ch) && REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getURLEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_B64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getURLEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n * @param {string} str - string\n * @param {number} [nest] - nest level\n * @returns {string} - parsed string\n */\nexport const parseURLEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (/^x[\\dA-F]+/i.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (/^\\d+/.test(value)) {\n num = parseInt(value);\n }\n if (Number.isInteger(num)) {\n const { index } = item;\n const [preNum, postNum] = [\n res.substring(0, index),\n res.substring(index + numCharRef.length)\n ];\n if (textCharCodes.has(num)) {\n res = `${preNum}${String.fromCharCode(num)}${postNum}`;\n if (/#x?$/.test(preNum) || /^#(?:x(?:00)?[2-7]|\\d)/.test(postNum)) {\n res = parseURLEncodedNumCharRef(res, ++nest);\n }\n } else if (num < HEX * HEX) {\n res = `${preNum}${postNum}`;\n }\n }\n }\n }\n return res;\n};\n\n/**\n * create data URL from blob\n * @param {object} blob - blob\n * @param {number} maxBlobSize - max blob size\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = (blob, maxBlobSize = MAX_BLOB_SIZE) =>\n new Promise((resolve, reject) => {\n if (!Number.isInteger(blob?.size)) {\n return resolve(null);\n } else if (Number.isInteger(maxBlobSize) && blob.size > maxBlobSize) {\n return reject(new DOMException(\n `Blob size (${blob.size} bytes) exceeds the maximum allowed size of ${maxBlobSize} bytes.`,\n 'NotReadableError'\n ));\n }\n const reader = new FileReader();\n reader.addEventListener('error', () => reject(reader.error));\n reader.addEventListener('abort', () => resolve(reader.result));\n reader.addEventListener('load', () => resolve(reader.result));\n reader.readAsDataURL(blob);\n });\n\n/**\n * URI schemes\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * verify URI\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\n verify(uri) {\n let res;\n if (isString(uri)) {\n try {\n const { protocol } = new URL(uri);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_EXT.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n\n /**\n * reset schemes\n * @returns {void}\n */\n reset() {\n this.#schemes.clear();\n for (const scheme of uriSchemes) {\n this.#schemes.add(scheme);\n }\n }\n}\n", "/**\n * sanitizer.js\n */\n\n/* shared */\nimport { domPurify } from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport {\n createDataURLFromBlob, escapeURLEncodedHTMLChars, parseBase64,\n parseURLEncodedNumCharRef, URISchemes\n} from './uri-util.js';\nimport {\n HEX, MAX_BLOB_SIZE, REG_DATA_URL, REG_DATA_URL_B64, REG_DATA_URL_G,\n REG_MIME_DOM, REG_SCRIPT_BLOB, REG_TAG_QUOT\n} from './constant.js';\n\n/* typedef */\n/**\n * @typedef {object} ParsedURL - object with additional props based on URL API\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} [data] - parsed result of data URL, `null`able\n * @property {string} [data.mime] - MIME type\n * @property {boolean} [data.base64] - is base64 encoded\n * @property {string} [data.data] - data part of the data URL\n * @property {string} [href] - sanitized URL input\n * @property {string} [origin] - scheme, domain and port of the sanitized URL\n * @property {string} [protocol] - protocol scheme of the sanitized URL\n * @property {string} [username] - username specified before the domain name\n * @property {string} [password] - password specified before the domain name\n * @property {string} [host] - domain and port of the sanitized URL\n * @property {string} [hostname] - domain of the sanitized URL\n * @property {string} [port] - port number of the sanitized URL\n * @property {string} [pathname] - path of the sanitized URL\n * @property {string} [search] - query string of the sanitized URL\n * @property {string} [hash] - fragment identifier of the sanitized URL\n */\n\n/**\n * Internal debug logger.\n * @param {boolean} isDebug - Debug flag.\n * @param {string} message - Output message.\n * @param {Error} [error] - Caught error object.\n */\nexport const logDebug = (isDebug, message, error) => {\n if (isDebug) {\n console.warn(`[URLSanitizer Debug] ${message}`, error ? error.message : '');\n }\n};\n\n/**\n * URL sanitizer\n */\nclass URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse = new Set();\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n }\n\n /**\n * replace matched data URLs\n * @param {string} data - data URL\n * @returns {string} - replaced data URL\n */\n replace(data) {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n let replacedData = data;\n if (REG_DATA_URL.test(replacedData)) {\n const matchedDataUrls = replacedData.matchAll(REG_DATA_URL_G);\n const items = [...matchedDataUrls].reverse();\n for (const item of items) {\n let [dataUrl] = item;\n if (REG_DATA_URL_B64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_B64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n let parsedDataUrl;\n try {\n parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n } finally {\n this.#nest--;\n this.#recurse.delete(dataUrl);\n }\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n replacedData.substring(0, index),\n replacedData.substring(index + dataUrl.length)\n ];\n if (parsedDataUrl) {\n replacedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n } else {\n replacedData = `${preDataUrl}${postDataUrl}`;\n }\n }\n }\n return replacedData;\n }\n\n /**\n * purify URL encoded DOM\n * @param {string} dom - DOM string\n * @returns {string} - purified DOM string\n */\n purify(dom) {\n if (!isString(dom)) {\n throw new TypeError(`Expected String but got ${getType(dom)}.`);\n }\n let decodedDom = dom;\n try {\n // prevent URIError caused by malformed percent-encoding\n // e.g., a standalone '%'\n decodedDom = decodeURIComponent(dom);\n } catch (e) {\n // fall through\n }\n let purifiedDom = domPurify.sanitize(decodedDom);\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom = purifiedDom.replace(/(?:#|%23)$/, '')\n .replace(/(?<!(?:#|%23).*)(?:\\?|%3F)$/, '');\n try {\n // prevent URIError caused by lone surrogates\n return encodeURI(purifiedDom);\n } catch (e) {\n return purifiedDom;\n }\n }\n\n /**\n * sanitize URL\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` URLs should be converted to `data` URLs\n * `javascript` and `vbscript` schemes can not be allowed\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.allowRelative] - allow relative URLs\n * @param {boolean} [opt.debug] - enable debug mode\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt) {\n if (this.#nest > HEX) {\n throw new Error('Data URLs nested too deeply.');\n }\n const {\n allow, deny, only, allowRelative = false, debug = false\n } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascript', false],\n ['vbscript', false]\n ]);\n const tempScheme = new Set();\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n const msg = `Failed to add scheme '${item}' in 'only' list.`;\n logDebug(debug, msg, e);\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n tempScheme.add(item);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n const msg = `Failed to add scheme '${item}' in 'allow' list.`;\n logDebug(debug, msg, e);\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n tempScheme.add(item);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n let isVerified = super.verify(url);\n let isRelative = false;\n if (!isVerified && allowRelative) {\n try {\n const { hostname, protocol } = new URL(url, 'http://dummy.local');\n if (protocol === 'http:' && hostname === 'dummy.local') {\n isVerified = true;\n isRelative = true;\n }\n } catch (e) {\n logDebug(debug, 'Failed to parse relative URL.', e);\n }\n }\n if (isVerified) {\n let hash, href, pathname, protocol, search;\n let scheme = '';\n let schemeParts = [];\n let bool = false;\n if (isRelative) {\n bool = true;\n } else {\n const urlObj = new URL(url);\n ({ hash, href, pathname, protocol, search } = urlObj);\n scheme = protocol.replace(/:$/, '');\n schemeParts = scheme.split('+');\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool =\n value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n }\n if (bool) {\n const isDataUrl = isRelative ? false : schemeParts.includes('data');\n let urlToSanitize = isRelative ? url : href;\n if (isDataUrl) {\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${search}${hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n let parsedData = data;\n if (isBase64) {\n parsedData = parseBase64(data);\n }\n try {\n const decodedData = parseURLEncodedNumCharRef(parsedData).trim();\n const { protocol: dataScheme } = new URL(decodedData);\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n const msg = 'Failed to parse inner data URL protocol.';\n logDebug(debug, msg, e);\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n }\n }\n if (!mediaType || REG_MIME_DOM.test(mediaType)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaTypes.pop();\n }\n urlToSanitize = `${scheme}:${mediaTypes.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n }\n if (!isDataUrl && REG_TAG_QUOT.test(urlToSanitize)) {\n const item = REG_TAG_QUOT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize =\n urlToSanitize.substring(0, index).replace(/[?&]$/, '');\n }\n if (urlToSanitize) {\n sanitizedUrl =\n urlToSanitize.replace(/%26/g, escapeURLEncodedHTMLChars);\n }\n }\n if (tempScheme.size) {\n tempScheme.forEach(item => {\n super.remove(item);\n });\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @returns {ParsedURL} - result with additional props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const parsedUrl = new Map([\n ['input', url]\n ]);\n let sanitizedUrl;\n if (this.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n sanitizedUrl = url;\n } else {\n sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['data', 'file']\n });\n }\n }\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n if (isBase64) {\n mediaTypes.pop();\n }\n dataUrl.set('mime', mediaTypes.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (isString(value)) {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n\n /**\n * reset sanitizer\n * @returns {void}\n */\n reset() {\n super.reset();\n this.#nest = 0;\n this.#recurse.clear();\n }\n}\nexport { URLSanitizer };\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * sanitize URL async\n * NOTE: `blob`, `data` and `file` schemes must be explicitly allowed\n * given a `blob` URL, returns a sanitized `data` URL\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: [],\n allowRelative: false,\n debug: false,\n maxBlobSize: MAX_BLOB_SIZE\n}) => {\n const isDebug = !!opt?.debug;\n const maxBlobSize = Number.isInteger(opt?.maxBlobSize) && opt.maxBlobSize > 0\n ? opt.maxBlobSize\n : MAX_BLOB_SIZE;\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n logDebug(isDebug, `Invalid URL input format: ${url}`, e);\n }\n if (scheme === 'blob') {\n const { allow, deny, only } = opt;\n if ((Array.isArray(allow) && allow.includes('blob') &&\n !(Array.isArray(deny) && deny.includes('blob'))) ||\n (Array.isArray(only) && only.includes('blob'))) {\n let data;\n try {\n data = await fetch(url)\n .then(r => r.blob())\n .then(b => createDataURLFromBlob(b, maxBlobSize));\n } catch (e) {\n const msg = `Failed to fetch and convert blob URL: ${url}`;\n logDebug(isDebug, msg, e);\n }\n if (data) {\n if (Array.isArray(only)) {\n if (!only.includes('data')) {\n only.push('data');\n }\n } else if (Array.isArray(allow)) {\n if (!allow.includes('data')) {\n allow.push('data');\n }\n if (Array.isArray(deny) && deny.includes('data')) {\n const i = deny.indexOf('data');\n deny.splice(i, 1);\n }\n }\n res = urlSanitizer.sanitize(data, opt);\n }\n }\n URL.revokeObjectURL(url);\n } else if (scheme || opt.allowRelative) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n const msg = `Failed to parse URL: ${url}`;\n logDebug(opt?.debug, msg, e);\n }\n if (scheme === 'blob') {\n URL.revokeObjectURL(url);\n } else if (scheme || opt?.allowRelative) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * parse URL async\n * @param {string} url - URL\n * @returns {Promise.<ParsedURL>} - result\n */\nexport const parseURL = async url => {\n const res = urlSanitizer.parse(url);\n return res;\n};\n\n/**\n * parse URL sync\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * is URI async\n * @param {string} uri - URI\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = urlSanitizer.verify(uri);\n return res;\n};\n\n/**\n * is URI sync\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/* export instance */\nexport default urlSanitizer;\n"],
5
- "mappings": "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",
6
- "names": ["domPurify", "args", "msg", "REG_B64", "REG_DATA_URL", "REG_DATA_URL_B64", "REG_DATA_URL_G", "REG_NUM_REF", "REG_MIME_DOM", "REG_SCHEME", "REG_SCHEME_EXT", "REG_SCRIPT", "REG_SCRIPT_BLOB", "REG_TAG_QUOT", "REG_URL_ENC", "getType", "o", "isString", "FileReader", "text_chars_default", "uri_schemes_default", "getURLEncodedString", "str", "isString", "getType", "chars", "ch", "escapeURLEncodedHTMLChars", "REG_URL_ENC", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "REG_B64", "bin", "uint8arr", "c", "textCharCodes", "text_chars_default", "parsedData", "parseURLEncodedNumCharRef", "nest", "res", "items", "REG_NUM_REF", "item", "numCharRef", "value", "index", "preNum", "postNum", "createDataURLFromBlob", "blob", "maxBlobSize", "resolve", "reject", "reader", "FileReader", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "REG_SCRIPT", "REG_SCHEME", "uri", "protocol", "schemeParts", "REG_SCHEME_EXT", "s", "logDebug", "isDebug", "message", "error", "URLSanitizer", "URISchemes", "#nest", "#recurse", "data", "isString", "getType", "replacedData", "REG_DATA_URL", "items", "REG_DATA_URL_G", "item", "dataUrl", "REG_DATA_URL_B64", "parsedDataUrl", "index", "preDataUrl", "postDataUrl", "dom", "decodedDom", "purifiedDom", "domPurify", "url", "opt", "allow", "deny", "only", "allowRelative", "debug", "schemeMap", "tempScheme", "restrictScheme", "schemes", "REG_SCRIPT_BLOB", "e", "msg", "sanitizedUrl", "isVerified", "isRelative", "hostname", "protocol", "hash", "href", "pathname", "search", "scheme", "schemeParts", "bool", "s", "key", "value", "isDataUrl", "urlToSanitize", "mediaType", "dataParts", "mediaTypes", "isBase64", "parsedData", "parseBase64", "decodedData", "parseURLEncodedNumCharRef", "dataScheme", "containsDataUrl", "REG_MIME_DOM", "REG_TAG_QUOT", "escapeURLEncodedHTMLChars", "parsedUrl", "urlObj", "urlSanitizer", "URLSanitizer", "sanitizeURL", "url", "opt", "isDebug", "maxBlobSize", "res", "isString", "scheme", "protocol", "e", "logDebug", "allow", "deny", "only", "data", "r", "b", "createDataURLFromBlob", "msg", "i", "sanitizeURLSync", "parseURL", "parseURLSync", "isURI", "uri", "isURISync", "sanitizer_default"]
3
+ "sources": ["../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/regexp.js", "../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/mjs/text-chars.js", "../bundle_wo_dompurify/mjs/uri-util.js", "../bundle_wo_dompurify/mjs/sanitizer.js"],
4
+ "sourcesContent": ["/**\n * dompurify.js (for wo-dompurify build)\n */\n\n/* constants */\nconst PROPERTIES = Object.freeze([\n 'addHook',\n 'removeHook',\n 'removeAllHooks',\n 'setConfig'\n]);\n\nconst hookQueue = [];\nexport const domPurify = new Proxy({}, {\n get(target, prop) {\n const purifier = globalThis.DOMPurify || globalThis.window?.DOMPurify;\n if (purifier) {\n if (hookQueue.length) {\n for (const { prop: p, args } of hookQueue) {\n if (typeof purifier[p] === 'function') {\n purifier[p](...args);\n }\n }\n hookQueue.length = 0;\n }\n const value = purifier[prop];\n return typeof value === 'function' ? value.bind(purifier) : value;\n }\n return (...args) => {\n if (PROPERTIES.includes(prop)) {\n hookQueue.push({ prop, args });\n return;\n }\n throw new Error('DOMPurify is not available. Ensure DOMPurify is exposed globally (e.g., window.DOMPurify).');\n };\n }\n});\n", "/**\n * common.js\n */\n\n/* shared */\nimport { TYPE_FROM, TYPE_TO } from './constant.js';\n\n/**\n * Gets the type of the given object.\n * Returns the object class name (e.g., \"String\", \"Array\", \"Null\", \"Undefined\").\n * @param {unknown} o - The object to check.\n * @returns {string} The specific type of the object.\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * Checks if the given value is a string.\n * @param {unknown} o - The value to check.\n * @returns {boolean} True if the value is a string, false otherwise.\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[\"aaa\",\"aaas\",\"about\",\"acap\",\"acct\",\"acd\",\"acr\",\"adiumxtra\",\"adt\",\"afp\",\"afs\",\"agtp\",\"aim\",\"amss\",\"android\",\"appdata\",\"apt\",\"ar\",\"ari\",\"ark\",\"at\",\"attachment\",\"aw\",\"barion\",\"beshare\",\"bitcoin\",\"bitcoincash\",\"bl\",\"blob\",\"bluetooth\",\"bolo\",\"brid\",\"browserext\",\"cabal\",\"caip\",\"calculator\",\"callto\",\"cap\",\"cast\",\"casts\",\"chrome\",\"chrome-extension\",\"cid\",\"coap\",\"coaps\",\"com-eventbrite-attendee\",\"content\",\"content-type\",\"crid\",\"cstr\",\"cttps\",\"cvs\",\"dab\",\"dat\",\"data\",\"dav\",\"dhttp\",\"diaspora\",\"dict\",\"did\",\"dilithium3\",\"dis\",\"dlna-playcontainer\",\"dlna-playsingle\",\"dnp\",\"dns\",\"dntp\",\"doi\",\"donau\",\"dpp\",\"drm\",\"dtmi\",\"dtn\",\"dvb\",\"dvx\",\"dweb\",\"ed2k\",\"eid\",\"elsi\",\"embedded\",\"ens\",\"esim\",\"ethereum\",\"example\",\"facetime\",\"feed\",\"feedready\",\"fido\",\"file\",\"finger\",\"first-run-pen-experience\",\"fish\",\"fm\",\"ftp\",\"fuchsia-pkg\",\"geo\",\"gg\",\"git\",\"gitoid\",\"gizmoproject\",\"go\",\"gopher\",\"graph\",\"gtalk\",\"h323\",\"ham\",\"hcap\",\"hcp\",\"hs20\",\"http\",\"https\",\"hxxp\",\"hxxps\",\"hydrazone\",\"hyper\",\"i0\",\"iax\",\"ibi\",\"ibi-\",\"icap\",\"icon\",\"ilstring\",\"im\",\"imap\",\"info\",\"iotdisco\",\"ipfs\",\"ipn\",\"ipns\",\"ipp\",\"ipps\",\"irc\",\"irc6\",\"ircs\",\"iris\",\"iris.beep\",\"iris.lwz\",\"iris.xpc\",\"iris.xpcs\",\"isostore\",\"itms\",\"jabber\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"lbry\",\"ldap\",\"ldaps\",\"leaptofrogans\",\"lid\",\"linkid\",\"lorawan\",\"lpa\",\"lvlt\",\"machineProvisioningProgressReporter\",\"magnet\",\"mailto\",\"maps\",\"market\",\"matrix\",\"message\",\"microsoft.windows.camera\",\"microsoft.windows.camera.multipicker\",\"microsoft.windows.camera.picker\",\"mid\",\"mms\",\"mongodb\",\"moz\",\"moz-extension\",\"mqtt\",\"mqtts\",\"ms-access\",\"ms-appinstaller\",\"ms-browser-extension\",\"ms-calculator\",\"ms-drive-to\",\"ms-enrollment\",\"ms-excel\",\"ms-eyecontrolspeech\",\"ms-gamebarservices\",\"ms-gamingoverlay\",\"ms-getoffice\",\"ms-help\",\"ms-infopath\",\"ms-inputapp\",\"ms-launchremotedesktop\",\"ms-lockscreencomponent-config\",\"ms-media-stream-id\",\"ms-meetnow\",\"ms-mixedrealitycapture\",\"ms-mobileplans\",\"ms-newsandinterests\",\"ms-officeapp\",\"ms-people\",\"ms-personacard\",\"ms-powerpoint\",\"ms-project\",\"ms-publisher\",\"ms-recall\",\"ms-remotedesktop\",\"ms-remotedesktop-launch\",\"ms-restoretabcompanion\",\"ms-screenclip\",\"ms-screensketch\",\"ms-search\",\"ms-search-repair\",\"ms-secondary-screen-controller\",\"ms-secondary-screen-setup\",\"ms-settings\",\"ms-settings-airplanemode\",\"ms-settings-bluetooth\",\"ms-settings-camera\",\"ms-settings-cellular\",\"ms-settings-cloudstorage\",\"ms-settings-connectabledevices\",\"ms-settings-displays-topology\",\"ms-settings-emailandaccounts\",\"ms-settings-language\",\"ms-settings-location\",\"ms-settings-lock\",\"ms-settings-nfctransactions\",\"ms-settings-notifications\",\"ms-settings-power\",\"ms-settings-privacy\",\"ms-settings-proximity\",\"ms-settings-screenrotation\",\"ms-settings-wifi\",\"ms-settings-workplace\",\"ms-spd\",\"ms-stickers\",\"ms-sttoverlay\",\"ms-transit-to\",\"ms-useractivityset\",\"ms-uup\",\"ms-virtualtouchpad\",\"ms-visio\",\"ms-walk-to\",\"ms-whiteboard\",\"ms-whiteboard-cmd\",\"ms-widgetboard\",\"ms-widgets\",\"ms-word\",\"msnim\",\"msrp\",\"msrps\",\"mss\",\"mt\",\"mtqp\",\"mtrust\",\"mumble\",\"mupdate\",\"mvn\",\"mvrp\",\"mvrps\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"notes\",\"num\",\"ocf\",\"oid\",\"onenote\",\"onenote-cmd\",\"opaquelocktoken\",\"openid\",\"openpgp4fpr\",\"otpauth\",\"palm\",\"paparazzi\",\"payto\",\"pkcs11\",\"platform\",\"pop\",\"pres\",\"proxy\",\"psyc\",\"pttp\",\"pwid\",\"qb\",\"query\",\"quic-transport\",\"redis\",\"rediss\",\"reload\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmfp\",\"rtmp\",\"rtsp\",\"rtsps\",\"rtspu\",\"sarif\",\"secondlife\",\"secret-token\",\"service\",\"session\",\"sftp\",\"sgn\",\"shc\",\"shelter\",\"sieve\",\"simpleledger\",\"simplex\",\"sip\",\"sips\",\"skype\",\"smb\",\"smp\",\"sms\",\"smtp\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"soldat\",\"spacify\",\"spiffe\",\"spotify\",\"ssb\",\"ssh\",\"starknet\",\"steam\",\"stun\",\"stuns\",\"submit\",\"svn\",\"swh\",\"swid\",\"swidpath\",\"tag\",\"taler\",\"teamspeak\",\"teapot\",\"teapots\",\"tel\",\"teliaeid\",\"telnet\",\"tftp\",\"things\",\"thismessage\",\"tip\",\"tn3270\",\"tool\",\"turn\",\"turns\",\"tv\",\"udp\",\"unreal\",\"upn\",\"urn\",\"ut2004\",\"uuid-in-package\",\"v-event\",\"vemmi\",\"ventrilo\",\"ves\",\"view-source\",\"vnc\",\"vscode\",\"vscode-insiders\",\"vsls\",\"w3\",\"wasm\",\"wasm-js\",\"wcr\",\"web3\",\"webcal\",\"wifi\",\"ws\",\"wss\",\"wtai\",\"wyciwyg\",\"xcompute\",\"xcon\",\"xcon-userid\",\"xfire\",\"xftp\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"xrcp\",\"xri\",\"ymsgr\",\"z39.50r\",\"z39.50s\",\"ztdnaid\"]\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = globalThis;\n\nexport {\n FileReader\n};\n", "/**\n * regexp.js\n */\n\n/**\n * Matches and captures the charset parameter in a media type string.\n * @type {RegExp}\n */\nexport const REG_CHARSET = /^charset=([\\w#&.;-]+)$/;\n\n/**\n * Matches a trailing empty fragment identifier (#).\n * @type {RegExp}\n */\nexport const REG_HASH = /(?:#|%23)$/;\n\n/**\n * Matches MIME types that contain DOM-parsable content (HTML, XML, SVG).\n * @type {RegExp}\n */\nexport const REG_MIME_DOM =\n /^(?:application\\/(?:[\\w#&.;-]+\\+)?x|image\\/svg\\+x|text\\/(?:ht|x))ml;?/;\n\n/**\n * Matches general text MIME types.\n * @type {RegExp}\n */\nexport const REG_MIME_TEXT = /^text\\/[\\w#&.;-]+/;\n\n/**\n * Matches a trailing empty query string (?), ensuring it is not part of a hash.\n * @type {RegExp}\n */\nexport const REG_QUERY = /(?<!(?:#|%23).*)(?:\\?|%3F)$/;\n\n/**\n * Validates a string against standard IANA URI scheme syntax.\n * @type {RegExp}\n */\nexport const REG_SCHEME = /^[a-z][\\da-z+.-]*$/;\n\n/**\n * Matches web custom schemes (`web+`) or application-specific schemes (`ext+`).\n * - `web+` schemes comply with the HTML Standard.\n * - `ext+` schemes comply with RFC 3986 but disallow `+` in the suffix.\n * @type {RegExp}\n */\nexport const REG_SCHEME_EXT = /^(?:web\\+[a-z]+|ext\\+[a-z][\\da-z.-]*)$/;\n\n/**\n * Matches executable script schemes (javascript or vbscript), case-insensitive.\n * @type {RegExp}\n */\nexport const REG_SCRIPT = /^(?:java|vb)script$/i;\n\n/**\n * Matches script-executing or data-fetching schemes.\n * @type {RegExp}\n */\nexport const REG_SCRIPT_BLOB = /^(?:(?:java|vb)script|blob)$/i;\n\n/**\n * Matches HTML tags, quotes, and their encoded or character reference variants.\n * @type {RegExp}\n */\nexport const REG_TAG_QUOT =\n /[\"'<>]|%(?:22|27|3C|3E)|&(?:apos|lt|gt|quot|#0*(?:34|39|60|62)|#x0*(?:22|27|3C|3E));/i;\n\n/**\n * Matches a valid percent-encoded character format (%XX).\n * @type {RegExp}\n */\nexport const REG_URL_ENC = /^%[\\dA-F]{2}$/i;\n\n/**\n * Validates relative URLs and flags invalid patterns.\n * @type {RegExp}\n */\nexport const REG_VERIFY_RELATIVE = /^(?:\\/{2,}|\\\\|[a-z][a-z\\d+\\-.]*:[^/])/i;\n", "[7,8,9,10,11,12,13,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]\n", "/**\n * text-chars.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' with { type: 'json' };\nimport { HEX } from './constant.js';\n\n/**\n * A set of valid text character codes.\n * @type {Set<number>}\n */\nexport const TEXT_CHAR_CODES = new Set(textChars);\n\n/**\n * A mapping of Windows-1252 specific character codes to their corresponding Unicode code points.\n * @type {Map<number, number>}\n */\nexport const WINDOWS1252_TO_UNICODE = new Map([\n [128, 0x20AC],\n [130, 0x201A],\n [131, 0x0192],\n [132, 0x201E],\n [133, 0x2026],\n [134, 0x2020],\n [135, 0x2021],\n [136, 0x02C6],\n [137, 0x2030],\n [138, 0x0160],\n [139, 0x2039],\n [140, 0x0152],\n [142, 0x017D],\n [145, 0x2018],\n [146, 0x2019],\n [147, 0x201C],\n [148, 0x201D],\n [149, 0x2022],\n [150, 0x2013],\n [151, 0x2014],\n [152, 0x02DC],\n [153, 0x2122],\n [154, 0x0161],\n [155, 0x203A],\n [156, 0x0153],\n [158, 0x017E],\n [159, 0x0178]\n]);\n\n/**\n * Generates control character codes in hex.\n * @private\n * @returns {Map<number, string>} Generated control char codes.\n */\nconst generateCtrlCharCodes = () => {\n const charCodes = new Map();\n for (let i = 0; i < HEX * HEX; i++) {\n if (!TEXT_CHAR_CODES.has(i) && !WINDOWS1252_TO_UNICODE.has(i)) {\n charCodes.set(i, `\\\\x${i.toString(HEX).padStart(2, '0').toUpperCase()}`);\n }\n }\n return charCodes;\n};\n\n/**\n * A mapping of control character codes to their hexadecimal escape strings.\n * @type {Map<number, string>}\n */\nexport const CTRL_CHAR_CODES = generateCtrlCharCodes();\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport uriSchemes from '../lib/iana/uri-schemes.json' with { type: 'json' };\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nimport { DECI, HEX, MAX_BLOB_SIZE, MAX_NEST } from './constant.js';\nimport {\n REG_HASH, REG_QUERY, REG_SCHEME_EXT, REG_SCRIPT, REG_URL_ENC\n} from './regexp.js';\nimport {\n CTRL_CHAR_CODES, TEXT_CHAR_CODES, WINDOWS1252_TO_UNICODE\n} from './text-chars.js';\nconst [\n ENC_AMP,\n ENC_NUM,\n ENC_LT,\n ENC_GT,\n ENC_QUOT,\n ENC_APOS\n] = ['&', '#', '<', '>', '\"', \"'\"].map(ch =>\n `%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`\n);\nconst REG_BINARY = new RegExp(`[${[...CTRL_CHAR_CODES.values()].join('')}]`);\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/gi;\n\n/**\n * URI schemes\n */\nexport class URISchemes {\n /* private fields */\n #schemes = new Set(uriSchemes);\n\n /**\n * Gets the list of registered URI schemes.\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes are omitted.\n * - The 'moz-extension' scheme is added by default.\n * @returns {string[]} An array of registered schemes.\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * Checks if the specified scheme is currently registered.\n * @param {string} scheme - The target scheme.\n * @returns {boolean} True if the scheme is registered.\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * Verifies if the given URI is valid and its scheme is allowed.\n * @param {string} uri - The URI string to verify.\n * @param {Set<string>} [schemes] - The set of allowed schemes.\n * @returns {boolean} True if the URI is syntactically valid and permitted.\n */\n verify(uri, schemes = this.#schemes) {\n if (!isString(uri)) {\n return false;\n }\n try {\n const { protocol } = new URL(uri);\n const scheme = protocol.replace(/:$/, '');\n const parts = scheme.split('+');\n const isScript = parts.some(s => REG_SCRIPT.test(s));\n if (isScript) {\n return false;\n }\n return REG_SCHEME_EXT.test(scheme) || parts.every(s => schemes.has(s));\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Gets the URL-encoded representation of a given string.\n * @param {string} str - The target string.\n * @returns {string} The completely URL-encoded string.\n */\nexport const getURLEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str);\n const chars = [];\n for (const byte of bytes) {\n chars.push(`%${byte.toString(HEX).padStart(2, '0').toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * Escapes URL-encoded HTML special characters.\n * @param {string} ch - A URL-encoded (percent-encoded) character.\n * @returns {string} The escaped HTML special character, or the given character.\n */\nexport const escapeURLEncodedHTMLChars = ch => {\n let target = ch;\n if (isString(target)) {\n if (REG_URL_ENC.test(target)) {\n target = target.toUpperCase();\n }\n switch (target) {\n case ENC_AMP: {\n return `${ENC_AMP}amp;`;\n }\n case ENC_LT: {\n return `${ENC_AMP}lt;`;\n }\n case ENC_GT: {\n return `${ENC_AMP}gt;`;\n }\n case ENC_QUOT: {\n return `${ENC_AMP}quot;`;\n }\n case ENC_APOS: {\n return `${ENC_AMP}${ENC_NUM}39;`;\n }\n default:\n }\n }\n return target;\n};\n\n/**\n * Parses base64-encoded data.\n * @param {string} data - The base64-encoded string.\n * @returns {string} The parsed text, or the original base64 if binary.\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n const cleanData = data.replace(/\\s/g, '');\n let binStr;\n try {\n binStr = atob(cleanData);\n } catch {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bytes = Uint8Array.from(binStr, c => c.charCodeAt(0));\n try {\n const decoder = new TextDecoder('utf-8', { fatal: true });\n const text = decoder.decode(bytes);\n if (REG_BINARY.test(text)) {\n return cleanData;\n }\n return text;\n } catch {\n return cleanData;\n }\n};\n\n/**\n * Replacer function for URL-encoded numeric character references.\n * @param {string} match - The matched substring.\n * @param {string} value - The captured numeric value.\n * @returns {string} The resolved character or the original match.\n */\nexport const replaceNumCharRef = (match, value) => {\n const num = /x/i.test(value[0])\n ? parseInt(value.substring(1), HEX)\n : parseInt(value, DECI);\n if (Number.isInteger(num)) {\n if (TEXT_CHAR_CODES.has(num)) {\n return String.fromCharCode(num);\n } else if (WINDOWS1252_TO_UNICODE.has(num)) {\n const codePoint = WINDOWS1252_TO_UNICODE.get(num);\n return String.fromCodePoint(codePoint);\n } else if (CTRL_CHAR_CODES.has(num)) {\n return '';\n }\n }\n return match;\n};\n\n/**\n * Parses URL-encoded numeric character references in the range 0x00 to 0xFF.\n * @param {string} str - The target string to parse.\n * @param {number} [nest] - The current nesting depth for recursive parsing.\n * @returns {string} The decoded and parsed string.\n */\nexport const parseURLEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n }\n let res = decodeURIComponent(str);\n while (/&#/.test(res)) {\n if (nest > MAX_NEST) {\n throw new Error('Character references nested too deeply.');\n }\n const previousRes = res;\n res = res.replace(REG_NUM_REF, replaceNumCharRef);\n if (res === previousRes) {\n break;\n }\n nest++;\n }\n return res;\n};\n\n/**\n * Creates a base64 data URL asynchronously from a given Blob.\n * @param {Blob} blob - The target Blob object.\n * @param {number} [maxBlobSize] - The maximum allowed blob size in bytes.\n * @returns {Promise<string|null>} A promise resolving to the data URL, or null.\n */\nexport const createDataURLFromBlob = (blob, maxBlobSize = MAX_BLOB_SIZE) =>\n new Promise((resolve, reject) => {\n if (!Number.isInteger(blob?.size)) {\n return resolve(null);\n } else if (Number.isInteger(maxBlobSize) && blob.size > maxBlobSize) {\n const msg =\n `Blob size (${blob.size} bytes) exceeds max (${maxBlobSize} bytes).`;\n return reject(new DOMException(msg, 'NotReadableError'));\n }\n const reader = new FileReader();\n reader.addEventListener('error', () => reject(reader.error));\n reader.addEventListener('abort', () => resolve(reader.result));\n reader.addEventListener('load', () => resolve(reader.result));\n reader.readAsDataURL(blob);\n });\n\n/**\n * Safely removes a trailing empty hash and an empty query string from a URL.\n * @param {string} url - The target URL string to be cleaned.\n * @returns {string} The cleaned URL string or the original input.\n */\nexport const trimTrailingEmptyQueryAndHash = url => {\n if (!isString(url)) {\n return url;\n }\n return url.replace(REG_HASH, '').replace(REG_QUERY, '');\n};\n", "/**\n * sanitizer.js\n */\n\n/* shared */\nimport { domPurify } from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport {\n URISchemes, createDataURLFromBlob, escapeURLEncodedHTMLChars, parseBase64,\n parseURLEncodedNumCharRef, trimTrailingEmptyQueryAndHash\n} from './uri-util.js';\n\n/* constants */\nimport { MAX_BLOB_SIZE, MAX_NEST } from './constant.js';\nimport {\n REG_MIME_DOM, REG_SCHEME, REG_SCRIPT, REG_SCRIPT_BLOB, REG_TAG_QUOT,\n REG_VERIFY_RELATIVE\n} from './regexp.js';\nconst URL_PROPS = Object.freeze([\n 'href',\n 'origin',\n 'protocol',\n 'username',\n 'password',\n 'host',\n 'hostname',\n 'port',\n 'pathname',\n 'search',\n 'hash'\n]);\nconst INTERNAL_PURIFY_CONFIG = Object.freeze({\n RETURN_DOM: false,\n RETURN_DOM_FRAGMENT: false,\n RETURN_TRUSTED_TYPE: false\n});\n\n/* typedef */\n/**\n * The parsed result of a data URL.\n * @typedef {object} InspectedDataURL\n * @property {string} mime - The MIME type of the data.\n * @property {boolean} base64 - Indicates whether the data is base64-encoded.\n * @property {string} data - The actual data part of the data URL.\n */\n\n/**\n * The result of an inspected URL, extending the standard URL API.\n * The properties except for input and valid are omitted from the object for invalid URLs.\n * @typedef {object} InspectedURLResult\n * @property {string} input - The original URL input.\n * @property {boolean} valid - Indicates whether the URI is valid.\n * @property {InspectedDataURL | null} [data] - The parsed result of a data URL. Null if not a data URL.\n * @property {string} [href] - The sanitized URL input.\n * @property {string} [origin] - The scheme, domain, and port.\n * @property {string} [protocol] - The protocol scheme.\n * @property {string} [username] - The specified username.\n * @property {string} [password] - The specified password.\n * @property {string} [host] - The domain and port.\n * @property {string} [hostname] - The domain.\n * @property {string} [port] - The port number.\n * @property {string} [pathname] - The path.\n * @property {string} [search] - The query string.\n * @property {string} [hash] - The fragment identifier.\n */\n\n/**\n * Internal debug logger.\n * @param {boolean} isDebug - Flag to enable or disable debug output.\n * @param {string} message - The message to output.\n * @param {Error} [error] - The caught error object, if any.\n * @returns {void}\n */\nexport const logDebug = (isDebug, message, error) => {\n if (isDebug) {\n console.warn(`[URLSanitizer Debug] ${message}`, error ? error.message : '');\n }\n};\n\n/**\n * URL sanitizer\n */\nclass URLSanitizer extends URISchemes {\n /* private fields */\n #allowedSchemes;\n\n static #currentCtx = null;\n\n /** @type {URLSanitizer | null} */\n static #currentInstance = null;\n\n /**\n * DOMPurify 'uponSanitizeAttribute' hook callback.\n * @private\n * @static\n * @param {Node} node - The DOM node being sanitized.\n * @param {object} e - The event object containing attribute details.\n */\n static #uponSanitizeAttribute(node, e) {\n if (!e.attrValue || !/^\\s*data:/i.test(e.attrValue)) {\n return;\n }\n /** @type {URLSanitizer | null} */\n const sanitizer = URLSanitizer.#currentInstance;\n const ctx = URLSanitizer.#currentCtx;\n if (!ctx || !sanitizer) {\n return;\n }\n let urlObj;\n try {\n urlObj = new URL(e.attrValue);\n } catch {\n return;\n }\n if (urlObj.protocol === 'data:') {\n const originalUrl = e.attrValue;\n if (!ctx.recurse) {\n ctx.recurse = new Set();\n }\n if (ctx.recurse.has(originalUrl)) {\n const msg = `Circular Data URL detected and skipped: ${originalUrl}`;\n logDebug(ctx.debug, msg);\n e.attrValue = '';\n return;\n }\n ctx.nest++;\n ctx.recurse.add(originalUrl);\n try {\n const sanitized = sanitizer.#process(originalUrl, {\n allow: ['data'],\n deny: [],\n only: [],\n allowRelative: false\n }, ctx);\n e.attrValue = sanitized || '';\n } finally {\n ctx.nest--;\n ctx.recurse.delete(originalUrl);\n }\n }\n }\n\n static {\n domPurify.setConfig(INTERNAL_PURIFY_CONFIG);\n domPurify.addHook(\n 'uponSanitizeAttribute',\n URLSanitizer.#uponSanitizeAttribute\n );\n }\n\n constructor() {\n super();\n this.#allowedSchemes = new Set(super.get());\n }\n\n /**\n * Helper method to register schemes for the 'allow' or 'only' options.\n * @private\n * @param {string} item - The scheme to register.\n * @param {string} listName - The name of the target option list.\n * @param {Set<string>} allowedSchemes - The local set of allowed schemes.\n * @param {Map<string, boolean>} schemeMap - The local map of schemes.\n * @param {object} ctx - The context for state management.\n * @returns {boolean} True if the scheme is successfully registered.\n */\n #registerScheme(item, listName, allowedSchemes, schemeMap, ctx) {\n if (REG_SCRIPT_BLOB.test(item)) {\n return false;\n }\n const schemeParts = item.split('+');\n const isScript = schemeParts.some(s => REG_SCRIPT.test(s));\n if (isScript || !REG_SCHEME.test(item)) {\n const msg = `Failed to add scheme '${item}' in '${listName}' list.`;\n logDebug(ctx.debug, msg);\n return false;\n }\n schemeMap.set(item, true);\n allowedSchemes.add(item);\n return true;\n }\n\n /**\n * Purifies a URL-encoded DOM string to prevent XSS.\n * @private\n * @param {string} dom - The URL-encoded DOM string.\n * @param {object} ctx - The context for state management.\n * @returns {string} The purified DOM string.\n */\n #purify(dom, ctx) {\n let decodedDom = dom;\n try {\n decodedDom = decodeURIComponent(dom);\n } catch {\n // fall through\n }\n const prevInstance = URLSanitizer.#currentInstance;\n const prevCtx = URLSanitizer.#currentCtx;\n URLSanitizer.#currentInstance = this;\n URLSanitizer.#currentCtx = ctx;\n let purifiedDom;\n try {\n purifiedDom = ctx.domPurify.sanitize(decodedDom);\n } finally {\n URLSanitizer.#currentInstance = prevInstance;\n URLSanitizer.#currentCtx = prevCtx;\n }\n purifiedDom = trimTrailingEmptyQueryAndHash(purifiedDom);\n try {\n return encodeURI(purifiedDom);\n } catch {\n return purifiedDom;\n }\n }\n\n /**\n * Internal recursive method for sanitization.\n * @private\n * @param {string} url - The URL string to sanitize.\n * @param {object} rules - Normalized sanitization rules.\n * @param {object} ctx - Internal context for state management.\n * @returns {string|null} The sanitized URL, or null.\n */\n #process(url, rules, ctx) {\n if (ctx.nest > MAX_NEST) {\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, allowRelative } = rules;\n let allowedSchemes = this.#allowedSchemes;\n let restrictScheme = false;\n const schemeMap = new Map(ctx.schemeMap);\n if (only.length) {\n allowedSchemes = new Set();\n for (let item of only) {\n if (isString(item)) {\n item = item.trim();\n const registered =\n this.#registerScheme(item, 'only', allowedSchemes, schemeMap, ctx);\n if (registered && !restrictScheme) {\n restrictScheme = true;\n }\n }\n }\n } else {\n if (allow.length) {\n allowedSchemes = new Set(this.#allowedSchemes);\n for (const item of allow) {\n if (isString(item)) {\n this.#registerScheme(\n item.trim(),\n 'allow',\n allowedSchemes,\n schemeMap,\n ctx\n );\n }\n }\n }\n if (deny.length) {\n for (let item of deny) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n let isVerified = super.verify(url, allowedSchemes);\n let isRelative = false;\n let relativeParsedPath = '';\n if (!isVerified && allowRelative && !REG_VERIFY_RELATIVE.test(url)) {\n try {\n const dummyUrl = new URL(url, 'http://dummy.local');\n if (\n dummyUrl.protocol === 'http:' &&\n dummyUrl.hostname === 'dummy.local'\n ) {\n isVerified = true;\n isRelative = true;\n relativeParsedPath =\n `${dummyUrl.pathname}${dummyUrl.search}${dummyUrl.hash}`;\n }\n } catch (e) {\n logDebug(ctx.debug, 'Failed to parse relative URL.', e);\n }\n }\n if (isVerified) {\n let hash, href, pathname, protocol, search;\n let scheme = '';\n let schemeParts = [];\n let bool = false;\n if (isRelative) {\n bool = true;\n } else {\n const urlObj = new URL(url);\n ({ hash, href, pathname, protocol, search } = urlObj);\n scheme = protocol.replace(/:$/, '');\n schemeParts = scheme.split('+');\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool =\n value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n }\n if (bool) {\n const isDataUrl = isRelative ? false : schemeParts.includes('data');\n let urlToSanitize = isRelative ? relativeParsedPath : href;\n if (isDataUrl) {\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${search}${hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n let parsedData = data;\n if (isBase64) {\n try {\n parsedData = parseBase64(data);\n } catch (e) {\n logDebug(ctx.debug, 'Failed to parse base64 data.', e);\n urlToSanitize = '';\n }\n }\n try {\n const decodedData = parseURLEncodedNumCharRef(parsedData).trim();\n const { protocol: dataScheme } =\n new URL(decodedData, 'http://dummy.local');\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n const msg = 'Failed to parse inner data URL protocol.';\n logDebug(ctx.debug, msg, e);\n }\n if (!mediaType || REG_MIME_DOM.test(mediaType)) {\n parsedData = this.#purify(parsedData, ctx);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaTypes.pop();\n }\n urlToSanitize = `${scheme}:${mediaTypes.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n }\n if (!isDataUrl && REG_TAG_QUOT.test(urlToSanitize)) {\n const item = REG_TAG_QUOT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize =\n urlToSanitize.substring(0, index).replace(/[?&]$/, '');\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * Sanitizes the given URL.\n * @param {string} url - The URL string to sanitize.\n * @param {object} [opt] - Sanitization options.\n * @param {string[]} [opt.allow] - An array of schemes to allow.\n * @param {string[]} [opt.deny] - An array of schemes to deny.\n * @param {string[]} [opt.only] - An array of specific schemes to allow.\n * @param {boolean} [opt.allowRelative] - Flag to safely allow relative URLs.\n * @param {boolean} [opt.debug] - Flag to enable debug mode.\n * @param {number} [opt.maxBlobSize] - The maximum allowed blob size in bytes.\n * @returns {string|null} The sanitized URL, or null.\n */\n sanitize(url, opt) {\n if (!url || !isString(url)) {\n return null;\n }\n const hasRestrictiveRules = opt && (\n (Array.isArray(opt.deny) && opt.deny.length > 0) ||\n (Array.isArray(opt.only) && opt.only.length > 0) ||\n opt.allowRelative\n );\n if (\n !hasRestrictiveRules &&\n (url.startsWith('https://') || url.startsWith('http://')) &&\n !REG_TAG_QUOT.test(url) &&\n !url.includes('data:')\n ) {\n try {\n const { href } = new URL(url);\n const res = href;\n return res.replace(/%26/g, escapeURLEncodedHTMLChars);\n } catch {\n return null;\n }\n }\n const rules = {\n allow: Array.isArray(opt?.allow) ? opt.allow : [],\n deny: Array.isArray(opt?.deny) ? opt.deny : [],\n only: Array.isArray(opt?.only) ? opt.only : [],\n allowRelative: !!opt?.allowRelative\n };\n const ctx = {\n debug: !!opt?.debug,\n domPurify,\n nest: 0,\n recurse: null,\n schemeMap: new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascript', false],\n ['vbscript', false]\n ])\n };\n return this.#process(url, rules, ctx);\n }\n\n /**\n * Inspects, parses, and sanitizes the given URL.\n * NOTE: blob URLs are simply parsed, but neither decoded nor sanitized.\n * @param {string} url - The URL string to parse.\n * @param {object} [opt] - Sanitization options.\n * @returns {InspectedURLResult} The object containing parsed result.\n */\n inspect(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const parsedUrl = new Map([['input', url]]);\n let sanitizedUrl;\n if (this.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n sanitizedUrl = url;\n } else {\n sanitizedUrl = this.sanitize(url, opt ?? { allow: ['data', 'file'] });\n }\n }\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${urlObj.search}${urlObj.hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n if (isBase64) {\n mediaTypes.pop();\n }\n dataUrl.set('mime', mediaTypes.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key of URL_PROPS) {\n const value = urlObj[key];\n if (isString(value)) {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n\n /**\n * Gets the list of registered URI schemes.\n * @returns {string[]} An array of registered schemes.\n */\n get() {\n return [...this.#allowedSchemes];\n }\n\n /**\n * Checks if the specified scheme is currently registered.\n * @param {string} scheme - The target scheme.\n * @returns {boolean} True if the scheme is registered.\n */\n has(scheme) {\n return this.#allowedSchemes.has(scheme);\n }\n\n /**\n * Adds a new scheme to the allowed list.\n * @param {string} scheme - The scheme to add.\n * @returns {string[]} The updated array of registered schemes.\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n }\n const schemeParts = scheme.split('+');\n const isScript = schemeParts.some(s => REG_SCRIPT.test(s));\n if (isScript || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#allowedSchemes.add(scheme);\n return [...this.#allowedSchemes];\n }\n\n /**\n * Removes a scheme from the allowed list.\n * @param {string} scheme - The scheme to remove.\n * @returns {boolean} True if the scheme was successfully removed.\n */\n remove(scheme) {\n return this.#allowedSchemes.delete(scheme);\n }\n\n /**\n * Resets the registered schemes back to the default initial list.\n * @returns {void}\n */\n reset() {\n this.#allowedSchemes = new Set(super.get());\n }\n\n /**\n * Verifies if the given URI is valid and its scheme is allowed.\n * @param {string} uri - The URI string to verify.\n * @param {Set<string>} [schemes] - The set of allowed schemes.\n * @returns {boolean} True if the URI is syntactically valid and permitted.\n */\n verify(uri, schemes = this.#allowedSchemes) {\n return super.verify(uri, schemes);\n }\n}\nexport { URLSanitizer };\n\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * Asynchronously sanitizes the given URL.\n * NOTE: `blob`, `data`, and `file` schemes must be explicitly allowed.\n * Given a `blob` URL, it securely converts and returns a sanitized `data` URL.\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {string[]} [opt.allow] - The array of schemes to allow.\n * @param {string[]} [opt.deny] - The array of schemes to deny.\n * @param {string[]} [opt.only] - The array of specific schemes to allow.\n * @param {boolean} [opt.allowRelative] - Allow relative URLs.\n * @param {boolean} [opt.debug] - Enable debug mode.\n * @param {boolean} [opt.revokeObjectURL] - Revokes the blob URL after sanitization.\n * @param {number} [opt.maxBlobSize] - The maximum allowed blob size in bytes.\n * @returns {Promise<string|null>} A promise resolving to the sanitized URL, or null.\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: [],\n allowRelative: false,\n debug: false,\n revokeObjectURL: false,\n maxBlobSize: MAX_BLOB_SIZE\n}) => {\n const isDebug = !!opt?.debug;\n const maxBlobSize = Number.isInteger(opt?.maxBlobSize) && opt.maxBlobSize > 0\n ? opt.maxBlobSize\n : MAX_BLOB_SIZE;\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n logDebug(isDebug, `Invalid URL input format: ${url}`, e);\n }\n if (scheme === 'blob') {\n const { allow, deny, only } = opt;\n if ((Array.isArray(allow) && allow.includes('blob') &&\n !(Array.isArray(deny) && deny.includes('blob'))) ||\n (Array.isArray(only) && only.includes('blob'))) {\n let data;\n try {\n data = await fetch(url)\n .then(r => r.blob())\n .then(b => createDataURLFromBlob(b, maxBlobSize));\n } catch (e) {\n const msg = `Failed to fetch and convert blob URL: ${url}`;\n logDebug(isDebug, msg, e);\n }\n if (data) {\n const options = { ...opt };\n if (Array.isArray(opt.only)) {\n options.only = opt.only.includes('data')\n ? opt.only\n : [...opt.only, 'data'];\n } else if (Array.isArray(opt.allow)) {\n options.allow = opt.allow.includes('data')\n ? opt.allow\n : [...opt.allow, 'data'];\n if (Array.isArray(opt.deny)) {\n options.deny = opt.deny.filter(scheme => scheme !== 'data');\n }\n }\n res = urlSanitizer.sanitize(data, options);\n }\n }\n if (opt?.revokeObjectURL) {\n URL.revokeObjectURL(url);\n }\n } else if (scheme || opt.allowRelative) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * Synchronously sanitizes the given URL.\n * NOTE: `data` and `file` schemes must be explicitly allowed.\n * The `blob` scheme is not supported and will return `null`.\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {string[]} [opt.allow] - The array of schemes to allow.\n * @param {string[]} [opt.deny] - The array of schemes to deny.\n * @param {string[]} [opt.only] - The array of specific schemes to allow.\n * @param {boolean} [opt.allowRelative] - Allow relative URLs.\n * @param {boolean} [opt.debug] - Enable debug mode.\n * @param {boolean} [opt.revokeObjectURL] - Revokes the blob URL.\n * @returns {string|null} The sanitized URL, or null if denied.\n */\nexport const sanitizeURLSync = (url, opt = {\n allow: [],\n deny: [],\n only: [],\n allowRelative: false,\n debug: false,\n revokeObjectURL: false\n}) => {\n const isDebug = !!opt?.debug;\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n const msg = `Invalid URL input format: ${url}`;\n logDebug(isDebug, msg, e);\n }\n if (scheme === 'blob') {\n if (opt?.revokeObjectURL) {\n URL.revokeObjectURL(url);\n }\n return null;\n } else if (scheme || opt.allowRelative) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * Inspects, parses, and sanitizes the given URL asynchronously.\n * @param {string} url - The URL string to inspect.\n * @returns {Promise<InspectedURLResult>} A promise resolving to the inspected URL object.\n */\nexport const inspectURL = async url => {\n const res = urlSanitizer.inspect(url);\n return res;\n};\n\n/**\n * @deprecated Use inspectURL instead.\n * @param {string} url - The URL string to inspect.\n * @returns {Promise<InspectedURLResult>} A promise resolving to the inspected URL object.\n */\nexport const parseURL = url => inspectURL(url);\n\n/**\n * Inspects, parses, and sanitizes the given URL synchronously.\n * @param {string} url - The URL string to inspect.\n * @returns {InspectedURLResult} The inspected URL object.\n */\nexport const inspectURLSync = url => urlSanitizer.inspect(url);\n\n/**\n * @deprecated Use inspectURLSync instead.\n * @param {string} url - The URL string to inspect.\n * @returns {InspectedURLResult} The inspected URL object.\n */\nexport const parseURLSync = url => inspectURLSync(url);\n\n/**\n * Asynchronously checks if the given string is a valid URI and is registered.\n * @param {string} uri - The URI string to verify.\n * @returns {Promise<boolean>} True if valid and registered, false otherwise.\n */\nexport const isURI = async uri => {\n const res = urlSanitizer.verify(uri);\n return res;\n};\n\n/**\n * Synchronously checks if the given string is a valid URI and is registered.\n * @param {string} uri - The URI string to verify.\n * @returns {boolean} True if valid and registered, false otherwise.\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/* export instance */\nexport default urlSanitizer;\n"],
5
+ "mappings": "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",
6
+ "names": ["PROPERTIES", "hookQueue", "domPurify", "target", "prop", "purifier", "p", "args", "value", "getType", "o", "isString", "uri_schemes_default", "FileReader", "REG_HASH", "REG_MIME_DOM", "REG_QUERY", "REG_SCHEME", "REG_SCHEME_EXT", "REG_SCRIPT", "REG_SCRIPT_BLOB", "REG_TAG_QUOT", "REG_URL_ENC", "REG_VERIFY_RELATIVE", "text_chars_default", "TEXT_CHAR_CODES", "text_chars_default", "WINDOWS1252_TO_UNICODE", "generateCtrlCharCodes", "charCodes", "i", "CTRL_CHAR_CODES", "ENC_AMP", "ENC_NUM", "ENC_LT", "ENC_GT", "ENC_QUOT", "ENC_APOS", "ch", "REG_BINARY", "CTRL_CHAR_CODES", "REG_NUM_REF", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "schemes", "isString", "protocol", "parts", "s", "REG_SCRIPT", "REG_SCHEME_EXT", "escapeURLEncodedHTMLChars", "ch", "target", "isString", "REG_URL_ENC", "ENC_AMP", "ENC_LT", "ENC_GT", "ENC_QUOT", "ENC_APOS", "ENC_NUM", "parseBase64", "data", "getType", "cleanData", "binStr", "bytes", "c", "text", "REG_BINARY", "replaceNumCharRef", "match", "value", "num", "TEXT_CHAR_CODES", "WINDOWS1252_TO_UNICODE", "codePoint", "CTRL_CHAR_CODES", "parseURLEncodedNumCharRef", "str", "nest", "res", "previousRes", "REG_NUM_REF", "createDataURLFromBlob", "blob", "maxBlobSize", "resolve", "reject", "msg", "reader", "FileReader", "trimTrailingEmptyQueryAndHash", "url", "REG_HASH", "REG_QUERY", "URL_PROPS", "INTERNAL_PURIFY_CONFIG", "logDebug", "isDebug", "message", "error", "URLSanitizer", "_URLSanitizer", "URISchemes", "#allowedSchemes", "#currentCtx", "#currentInstance", "#uponSanitizeAttribute", "node", "e", "sanitizer", "ctx", "urlObj", "originalUrl", "msg", "sanitized", "#process", "domPurify", "#registerScheme", "item", "listName", "allowedSchemes", "schemeMap", "REG_SCRIPT_BLOB", "s", "REG_SCRIPT", "REG_SCHEME", "#purify", "dom", "decodedDom", "prevInstance", "prevCtx", "purifiedDom", "trimTrailingEmptyQueryAndHash", "url", "rules", "allow", "deny", "only", "allowRelative", "restrictScheme", "isString", "sanitizedUrl", "isVerified", "isRelative", "relativeParsedPath", "REG_VERIFY_RELATIVE", "dummyUrl", "hash", "href", "pathname", "protocol", "search", "scheme", "schemeParts", "bool", "key", "value", "isDataUrl", "urlToSanitize", "mediaType", "dataParts", "data", "mediaTypes", "isBase64", "parsedData", "parseBase64", "decodedData", "parseURLEncodedNumCharRef", "dataScheme", "REG_MIME_DOM", "REG_TAG_QUOT", "index", "opt", "escapeURLEncodedHTMLChars", "getType", "parsedUrl", "dataUrl", "uri", "schemes", "urlSanitizer", "URLSanitizer", "sanitizeURL", "url", "opt", "isDebug", "maxBlobSize", "res", "isString", "scheme", "protocol", "e", "logDebug", "allow", "deny", "only", "data", "r", "b", "createDataURLFromBlob", "msg", "options", "sanitizeURLSync", "inspectURL", "parseURL", "inspectURLSync", "parseURLSync", "isURI", "uri", "isURISync", "sanitizer_default"]
7
7
  }
@@ -1,6 +1,6 @@
1
- function Wt(n,t){(t==null||t>n.length)&&(t=n.length);for(var r=0,s=Array(t);r<t;r++)s[r]=n[r];return s}function Dn(n){if(Array.isArray(n))return n}function In(n,t){var r=n==null?null:typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(r!=null){var s,i,l,f,m=[],u=!0,E=!1;try{if(l=(r=r.call(n)).next,t!==0)for(;!(u=(s=l.call(r)).done)&&(m.push(s.value),m.length!==t);u=!0);}catch(g){E=!0,i=g}finally{try{if(!u&&r.return!=null&&(f=r.return(),Object(f)!==f))return}finally{if(E)throw i}}return m}}function Nn(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Cn(n,t){return Dn(n)||In(n,t)||Mn(n,t)||Nn()}function Mn(n,t){if(n){if(typeof n=="string")return Wt(n,t);var r={}.toString.call(n).slice(8,-1);return r==="Object"&&n.constructor&&(r=n.constructor.name),r==="Map"||r==="Set"?Array.from(n):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Wt(n,t):void 0}}var rn=Object.entries,Yt=Object.setPrototypeOf,vn=Object.isFrozen,Un=Object.getPrototypeOf,Pn=Object.getOwnPropertyDescriptor,P=Object.freeze,G=Object.seal,be=Object.create,sn=typeof Reflect<"u"&&Reflect,mt=sn.apply,ut=sn.construct;P||(P=function(t){return t});G||(G=function(t){return t});mt||(mt=function(t,r){for(var s=arguments.length,i=new Array(s>2?s-2:0),l=2;l<s;l++)i[l-2]=arguments[l];return t.apply(r,i)});ut||(ut=function(t){for(var r=arguments.length,s=new Array(r>1?r-1:0),i=1;i<r;i++)s[i-1]=arguments[i];return new t(...s)});var Ee=x(Array.prototype.forEach),kn=x(Array.prototype.lastIndexOf),Xt=x(Array.prototype.pop),_e=x(Array.prototype.push),Fn=x(Array.prototype.splice),U=Array.isArray,De=x(String.prototype.toLowerCase),at=x(String.prototype.toString),qt=x(String.prototype.match),Ae=x(String.prototype.replace),Vt=x(String.prototype.indexOf),zn=x(String.prototype.trim),Gn=x(Number.prototype.toString),$n=x(Boolean.prototype.toString),Zt=typeof BigInt>"u"?null:x(BigInt.prototype.toString),Kt=typeof Symbol>"u"?null:x(Symbol.prototype.toString),y=x(Object.prototype.hasOwnProperty),Le=x(Object.prototype.toString),C=x(RegExp.prototype.test),ke=Hn(TypeError);function x(n){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var r=arguments.length,s=new Array(r>1?r-1:0),i=1;i<r;i++)s[i-1]=arguments[i];return mt(n,t,s)}}function Hn(n){return function(){for(var t=arguments.length,r=new Array(t),s=0;s<t;s++)r[s]=arguments[s];return ut(n,r)}}function p(n,t){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:De;if(Yt&&Yt(n,null),!U(t))return n;let s=t.length;for(;s--;){let i=t[s];if(typeof i=="string"){let l=r(i);l!==i&&(vn(t)||(t[s]=l),i=l)}n[i]=!0}return n}function Bn(n){for(let t=0;t<n.length;t++)y(n,t)||(n[t]=null);return n}function F(n){let t=be(null);for(let s of rn(n)){var r=Cn(s,2);let i=r[0],l=r[1];y(n,i)&&(U(l)?t[i]=Bn(l):l&&typeof l=="object"&&l.constructor===Object?t[i]=F(l):t[i]=l)}return t}function jn(n){switch(typeof n){case"string":return n;case"number":return Gn(n);case"boolean":return $n(n);case"bigint":return Zt?Zt(n):"0";case"symbol":return Kt?Kt(n):"Symbol()";case"undefined":return Le(n);case"function":case"object":{if(n===null)return Le(n);let t=n,r=Re(t,"toString");if(typeof r=="function"){let s=r(t);return typeof s=="string"?s:Le(s)}return Le(n)}default:return Le(n)}}function Re(n,t){for(;n!==null;){let s=Pn(n,t);if(s){if(s.get)return x(s.get);if(typeof s.value=="function")return x(s.value)}n=Un(n)}function r(){return null}return r}function Wn(n){try{return C(n,""),!0}catch{return!1}}var Qt=P(["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","search","section","select","shadow","slot","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"]),lt=P(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),ct=P(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Yn=P(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),pt=P(["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"]),Xn=P(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Jt=P(["#text"]),en=P(["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","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","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","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns"]),ft=P(["accent-height","accumulate","additive","alignment-baseline","amplitude","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","exponent","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","intercept","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","mask-type","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","slope","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","tablevalues","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"]),tn=P(["accent","accentunder","align","bevelled","close","columnalign","columnlines","columnspacing","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lquote","lspace","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"]),Fe=P(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),qn=G(/{{[\w\W]*|^[\w\W]*}}/g),Vn=G(/<%[\w\W]*|^[\w\W]*%>/g),Zn=G(/\${[\w\W]*/g),Kn=G(/^data-[\-\w.\u00B7-\uFFFF]+$/),Qn=G(/^aria-[\-\w]+$/),nn=G(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Jn=G(/^(?:\w+script|data):/i),eo=G(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),to=G(/^html$/i),no=G(/^[a-z][.\w]*(-[.\w]+)+$/i),ye={element:1,text:3,progressingInstruction:7,comment:8,document:9},oo=function(){return typeof window>"u"?null:window},ro=function(t,r){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(s=r.getAttribute(i));let l="dompurify"+(s?"#"+s:"");try{return t.createPolicy(l,{createHTML(f){return f},createScriptURL(f){return f}})}catch{return console.warn("TrustedTypes policy "+l+" could not be created."),null}},on=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function an(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:oo(),t=c=>an(c);if(t.version="3.4.3",t.removed=[],!n||!n.document||n.document.nodeType!==ye.document||!n.Element)return t.isSupported=!1,t;let r=n.document,s=r,i=s.currentScript,l=n.DocumentFragment,f=n.HTMLTemplateElement,m=n.Node,u=n.Element,E=n.NodeFilter,g=n.NamedNodeMap,v=g===void 0?n.NamedNodeMap||n.MozNamedAttrMap:g,te=n.HTMLFormElement,Z=n.DOMParser,_=n.trustedTypes,d=u.prototype,A=Re(d,"cloneNode"),K=Re(d,"remove"),pe=Re(d,"nextSibling"),fe=Re(d,"childNodes"),q=Re(d,"parentNode");if(typeof f=="function"){let c=r.createElement("template");c.content&&c.content.ownerDocument&&(r=c.content.ownerDocument)}let b,$="",S=r,H=S.implementation,ne=S.createNodeIterator,me=S.createDocumentFragment,ue=S.getElementsByTagName,Ie=s.importNode,T=on();t.isSupported=typeof rn=="function"&&typeof q=="function"&&H&&H.createHTMLDocument!==void 0;let oe=qn,Q=Vn,re=Zn,At=Kn,We=Qn,An=Jn,yt=eo,yn=no,bt=nn,L=null,Rt=p({},[...Qt,...lt,...ct,...pt,...Jt]),N=null,St=p({},[...en,...ft,...tn,...Fe]),R=Object.seal(be(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}})),Se=null,Ne=null,J=Object.seal(be(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),wt=!0,Ye=!0,xt=!1,Ot=!0,se=!1,we=!0,ie=!1,Xe=!1,qe=!1,de=!1,Ce=!1,Me=!1,Lt=!0,Dt=!1,It="user-content-",Ve=!0,xe=!1,he={},W=null,Ze=p({},["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"]),Nt=null,Ct=p({},["audio","video","img","source","image","track"]),Ke=null,Mt=p({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ve="http://www.w3.org/1998/Math/MathML",Ue="http://www.w3.org/2000/svg",Y="http://www.w3.org/1999/xhtml",ge=Y,Qe=!1,Je=null,bn=p({},[ve,Ue,Y],at),et=p({},["mi","mo","mn","ms","mtext"]),tt=p({},["annotation-xml"]),Rn=p({},["title","style","font","a","script"]),Oe=null,Sn=["application/xhtml+xml","text/html"],wn="text/html",O=null,Te=null,xn=r.createElement("form"),vt=function(e){return e instanceof RegExp||e instanceof Function},nt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Te&&Te===e)return;(!e||typeof e!="object")&&(e={}),e=F(e),Oe=Sn.indexOf(e.PARSER_MEDIA_TYPE)===-1?wn:e.PARSER_MEDIA_TYPE,O=Oe==="application/xhtml+xml"?at:De,L=y(e,"ALLOWED_TAGS")&&U(e.ALLOWED_TAGS)?p({},e.ALLOWED_TAGS,O):Rt,N=y(e,"ALLOWED_ATTR")&&U(e.ALLOWED_ATTR)?p({},e.ALLOWED_ATTR,O):St,Je=y(e,"ALLOWED_NAMESPACES")&&U(e.ALLOWED_NAMESPACES)?p({},e.ALLOWED_NAMESPACES,at):bn,Ke=y(e,"ADD_URI_SAFE_ATTR")&&U(e.ADD_URI_SAFE_ATTR)?p(F(Mt),e.ADD_URI_SAFE_ATTR,O):Mt,Nt=y(e,"ADD_DATA_URI_TAGS")&&U(e.ADD_DATA_URI_TAGS)?p(F(Ct),e.ADD_DATA_URI_TAGS,O):Ct,W=y(e,"FORBID_CONTENTS")&&U(e.FORBID_CONTENTS)?p({},e.FORBID_CONTENTS,O):Ze,Se=y(e,"FORBID_TAGS")&&U(e.FORBID_TAGS)?p({},e.FORBID_TAGS,O):F({}),Ne=y(e,"FORBID_ATTR")&&U(e.FORBID_ATTR)?p({},e.FORBID_ATTR,O):F({}),he=y(e,"USE_PROFILES")?e.USE_PROFILES&&typeof e.USE_PROFILES=="object"?F(e.USE_PROFILES):e.USE_PROFILES:!1,wt=e.ALLOW_ARIA_ATTR!==!1,Ye=e.ALLOW_DATA_ATTR!==!1,xt=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ot=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,se=e.SAFE_FOR_TEMPLATES||!1,we=e.SAFE_FOR_XML!==!1,ie=e.WHOLE_DOCUMENT||!1,de=e.RETURN_DOM||!1,Ce=e.RETURN_DOM_FRAGMENT||!1,Me=e.RETURN_TRUSTED_TYPE||!1,qe=e.FORCE_BODY||!1,Lt=e.SANITIZE_DOM!==!1,Dt=e.SANITIZE_NAMED_PROPS||!1,Ve=e.KEEP_CONTENT!==!1,xe=e.IN_PLACE||!1,bt=Wn(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:nn,ge=typeof e.NAMESPACE=="string"?e.NAMESPACE:Y,et=y(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&typeof e.MATHML_TEXT_INTEGRATION_POINTS=="object"?F(e.MATHML_TEXT_INTEGRATION_POINTS):p({},["mi","mo","mn","ms","mtext"]),tt=y(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&typeof e.HTML_INTEGRATION_POINTS=="object"?F(e.HTML_INTEGRATION_POINTS):p({},["annotation-xml"]);let o=y(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&typeof e.CUSTOM_ELEMENT_HANDLING=="object"?F(e.CUSTOM_ELEMENT_HANDLING):be(null);if(R=be(null),y(o,"tagNameCheck")&&vt(o.tagNameCheck)&&(R.tagNameCheck=o.tagNameCheck),y(o,"attributeNameCheck")&&vt(o.attributeNameCheck)&&(R.attributeNameCheck=o.attributeNameCheck),y(o,"allowCustomizedBuiltInElements")&&typeof o.allowCustomizedBuiltInElements=="boolean"&&(R.allowCustomizedBuiltInElements=o.allowCustomizedBuiltInElements),se&&(Ye=!1),Ce&&(de=!0),he&&(L=p({},Jt),N=be(null),he.html===!0&&(p(L,Qt),p(N,en)),he.svg===!0&&(p(L,lt),p(N,ft),p(N,Fe)),he.svgFilters===!0&&(p(L,ct),p(N,ft),p(N,Fe)),he.mathMl===!0&&(p(L,pt),p(N,tn),p(N,Fe))),J.tagCheck=null,J.attributeCheck=null,y(e,"ADD_TAGS")&&(typeof e.ADD_TAGS=="function"?J.tagCheck=e.ADD_TAGS:U(e.ADD_TAGS)&&(L===Rt&&(L=F(L)),p(L,e.ADD_TAGS,O))),y(e,"ADD_ATTR")&&(typeof e.ADD_ATTR=="function"?J.attributeCheck=e.ADD_ATTR:U(e.ADD_ATTR)&&(N===St&&(N=F(N)),p(N,e.ADD_ATTR,O))),y(e,"ADD_URI_SAFE_ATTR")&&U(e.ADD_URI_SAFE_ATTR)&&p(Ke,e.ADD_URI_SAFE_ATTR,O),y(e,"FORBID_CONTENTS")&&U(e.FORBID_CONTENTS)&&(W===Ze&&(W=F(W)),p(W,e.FORBID_CONTENTS,O)),y(e,"ADD_FORBID_CONTENTS")&&U(e.ADD_FORBID_CONTENTS)&&(W===Ze&&(W=F(W)),p(W,e.ADD_FORBID_CONTENTS,O)),Ve&&(L["#text"]=!0),ie&&p(L,["html","head","body"]),L.table&&(p(L,["tbody"]),delete Se.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!="function")throw ke('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw ke('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');b=e.TRUSTED_TYPES_POLICY,$=b.createHTML("")}else b===void 0&&(b=ro(_,i)),b!==null&&typeof $=="string"&&($=b.createHTML(""));P&&P(e),Te=e},Ut=p({},[...lt,...ct,...Yn]),Pt=p({},[...pt,...Xn]),On=function(e){let o=q(e);(!o||!o.tagName)&&(o={namespaceURI:ge,tagName:"template"});let a=De(e.tagName),h=De(o.tagName);return Je[e.namespaceURI]?e.namespaceURI===Ue?o.namespaceURI===Y?a==="svg":o.namespaceURI===ve?a==="svg"&&(h==="annotation-xml"||et[h]):!!Ut[a]:e.namespaceURI===ve?o.namespaceURI===Y?a==="math":o.namespaceURI===Ue?a==="math"&&tt[h]:!!Pt[a]:e.namespaceURI===Y?o.namespaceURI===Ue&&!tt[h]||o.namespaceURI===ve&&!et[h]?!1:!Pt[a]&&(Rn[a]||!Ut[a]):!!(Oe==="application/xhtml+xml"&&Je[e.namespaceURI]):!1},B=function(e){_e(t.removed,{element:e});try{q(e).removeChild(e)}catch{K(e)}},ae=function(e,o){try{_e(t.removed,{attribute:o.getAttributeNode(e),from:o})}catch{_e(t.removed,{attribute:null,from:o})}if(o.removeAttribute(e),e==="is")if(de||Ce)try{B(o)}catch{}else try{o.setAttribute(e,"")}catch{}},kt=function(e){let o=null,a=null;if(qe)e="<remove></remove>"+e;else{let w=qt(e,/^[\r\n\t ]+/);a=w&&w[0]}Oe==="application/xhtml+xml"&&ge===Y&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");let h=b?b.createHTML(e):e;if(ge===Y)try{o=new Z().parseFromString(h,Oe)}catch{}if(!o||!o.documentElement){o=H.createDocument(ge,"template",null);try{o.documentElement.innerHTML=Qe?$:h}catch{}}let D=o.body||o.documentElement;return e&&a&&D.insertBefore(r.createTextNode(a),D.childNodes[0]||null),ge===Y?ue.call(o,ie?"html":"body")[0]:ie?o.documentElement:D},Ft=function(e){return ne.call(e.ownerDocument||e,e,E.SHOW_ELEMENT|E.SHOW_COMMENT|E.SHOW_TEXT|E.SHOW_PROCESSING_INSTRUCTION|E.SHOW_CDATA_SECTION,null)},ot=function(e){return e instanceof te&&(typeof e.nodeName!="string"||typeof e.textContent!="string"||typeof e.removeChild!="function"||!(e.attributes instanceof v)||typeof e.removeAttribute!="function"||typeof e.setAttribute!="function"||typeof e.namespaceURI!="string"||typeof e.insertBefore!="function"||typeof e.hasChildNodes!="function")},rt=function(e){return typeof m=="function"&&e instanceof m};function V(c,e,o){Ee(c,a=>{a.call(t,e,o,Te)})}let zt=function(e){let o=null;if(V(T.beforeSanitizeElements,e,null),ot(e))return B(e),!0;let a=O(e.nodeName);if(V(T.uponSanitizeElement,e,{tagName:a,allowedTags:L}),we&&e.hasChildNodes()&&!rt(e.firstElementChild)&&C(/<[/\w!]/g,e.innerHTML)&&C(/<[/\w!]/g,e.textContent)||we&&e.namespaceURI===Y&&a==="style"&&rt(e.firstElementChild)||e.nodeType===ye.progressingInstruction||we&&e.nodeType===ye.comment&&C(/<[/\w]/g,e.data))return B(e),!0;if(Se[a]||!(J.tagCheck instanceof Function&&J.tagCheck(a))&&!L[a]){if(!Se[a]&&$t(a)&&(R.tagNameCheck instanceof RegExp&&C(R.tagNameCheck,a)||R.tagNameCheck instanceof Function&&R.tagNameCheck(a)))return!1;if(Ve&&!W[a]){let h=q(e)||e.parentNode,D=fe(e)||e.childNodes;if(D&&h){let w=D.length;for(let k=w-1;k>=0;--k){let z=A(D[k],!0);h.insertBefore(z,pe(e))}}}return B(e),!0}return e instanceof u&&!On(e)||(a==="noscript"||a==="noembed"||a==="noframes")&&C(/<\/no(script|embed|frames)/i,e.innerHTML)?(B(e),!0):(se&&e.nodeType===ye.text&&(o=e.textContent,Ee([oe,Q,re],h=>{o=Ae(o,h," ")}),e.textContent!==o&&(_e(t.removed,{element:e.cloneNode()}),e.textContent=o)),V(T.afterSanitizeElements,e,null),!1)},Gt=function(e,o,a){if(Ne[o]||Lt&&(o==="id"||o==="name")&&(a in r||a in xn))return!1;let h=N[o]||J.attributeCheck instanceof Function&&J.attributeCheck(o,e);if(!(Ye&&!Ne[o]&&C(At,o))){if(!(wt&&C(We,o))){if(!h||Ne[o]){if(!($t(e)&&(R.tagNameCheck instanceof RegExp&&C(R.tagNameCheck,e)||R.tagNameCheck instanceof Function&&R.tagNameCheck(e))&&(R.attributeNameCheck instanceof RegExp&&C(R.attributeNameCheck,o)||R.attributeNameCheck instanceof Function&&R.attributeNameCheck(o,e))||o==="is"&&R.allowCustomizedBuiltInElements&&(R.tagNameCheck instanceof RegExp&&C(R.tagNameCheck,a)||R.tagNameCheck instanceof Function&&R.tagNameCheck(a))))return!1}else if(!Ke[o]){if(!C(bt,Ae(a,yt,""))){if(!((o==="src"||o==="xlink:href"||o==="href")&&e!=="script"&&Vt(a,"data:")===0&&Nt[e])){if(!(xt&&!C(An,Ae(a,yt,"")))){if(a)return!1}}}}}}return!0},Ln=p({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),$t=function(e){return!Ln[De(e)]&&C(yn,e)},Ht=function(e){V(T.beforeSanitizeAttributes,e,null);let o=e.attributes;if(!o||ot(e))return;let a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:N,forceKeepAttr:void 0},h=o.length;for(;h--;){let D=o[h],w=D.name,k=D.namespaceURI,z=D.value,j=O(w),it=z,I=w==="value"?it:zn(it);if(a.attrName=j,a.attrValue=I,a.keepAttr=!0,a.forceKeepAttr=void 0,V(T.uponSanitizeAttribute,e,a),I=a.attrValue,Dt&&(j==="id"||j==="name")&&Vt(I,It)!==0&&(ae(w,e),I=It+I),we&&C(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,I)){ae(w,e);continue}if(j==="attributename"&&qt(I,"href")){ae(w,e);continue}if(a.forceKeepAttr)continue;if(!a.keepAttr){ae(w,e);continue}if(!Ot&&C(/\/>/i,I)){ae(w,e);continue}se&&Ee([oe,Q,re],jt=>{I=Ae(I,jt," ")});let Bt=O(e.nodeName);if(!Gt(Bt,j,I)){ae(w,e);continue}if(b&&typeof _=="object"&&typeof _.getAttributeType=="function"&&!k)switch(_.getAttributeType(Bt,j)){case"TrustedHTML":{I=b.createHTML(I);break}case"TrustedScriptURL":{I=b.createScriptURL(I);break}}if(I!==it)try{k?e.setAttributeNS(k,w,I):e.setAttribute(w,I),ot(e)?B(e):Xt(t.removed)}catch{ae(w,e)}}V(T.afterSanitizeAttributes,e,null)},st=function(e){let o=null,a=Ft(e);for(V(T.beforeSanitizeShadowDOM,e,null);o=a.nextNode();)V(T.uponSanitizeShadowNode,o,null),zt(o),Ht(o),o.content instanceof l&&st(o.content);V(T.afterSanitizeShadowDOM,e,null)},Pe=function(e){if(e.nodeType===ye.element&&e.shadowRoot instanceof l){let h=e.shadowRoot;Pe(h),st(h)}let o=e.childNodes;if(!o)return;let a=[];Ee(o,h=>{_e(a,h)});for(let h of a)Pe(h)};return t.sanitize=function(c){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=null,a=null,h=null,D=null;if(Qe=!c,Qe&&(c="<!-->"),typeof c!="string"&&!rt(c)&&(c=jn(c),typeof c!="string"))throw ke("dirty is not a string, aborting");if(!t.isSupported)return c;if(Xe||nt(e),t.removed=[],typeof c=="string"&&(xe=!1),xe){let z=c.nodeName;if(typeof z=="string"){let j=O(z);if(!L[j]||Se[j])throw ke("root node is forbidden and cannot be sanitized in-place")}Pe(c)}else if(c instanceof m)o=kt("<!---->"),a=o.ownerDocument.importNode(c,!0),a.nodeType===ye.element&&a.nodeName==="BODY"||a.nodeName==="HTML"?o=a:o.appendChild(a),Pe(a);else{if(!de&&!se&&!ie&&c.indexOf("<")===-1)return b&&Me?b.createHTML(c):c;if(o=kt(c),!o)return de?null:Me?$:""}o&&qe&&B(o.firstChild);let w=Ft(xe?c:o);for(;h=w.nextNode();)zt(h),Ht(h),h.content instanceof l&&st(h.content);if(xe)return c;if(de){if(se){o.normalize();let z=o.innerHTML;Ee([oe,Q,re],j=>{z=Ae(z,j," ")}),o.innerHTML=z}if(Ce)for(D=me.call(o.ownerDocument);o.firstChild;)D.appendChild(o.firstChild);else D=o;return(N.shadowroot||N.shadowrootmode)&&(D=Ie.call(s,D,!0)),D}let k=ie?o.outerHTML:o.innerHTML;return ie&&L["!doctype"]&&o.ownerDocument&&o.ownerDocument.doctype&&o.ownerDocument.doctype.name&&C(to,o.ownerDocument.doctype.name)&&(k="<!DOCTYPE "+o.ownerDocument.doctype.name+`>
3
- `+k),se&&Ee([oe,Q,re],z=>{k=Ae(k,z," ")}),b&&Me?b.createHTML(k):k},t.setConfig=function(){let c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};nt(c),Xe=!0},t.clearConfig=function(){Te=null,Xe=!1},t.isValidAttribute=function(c,e,o){Te||nt({});let a=O(c),h=O(e);return Gt(a,h,o)},t.addHook=function(c,e){typeof e=="function"&&_e(T[c],e)},t.removeHook=function(c,e){if(e!==void 0){let o=kn(T[c],e);return o===-1?void 0:Fn(T[c],o,1)[0]}return Xt(T[c])},t.removeHooks=function(c){T[c]=[]},t.removeAllHooks=function(){T=on()},t}var dt=an();var ln=/^[\w+/=-]+$/;var ze=/data:[\w#&+./;=-]*,/,ht=/data:[\w#&+./;=^]*base64,[\w+/=-]+/i,cn=/data:[\w#&+./;=-]*,[^\x22]+/g,pn=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi,fn=/^(?:application\/(?:[\w#&.;-]+\+)?x|image\/svg\+x|text\/(?:ht|x))ml;?/;var mn=/^[a-z][\da-z+.-]*$/,un=/^(?:ext|web)\+[a-z]+$/,gt=/(?:java|vb)script/,Ge=/(?:java|vb)script|blob/,Tt=/%(?:22|27|3C|3E)|[\x22\x27<>]/,dn=/^%[\dA-F]{2}$/i;var X=n=>Object.prototype.toString.call(n).slice(8,-1),M=n=>typeof n=="string"||n instanceof String;var{FileReader:hn}=globalThis;var $e=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var He=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","agtp","aim","amss","android","appdata","apt","ar","ari","ark","at","attachment","aw","barion","beshare","bitcoin","bitcoincash","bl","blob","bluetooth","bolo","brid","browserext","cabal","caip","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cttps","cvs","dab","dat","data","dav","dhttp","diaspora","dict","did","dilithium3","dis","dlna-playcontainer","dlna-playsingle","dnp","dns","dntp","doi","donau","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","esim","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","hs20","http","https","hxxp","hxxps","hydrazone","hyper","i0","iax","ibi","ibi-","icap","icon","ilstring","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lid","linkid","lorawan","lpa","lvlt","machineProvisioningProgressReporter","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","mqtt","mqtts","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-launchremotedesktop","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-personacard","ms-powerpoint","ms-project","ms-publisher","ms-recall","ms-remotedesktop","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-uup","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-widgetboard","ms-widgets","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mtrust","mumble","mupdate","mvn","mvrp","mvrps","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openid","openpgp4fpr","otpauth","palm","paparazzi","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","shelter","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spacify","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","teapot","teapots","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","upn","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wasm","wasm-js","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcompute","xcon","xcon-userid","xfire","xftp","xmlrpc.beep","xmlrpc.beeps","xmpp","xrcp","xri","ymsgr","z39.50r","z39.50s","ztdnaid"];var gn=n=>{if(!M(n))throw new TypeError(`Expected String but got ${X(n)}.`);let t=[];for(let r of n)t.push(`%${r.charCodeAt(0).toString(16).toUpperCase()}`);return t.join("")},Tn=n=>{M(n)&&dn.test(n)&&(n=n.toUpperCase());let[t,r,s,i,l,f]=["&","#","<",">",'"',"'"].map(gn),m;return n===t?m=`${t}amp;`:n===s?m=`${t}lt;`:n===i?m=`${t}gt;`:n===l?m=`${t}quot;`:n===f?m=`${t}${r}39;`:m=n,m},En=n=>{if(M(n)){if(!ln.test(n))throw new Error(`Invalid base64 data: ${n}`)}else throw new TypeError(`Expected String but got ${X(n)}.`);let t=atob(n),r=Uint8Array.from([...t].map(l=>l.charCodeAt(0))),s=new Set($e),i;return r.every(l=>s.has(l))?i=t.replace(/\s/g,gn):i=n,i},Et=(n,t=0)=>{if(!M(n))throw new TypeError(`Expected String but got ${X(n)}.`);if(Number.isInteger(t)){if(t>16)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${X(t)}.`);let r=decodeURIComponent(n);if(/&#/.test(r)){let s=new Set($e),i=[...r.matchAll(pn)].reverse();for(let l of i){let[f,m]=l,u;if(/^x[\dA-F]+/i.test(m)?u=parseInt(`0${m}`,16):/^\d+/.test(m)&&(u=parseInt(m)),Number.isInteger(u)){let{index:E}=l,[g,v]=[r.substring(0,E),r.substring(E+f.length)];s.has(u)?(r=`${g}${String.fromCharCode(u)}${v}`,(/#x?$/.test(g)||/^#(?:x(?:00)?[2-7]|\d)/.test(v))&&(r=Et(r,++t))):u<256&&(r=`${g}${v}`)}}}return r},_n=(n,t=33554432)=>new Promise((r,s)=>{if(Number.isInteger(n?.size)){if(Number.isInteger(t)&&n.size>t)return s(new DOMException(`Blob size (${n.size} bytes) exceeds the maximum allowed size of ${t} bytes.`,"NotReadableError"))}else return r(null);let i=new hn;i.addEventListener("error",()=>s(i.error)),i.addEventListener("abort",()=>r(i.result)),i.addEventListener("load",()=>r(i.result)),i.readAsDataURL(n)}),Be=class{#e;constructor(){this.#e=new Set(He)}get(){return[...this.#e]}has(t){return this.#e.has(t)}add(t){if(M(t)){if(gt.test(t)||!mn.test(t))throw new Error(`Invalid scheme: ${t}`)}else throw new TypeError(`Expected String but got ${X(t)}.`);return this.#e.add(t),[...this.#e]}remove(t){return this.#e.delete(t)}verify(t){let r;if(M(t))try{let{protocol:s}=new URL(t),i=s.replace(/:$/,""),l=i.split("+");r=!gt.test(i)&&un.test(i)||l.every(f=>this.#e.has(f))}catch{r=!1}return!!r}reset(){this.#e.clear();for(let t of He)this.#e.add(t)}};var ce=(n,t,r)=>{n&&console.warn(`[URLSanitizer Debug] ${t}`,r?r.message:"")},_t=class extends Be{#e;#t=new Set;constructor(){super(),this.#e=0}replace(t){if(!M(t))throw new TypeError(`Expected String but got ${X(t)}.`);let r=t;if(ze.test(r)){let i=[...r.matchAll(cn)].reverse();for(let l of i){let[f]=l;ht.test(f)&&([f]=ht.exec(f)),this.#e++,this.#t.add(f);let m;try{m=this.sanitize(f,{allow:["data"]})}finally{this.#e--,this.#t.delete(f)}let{index:u}=l,[E,g]=[r.substring(0,u),r.substring(u+f.length)];m?r=`${E}${m}${g}`:r=`${E}${g}`}}return r}purify(t){if(!M(t))throw new TypeError(`Expected String but got ${X(t)}.`);let r=t;try{r=decodeURIComponent(t)}catch{}let s=dt.sanitize(r);s&&ze.test(s)&&(s=this.replace(s)),s=s.replace(/(?:#|%23)$/,"").replace(/(?<!(?:#|%23).*)(?:\?|%3F)$/,"");try{return encodeURI(s)}catch{return s}}sanitize(t,r){if(this.#e>16)throw new Error("Data URLs nested too deeply.");let{allow:s,deny:i,only:l,allowRelative:f=!1,debug:m=!1}=r??{},u=new Map([["blob",!1],["data",!1],["file",!1],["javascript",!1],["vbscript",!1]]),E=new Set,g=!1;if(Array.isArray(l)&&l.length){let _=super.get();for(let A of _)u.set(A,!1);let d=Object.values(l);for(let A of d)if(M(A)&&(A=A.trim(),!Ge.test(A))){if(super.has(A))u.set(A,!0);else{try{super.add(A)}catch(K){let pe=`Failed to add scheme '${A}' in 'only' list.`;ce(m,pe,K)}super.has(A)&&(u.set(A,!0),E.add(A))}!g&&u.has(A)&&(g=u.get(A))}}else{if(Array.isArray(s)&&s.length){let _=Object.values(s);for(let d of _)if(M(d)&&(d=d.trim(),!Ge.test(d)))if(super.has(d))u.set(d,!0);else{try{super.add(d)}catch(A){let K=`Failed to add scheme '${d}' in 'allow' list.`;ce(m,K,A)}super.has(d)&&(u.set(d,!0),E.add(d))}}if(Array.isArray(i)&&i.length){let _=Object.values(i);for(let d of _)M(d)&&(d=d.trim(),d&&u.set(d,!1))}}let v,te=super.verify(t),Z=!1;if(!te&&f)try{let{hostname:_,protocol:d}=new URL(t,"http://dummy.local");d==="http:"&&_==="dummy.local"&&(te=!0,Z=!0)}catch(_){ce(m,"Failed to parse relative URL.",_)}if(te){let _,d,A,K,pe,fe="",q=[],b=!1;if(Z)b=!0;else if({hash:_,href:d,pathname:A,protocol:K,search:pe}=new URL(t),fe=K.replace(/:$/,""),q=fe.split("+"),g)b=q.every(S=>u.get(S));else for(let[S,H]of u.entries())if(b=H||fe!==S&&q.every(ne=>ne!==S),!b)break;if(b){let $=Z?!1:q.includes("data"),S=Z?t:d;if($){let[H,...ne]=A.split(","),me=`${ne.join(",")}${pe}${_}`,ue=H.split(";"),Ie=ue[ue.length-1]==="base64",T=me;Ie&&(T=En(me));try{let Q=Et(T).trim(),{protocol:re}=new URL(Q);re.replace(/:$/,"").split("+").some(We=>Ge.test(We))&&(S="")}catch(Q){ce(m,"Failed to parse inner data URL protocol.",Q)}let oe=ze.test(T);(T!==me||oe)&&oe&&(T=this.replace(T)),(!H||fn.test(H))&&(T=this.purify(T)),S&&T?(Ie&&T!==me&&ue.pop(),S=`${fe}:${ue.join(";")},${T}`):S=""}if(!$&&Tt.test(S)){let H=Tt.exec(S),{index:ne}=H;S=S.substring(0,ne).replace(/[?&]$/,"")}S&&(v=S.replace(/%26/g,Tn))}E.size&&E.forEach($=>{super.remove($)})}return v||null}parse(t,r){if(!M(t))throw new TypeError(`Expected String but got ${X(t)}.`);let s=new Map([["input",t]]),i;if(this.verify(t)){let{protocol:l}=new URL(t);l==="blob:"?i=t:i=this.sanitize(t,r??{allow:["data","file"]})}if(i){let l=new URL(i),{pathname:f,protocol:m}=l,E=m.replace(/:$/,"").split("+").includes("data");if(s.set("valid",!0),E){let g=new Map,[v,...te]=f.split(","),Z=`${te.join(",")}`,_=v.split(";"),d=_[_.length-1]==="base64";d&&_.pop(),g.set("mime",_.join(";")),g.set("base64",d),g.set("data",Z),s.set("data",Object.fromEntries(g))}else s.set("data",null);for(let g in l){let v=l[g];M(v)&&s.set(g,v)}}else s.set("valid",!1);return Object.fromEntries(s)}reset(){super.reset(),this.#e=0,this.#t.clear()}};var ee=new _t,co=async(n,t={allow:[],deny:[],only:[],allowRelative:!1,debug:!1,maxBlobSize:33554432})=>{let r=!!t?.debug,s=Number.isInteger(t?.maxBlobSize)&&t.maxBlobSize>0?t.maxBlobSize:33554432,i;if(n&&M(n)){let l;try{let{protocol:f}=new URL(n);l=f.replace(/:$/,"")}catch(f){ce(r,`Invalid URL input format: ${n}`,f)}if(l==="blob"){let{allow:f,deny:m,only:u}=t;if(Array.isArray(f)&&f.includes("blob")&&!(Array.isArray(m)&&m.includes("blob"))||Array.isArray(u)&&u.includes("blob")){let E;try{E=await fetch(n).then(g=>g.blob()).then(g=>_n(g,s))}catch(g){let v=`Failed to fetch and convert blob URL: ${n}`;ce(r,v,g)}if(E){if(Array.isArray(u))u.includes("data")||u.push("data");else if(Array.isArray(f)&&(f.includes("data")||f.push("data"),Array.isArray(m)&&m.includes("data"))){let g=m.indexOf("data");m.splice(g,1)}i=ee.sanitize(E,t)}}URL.revokeObjectURL(n)}else(l||t.allowRelative)&&(i=ee.sanitize(n,t))}return i||null},po=(n,t)=>{let r;if(n&&M(n)){let s;try{let{protocol:i}=new URL(n);s=i.replace(/:$/,"")}catch(i){let l=`Failed to parse URL: ${n}`;ce(t?.debug,l,i)}s==="blob"?URL.revokeObjectURL(n):(s||t?.allowRelative)&&(r=ee.sanitize(n,t))}return r||null},fo=async n=>ee.parse(n),mo=n=>ee.parse(n),uo=async n=>ee.verify(n),ho=n=>ee.verify(n),go=ee;export{go as default,uo as isURI,ho as isURISync,fo as parseURL,mo as parseURLSync,co as sanitizeURL,po as sanitizeURLSync};
1
+ function Vt(n,t){(t==null||t>n.length)&&(t=n.length);for(var r=0,s=Array(t);r<t;r++)s[r]=n[r];return s}function Pn(n){if(Array.isArray(n))return n}function kn(n,t){var r=n==null?null:typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(r!=null){var s,i,l,p,y=[],g=!0,v=!1;try{if(l=(r=r.call(n)).next,t!==0)for(;!(g=(s=l.call(r)).done)&&(y.push(s.value),y.length!==t);g=!0);}catch(h){v=!0,i=h}finally{try{if(!g&&r.return!=null&&(p=r.return(),Object(p)!==p))return}finally{if(v)throw i}}return y}}function Fn(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function zn(n,t){return Pn(n)||kn(n,t)||Hn(n,t)||Fn()}function Hn(n,t){if(n){if(typeof n=="string")return Vt(n,t);var r={}.toString.call(n).slice(8,-1);return r==="Object"&&n.constructor&&(r=n.constructor.name),r==="Map"||r==="Set"?Array.from(n):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Vt(n,t):void 0}}var ln=Object.entries,qt=Object.setPrototypeOf,Gn=Object.isFrozen,$n=Object.getPrototypeOf,Bn=Object.getOwnPropertyDescriptor,P=Object.freeze,z=Object.seal,Ae=Object.create,cn=typeof Reflect<"u"&&Reflect,Tt=cn.apply,Et=cn.construct;P||(P=function(t){return t});z||(z=function(t){return t});Tt||(Tt=function(t,r){for(var s=arguments.length,i=new Array(s>2?s-2:0),l=2;l<s;l++)i[l-2]=arguments[l];return t.apply(r,i)});Et||(Et=function(t){for(var r=arguments.length,s=new Array(r>1?r-1:0),i=1;i<r;i++)s[i-1]=arguments[i];return new t(...s)});var Ee=O(Array.prototype.forEach),jn=O(Array.prototype.lastIndexOf),Zt=O(Array.prototype.pop),ye=O(Array.prototype.push),Wn=O(Array.prototype.splice),U=Array.isArray,Me=O(String.prototype.toLowerCase),mt=O(String.prototype.toString),Kt=O(String.prototype.match),_e=O(String.prototype.replace),Qt=O(String.prototype.indexOf),Yn=O(String.prototype.trim),Xn=O(Number.prototype.toString),Vn=O(Boolean.prototype.toString),Jt=typeof BigInt>"u"?null:O(BigInt.prototype.toString),en=typeof Symbol>"u"?null:O(Symbol.prototype.toString),_=O(Object.prototype.hasOwnProperty),De=O(Object.prototype.toString),I=O(RegExp.prototype.test),Ce=qn(TypeError);function O(n){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var r=arguments.length,s=new Array(r>1?r-1:0),i=1;i<r;i++)s[i-1]=arguments[i];return Tt(n,t,s)}}function qn(n){return function(){for(var t=arguments.length,r=new Array(t),s=0;s<t;s++)r[s]=arguments[s];return Et(n,r)}}function f(n,t){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Me;if(qt&&qt(n,null),!U(t))return n;let s=t.length;for(;s--;){let i=t[s];if(typeof i=="string"){let l=r(i);l!==i&&(Gn(t)||(t[s]=l),i=l)}n[i]=!0}return n}function Zn(n){for(let t=0;t<n.length;t++)_(n,t)||(n[t]=null);return n}function C(n){let t=Ae(null);for(let s of ln(n)){var r=zn(s,2);let i=r[0],l=r[1];_(n,i)&&(U(l)?t[i]=Zn(l):l&&typeof l=="object"&&l.constructor===Object?t[i]=C(l):t[i]=l)}return t}function Kn(n){switch(typeof n){case"string":return n;case"number":return Xn(n);case"boolean":return Vn(n);case"bigint":return Jt?Jt(n):"0";case"symbol":return en?en(n):"Symbol()";case"undefined":return De(n);case"function":case"object":{if(n===null)return De(n);let t=n,r=q(t,"toString");if(typeof r=="function"){let s=r(t);return typeof s=="string"?s:De(s)}return De(n)}default:return De(n)}}function q(n,t){for(;n!==null;){let s=Bn(n,t);if(s){if(s.get)return O(s.get);if(typeof s.value=="function")return O(s.value)}n=$n(n)}function r(){return null}return r}function Qn(n){try{return I(n,""),!0}catch{return!1}}var tn=P(["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","search","section","select","shadow","slot","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"]),ut=P(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),dt=P(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Jn=P(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),ht=P(["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"]),er=P(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),nn=P(["#text"]),rn=P(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","command","commandfor","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","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","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns"]),gt=P(["accent-height","accumulate","additive","alignment-baseline","amplitude","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","exponent","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","intercept","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","mask-type","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","slope","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","tablevalues","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"]),on=P(["accent","accentunder","align","bevelled","close","columnalign","columnlines","columnspacing","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lquote","lspace","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"]),We=P(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),tr=z(/{{[\w\W]*|^[\w\W]*}}/g),nr=z(/<%[\w\W]*|^[\w\W]*%>/g),rr=z(/\${[\w\W]*/g),or=z(/^data-[\-\w.\u00B7-\uFFFF]+$/),sr=z(/^aria-[\-\w]+$/),sn=z(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ir=z(/^(?:\w+script|data):/i),ar=z(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),lr=z(/^html$/i),cr=z(/^[a-z][.\w]*(-[.\w]+)+$/i),V={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},pr=function(){return typeof window>"u"?null:window},fr=function(t,r){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(s=r.getAttribute(i));let l="dompurify"+(s?"#"+s:"");try{return t.createPolicy(l,{createHTML(p){return p},createScriptURL(p){return p}})}catch{return console.warn("TrustedTypes policy "+l+" could not be created."),null}},an=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function pn(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:pr(),t=c=>pn(c);if(t.version="3.4.7",t.removed=[],!n||!n.document||n.document.nodeType!==V.document||!n.Element)return t.isSupported=!1,t;let r=n.document,s=r,i=s.currentScript;n.DocumentFragment;let l=n.HTMLTemplateElement,p=n.Node,y=n.Element,g=n.NodeFilter,v=n.NamedNodeMap;v===void 0&&(n.NamedNodeMap||n.MozNamedAttrMap),n.HTMLFormElement;let h=n.DOMParser,N=n.trustedTypes,k=y.prototype,J=q(k,"cloneNode"),Z=q(k,"remove"),d=q(k,"nextSibling"),ee=q(k,"childNodes"),ie=q(k,"parentNode"),ae=q(k,"shadowRoot"),Ue=q(k,"attributes"),D=p&&p.prototype?q(p.prototype,"nodeType"):null,H=p&&p.prototype?q(p.prototype,"nodeName"):null;if(typeof l=="function"){let c=r.createElement("template");c.content&&c.content.ownerDocument&&(r=c.content.ownerDocument)}let A,K="",b=r,G=b.implementation,te=b.createNodeIterator,Se=b.createDocumentFragment,me=b.getElementsByTagName,Pe=s.importNode,T=an();t.isSupported=typeof ln=="function"&&typeof ie=="function"&&G&&G.createHTMLDocument!==void 0;let j=tr,le=nr,we=rr,Ke=or,xn=sr,On=ir,wt=ar,Ln=cr,xt=sn,R=null,Qe=f({},[...tn,...ut,...dt,...ht,...nn]),x=null,Je=f({},[...rn,...gt,...on,...We]),S=Object.seal(Ae(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}})),xe=null,ke=null,ne=Object.seal(Ae(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),Ot=!0,et=!0,Lt=!1,It=!0,re=!1,Oe=!0,ce=!1,tt=!1,nt=!1,ue=!1,Fe=!1,ze=!1,Nt=!0,Dt=!1,Ct="user-content-",rt=!0,Le=!1,de={},W=null,ot=f({},["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"]),Mt=null,vt=f({},["audio","video","img","source","image","track"]),st=null,Ut=f({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),He="http://www.w3.org/1998/Math/MathML",Ge="http://www.w3.org/2000/svg",Y="http://www.w3.org/1999/xhtml",he=Y,it=!1,at=null,In=f({},[He,Ge,Y],mt),lt=f({},["mi","mo","mn","ms","mtext"]),ct=f({},["annotation-xml"]),Nn=f({},["title","style","font","a","script"]),Ie=null,Dn=["application/xhtml+xml","text/html"],Cn="text/html",w=null,ge=null,Mn=r.createElement("form"),Pt=function(e){return e instanceof RegExp||e instanceof Function},pt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(ge&&ge===e)return;(!e||typeof e!="object")&&(e={}),e=C(e),Ie=Dn.indexOf(e.PARSER_MEDIA_TYPE)===-1?Cn:e.PARSER_MEDIA_TYPE,w=Ie==="application/xhtml+xml"?mt:Me,R=_(e,"ALLOWED_TAGS")&&U(e.ALLOWED_TAGS)?f({},e.ALLOWED_TAGS,w):Qe,x=_(e,"ALLOWED_ATTR")&&U(e.ALLOWED_ATTR)?f({},e.ALLOWED_ATTR,w):Je,at=_(e,"ALLOWED_NAMESPACES")&&U(e.ALLOWED_NAMESPACES)?f({},e.ALLOWED_NAMESPACES,mt):In,st=_(e,"ADD_URI_SAFE_ATTR")&&U(e.ADD_URI_SAFE_ATTR)?f(C(Ut),e.ADD_URI_SAFE_ATTR,w):Ut,Mt=_(e,"ADD_DATA_URI_TAGS")&&U(e.ADD_DATA_URI_TAGS)?f(C(vt),e.ADD_DATA_URI_TAGS,w):vt,W=_(e,"FORBID_CONTENTS")&&U(e.FORBID_CONTENTS)?f({},e.FORBID_CONTENTS,w):ot,xe=_(e,"FORBID_TAGS")&&U(e.FORBID_TAGS)?f({},e.FORBID_TAGS,w):C({}),ke=_(e,"FORBID_ATTR")&&U(e.FORBID_ATTR)?f({},e.FORBID_ATTR,w):C({}),de=_(e,"USE_PROFILES")?e.USE_PROFILES&&typeof e.USE_PROFILES=="object"?C(e.USE_PROFILES):e.USE_PROFILES:!1,Ot=e.ALLOW_ARIA_ATTR!==!1,et=e.ALLOW_DATA_ATTR!==!1,Lt=e.ALLOW_UNKNOWN_PROTOCOLS||!1,It=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,re=e.SAFE_FOR_TEMPLATES||!1,Oe=e.SAFE_FOR_XML!==!1,ce=e.WHOLE_DOCUMENT||!1,ue=e.RETURN_DOM||!1,Fe=e.RETURN_DOM_FRAGMENT||!1,ze=e.RETURN_TRUSTED_TYPE||!1,nt=e.FORCE_BODY||!1,Nt=e.SANITIZE_DOM!==!1,Dt=e.SANITIZE_NAMED_PROPS||!1,rt=e.KEEP_CONTENT!==!1,Le=e.IN_PLACE||!1,xt=Qn(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:sn,he=typeof e.NAMESPACE=="string"?e.NAMESPACE:Y,lt=_(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&typeof e.MATHML_TEXT_INTEGRATION_POINTS=="object"?C(e.MATHML_TEXT_INTEGRATION_POINTS):f({},["mi","mo","mn","ms","mtext"]),ct=_(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&typeof e.HTML_INTEGRATION_POINTS=="object"?C(e.HTML_INTEGRATION_POINTS):f({},["annotation-xml"]);let o=_(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&typeof e.CUSTOM_ELEMENT_HANDLING=="object"?C(e.CUSTOM_ELEMENT_HANDLING):Ae(null);if(S=Ae(null),_(o,"tagNameCheck")&&Pt(o.tagNameCheck)&&(S.tagNameCheck=o.tagNameCheck),_(o,"attributeNameCheck")&&Pt(o.attributeNameCheck)&&(S.attributeNameCheck=o.attributeNameCheck),_(o,"allowCustomizedBuiltInElements")&&typeof o.allowCustomizedBuiltInElements=="boolean"&&(S.allowCustomizedBuiltInElements=o.allowCustomizedBuiltInElements),re&&(et=!1),Fe&&(ue=!0),de&&(R=f({},nn),x=Ae(null),de.html===!0&&(f(R,tn),f(x,rn)),de.svg===!0&&(f(R,ut),f(x,gt),f(x,We)),de.svgFilters===!0&&(f(R,dt),f(x,gt),f(x,We)),de.mathMl===!0&&(f(R,ht),f(x,on),f(x,We))),ne.tagCheck=null,ne.attributeCheck=null,_(e,"ADD_TAGS")&&(typeof e.ADD_TAGS=="function"?ne.tagCheck=e.ADD_TAGS:U(e.ADD_TAGS)&&(R===Qe&&(R=C(R)),f(R,e.ADD_TAGS,w))),_(e,"ADD_ATTR")&&(typeof e.ADD_ATTR=="function"?ne.attributeCheck=e.ADD_ATTR:U(e.ADD_ATTR)&&(x===Je&&(x=C(x)),f(x,e.ADD_ATTR,w))),_(e,"ADD_URI_SAFE_ATTR")&&U(e.ADD_URI_SAFE_ATTR)&&f(st,e.ADD_URI_SAFE_ATTR,w),_(e,"FORBID_CONTENTS")&&U(e.FORBID_CONTENTS)&&(W===ot&&(W=C(W)),f(W,e.FORBID_CONTENTS,w)),_(e,"ADD_FORBID_CONTENTS")&&U(e.ADD_FORBID_CONTENTS)&&(W===ot&&(W=C(W)),f(W,e.ADD_FORBID_CONTENTS,w)),rt&&(R["#text"]=!0),ce&&f(R,["html","head","body"]),R.table&&(f(R,["tbody"]),delete xe.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!="function")throw Ce('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Ce('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');A=e.TRUSTED_TYPES_POLICY,K=A.createHTML("")}else A===void 0&&(A=fr(N,i)),A!==null&&typeof K=="string"&&(K=A.createHTML(""));(T.uponSanitizeElement.length>0||T.uponSanitizeAttribute.length>0)&&R===Qe&&(R=C(R)),T.uponSanitizeAttribute.length>0&&x===Je&&(x=C(x)),P&&P(e),ge=e},kt=f({},[...ut,...dt,...Jn]),Ft=f({},[...ht,...er]),vn=function(e){let o=ie(e);(!o||!o.tagName)&&(o={namespaceURI:he,tagName:"template"});let a=Me(e.tagName),u=Me(o.tagName);return at[e.namespaceURI]?e.namespaceURI===Ge?o.namespaceURI===Y?a==="svg":o.namespaceURI===He?a==="svg"&&(u==="annotation-xml"||lt[u]):!!kt[a]:e.namespaceURI===He?o.namespaceURI===Y?a==="math":o.namespaceURI===Ge?a==="math"&&ct[u]:!!Ft[a]:e.namespaceURI===Y?o.namespaceURI===Ge&&!ct[u]||o.namespaceURI===He&&!lt[u]?!1:!Ft[a]&&(Nn[a]||!kt[a]):!!(Ie==="application/xhtml+xml"&&at[e.namespaceURI]):!1},$=function(e){ye(t.removed,{element:e});try{ie(e).removeChild(e)}catch{Z(e)}},pe=function(e,o){try{ye(t.removed,{attribute:o.getAttributeNode(e),from:o})}catch{ye(t.removed,{attribute:null,from:o})}if(o.removeAttribute(e),e==="is")if(ue||Fe)try{$(o)}catch{}else try{o.setAttribute(e,"")}catch{}},zt=function(e){let o=null,a=null;if(nt)e="<remove></remove>"+e;else{let E=Kt(e,/^[\r\n\t ]+/);a=E&&E[0]}Ie==="application/xhtml+xml"&&he===Y&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");let u=A?A.createHTML(e):e;if(he===Y)try{o=new h().parseFromString(u,Ie)}catch{}if(!o||!o.documentElement){o=G.createDocument(he,"template",null);try{o.documentElement.innerHTML=it?K:u}catch{}}let m=o.body||o.documentElement;return e&&a&&m.insertBefore(r.createTextNode(a),m.childNodes[0]||null),he===Y?me.call(o,ce?"html":"body")[0]:ce?o.documentElement:m},Ht=function(e){return te.call(e.ownerDocument||e,e,g.SHOW_ELEMENT|g.SHOW_COMMENT|g.SHOW_TEXT|g.SHOW_PROCESSING_INSTRUCTION|g.SHOW_CDATA_SECTION,null)},Gt=function(e){e.normalize();let o=te.call(e.ownerDocument||e,e,g.SHOW_TEXT|g.SHOW_COMMENT|g.SHOW_CDATA_SECTION|g.SHOW_PROCESSING_INSTRUCTION,null),a=o.nextNode();for(;a;){let u=a.data;Ee([j,le,we],m=>{u=_e(u,m," ")}),a.data=u,a=o.nextNode()}},$e=function(e){let o=H?H(e):null;return typeof o!="string"||w(o)!=="form"?!1:typeof e.nodeName!="string"||typeof e.textContent!="string"||typeof e.removeChild!="function"||e.attributes!==Ue(e)||typeof e.removeAttribute!="function"||typeof e.setAttribute!="function"||typeof e.namespaceURI!="string"||typeof e.insertBefore!="function"||typeof e.hasChildNodes!="function"||e.nodeType!==D(e)||e.childNodes!==ee(e)},Ne=function(e){if(!D||typeof e!="object"||e===null)return!1;try{return D(e)===V.documentFragment}catch{return!1}},Be=function(e){if(!D||typeof e!="object"||e===null)return!1;try{return typeof D(e)=="number"}catch{return!1}};function Q(c,e,o){Ee(c,a=>{a.call(t,e,o,ge)})}let $t=function(e){let o=null;if(Q(T.beforeSanitizeElements,e,null),$e(e))return $(e),!0;let a=w(e.nodeName);if(Q(T.uponSanitizeElement,e,{tagName:a,allowedTags:R}),Oe&&e.hasChildNodes()&&!Be(e.firstElementChild)&&I(/<[/\w!]/g,e.innerHTML)&&I(/<[/\w!]/g,e.textContent)||Oe&&e.namespaceURI===Y&&a==="style"&&Be(e.firstElementChild)||e.nodeType===V.progressingInstruction||Oe&&e.nodeType===V.comment&&I(/<[/\w]/g,e.data))return $(e),!0;if(xe[a]||!(ne.tagCheck instanceof Function&&ne.tagCheck(a))&&!R[a]){if(!xe[a]&&jt(a)&&(S.tagNameCheck instanceof RegExp&&I(S.tagNameCheck,a)||S.tagNameCheck instanceof Function&&S.tagNameCheck(a)))return!1;if(rt&&!W[a]){let m=ie(e),E=ee(e);if(E&&m){let F=E.length;for(let X=F-1;X>=0;--X){let B=J(E[X],!0);m.insertBefore(B,d(e))}}}return $(e),!0}return(D?D(e):e.nodeType)===V.element&&!vn(e)||(a==="noscript"||a==="noembed"||a==="noframes")&&I(/<\/no(script|embed|frames)/i,e.innerHTML)?($(e),!0):(re&&e.nodeType===V.text&&(o=e.textContent,Ee([j,le,we],m=>{o=_e(o,m," ")}),e.textContent!==o&&(ye(t.removed,{element:e.cloneNode()}),e.textContent=o)),Q(T.afterSanitizeElements,e,null),!1)},Bt=function(e,o,a){if(ke[o]||Nt&&(o==="id"||o==="name")&&(a in r||a in Mn))return!1;let u=x[o]||ne.attributeCheck instanceof Function&&ne.attributeCheck(o,e);if(!(et&&!ke[o]&&I(Ke,o))){if(!(Ot&&I(xn,o))){if(!u||ke[o]){if(!(jt(e)&&(S.tagNameCheck instanceof RegExp&&I(S.tagNameCheck,e)||S.tagNameCheck instanceof Function&&S.tagNameCheck(e))&&(S.attributeNameCheck instanceof RegExp&&I(S.attributeNameCheck,o)||S.attributeNameCheck instanceof Function&&S.attributeNameCheck(o,e))||o==="is"&&S.allowCustomizedBuiltInElements&&(S.tagNameCheck instanceof RegExp&&I(S.tagNameCheck,a)||S.tagNameCheck instanceof Function&&S.tagNameCheck(a))))return!1}else if(!st[o]){if(!I(xt,_e(a,wt,""))){if(!((o==="src"||o==="xlink:href"||o==="href")&&e!=="script"&&Qt(a,"data:")===0&&Mt[e])){if(!(Lt&&!I(On,_e(a,wt,"")))){if(a)return!1}}}}}}return!0},Un=f({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),jt=function(e){return!Un[Me(e)]&&I(Ln,e)},Wt=function(e){Q(T.beforeSanitizeAttributes,e,null);let o=e.attributes;if(!o||$e(e))return;let a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:x,forceKeepAttr:void 0},u=o.length;for(;u--;){let m=o[u],E=m.name,F=m.namespaceURI,X=m.value,B=w(E),ft=X,L=E==="value"?ft:Yn(ft);if(a.attrName=B,a.attrValue=L,a.keepAttr=!0,a.forceKeepAttr=void 0,Q(T.uponSanitizeAttribute,e,a),L=a.attrValue,Dt&&(B==="id"||B==="name")&&Qt(L,Ct)!==0&&(pe(E,e),L=Ct+L),Oe&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,L)){pe(E,e);continue}if(B==="attributename"&&Kt(L,"href")){pe(E,e);continue}if(a.forceKeepAttr)continue;if(!a.keepAttr){pe(E,e);continue}if(!It&&I(/\/>/i,L)){pe(E,e);continue}re&&Ee([j,le,we],Xt=>{L=_e(L,Xt," ")});let Yt=w(e.nodeName);if(!Bt(Yt,B,L)){pe(E,e);continue}if(A&&typeof N=="object"&&typeof N.getAttributeType=="function"&&!F)switch(N.getAttributeType(Yt,B)){case"TrustedHTML":{L=A.createHTML(L);break}case"TrustedScriptURL":{L=A.createScriptURL(L);break}}if(L!==ft)try{F?e.setAttributeNS(F,E,L):e.setAttribute(E,L),$e(e)?$(e):Zt(t.removed)}catch{pe(E,e)}}Q(T.afterSanitizeAttributes,e,null)},je=function(e){let o=null,a=Ht(e);for(Q(T.beforeSanitizeShadowDOM,e,null);o=a.nextNode();)if(Q(T.uponSanitizeShadowNode,o,null),$t(o),Wt(o),Ne(o.content)&&je(o.content),(D?D(o):o.nodeType)===V.element){let m=ae?ae(o):o.shadowRoot;Ne(m)&&(Te(m),je(m))}Q(T.afterSanitizeShadowDOM,e,null)},Te=function(e){let o=D?D(e):e.nodeType;if(o===V.element){let m=ae?ae(e):e.shadowRoot;Ne(m)&&(Te(m),je(m))}let a=ee?ee(e):e.childNodes;if(!a)return;let u=[];Ee(a,m=>{ye(u,m)});for(let m of u)Te(m);if(o===V.element){let m=H?H(e):null;if(typeof m=="string"&&w(m)==="template"){let E=e.content;Ne(E)&&Te(E)}}};return t.sanitize=function(c){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=null,a=null,u=null,m=null;if(it=!c,it&&(c="<!-->"),typeof c!="string"&&!Be(c)&&(c=Kn(c),typeof c!="string"))throw Ce("dirty is not a string, aborting");if(!t.isSupported)return c;if(tt||pt(e),t.removed=[],typeof c=="string"&&(Le=!1),Le){let X=H?H(c):c.nodeName;if(typeof X=="string"){let B=w(X);if(!R[B]||xe[B])throw Ce("root node is forbidden and cannot be sanitized in-place")}if($e(c))throw Ce("root node is clobbered and cannot be sanitized in-place");Te(c)}else if(Be(c))o=zt("<!---->"),a=o.ownerDocument.importNode(c,!0),a.nodeType===V.element&&a.nodeName==="BODY"||a.nodeName==="HTML"?o=a:o.appendChild(a),Te(a);else{if(!ue&&!re&&!ce&&c.indexOf("<")===-1)return A&&ze?A.createHTML(c):c;if(o=zt(c),!o)return ue?null:ze?K:""}o&&nt&&$(o.firstChild);let E=Ht(Le?c:o);for(;u=E.nextNode();)$t(u),Wt(u),Ne(u.content)&&je(u.content);if(Le)return re&&Gt(c),c;if(ue){if(re&&Gt(o),Fe)for(m=Se.call(o.ownerDocument);o.firstChild;)m.appendChild(o.firstChild);else m=o;return(x.shadowroot||x.shadowrootmode)&&(m=Pe.call(s,m,!0)),m}let F=ce?o.outerHTML:o.innerHTML;return ce&&R["!doctype"]&&o.ownerDocument&&o.ownerDocument.doctype&&o.ownerDocument.doctype.name&&I(lr,o.ownerDocument.doctype.name)&&(F="<!DOCTYPE "+o.ownerDocument.doctype.name+`>
3
+ `+F),re&&Ee([j,le,we],X=>{F=_e(F,X," ")}),A&&ze?A.createHTML(F):F},t.setConfig=function(){let c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};pt(c),tt=!0},t.clearConfig=function(){ge=null,tt=!1},t.isValidAttribute=function(c,e,o){ge||pt({});let a=w(c),u=w(e);return Bt(a,u,o)},t.addHook=function(c,e){typeof e=="function"&&ye(T[c],e)},t.removeHook=function(c,e){if(e!==void 0){let o=jn(T[c],e);return o===-1?void 0:Wn(T[c],o,1)[0]}return Zt(T[c])},t.removeHooks=function(c){T[c]=[]},t.removeAllHooks=function(){T=an()},t}var fn=pn();var Ye=fn(globalThis.window);var fe=n=>Object.prototype.toString.call(n).slice(8,-1),M=n=>typeof n=="string"||n instanceof String;var mn=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","agtp","aim","amss","android","appdata","apt","ar","ari","ark","at","attachment","aw","barion","beshare","bitcoin","bitcoincash","bl","blob","bluetooth","bolo","brid","browserext","cabal","caip","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cttps","cvs","dab","dat","data","dav","dhttp","diaspora","dict","did","dilithium3","dis","dlna-playcontainer","dlna-playsingle","dnp","dns","dntp","doi","donau","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","esim","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","hs20","http","https","hxxp","hxxps","hydrazone","hyper","i0","iax","ibi","ibi-","icap","icon","ilstring","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lid","linkid","lorawan","lpa","lvlt","machineProvisioningProgressReporter","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","mqtt","mqtts","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-launchremotedesktop","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-personacard","ms-powerpoint","ms-project","ms-publisher","ms-recall","ms-remotedesktop","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-uup","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-widgetboard","ms-widgets","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mtrust","mumble","mupdate","mvn","mvrp","mvrps","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openid","openpgp4fpr","otpauth","palm","paparazzi","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","shelter","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spacify","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","teapot","teapots","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","upn","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wasm","wasm-js","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcompute","xcon","xcon-userid","xfire","xftp","xmlrpc.beep","xmlrpc.beeps","xmpp","xrcp","xri","ymsgr","z39.50r","z39.50s","ztdnaid"];var{FileReader:un}=globalThis;var dn=/(?:#|%23)$/,hn=/^(?:application\/(?:[\w#&.;-]+\+)?x|image\/svg\+x|text\/(?:ht|x))ml;?/;var gn=/(?<!(?:#|%23).*)(?:\?|%3F)$/,yt=/^[a-z][\da-z+.-]*$/,Tn=/^(?:web\+[a-z]+|ext\+[a-z][\da-z.-]*)$/,ve=/^(?:java|vb)script$/i,_t=/^(?:(?:java|vb)script|blob)$/i,Xe=/["'<>]|%(?:22|27|3C|3E)|&(?:apos|lt|gt|quot|#0*(?:34|39|60|62)|#x0*(?:22|27|3C|3E));/i,En=/^%[\dA-F]{2}$/i,yn=/^(?:\/{2,}|\\|[a-z][a-z\d+\-.]*:[^/])/i;var _n=[7,8,9,10,11,12,13,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var At=new Set(_n),Ve=new Map([[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),gr=()=>{let n=new Map;for(let t=0;t<256;t++)!At.has(t)&&!Ve.has(t)&&n.set(t,`\\x${t.toString(16).padStart(2,"0").toUpperCase()}`);return n},bt=gr();var[Re,Er,yr,_r,Ar,br]=["&","#","<",">",'"',"'"].map(n=>`%${n.charCodeAt(0).toString(16).toUpperCase()}`),Rr=new RegExp(`[${[...bt.values()].join("")}]`),Sr=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi,qe=class{#e=new Set(mn);get(){return[...this.#e]}has(t){return this.#e.has(t)}verify(t,r=this.#e){if(!M(t))return!1;try{let{protocol:s}=new URL(t),i=s.replace(/:$/,""),l=i.split("+");return l.some(y=>ve.test(y))?!1:Tn.test(i)||l.every(y=>r.has(y))}catch{return!1}}};var An=n=>{let t=n;if(M(t))switch(En.test(t)&&(t=t.toUpperCase()),t){case Re:return`${Re}amp;`;case yr:return`${Re}lt;`;case _r:return`${Re}gt;`;case Ar:return`${Re}quot;`;case br:return`${Re}${Er}39;`;default:}return t},bn=n=>{if(!M(n))throw new TypeError(`Expected String but got ${fe(n)}.`);let t=n.replace(/\s/g,""),r;try{r=atob(t)}catch{throw new Error(`Invalid base64 data: ${n}`)}let s=Uint8Array.from(r,i=>i.charCodeAt(0));try{let l=new TextDecoder("utf-8",{fatal:!0}).decode(s);return Rr.test(l)?t:l}catch{return t}},wr=(n,t)=>{let r=/x/i.test(t[0])?parseInt(t.substring(1),16):parseInt(t,10);if(Number.isInteger(r)){if(At.has(r))return String.fromCharCode(r);if(Ve.has(r)){let s=Ve.get(r);return String.fromCodePoint(s)}else if(bt.has(r))return""}return n},Rn=(n,t=0)=>{if(!M(n))throw new TypeError(`Expected String but got ${fe(n)}.`);if(!Number.isInteger(t))throw new TypeError(`Expected Number but got ${fe(t)}.`);let r=decodeURIComponent(n);for(;/&#/.test(r);){if(t>16)throw new Error("Character references nested too deeply.");let s=r;if(r=r.replace(Sr,wr),r===s)break;t++}return r},Sn=(n,t=16777216)=>new Promise((r,s)=>{if(Number.isInteger(n?.size)){if(Number.isInteger(t)&&n.size>t){let l=`Blob size (${n.size} bytes) exceeds max (${t} bytes).`;return s(new DOMException(l,"NotReadableError"))}}else return r(null);let i=new un;i.addEventListener("error",()=>s(i.error)),i.addEventListener("abort",()=>r(i.result)),i.addEventListener("load",()=>r(i.result)),i.readAsDataURL(n)}),wn=n=>M(n)?n.replace(dn,"").replace(gn,""):n;var xr=Object.freeze(["href","origin","protocol","username","password","host","hostname","port","pathname","search","hash"]),Or=Object.freeze({RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,RETURN_TRUSTED_TYPE:!1}),oe=(n,t,r)=>{n&&console.warn(`[URLSanitizer Debug] ${t}`,r?r.message:"")},St=class n extends qe{#e;static#t=null;static#n=null;static#s(t,r){if(!r.attrValue||!/^\s*data:/i.test(r.attrValue))return;let s=n.#n,i=n.#t;if(!i||!s)return;let l;try{l=new URL(r.attrValue)}catch{return}if(l.protocol==="data:"){let p=r.attrValue;if(i.recurse||(i.recurse=new Set),i.recurse.has(p)){let y=`Circular Data URL detected and skipped: ${p}`;oe(i.debug,y),r.attrValue="";return}i.nest++,i.recurse.add(p);try{let y=s.#o(p,{allow:["data"],deny:[],only:[],allowRelative:!1},i);r.attrValue=y||""}finally{i.nest--,i.recurse.delete(p)}}}static{Ye.setConfig(Or),Ye.addHook("uponSanitizeAttribute",n.#s)}constructor(){super(),this.#e=new Set(super.get())}#r(t,r,s,i,l){if(_t.test(t))return!1;if(t.split("+").some(g=>ve.test(g))||!yt.test(t)){let g=`Failed to add scheme '${t}' in '${r}' list.`;return oe(l.debug,g),!1}return i.set(t,!0),s.add(t),!0}#i(t,r){let s=t;try{s=decodeURIComponent(t)}catch{}let i=n.#n,l=n.#t;n.#n=this,n.#t=r;let p;try{p=r.domPurify.sanitize(s)}finally{n.#n=i,n.#t=l}p=wn(p);try{return encodeURI(p)}catch{return p}}#o(t,r,s){if(s.nest>16)throw new Error("Data URLs nested too deeply.");let{allow:i,deny:l,only:p,allowRelative:y}=r,g=this.#e,v=!1,h=new Map(s.schemeMap);if(p.length){g=new Set;for(let d of p)M(d)&&(d=d.trim(),this.#r(d,"only",g,h,s)&&!v&&(v=!0))}else{if(i.length){g=new Set(this.#e);for(let d of i)M(d)&&this.#r(d.trim(),"allow",g,h,s)}if(l.length)for(let d of l)M(d)&&(d=d.trim(),d&&h.set(d,!1))}let N,k=super.verify(t,g),J=!1,Z="";if(!k&&y&&!yn.test(t))try{let d=new URL(t,"http://dummy.local");d.protocol==="http:"&&d.hostname==="dummy.local"&&(k=!0,J=!0,Z=`${d.pathname}${d.search}${d.hash}`)}catch(d){oe(s.debug,"Failed to parse relative URL.",d)}if(k){let d,ee,ie,ae,Ue,D="",H=[],A=!1;if(J)A=!0;else if({hash:d,href:ee,pathname:ie,protocol:ae,search:Ue}=new URL(t),D=ae.replace(/:$/,""),H=D.split("+"),v)A=H.every(b=>h.get(b));else for(let[b,G]of h.entries())if(A=G||D!==b&&H.every(te=>te!==b),!A)break;if(A){let K=J?!1:H.includes("data"),b=J?Z:ee;if(K){let[G,...te]=ie.split(","),Se=`${te.join(",")}${Ue}${d}`,me=G.split(";"),Pe=me[me.length-1]==="base64",T=Se;if(Pe)try{T=bn(Se)}catch(j){oe(s.debug,"Failed to parse base64 data.",j),b=""}try{let j=Rn(T).trim(),{protocol:le}=new URL(j,"http://dummy.local");le.replace(/:$/,"").split("+").some(Ke=>_t.test(Ke))&&(b="")}catch(j){oe(s.debug,"Failed to parse inner data URL protocol.",j)}(!G||hn.test(G))&&(T=this.#i(T,s)),b&&T?(Pe&&T!==Se&&me.pop(),b=`${D}:${me.join(";")},${T}`):b=""}if(!K&&Xe.test(b)){let G=Xe.exec(b),{index:te}=G;b=b.substring(0,te).replace(/[?&]$/,"")}b&&(N=b)}}return N||null}sanitize(t,r){if(!t||!M(t))return null;if(!(r&&(Array.isArray(r.deny)&&r.deny.length>0||Array.isArray(r.only)&&r.only.length>0||r.allowRelative))&&(t.startsWith("https://")||t.startsWith("http://"))&&!Xe.test(t)&&!t.includes("data:"))try{let{href:p}=new URL(t);return p.replace(/%26/g,An)}catch{return null}let i={allow:Array.isArray(r?.allow)?r.allow:[],deny:Array.isArray(r?.deny)?r.deny:[],only:Array.isArray(r?.only)?r.only:[],allowRelative:!!r?.allowRelative},l={debug:!!r?.debug,domPurify:Ye,nest:0,recurse:null,schemeMap:new Map([["blob",!1],["data",!1],["file",!1],["javascript",!1],["vbscript",!1]])};return this.#o(t,i,l)}inspect(t,r){if(!M(t))throw new TypeError(`Expected String but got ${fe(t)}.`);let s=new Map([["input",t]]),i;if(this.verify(t)){let{protocol:l}=new URL(t);l==="blob:"?i=t:i=this.sanitize(t,r??{allow:["data","file"]})}if(i){let l=new URL(i),{pathname:p,protocol:y}=l,v=y.replace(/:$/,"").split("+").includes("data");if(s.set("valid",!0),v){let h=new Map,[N,...k]=p.split(","),J=`${k.join(",")}${l.search}${l.hash}`,Z=N.split(";"),d=Z[Z.length-1]==="base64";d&&Z.pop(),h.set("mime",Z.join(";")),h.set("base64",d),h.set("data",J),s.set("data",Object.fromEntries(h))}else s.set("data",null);for(let h of xr){let N=l[h];M(N)&&s.set(h,N)}}else s.set("valid",!1);return Object.fromEntries(s)}get(){return[...this.#e]}has(t){return this.#e.has(t)}add(t){if(!M(t))throw new TypeError(`Expected String but got ${fe(t)}.`);if(t.split("+").some(i=>ve.test(i))||!yt.test(t))throw new Error(`Invalid scheme: ${t}`);return this.#e.add(t),[...this.#e]}remove(t){return this.#e.delete(t)}reset(){this.#e=new Set(super.get())}verify(t,r=this.#e){return super.verify(t,r)}};var se=new St,Lr=async(n,t={allow:[],deny:[],only:[],allowRelative:!1,debug:!1,revokeObjectURL:!1,maxBlobSize:16777216})=>{let r=!!t?.debug,s=Number.isInteger(t?.maxBlobSize)&&t.maxBlobSize>0?t.maxBlobSize:16777216,i;if(n&&M(n)){let l;try{let{protocol:p}=new URL(n);l=p.replace(/:$/,"")}catch(p){oe(r,`Invalid URL input format: ${n}`,p)}if(l==="blob"){let{allow:p,deny:y,only:g}=t;if(Array.isArray(p)&&p.includes("blob")&&!(Array.isArray(y)&&y.includes("blob"))||Array.isArray(g)&&g.includes("blob")){let v;try{v=await fetch(n).then(h=>h.blob()).then(h=>Sn(h,s))}catch(h){let N=`Failed to fetch and convert blob URL: ${n}`;oe(r,N,h)}if(v){let h={...t};Array.isArray(t.only)?h.only=t.only.includes("data")?t.only:[...t.only,"data"]:Array.isArray(t.allow)&&(h.allow=t.allow.includes("data")?t.allow:[...t.allow,"data"],Array.isArray(t.deny)&&(h.deny=t.deny.filter(N=>N!=="data"))),i=se.sanitize(v,h)}}t?.revokeObjectURL&&URL.revokeObjectURL(n)}else(l||t.allowRelative)&&(i=se.sanitize(n,t))}return i||null},Ir=(n,t={allow:[],deny:[],only:[],allowRelative:!1,debug:!1,revokeObjectURL:!1})=>{let r=!!t?.debug,s;if(n&&M(n)){let i;try{let{protocol:l}=new URL(n);i=l.replace(/:$/,"")}catch(l){let p=`Invalid URL input format: ${n}`;oe(r,p,l)}if(i==="blob")return t?.revokeObjectURL&&URL.revokeObjectURL(n),null;(i||t.allowRelative)&&(s=se.sanitize(n,t))}return s||null},Nr=async n=>se.inspect(n),Dr=n=>Nr(n),Cr=n=>se.inspect(n),Mr=n=>Cr(n),vr=async n=>se.verify(n),Ur=n=>se.verify(n),Pr=se;export{Pr as default,vr as isURI,Ur as isURISync,Dr as parseURL,Mr as parseURLSync,Lr as sanitizeURL,Ir as sanitizeURLSync};
4
4
  /*!
5
5
  * URL Sanitizer
6
6
  *
@@ -11,6 +11,6 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
11
11
  /*! Bundled license information:
12
12
 
13
13
  dompurify/dist/purify.es.mjs:
14
- (*! @license DOMPurify 3.4.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.3/LICENSE *)
14
+ (*! @license DOMPurify 3.4.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.7/LICENSE *)
15
15
  */
16
16
  //# sourceMappingURL=url-sanitizer.min.js.map