url-sanitizer 0.9.2 → 0.9.3

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
3
  "sources": ["../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/uri-util.js"],
4
- "sourcesContent": ["[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * dompurify.js\n */\n\nconst { DOMPurify } = window;\n\nexport {\n DOMPurify as default\n};\n", "/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} 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 *\n * @param {*} 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 } = window;\n\nexport {\n FileReader\n};\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,/;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_DATA_URL_G = /data:[^,]*,[^\"]+/g;\nconst REG_END_COLON = /:$/;\nconst REG_END_NUM = /(?:#|%23)$/;\nconst REG_END_QUEST = /(?<!(?:#|%23).*)(?:\\?|%3F)$/;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_HTML_URL_ENC_SHORT = /%(?:2(?:2|7)|3(?:C|E))+?/;\nconst REG_MIME_DOM =\n /^(?:text\\/(?:ht|x)ml|application\\/(?:xhtml\\+)?xml|image\\/svg\\+xml)/;\nconst REG_NUM_DECI = /^\\d+/;\nconst REG_NUM_HEAD = /#x?$/;\nconst REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\\d)/;\nconst REG_NUM_HEX = /^x[\\dA-F]+/i;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/* typedef */\n/**\n * object with additional properties based on URL API\n *\n * @typedef {object} ParsedURL\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 * get URL encoded string\n *\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 *\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 *\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_BASE64.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 *\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 (REG_NUM_HEX.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (REG_NUM_DECI.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 (REG_NUM_HEAD.test(preNum) || REG_NUM_HEAD_ASCII.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 *\n * @param {object} blob - blob\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = blob => new Promise((resolve, reject) => {\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 *\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 *\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 *\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 *\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 *\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 *\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(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_CUSTOM.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/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * replace matched data URLs\n *\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_BASE64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_BASE64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\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 *\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 purifiedDom = domPurify.sanitize(decodeURIComponent(dom));\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom =\n purifiedDom.replace(REG_END_NUM, '').replace(REG_END_QUEST, '');\n return encodeURI(purifiedDom);\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 *\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.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, remove } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\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 // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\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 // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\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 if (super.verify(url)) {\n const { hash, href, pathname, protocol, search } = new URL(url);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n let bool;\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool = value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n if (bool) {\n const isDataUrl = schemeParts.includes('data');\n let finalize;\n let urlToSanitize = href;\n if (isDataUrl) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.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 =\n dataScheme.replace(REG_END_COLON, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n if (!head || REG_MIME_DOM.test(head)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaType.pop();\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove &&\n REG_HTML_URL_ENC_SHORT.test(urlToSanitize)) {\n const item = REG_HTML_URL_ENC_SHORT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getURLEncodedString)\n .replace(REG_URL_ENC_AMP, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_URL_ENC, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n *\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.remove] - remove tag and/or quote and the rest\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(REG_END_COLON, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.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/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * is URI sync\n *\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/**\n * is URI async\n *\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 * parse URL sync\n *\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\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 * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n *\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.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n URL.revokeObjectURL(url);\n } else {\n res = urlSanitizer.sanitize(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n });\n }\n }\n return res || null;\n};\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 *\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.remove] - remove tag and/or quote and the rest\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: []\n}) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === '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 =\n await fetch(url).then(r => r.blob()).then(createDataURLFromBlob);\n } catch (e) {\n // fall through\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 {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/* export instance */\nexport {\n urlSanitizer as default\n};\n"],
5
- "mappings": "AAAA,IAAAA,EAAA,CACE,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACF,ECxOA,IAAAC,EAAA,CACE,MACA,OACA,QACA,OACA,OACA,MACA,MACA,YACA,MACA,MACA,MACA,MACA,OACA,UACA,UACA,MACA,KACA,MACA,aACA,KACA,SACA,UACA,UACA,cACA,OACA,OACA,aACA,QACA,aACA,SACA,MACA,OACA,QACA,SACA,mBACA,MACA,OACA,QACA,0BACA,UACA,eACA,OACA,OACA,MACA,MACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,qBACA,kBACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,OACA,OACA,MACA,OACA,WACA,MACA,WACA,UACA,WACA,OACA,YACA,OACA,OACA,SACA,2BACA,OACA,KACA,MACA,cACA,MACA,KACA,MACA,SACA,eACA,KACA,SACA,QACA,QACA,OACA,MACA,OACA,MACA,OACA,QACA,OACA,QACA,YACA,QACA,MACA,OACA,OACA,KACA,OACA,OACA,WACA,OACA,MACA,OACA,MACA,OACA,MACA,OACA,OACA,OACA,YACA,WACA,WACA,YACA,WACA,OACA,SACA,MACA,MACA,UACA,SACA,OACA,OACA,QACA,gBACA,UACA,MACA,OACA,SACA,SACA,OACA,SACA,SACA,UACA,2BACA,uCACA,kCACA,MACA,MACA,UACA,MACA,gBACA,YACA,kBACA,uBACA,gBACA,cACA,gBACA,WACA,sBACA,qBACA,mBACA,eACA,UACA,cACA,cACA,gCACA,qBACA,aACA,yBACA,iBACA,sBACA,eACA,YACA,gBACA,aACA,eACA,0BACA,yBACA,gBACA,kBACA,YACA,mBACA,iCACA,4BACA,cACA,2BACA,wBACA,qBACA,uBACA,2BACA,iCACA,gCACA,+BACA,uBACA,uBACA,mBACA,8BACA,4BACA,oBACA,sBACA,wBACA,6BACA,mBACA,wBACA,SACA,cACA,gBACA,gBACA,qBACA,qBACA,WACA,aACA,gBACA,oBACA,UACA,QACA,OACA,QACA,MACA,KACA,OACA,SACA,UACA,MACA,OACA,MACA,KACA,MACA,OACA,QACA,MACA,MACA,MACA,UACA,cACA,kBACA,cACA,UACA,OACA,YACA,UACA,QACA,SACA,WACA,MACA,OACA,QACA,OACA,OACA,OACA,KACA,QACA,iBACA,QACA,SACA,SACA,MACA,WACA,MACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,aACA,eACA,UACA,UACA,OACA,MACA,MACA,QACA,eACA,UACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,YACA,aACA,SACA,SACA,UACA,MACA,MACA,WACA,QACA,OACA,QACA,SACA,MACA,MACA,OACA,WACA,MACA,QACA,YACA,MACA,WACA,SACA,OACA,SACA,cACA,MACA,SACA,OACA,OACA,QACA,KACA,MACA,SACA,MACA,SACA,kBACA,UACA,QACA,WACA,MACA,cACA,MACA,SACA,kBACA,OACA,KACA,MACA,OACA,SACA,OACA,KACA,MACA,OACA,UACA,OACA,cACA,QACA,cACA,eACA,OACA,MACA,QACA,UACA,SACF,ECvVA,GAAM,CAAE,UAAAC,CAAU,EAAI,OCUf,IAAMC,EAAUC,GACrB,OAAO,UAAU,SAAS,KAAKA,CAAC,EAAE,MAAM,EAAW,EAAO,EAQ/CC,EAAWD,GAAK,OAAOA,GAAM,UAAYA,aAAa,OCnBnE,GAAM,CAAE,WAAAE,CAAW,EAAI,OCQvB,IAAMC,EAAM,GACNC,EAAa,oBACbC,EAAe,cACfC,EAAsB,qCACtBC,EAAiB,oBACjBC,EAAgB,KAChBC,GAAc,aACdC,GAAgB,8BAChBC,GAAc,YACdC,GAAmB,0BACnBC,EAAyB,2BACzBC,GACJ,qEACIC,GAAe,OACfC,GAAe,OACfC,GAAqB,yBACrBC,GAAc,cACdC,GAAc,uCACdC,GAAa,sBACbC,GAAoB,wBACpBC,EAAa,oBACbC,EAAkB,yBAClBC,GAAc,iBACdC,GAAkB,OAgCXC,EAAsBC,GAAO,CACxC,GAAI,CAACC,EAASD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BE,EAAQF,CAAG,IAAI,EAEhE,IAAMG,EAAQ,CAAC,EACf,QAAWC,KAAMJ,EACfG,EAAM,KAAK,IAAIC,EAAG,WAAW,CAAC,EAAE,SAAS5B,CAAG,EAAE,YAAY,GAAG,EAE/D,OAAO2B,EAAM,KAAK,EAAE,CACtB,EAQaE,EAA4BD,GAAM,CACzCH,EAASG,CAAE,GAAKP,GAAY,KAAKO,CAAE,IACrCA,EAAKA,EAAG,YAAY,GAEtB,GAAM,CAACE,EAAKC,EAAKC,EAAIC,EAAIC,EAAMC,CAAI,EACjC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAAE,IAAIZ,CAAmB,EACpDa,EACJ,OAAIR,IAAOE,EACTM,EAAc,GAAGN,QACRF,IAAOI,EAChBI,EAAc,GAAGN,OACRF,IAAOK,EAChBG,EAAc,GAAGN,OACRF,IAAOM,EAChBE,EAAc,GAAGN,SACRF,IAAOO,EAChBC,EAAc,GAAGN,IAAMC,OAEvBK,EAAcR,EAETQ,CACT,EAQaC,GAAcC,GAAQ,CACjC,GAAKb,EAASa,CAAI,GAEX,GAAI,CAACrC,EAAW,KAAKqC,CAAI,EAC9B,MAAM,IAAI,MAAM,wBAAwBA,GAAM,MAF9C,OAAM,IAAI,UAAU,2BAA2BZ,EAAQY,CAAI,IAAI,EAIjE,IAAMC,EAAM,KAAKD,CAAI,EACfE,EAAW,WAAW,KAAK,CAAC,GAAGD,CAAG,EAAE,IAAIE,GAAKA,EAAE,WAAW,CAAC,CAAC,CAAC,EAC7DC,EAAgB,IAAI,IAAIC,CAAS,EACnCC,EACJ,OAAIJ,EAAS,MAAMC,GAAKC,EAAc,IAAID,CAAC,CAAC,EAC1CG,EAAaL,EAAI,QAAQ,MAAOhB,CAAmB,EAEnDqB,EAAaN,EAERM,CACT,EASaC,EAA4B,CAACrB,EAAKsB,EAAO,IAAM,CAC1D,GAAI,CAACrB,EAASD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BE,EAAQF,CAAG,IAAI,EAEhE,GAAK,OAAO,UAAUsB,CAAI,GAEnB,GAAIA,EAAO9C,EAChB,MAAM,IAAI,MAAM,yCAAyC,MAFzD,OAAM,IAAI,UAAU,2BAA2B0B,EAAQoB,CAAI,IAAI,EAIjE,IAAIC,EAAM,mBAAmBvB,CAAG,EAChC,GAAI,KAAK,KAAKuB,CAAG,EAAG,CAClB,IAAML,EAAgB,IAAI,IAAIC,CAAS,EACjCK,EAAQ,CAAC,GAAGD,EAAI,SAAS/B,EAAW,CAAC,EAAE,QAAQ,EACrD,QAAWiC,KAAQD,EAAO,CACxB,GAAM,CAACE,EAAYC,CAAK,EAAIF,EACxBlB,EAMJ,GALIhB,GAAY,KAAKoC,CAAK,EACxBpB,EAAM,SAAS,IAAIoB,IAASnD,CAAG,EACtBY,GAAa,KAAKuC,CAAK,IAChCpB,EAAM,SAASoB,CAAK,GAElB,OAAO,UAAUpB,CAAG,EAAG,CACzB,GAAM,CAAE,MAAAqB,CAAM,EAAIH,EACZ,CAACI,EAAQC,CAAO,EAAI,CACxBP,EAAI,UAAU,EAAGK,CAAK,EACtBL,EAAI,UAAUK,EAAQF,EAAW,MAAM,CACzC,EACIR,EAAc,IAAIX,CAAG,GACvBgB,EAAM,GAAGM,IAAS,OAAO,aAAatB,CAAG,IAAIuB,KACzCzC,GAAa,KAAKwC,CAAM,GAAKvC,GAAmB,KAAKwC,CAAO,KAC9DP,EAAMF,EAA0BE,EAAK,EAAED,CAAI,IAEpCf,EAAM/B,EAAMA,IACrB+C,EAAM,GAAGM,IAASC,OAK1B,OAAOP,CACT,EAQaQ,GAAwBC,GAAQ,IAAI,QAAQ,CAACC,EAASC,IAAW,CAC5E,IAAMC,EAAS,IAAIC,EACnBD,EAAO,iBAAiB,QAAS,IAAMD,EAAOC,EAAO,KAAK,CAAC,EAC3DA,EAAO,iBAAiB,QAAS,IAAMF,EAAQE,EAAO,MAAM,CAAC,EAC7DA,EAAO,iBAAiB,OAAQ,IAAMF,EAAQE,EAAO,MAAM,CAAC,EAC5DA,EAAO,cAAcH,CAAI,CAC3B,CAAC,EAMYK,EAAN,KAAiB,CAEtBC,GAKA,aAAc,CACZ,KAAKA,GAAW,IAAI,IAAIC,CAAU,CACpC,CAUA,KAAM,CACJ,MAAO,CAAC,GAAG,KAAKD,EAAQ,CAC1B,CAQA,IAAIE,EAAQ,CACV,OAAO,KAAKF,GAAS,IAAIE,CAAM,CACjC,CASA,IAAIA,EAAQ,CACV,GAAKvC,EAASuC,CAAM,GAEb,GAAI7C,EAAW,KAAK6C,CAAM,GAAK,CAAC/C,GAAW,KAAK+C,CAAM,EAC3D,MAAM,IAAI,MAAM,mBAAmBA,GAAQ,MAF3C,OAAM,IAAI,UAAU,2BAA2BtC,EAAQsC,CAAM,IAAI,EAInE,YAAKF,GAAS,IAAIE,CAAM,EACjB,CAAC,GAAG,KAAKF,EAAQ,CAC1B,CAQA,OAAOE,EAAQ,CACb,OAAO,KAAKF,GAAS,OAAOE,CAAM,CACpC,CAQA,OAAOC,EAAK,CACV,IAAIlB,EACJ,GAAItB,EAASwC,CAAG,EACd,GAAI,CACF,GAAM,CAAE,SAAAC,CAAS,EAAI,IAAI,IAAID,CAAG,EAC1BD,EAASE,EAAS,QAAQ7D,EAAe,EAAE,EAC3C8D,EAAcH,EAAO,MAAM,GAAG,EACpCjB,EAAO,CAAC5B,EAAW,KAAK6C,CAAM,GAAK9C,GAAkB,KAAK8C,CAAM,GAC1DG,EAAY,MAAMC,GAAK,KAAKN,GAAS,IAAIM,CAAC,CAAC,CACnD,MAAE,CACArB,EAAM,EACR,CAEF,MAAO,CAAC,CAACA,CACX,CACF,EAGasB,EAAN,cAA2BR,CAAW,CAE3CS,GACAC,GAKA,aAAc,CACZ,MAAM,EACN,KAAKD,GAAQ,EACb,KAAKC,GAAW,IAAI,GACtB,CAQA,QAAQjC,EAAM,CACZ,GAAI,CAACb,EAASa,CAAI,EAChB,MAAM,IAAI,UAAU,2BAA2BZ,EAAQY,CAAI,IAAI,EAEjE,IAAIkC,EAAelC,EACnB,GAAIpC,EAAa,KAAKsE,CAAY,EAAG,CAEnC,IAAMxB,EAAQ,CAAC,GADSwB,EAAa,SAASpE,CAAc,CAC3B,EAAE,QAAQ,EAC3C,QAAW6C,KAAQD,EAAO,CACxB,GAAI,CAACyB,CAAO,EAAIxB,EACZ9C,EAAoB,KAAKsE,CAAO,IAClC,CAACA,CAAO,EAAItE,EAAoB,KAAKsE,CAAO,GAE9C,KAAKH,KACL,KAAKC,GAAS,IAAIE,CAAO,EACzB,IAAMC,EAAgB,KAAK,SAASD,EAAS,CAC3C,MAAO,CAAC,MAAM,CAChB,CAAC,EACK,CAAE,MAAArB,CAAM,EAAIH,EACZ,CAAC0B,EAAYC,CAAW,EAAI,CAChCJ,EAAa,UAAU,EAAGpB,CAAK,EAC/BoB,EAAa,UAAUpB,EAAQqB,EAAQ,MAAM,CAC/C,EACIC,EACFF,EAAe,GAAGG,IAAaD,IAAgBE,IAE/CJ,EAAe,GAAGG,IAAaC,KAIrC,OAAOJ,CACT,CAQA,OAAOK,EAAK,CACV,GAAI,CAACpD,EAASoD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BnD,EAAQmD,CAAG,IAAI,EAEhE,IAAIC,EAAcC,EAAU,SAAS,mBAAmBF,CAAG,CAAC,EAC5D,OAAIC,GAAe5E,EAAa,KAAK4E,CAAW,IAC9CA,EAAc,KAAK,QAAQA,CAAW,GAExCA,EACEA,EAAY,QAAQxE,GAAa,EAAE,EAAE,QAAQC,GAAe,EAAE,EACzD,UAAUuE,CAAW,CAC9B,CAgBA,SAASE,EAAKC,EAAM,CAAE,MAAO,CAAC,EAAG,KAAM,CAAC,EAAG,KAAM,CAAC,CAAE,EAAG,CACrD,GAAI,KAAKX,GAAQtE,EACf,WAAKsE,GAAQ,EACP,IAAI,MAAM,8BAA8B,EAEhD,GAAM,CAAE,MAAAY,EAAO,KAAAC,EAAM,KAAAC,EAAM,OAAAC,CAAO,EAAIJ,GAAO,CAAC,EACxCK,EAAY,IAAI,IAAI,CACxB,CAAC,OAAQ,EAAK,EACd,CAAC,OAAQ,EAAK,EACd,CAAC,OAAQ,EAAK,EACd,CAAC,YAAa,EAAK,EACnB,CAAC,WAAY,EAAK,CACpB,CAAC,EACGC,EAAiB,GACrB,GAAI,MAAM,QAAQH,CAAI,GAAKA,EAAK,OAAQ,CACtC,IAAMI,EAAU,MAAM,IAAI,EAC1B,QAAWvC,KAAQuC,EACjBF,EAAU,IAAIrC,EAAM,EAAK,EAE3B,IAAMD,EAAQ,OAAO,OAAOoC,CAAI,EAChC,QAASnC,KAAQD,EACf,GAAIvB,EAASwB,CAAI,IACfA,EAAOA,EAAK,KAAK,EACb,CAAC7B,EAAgB,KAAK6B,CAAI,GAAG,CAC/B,GAAI,MAAM,IAAIA,CAAI,EAChBqC,EAAU,IAAIrC,EAAM,EAAI,MACnB,CACL,GAAI,CACF,MAAM,IAAIA,CAAI,CAChB,MAAE,CAEF,CACI,MAAM,IAAIA,CAAI,GAChBqC,EAAU,IAAIrC,EAAM,EAAI,EAGxB,CAACsC,GAAkBD,EAAU,IAAIrC,CAAI,IACvCsC,EAAiBD,EAAU,IAAIrC,CAAI,QAKtC,CACL,GAAI,MAAM,QAAQiC,CAAK,GAAKA,EAAM,OAAQ,CACxC,IAAMlC,EAAQ,OAAO,OAAOkC,CAAK,EACjC,QAASjC,KAAQD,EACf,GAAIvB,EAASwB,CAAI,IACfA,EAAOA,EAAK,KAAK,EACb,CAAC7B,EAAgB,KAAK6B,CAAI,GAC5B,GAAI,MAAM,IAAIA,CAAI,EAChBqC,EAAU,IAAIrC,EAAM,EAAI,MACnB,CACL,GAAI,CACF,MAAM,IAAIA,CAAI,CAChB,MAAE,CAEF,CACI,MAAM,IAAIA,CAAI,GAChBqC,EAAU,IAAIrC,EAAM,EAAI,GAOpC,GAAI,MAAM,QAAQkC,CAAI,GAAKA,EAAK,OAAQ,CACtC,IAAMnC,EAAQ,OAAO,OAAOmC,CAAI,EAChC,QAASlC,KAAQD,EACXvB,EAASwB,CAAI,IACfA,EAAOA,EAAK,KAAK,EACbA,GACFqC,EAAU,IAAIrC,EAAM,EAAK,IAMnC,IAAIwC,EACJ,GAAI,MAAM,OAAOT,CAAG,EAAG,CACrB,GAAM,CAAE,KAAAU,EAAM,KAAAC,EAAM,SAAAC,EAAU,SAAA1B,EAAU,OAAA2B,CAAO,EAAI,IAAI,IAAIb,CAAG,EACxDhB,EAASE,EAAS,QAAQ7D,EAAe,EAAE,EAC3C8D,EAAcH,EAAO,MAAM,GAAG,EAChC8B,EACJ,GAAIP,EACFO,EAAO3B,EAAY,MAAMC,GAAKkB,EAAU,IAAIlB,CAAC,CAAC,MAE9C,QAAW,CAAC2B,EAAK5C,CAAK,IAAKmC,EAAU,QAAQ,EAE3C,GADAQ,EAAO3C,GAAUa,IAAW+B,GAAO5B,EAAY,MAAMC,GAAKA,IAAM2B,CAAG,EAC/D,CAACD,EACH,MAIN,GAAIA,EAAM,CACR,IAAME,EAAY7B,EAAY,SAAS,MAAM,EACzC8B,EACAC,EAAgBP,EACpB,GAAIK,EAAW,CACb,GAAM,CAACG,EAAM,GAAGC,CAAI,EAAIR,EAAS,MAAM,GAAG,EACpCtD,EAAO,GAAG8D,EAAK,KAAK,GAAG,IAAIP,IAASH,IACpCW,EAAYF,EAAK,MAAM,GAAG,EAC1BG,EAAWD,EAAUA,EAAU,OAAS,CAAC,IAAM,SACjDzD,EAAaN,EACbgE,IACF1D,EAAaP,GAAYC,CAAI,GAE/B,GAAI,CACF,IAAMiE,EAAc1D,EAA0BD,CAAU,EAAE,KAAK,EACzD,CAAE,SAAU4D,CAAW,EAAI,IAAI,IAAID,CAAW,EAElDC,EAAW,QAAQnG,EAAe,EAAE,EAAE,MAAM,GAAG,EAC7B,KAAK+D,GAAKhD,EAAgB,KAAKgD,CAAC,CAAC,IACnD8B,EAAgB,GAEpB,MAAE,CAEF,CACA,IAAMO,EAAkBvG,EAAa,KAAK0C,CAAU,EAChDA,IAAeN,GAAQmE,EACrBA,EACF7D,EAAa,KAAK,QAAQA,CAAU,EAC3B,KAAK2B,GAAS,IAAIS,CAAG,EAC9B,KAAKT,GAAS,OAAOS,CAAG,EAExBiB,EAAW,GAEJ,KAAK1B,GAAS,IAAIS,CAAG,EAC9B,KAAKT,GAAS,OAAOS,CAAG,EAExBiB,EAAW,IAET,CAACE,GAAQxF,GAAa,KAAKwF,CAAI,KACjCvD,EAAa,KAAK,OAAOA,CAAU,GAEjCsD,GAAiBtD,GACf0D,GAAY1D,IAAeN,GAC7B+D,EAAU,IAAI,EAEhBH,EAAgB,GAAGlC,KAAUqC,EAAU,KAAK,GAAG,KAAKzD,KAEpDsD,EAAgB,QAGlBD,EAAW,GAEb,GAAI,CAACD,GAAaX,GACd3E,EAAuB,KAAKwF,CAAa,EAAG,CAC9C,IAAMjD,EAAOvC,EAAuB,KAAKwF,CAAa,EAChD,CAAE,MAAA9C,CAAM,EAAIH,EAClBiD,EAAgBA,EAAc,UAAU,EAAG9C,CAAK,EAE9C8C,GACFT,EAAeS,EACZ,QAAQ1F,GAAae,CAAmB,EACxC,QAAQD,GAAiBO,CAAyB,EACjDoE,IACGD,IACHP,EAAeA,EACZ,QAAQhF,GAAkBoB,CAAyB,GAExD,KAAKyC,GAAQ,IAGf,KAAKA,GAAQ,GAInB,OAAOmB,GAAgB,IACzB,CAaA,MAAMT,EAAKC,EAAK,CACd,GAAI,CAACxD,EAASuD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BtD,EAAQsD,CAAG,IAAI,EAEhE,IAAM0B,EAAY,IAAI,IAAI,CACxB,CAAC,QAAS1B,CAAG,CACf,CAAC,EACGS,EACJ,GAAI,KAAK,OAAOT,CAAG,EAAG,CACpB,GAAM,CAAE,SAAAd,CAAS,EAAI,IAAI,IAAIc,CAAG,EAC5Bd,IAAa,QACfuB,EAAeT,EAEfS,EAAe,KAAK,SAAST,EAAKC,GAAO,CACvC,MAAO,CAAC,OAAQ,MAAM,CACxB,CAAC,EAGL,GAAIQ,EAAc,CAChB,IAAMkB,EAAS,IAAI,IAAIlB,CAAY,EAC7B,CAAE,SAAAG,EAAU,SAAA1B,CAAS,EAAIyC,EAEzBX,EADc9B,EAAS,QAAQ7D,EAAe,EAAE,EAAE,MAAM,GAAG,EACnC,SAAS,MAAM,EAE7C,GADAqG,EAAU,IAAI,QAAS,EAAI,EACvBV,EAAW,CACb,IAAMvB,EAAU,IAAI,IACd,CAAC0B,EAAM,GAAGC,CAAI,EAAIR,EAAS,MAAM,GAAG,EACpCtD,EAAO,GAAG8D,EAAK,KAAK,GAAG,IACvBC,EAAYF,EAAK,MAAM,GAAG,EAC1BG,EAAWD,EAAUA,EAAU,OAAS,CAAC,IAAM,SACjDC,GACFD,EAAU,IAAI,EAEhB5B,EAAQ,IAAI,OAAQ4B,EAAU,KAAK,GAAG,CAAC,EACvC5B,EAAQ,IAAI,SAAU6B,CAAQ,EAC9B7B,EAAQ,IAAI,OAAQnC,CAAI,EACxBoE,EAAU,IAAI,OAAQ,OAAO,YAAYjC,CAAO,CAAC,OAEjDiC,EAAU,IAAI,OAAQ,IAAI,EAE5B,QAAWX,KAAOY,EAAQ,CACxB,IAAMxD,EAAQwD,EAAOZ,CAAG,EACpBtE,EAAS0B,CAAK,GAChBuD,EAAU,IAAIX,EAAK5C,CAAK,QAI5BuD,EAAU,IAAI,QAAS,EAAK,EAE9B,OAAO,OAAO,YAAYA,CAAS,CACrC,CACF,EAIME,EAAe,IAAIvC,EAQZwC,GAAY5C,GAAO2C,EAAa,OAAO3C,CAAG,EAQ1C6C,GAAQ,MAAM7C,GACb2C,EAAa,OAAO3C,CAAG,EAUxB8C,GAAe/B,GAAO4B,EAAa,MAAM5B,CAAG,EAQ5CgC,GAAW,MAAMhC,GAChB4B,EAAa,MAAM5B,CAAG,EAiBvBiC,GAAkB,CAACjC,EAAKC,IAAQ,CAC3C,IAAIlC,EACJ,GAAI6D,EAAa,OAAO5B,CAAG,EAAG,CAC5B,GAAM,CAAE,SAAAd,CAAS,EAAI,IAAI,IAAIc,CAAG,EAC5Bd,IAAa,QACf,IAAI,gBAAgBc,CAAG,EAEvBjC,EAAM6D,EAAa,SAAS5B,EAAKC,GAAO,CACtC,MAAO,CAAC,EACR,KAAM,CAAC,EACP,KAAM,CAAC,CACT,CAAC,EAGL,OAAOlC,GAAO,IAChB,EAeamE,GAAc,MAAOlC,EAAKC,EAAM,CAC3C,MAAO,CAAC,EACR,KAAM,CAAC,EACP,KAAM,CAAC,CACT,IAAM,CACJ,IAAIlC,EACJ,GAAI6D,EAAa,OAAO5B,CAAG,EAAG,CAC5B,GAAM,CAAE,SAAAd,CAAS,EAAI,IAAI,IAAIc,CAAG,EAChC,GAAId,IAAa,QAAS,CACxB,GAAM,CAAE,MAAAgB,EAAO,KAAAC,EAAM,KAAAC,CAAK,EAAIH,EAC9B,GAAK,MAAM,QAAQC,CAAK,GAAKA,EAAM,SAAS,MAAM,GAC7C,EAAE,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAS,MAAM,IAC7C,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAS,MAAM,EAAI,CAClD,IAAI9C,EACJ,GAAI,CACFA,EACE,MAAM,MAAM0C,CAAG,EAAE,KAAKmC,GAAKA,EAAE,KAAK,CAAC,EAAE,KAAK5D,EAAqB,CACnE,MAAE,CAEF,CACA,GAAIjB,EAAM,CACR,GAAI,MAAM,QAAQ8C,CAAI,EACfA,EAAK,SAAS,MAAM,GACvBA,EAAK,KAAK,MAAM,UAET,MAAM,QAAQF,CAAK,IACvBA,EAAM,SAAS,MAAM,GACxBA,EAAM,KAAK,MAAM,EAEf,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAS,MAAM,GAAG,CAChD,IAAMiC,EAAIjC,EAAK,QAAQ,MAAM,EAC7BA,EAAK,OAAOiC,EAAG,CAAC,EAGpBrE,EAAM6D,EAAa,SAAStE,EAAM2C,CAAG,GAGzC,IAAI,gBAAgBD,CAAG,OAEvBjC,EAAM6D,EAAa,SAAS5B,EAAKC,CAAG,EAGxC,OAAOlC,GAAO,IAChB",
6
- "names": ["text_chars_default", "uri_schemes_default", "DOMPurify", "getType", "o", "isString", "FileReader", "HEX", "REG_BASE64", "REG_DATA_URL", "REG_DATA_URL_BASE64", "REG_DATA_URL_G", "REG_END_COLON", "REG_END_NUM", "REG_END_QUEST", "REG_HTML_SP", "REG_HTML_URL_ENC", "REG_HTML_URL_ENC_SHORT", "REG_MIME_DOM", "REG_NUM_DECI", "REG_NUM_HEAD", "REG_NUM_HEAD_ASCII", "REG_NUM_HEX", "REG_NUM_REF", "REG_SCHEME", "REG_SCHEME_CUSTOM", "REG_SCRIPT", "REG_SCRIPT_BLOB", "REG_URL_ENC", "REG_URL_ENC_AMP", "getURLEncodedString", "str", "isString", "getType", "chars", "ch", "escapeURLEncodedHTMLChars", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "bin", "uint8arr", "c", "textCharCodes", "text_chars_default", "parsedData", "parseURLEncodedNumCharRef", "nest", "res", "items", "item", "numCharRef", "value", "index", "preNum", "postNum", "createDataURLFromBlob", "blob", "resolve", "reject", "reader", "FileReader", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "protocol", "schemeParts", "s", "URLSanitizer", "#nest", "#recurse", "replacedData", "dataUrl", "parsedDataUrl", "preDataUrl", "postDataUrl", "dom", "purifiedDom", "DOMPurify", "url", "opt", "allow", "deny", "only", "remove", "schemeMap", "restrictScheme", "schemes", "sanitizedUrl", "hash", "href", "pathname", "search", "bool", "key", "isDataUrl", "finalize", "urlToSanitize", "head", "body", "mediaType", "isBase64", "decodedData", "dataScheme", "containsDataUrl", "parsedUrl", "urlObj", "urlSanitizer", "isURISync", "isURI", "parseURLSync", "parseURL", "sanitizeURLSync", "sanitizeURL", "r", "i"]
4
+ "sourcesContent": ["[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * dompurify.js\n */\n\nconst { DOMPurify } = window;\n\nexport {\n DOMPurify as default\n};\n", "/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} 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 *\n * @param {*} 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 } = window;\n\nexport {\n FileReader\n};\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,/;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_DATA_URL_G = /data:[^,]*,[^\"]+/g;\nconst REG_END_COLON = /:$/;\nconst REG_END_NUM = /(?:#|%23)$/;\nconst REG_END_QUEST = /(?<!(?:#|%23).*)(?:\\?|%3F)$/;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_HTML_URL_ENC_SHORT = /%(?:2(?:2|7)|3(?:C|E))+?/;\nconst REG_MIME_DOM =\n /^(?:text\\/(?:ht|x)ml|application\\/(?:xhtml\\+)?xml|image\\/svg\\+xml)/;\nconst REG_NUM_DECI = /^\\d+/;\nconst REG_NUM_HEAD = /#x?$/;\nconst REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\\d)/;\nconst REG_NUM_HEX = /^x[\\dA-F]+/i;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/* typedef */\n/**\n * object with additional properties based on URL API\n *\n * @typedef {object} ParsedURL\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 * get URL encoded string\n *\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 *\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 *\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_BASE64.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 *\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 (REG_NUM_HEX.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (REG_NUM_DECI.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 (REG_NUM_HEAD.test(preNum) || REG_NUM_HEAD_ASCII.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 *\n * @param {object} blob - blob\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = blob => new Promise((resolve, reject) => {\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 *\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 *\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 *\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 *\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 *\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 *\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(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_CUSTOM.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/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * replace matched data URLs\n *\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_BASE64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_BASE64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\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 *\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 purifiedDom = domPurify.sanitize(decodeURIComponent(dom));\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom =\n purifiedDom.replace(REG_END_NUM, '').replace(REG_END_QUEST, '');\n return encodeURI(purifiedDom);\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 *\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.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, remove } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\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 // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\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 // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\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 if (super.verify(url)) {\n const { hash, href, pathname, protocol, search } = new URL(url);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n let bool;\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool = value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n if (bool) {\n const isDataUrl = schemeParts.includes('data');\n let finalize;\n let urlToSanitize = 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 =\n dataScheme.replace(REG_END_COLON, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\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 } else {\n finalize = true;\n }\n if (!isDataUrl && remove &&\n REG_HTML_URL_ENC_SHORT.test(urlToSanitize)) {\n const item = REG_HTML_URL_ENC_SHORT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getURLEncodedString)\n .replace(REG_URL_ENC_AMP, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_URL_ENC, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n *\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.remove] - remove tag and/or quote and the rest\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(REG_END_COLON, '').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/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * is URI sync\n *\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/**\n * is URI async\n *\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 * parse URL sync\n *\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\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 * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n *\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.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n URL.revokeObjectURL(url);\n } else {\n res = urlSanitizer.sanitize(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n });\n }\n }\n return res || null;\n};\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 *\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.remove] - remove tag and/or quote and the rest\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: []\n}) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === '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 =\n await fetch(url).then(r => r.blob()).then(createDataURLFromBlob);\n } catch (e) {\n // fall through\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 {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/* export instance */\nexport {\n urlSanitizer as default\n};\n"],
5
+ "mappings": "AAAA,IAAAA,EAAA,CACE,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACF,ECxOA,IAAAC,EAAA,CACE,MACA,OACA,QACA,OACA,OACA,MACA,MACA,YACA,MACA,MACA,MACA,MACA,OACA,UACA,UACA,MACA,KACA,MACA,aACA,KACA,SACA,UACA,UACA,cACA,OACA,OACA,aACA,QACA,aACA,SACA,MACA,OACA,QACA,SACA,mBACA,MACA,OACA,QACA,0BACA,UACA,eACA,OACA,OACA,MACA,MACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,qBACA,kBACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,OACA,OACA,MACA,OACA,WACA,MACA,WACA,UACA,WACA,OACA,YACA,OACA,OACA,SACA,2BACA,OACA,KACA,MACA,cACA,MACA,KACA,MACA,SACA,eACA,KACA,SACA,QACA,QACA,OACA,MACA,OACA,MACA,OACA,QACA,OACA,QACA,YACA,QACA,MACA,OACA,OACA,KACA,OACA,OACA,WACA,OACA,MACA,OACA,MACA,OACA,MACA,OACA,OACA,OACA,YACA,WACA,WACA,YACA,WACA,OACA,SACA,MACA,MACA,UACA,SACA,OACA,OACA,QACA,gBACA,UACA,MACA,OACA,SACA,SACA,OACA,SACA,SACA,UACA,2BACA,uCACA,kCACA,MACA,MACA,UACA,MACA,gBACA,YACA,kBACA,uBACA,gBACA,cACA,gBACA,WACA,sBACA,qBACA,mBACA,eACA,UACA,cACA,cACA,gCACA,qBACA,aACA,yBACA,iBACA,sBACA,eACA,YACA,gBACA,aACA,eACA,0BACA,yBACA,gBACA,kBACA,YACA,mBACA,iCACA,4BACA,cACA,2BACA,wBACA,qBACA,uBACA,2BACA,iCACA,gCACA,+BACA,uBACA,uBACA,mBACA,8BACA,4BACA,oBACA,sBACA,wBACA,6BACA,mBACA,wBACA,SACA,cACA,gBACA,gBACA,qBACA,qBACA,WACA,aACA,gBACA,oBACA,UACA,QACA,OACA,QACA,MACA,KACA,OACA,SACA,UACA,MACA,OACA,MACA,KACA,MACA,OACA,QACA,MACA,MACA,MACA,UACA,cACA,kBACA,cACA,UACA,OACA,YACA,UACA,QACA,SACA,WACA,MACA,OACA,QACA,OACA,OACA,OACA,KACA,QACA,iBACA,QACA,SACA,SACA,MACA,WACA,MACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,aACA,eACA,UACA,UACA,OACA,MACA,MACA,QACA,eACA,UACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,YACA,aACA,SACA,SACA,UACA,MACA,MACA,WACA,QACA,OACA,QACA,SACA,MACA,MACA,OACA,WACA,MACA,QACA,YACA,MACA,WACA,SACA,OACA,SACA,cACA,MACA,SACA,OACA,OACA,QACA,KACA,MACA,SACA,MACA,SACA,kBACA,UACA,QACA,WACA,MACA,cACA,MACA,SACA,kBACA,OACA,KACA,MACA,OACA,SACA,OACA,KACA,MACA,OACA,UACA,OACA,cACA,QACA,cACA,eACA,OACA,MACA,QACA,UACA,SACF,ECvVA,GAAM,CAAE,UAAAC,CAAU,EAAI,OCUf,IAAMC,EAAUC,GACrB,OAAO,UAAU,SAAS,KAAKA,CAAC,EAAE,MAAM,EAAW,EAAO,EAQ/CC,EAAWD,GAAK,OAAOA,GAAM,UAAYA,aAAa,OCnBnE,GAAM,CAAE,WAAAE,CAAW,EAAI,OCQvB,IAAMC,EAAM,GACNC,EAAa,oBACbC,EAAe,cACfC,EAAsB,qCACtBC,EAAiB,oBACjBC,EAAgB,KAChBC,GAAc,aACdC,GAAgB,8BAChBC,GAAc,YACdC,GAAmB,0BACnBC,EAAyB,2BACzBC,GACJ,qEACIC,GAAe,OACfC,GAAe,OACfC,GAAqB,yBACrBC,GAAc,cACdC,GAAc,uCACdC,GAAa,sBACbC,GAAoB,wBACpBC,EAAa,oBACbC,EAAkB,yBAClBC,GAAc,iBACdC,GAAkB,OAgCXC,EAAsBC,GAAO,CACxC,GAAI,CAACC,EAASD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BE,EAAQF,CAAG,IAAI,EAEhE,IAAMG,EAAQ,CAAC,EACf,QAAWC,KAAMJ,EACfG,EAAM,KAAK,I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",
6
+ "names": ["text_chars_default", "uri_schemes_default", "DOMPurify", "getType", "o", "isString", "FileReader", "HEX", "REG_BASE64", "REG_DATA_URL", "REG_DATA_URL_BASE64", "REG_DATA_URL_G", "REG_END_COLON", "REG_END_NUM", "REG_END_QUEST", "REG_HTML_SP", "REG_HTML_URL_ENC", "REG_HTML_URL_ENC_SHORT", "REG_MIME_DOM", "REG_NUM_DECI", "REG_NUM_HEAD", "REG_NUM_HEAD_ASCII", "REG_NUM_HEX", "REG_NUM_REF", "REG_SCHEME", "REG_SCHEME_CUSTOM", "REG_SCRIPT", "REG_SCRIPT_BLOB", "REG_URL_ENC", "REG_URL_ENC_AMP", "getURLEncodedString", "str", "isString", "getType", "chars", "ch", "escapeURLEncodedHTMLChars", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "bin", "uint8arr", "c", "textCharCodes", "text_chars_default", "parsedData", "parseURLEncodedNumCharRef", "nest", "res", "items", "item", "numCharRef", "value", "index", "preNum", "postNum", "createDataURLFromBlob", "blob", "resolve", "reject", "reader", "FileReader", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "protocol", "schemeParts", "s", "URLSanitizer", "#nest", "#recurse", "replacedData", "dataUrl", "parsedDataUrl", "preDataUrl", "postDataUrl", "dom", "purifiedDom", "DOMPurify", "url", "opt", "allow", "deny", "only", "remove", "schemeMap", "restrictScheme", "schemes", "sanitizedUrl", "hash", "href", "pathname", "search", "bool", "key", "isDataUrl", "finalize", "urlToSanitize", "mediaType", "dataParts", "mediaTypes", "isBase64", "decodedData", "dataScheme", "containsDataUrl", "parsedUrl", "urlObj", "urlSanitizer", "isURISync", "isURI", "parseURLSync", "parseURL", "sanitizeURLSync", "sanitizeURL", "r", "i"]
7
7
  }
@@ -2034,10 +2034,10 @@ var URLSanitizer = class extends URISchemes {
2034
2034
  let finalize;
2035
2035
  let urlToSanitize = href;
2036
2036
  if (isDataUrl) {
2037
- const [head, ...body] = pathname.split(",");
2038
- const data = `${body.join(",")}${search}${hash}`;
2039
- const mediaType = head.split(";");
2040
- const isBase64 = mediaType[mediaType.length - 1] === "base64";
2037
+ const [mediaType, ...dataParts] = pathname.split(",");
2038
+ const data = `${dataParts.join(",")}${search}${hash}`;
2039
+ const mediaTypes = mediaType.split(";");
2040
+ const isBase64 = mediaTypes[mediaTypes.length - 1] === "base64";
2041
2041
  let parsedData = data;
2042
2042
  if (isBase64) {
2043
2043
  parsedData = parseBase64(data);
@@ -2065,14 +2065,14 @@ var URLSanitizer = class extends URISchemes {
2065
2065
  } else {
2066
2066
  finalize = true;
2067
2067
  }
2068
- if (!head || REG_MIME_DOM.test(head)) {
2068
+ if (!mediaType || REG_MIME_DOM.test(mediaType)) {
2069
2069
  parsedData = this.purify(parsedData);
2070
2070
  }
2071
2071
  if (urlToSanitize && parsedData) {
2072
2072
  if (isBase64 && parsedData !== data) {
2073
- mediaType.pop();
2073
+ mediaTypes.pop();
2074
2074
  }
2075
- urlToSanitize = `${scheme}:${mediaType.join(";")},${parsedData}`;
2075
+ urlToSanitize = `${scheme}:${mediaTypes.join(";")},${parsedData}`;
2076
2076
  } else {
2077
2077
  urlToSanitize = "";
2078
2078
  }
@@ -2136,14 +2136,14 @@ var URLSanitizer = class extends URISchemes {
2136
2136
  parsedUrl.set("valid", true);
2137
2137
  if (isDataUrl) {
2138
2138
  const dataUrl = /* @__PURE__ */ new Map();
2139
- const [head, ...body] = pathname.split(",");
2140
- const data = `${body.join(",")}`;
2141
- const mediaType = head.split(";");
2142
- const isBase64 = mediaType[mediaType.length - 1] === "base64";
2139
+ const [mediaType, ...dataParts] = pathname.split(",");
2140
+ const data = `${dataParts.join(",")}`;
2141
+ const mediaTypes = mediaType.split(";");
2142
+ const isBase64 = mediaTypes[mediaTypes.length - 1] === "base64";
2143
2143
  if (isBase64) {
2144
- mediaType.pop();
2144
+ mediaTypes.pop();
2145
2145
  }
2146
- dataUrl.set("mime", mediaType.join(";"));
2146
+ dataUrl.set("mime", mediaTypes.join(";"));
2147
2147
  dataUrl.set("base64", isBase64);
2148
2148
  dataUrl.set("data", data);
2149
2149
  parsedUrl.set("data", Object.fromEntries(dataUrl));