diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 659668c..838a5a3 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -51,6 +51,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Build and test compiled scripts + run: pnpm run build && pnpm run test:unit + - name: Test BrowserStack matrix selection run: pnpm run test:matrix @@ -69,7 +72,7 @@ jobs: - name: Run tests with BrowserStack Local if: steps.browserstack.outputs.skip != 'true' - run: pnpm run build && node ./test/index.js + run: node ./test/index.js env: CI: true NODE_ENV: test diff --git a/AGENTS.md b/AGENTS.md index 57a0759..76a6c9f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,10 +4,16 @@ This repository contains the public scripts for Simple Analytics. When making ch ## Development -- Use **Node.js 22.16** (see `.nvmrc`). +- Use the Node.js version pinned in `.nvmrc` (currently **24.18.0**). - Run `npm run build` to compile the scripts. This generates the files in `dist/` which should be committed. - Format code with Prettier before committing. You can run `npx prettier -w .` or validate with `npm run prettier`. +## Script size and naming + +- Write code in `src/` to minimize the bytes in the compiled scripts, not just the source. Reuse the predefined variables for repeated values: the compiler turns these into very short variable names, saving bytes wherever they are reused. +- Keep source code readable and check the compiled output and size after building to verify that a change actually saves bytes. +- Names in `overwriteOptions` and script attributes are public settings. Balance short names with readable, human-friendly names, using existing options and attributes as the reference (for example, `ignorePages` / `data-ignore-pages`). These names cannot be shortened by variable minification. + ## Testing - Execute `npm run test:unit` to run the unit tests diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index d48601d..1fdf6a5 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index d49fd42..eb9f74f 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/C/G,EAAIyI,QAAUH,IAAcvB,EAAK0B,MAAQnJ,GACzCU,EAAI0I,qBAAuBJ,IAAcvB,EAAK4B,KAAOrJ,GAGzD,IAAIsJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ5H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ7J,IAErB2I,IAAI,SAAUkB,GACb,OACErI,EAAuBqI,GACvB,IACArI,EAAuBmG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFlK,EAAiBmK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB9I,EAEzCiJ,GAAc,CAChBC,QA+oBJ,gBA9oBIH,SAAUC,IASZlK,EAAY,SAAUqK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJpK,EAAKoK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM7J,EACNuD,MAAOoG,EACPG,KAAMxJ,EAAIyJ,WAEZvK,EACAE,IAMJ4B,EACEtB,EACA,SAAUgK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ1I,IAC3CC,EAAU0K,EAAME,UAGpBvK,GAOF,IAwDIwK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOlL,EAAiBkL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCpL,EAAiBmL,cA9KvBC,GA+KjBpL,EAAiBmL,WACjBrG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC6K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBtD,EAAiBqL,cAAgB9K,GAI/B+K,GACFtL,EAAiBuL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhB6K,GAAcvG,EAChBjF,EAAiBwL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBjF,EAAiByL,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF1L,EAAiB0L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC1L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI4H,GAAUhM,EAAOgM,QACjBC,GACFhL,EAAIiL,WACJlM,EAAOmM,aACPnM,EAAOoM,aACPpM,EAAOqM,UACNL,KAAYA,GAAQM,QACrBtM,EAAOuM,YACPvM,EAAOwM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM1L,GAE3B,IAAIiJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAIwL,UAAYjM,EACvBsK,SAAUA,GACV4B,QAASH,GAAqB5F,KAASxG,EAGvCwM,WAAYtG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAmJ,GAAQsD,IAAMtM,EAIVkC,IACF8G,GAAQuD,OAASrK,EAAOqK,OACxBvD,GAAQwD,OAAS/K,EAAUS,EAAOsK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBiK,KAAoBhJ,IACtBmI,GAAQ0D,kBAAoB7L,IAGzB+J,IAAcpK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnB8I,IAED/J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIiK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYvI,EAAKxB,EAAe,aAGzBhC,EAAI+L,UAAY,IACrCxI,QAAQzD,EAAkBgJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAShI,EAAO2E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAngBnC,MAqgBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAASzM,EAAIgN,WAEf5E,GAASsE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOrL,KAAY/C,GAASwN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B5M,GAGF2B,EAAqBY,EAAUyK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBhM,EAAgBQ,IAAiB,EACxDyL,EAAS/G,KAAKuG,IAChBM,GAAKzL,IAAiB,EACtByL,GAAKxL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQxL,EAAgBmM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOnK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B+I,GAAW8C,KACX7L,EACEM,EACA,WACMyI,GAAW8C,OAAY9C,GAAW8C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa/M,EAAuBZ,EAAIyJ,UAC/C,MAAOxG,IACPhE,EAAKgE,IAGP,IAAI2K,EAAyB/O,EAAO2L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBnL,KAAK5D,EAAQ,CAAE2K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM9B,EAAYqK,GAAYnK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOpK,GAEX,OAAOC,EA0XH0O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBhK,EAAIgO,OAAMxE,GAAQxJ,EAAIgO,KAAK5J,MAAM,KAAK,IAErDoF,EAPLvK,EAAKuB,EAAiB,YAAcgJ,IAgDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD7K,EAAS4K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAc/J,MAAM,MACVmK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAIzL,EAA2B,aAAK,EAAGtC,EAAO4P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACHzL,EAAgBQ,IAAiB,EACjC9C,EAAO8P,aAAe,IACnB,MAILvJ,GAAsB,MACpBtF,EAAIsB,KAAWkH,GAAKlH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKsG,aAAezM,EAAO0M,MAC3BvG,GAAKwG,cAAgB3M,EAAOiL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOtG,IACPhE,EAAKgE,IAGPwK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAS/H,MA1uBH,KA0uBgB,GACtBlF,EACJsO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BlP,EAC3Bb,EAGJiJ,GAAK+G,OACH,QAAQnN,KAAKgK,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAM/J,EACNgK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MA7H1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASrM,GAC/CkM,KAAoBjD,GAAQoD,QAAU/F,MAE1C,IAAI+J,EAAcvG,GAAkBwE,KAChCgC,EAAQxI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM/J,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWsD,EAEXzN,IAgGE2N,CACEzB,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK1H,EAmBH6O,SAjBA,IACM/N,GAAUgF,GAAWhF,EAAOqO,sBAC9BrO,EACGqO,qBAAqB,CAAC/N,EAAcC,IACpC+N,KAAK,SAAUC,GACdzH,GAAQ0H,QAAUD,EAAkBjO,GACpCwG,GAAQ2H,WAAaF,EAAkBhO,GACvCwN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB3G,GAoBAiH,IAlBrB,WACL,IAEI9G,EAFAhF,EAAMhC,UACNiO,EAAKD,GAAK5N,MAAM8N,KAAMlM,GAY1B,OAVI6B,GAAWkK,OACb/G,EAAQ,IAAI+G,MAAMlH,KAIlBG,EAAQtJ,EAAIyQ,YAAY,UAClBC,UAAUvH,GAAMnK,EAASA,GAEjCsK,EAAMhH,UAAYgC,EAClB4L,GAAI5G,GACGiH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA8K,IAAuB,QAARH,IAAkB,iBAAkBnL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA8K,IAAa8D,KAEjBpP,EAAOkS,YAAc,SAAUvH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI6I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIsK,EAAkB3K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnD+C,SAAmBzH,EAEvB,GAAIsH,GAAWvJ,QAAQ0J,GAAa,IAAMD,EAExC,OADAnO,EAAeqH,GAAmB3K,EAAY,aAAe0R,GACtDhJ,IAGT,IACE,GAAI+I,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAWvJ,eAAe2J,GAAe,EAK3C,OAJArO,EACEqH,GACAV,EAAQ,uBAAyB0H,GAE5BjJ,IAETuB,EAAQ0H,GAEV,MAAOnO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI0N,EAAc,CAAE9H,KAAM9J,EAAWiK,MAAOA,GACxC4H,GAAa7D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUyK,GAEhC3H,GACFxB,GACE1D,EAAO6M,EAAa,CAClB/E,GAAI5G,KACJgK,MAAOxI,IAAgBoK,GACvBnF,UACGmF,GAAa9D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFoJ,GAAmB,SAAU7H,EAAO9C,EAAUuB,GAChD8I,GAAUvH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBmH,IAE9B,IAAIC,GAAY3S,EAAOuL,IAGnBqH,GAAQD,IAAaA,GAAUnK,EAAImK,GAAUnK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBmH,GAGVE,GACZvO,EAAQuO,GAAO/H,MACjBzF,MAAMC,QAAQuN,GAAM/H,KAChBuH,GAAUnO,MAAM,KAAM2O,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAGxB,MAAOsD,IACPhO,EAAUgO,IA7IY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CAu9BErL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index d48601d..1fdf6a5 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 7d67aee..45dc3ba 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 8dc894a..102803d 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3665; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 0713; v12) */ /* eslint-env browser */ (function ( @@ -142,6 +142,10 @@ if (logSettings) warn("Settings", overwriteOptions); + // A server-created initial pageview can be enriched by this script. + var pageLoadId = + overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); + // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") @@ -470,10 +474,12 @@ https: loc.protocol == https, timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, + page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, + session_id: collectMetricByString("se") + ? pageLoadId || uuid() + : undefinedVar, }); payload.sri = falseVar; @@ -551,6 +557,8 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -670,38 +678,39 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); + var originalId = pages === 0 ? pageLoadId : undefinedVar; + payload.page_id = + originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -724,6 +733,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && !lastSendPath && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; @@ -793,18 +809,18 @@ path: page.path, }); + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { @@ -939,6 +955,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && !lastSendPath && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + metadata = appendMetadata(metadata, eventParams); if (event) { diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f331c1b..a8a9280 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2fea; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 97df; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index e2232a8..e2f6cb6 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index f32008e..bf19cfd 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 1b6a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; da47; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,i="doNotTrack",h=f.navigator,d=f.location,v=d.host,a=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=a.currentScript||a.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var A=function(e){return"string"==typeof e},I=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||I(E,V)||"sa",C=e.strictUtm||"true"==I(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:$(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||I(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||I(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=$(J,{ua:o,https:d.protocol==n,timezone:T,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return g("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||I(E,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=$(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:m;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=$(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);A(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index a65fce3..d89fed7 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAIxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKtC,EAAIJ,KAAMI,EAAKoC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWrE,EAAOsE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKvE,GAAkB8D,OAG5D9D,EAAmBuD,EAAOvD,EAAkBoE,GAExCE,GAAapE,EAAK,WAAYF,GAGlC,IAAIwE,EACFxE,EAAiBwE,YAAcpB,EAAKb,EAAe,gBAUjDkC,GAFMC,KAAKC,IAEJ,WACT,IAAIC,EAAe7E,EAAO8E,QAAU9E,EAAO+E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,SAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF7F,EAAiB4F,IACjBxC,EAAKb,EAAeqD,IA2axB,KAjaME,EACF9F,EAAiB8F,WA3KJ,QA4Kb1C,EAAKb,EAAe,cAoClBwD,EAAiBF,EAAY,UACjC,GAnNc,GAmNV9F,EAAOgG,GAA4B,OAAO7F,EAAKgB,EAAa,SAChEnB,EAAOiG,iBApNO,EAqNdjG,EAAOgG,IArNO,EA4Nd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAO5C,EAAO+C,EAASC,EAAMJ,GAE/C1F,EAAI+F,QAAUH,IAAcF,EAAKK,OA/NzB,GAgOR/F,EAAIgG,qBAAuBJ,IAAcF,EAAKO,MAhOtC,IAmOA,IAAIC,OACVC,IACJhF,EACA,eACAqC,OAAOM,KAAK4B,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB+E,EAAKW,MAG/BE,KAAK,KACR,SACAtC,KAAKC,OAILsC,EACFjH,EAAiBkH,UAAY9D,EAAKb,EAAe,YAC/C4E,EAAkBF,GAAuBpG,EAEzCuG,EAAc,CAChBC,QA+UJ,kBA9UIH,SAAUC,GAeDnH,EAAiBsH,MAAQlE,EAAKb,EAAe,QAYxD,IAEE0D,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOpC,IACPpF,EAAKoF,IAQGjD,IAMD+E,EAAYO,KA7SP,GA+Sd,IAAIrB,EAAU/C,EAAO6D,EAAa,CAEhCQ,GAAkC3G,EAElCZ,MAAOM,EAAIkH,UAAYxH,EACvB4F,SAAUA,EACV6B,QAAStD,GAAoCC,IAG7CsD,WACIvD,GAAcC,MAyBpB,GArBA6B,EAAQ0B,KA5TO,EAgUXjG,IACFuE,EAAQ2B,OAASlG,EAAOkG,OACxB3B,EAAQ4B,OAAS1G,EAAUO,EAAOmG,SAWhCf,IAAoBtG,IACtByF,EAAQ6B,kBAAoBtH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EAnUYgB,4BAoUAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBuH,QAAQ,OACxB,aAAa9F,KAAKzB,IACnBoG,GAED/G,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACIkG,EADA9B,EAAO,GAiBP+B,GAXAtI,EAAiBsI,UAAYlF,EAAKb,EAAe,aAGzBxB,EAAIuH,UAAY,IACrCrD,QAAQpE,EAAkBsG,GAC1BlC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS9E,EAcjCoI,EAAc,SAAUC,EAAIC,GAG9B,GAFI,GAEAjE,GAAe6D,GAAiBK,IAApC,CAEA,IAAIC,EAASpF,EAAO6D,EAAa,CAC/BwB,KAAM,SACNC,YAAaJ,EAAOD,EAAKlC,EAAQwB,UAKnC,GAAIW,IAAShI,EAAIqI,WAEf5C,EAASyC,EAAQxI,GAjZP,QAmZV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEP9C,EAASyC,EAAQxI,GAvZT,MA6ZduB,EA3Xe,WA2XgB6G,GA5ZhB,GAmaf,IAoDIU,EAAUC,EApDVR,EAAU,SAAUS,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa7H,EAAuBX,EAAI0I,UAC/C,MAAO/D,IACPpF,EAAKoF,IAMP,OAAO8D,GAMLE,EAAkB,SACpBC,EACAC,EACAP,EACAQ,EACAC,GAEIH,GAAahB,EAAY,GAAKjC,EAAQwB,SA/b9B,GAgcZ,IAAI6B,EAAuB,IAAVvH,EAAcoC,EAAarE,EAC5CmG,EAAQwB,QACN6B,GAAoClF,IAEtC,IAnR6BmF,EAmRzBC,EAAc1C,EAAkBZ,EAAK6C,KACrCU,GApRyBF,EAoRFJ,GAAkBC,GAnRjB9I,EAAI8I,QAC7B9G,MAAM,GACNoH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCnE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKxD,KAAK0H,KAEpChD,KAAK,MAEI7G,GA+PRgG,EAAO5C,EAAOgD,EAAM,CACtBiC,GAAIlC,EAAQwB,QACZA,QAASxB,EAAQwB,QACjBe,YAAac,EACbf,KAAMe,EAAa,SAvcJ,WAwcfrB,UAAWkB,GAAoBP,EAAWX,EAAW,KACrDwB,MAAOA,IAQT,OAHAxB,EAAWuB,EAEXzH,IACO+D,IAKM,SACboD,EACAW,EACAR,EACAS,IAEKA,GAAezE,EAAWgE,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS3E,EAAWyE,GAEtBjH,EAASgH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcH,MAAM,MACVO,QACtBF,EAAc,IAAMC,EAAMrD,KAAK,MAGjC,IAAIoC,EAAOV,EAAQwB,GAUnB,GARKd,GAASf,IAAgB7D,IAE5B8B,EAAQwB,QAA+BrD,IACnC6B,EAAQyB,aAAevD,IAAY8B,EAAQyB,WAAatD,KAC5DD,EAAarE,GAIViJ,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf7C,EAAK6C,KAAOA,EAKN3I,EAAIoB,KAAW0E,EAAK1E,GAAYpB,EAAIoB,IAK1C,IAII0I,EAJAC,EAAOzK,EAAO0K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG9B,KAC/D,MAAOtD,IACPpF,EAAKoF,IAGP4D,EAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB9B,MAGxCK,IAAWX,GACPA,EAASyB,MAhhBH,KAghBgB,IAAMlJ,EAKhC,IACI+J,EAAetB,EACjBC,EAFWA,GAAeL,IAAiB,EAI3CD,EACAmB,GAIES,EAAsB,WACxB1J,GAriBU,EAsiBV+E,EAAS0E,IAGX,GAAKzJ,EAmBH0J,SAjBA,IACM9I,GAAU2D,EAAW3D,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACd1E,EAAQ2E,QAAUD,EAAkB/I,GACpCqE,EAAQ4E,WAAaF,EAAkB9I,GACvC2I,MAEDM,SAAMN,GAETA,IAEF,MAAO7B,GACP6B,MASNO,GAEA,MAAOpC,IACP9I,EAAK8I,KAxlBT,CA2lBEjJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 67ce58b..a8581bf 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3faa; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 3b46; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index f859b43..2f0b9bc 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index b9dc364..9809640 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e718) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; aa6b) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){ee=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");ee!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QA+oBJ,eA9oBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM9J,EACNwD,MAAOoG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBrG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC8K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBvD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhB8K,GAAcvG,EAChBlF,EAAiByL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBlF,EAAiB0L,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF3L,EAAiB2L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI4H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBuK,SAAUA,GACV2B,QAASF,GAAqB5F,KAASzG,EAGvCwM,WAAYrG,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAoJ,GAAQqD,IAAMtM,EAIVmC,IACF8G,GAAQsD,OAASpK,EAAOoK,OACxBtD,GAAQuD,OAAS/K,EAAUU,EAAOqK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQyD,kBAAoB7L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIgK,GA0DAC,GA3DA1D,GAAO,GAGP2D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYtI,EAAKxB,EAAe,aAGzBjC,EAAI+L,UAAY,IACrCvI,QAAQ1D,EAAkBiJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS/H,EAAO2E,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQmD,UAenC,GAXIpG,GAAsB,OACxBmH,EAAOE,SAAWpG,KAAKqG,OAAOlH,KAAQsE,GAAQqC,IAngBnC,MAqgBbA,GAAW,EACXrC,GAAQtE,KAGJJ,GAAsB,UACxBmH,EAAOxC,SAAW1D,KAAKsG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAASzM,EAAIgN,WAEf3E,GAASqE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP7E,GAASqE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOpL,KAAYhD,GAASwN,KAClCJ,GAAcxG,MACT2G,IAAY3G,KAAQwG,IAE7B5M,GAGF2B,EAAqBa,EAAUwK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB/L,EAAgBQ,IAAiB,EACxDwL,EAAS9G,KAAKsG,IAChBM,GAAKxL,IAAiB,EACtBwL,GAAKvL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAK+G,IACV,IAKI,EAJJ/G,KAAKqG,MACF,MAAQvL,EAAgBkM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOlK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BgJ,GAAW6C,KACX7L,EACEO,EACA,WACMyI,GAAW6C,OAAY7C,GAAW6C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAa/M,EAAuBZ,EAAI0J,UAC/C,MAAOxG,IACPjE,EAAKiE,IAGP,IAAI0K,EAAyB/O,EAAO4L,IACpC,GAAIjE,GAAWoH,GACb,IACEnE,EAAOmE,EAAuBlL,KAAK7D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIsD,EAAgBtD,GAAY9C,GAChC,GAAKoG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIjE,OACF,IAAM9B,EAAYoK,GAAYlK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOrK,GAEX,OAAOC,EA0XH0O,CAAatE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIgO,OAAMvE,GAAQzJ,EAAIgO,KAAK3J,MAAM,KAAK,IAErDoF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAgDpCwE,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFlG,EAAW5B,GAAW4H,GAAeA,EAAc,aAEnD5K,EAAS2K,KAAgD,EAA9BA,EAAczG,QAAQ,OAGnDyG,GADIG,EAAQH,EAAc9J,MAAM,MACVkK,QACtBF,EAAc,IAAMC,EAAMvG,KAAK,MAGjC,IAAI0B,EAAOiE,GAAQS,GAGnB,GAAK1E,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKiG,eACHlI,KAAKsG,IAAIxL,EAA2B,aAAK,EAAGvC,EAAO4P,YAAc,IACjE,KACFlG,GAAKmG,gBACHpI,KAAKsG,IACHxL,EAAgBQ,IAAiB,EACjC/C,EAAO8P,aAAe,IACnB,MAILtJ,GAAsB,MACpBvF,EAAIuB,KAAWkH,GAAKlH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKqG,aAAexM,EAAOyM,MAC3BtG,GAAKuG,cAAgB1M,EAAOgL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAOtG,IACPjE,EAAKiE,IAGPuK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrH,QAAQqH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxH,QAAQsH,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BjD,GAC1BA,GAAS9H,MA1uBH,KA0uBgB,GACtBnF,EACJsO,GAAWrB,IACgD,EAAvD3B,GAAmB9C,QAAQ0H,IAC3BA,GAA2BlP,EAC3Bb,EAGJkJ,GAAK8G,OACH,QAAQlN,KAAK+J,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP3G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI6F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBpI,GAAsB,MA7H1C,SACjB6I,EACAsB,EACAhC,EACAjG,EACAV,EACAuB,GAEI8F,GAAa7B,GAAY,GAAK/D,GAAQmD,QAASrM,GAC/CmM,KAAoBjD,GAAQmD,QAAU9F,MAE1C,IAAI8J,EAActG,GAAkBuE,KAChCgC,EAAQvI,GAAeqI,EAAkBjI,GAE7CY,GACE,CACEmE,GAAIhE,GAAQmD,QACZjC,KAAMhK,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPvK,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFmF,GAAmBpB,GACnBA,GAAWsD,EAEXxN,IAgGE0N,CACEzB,EACAqB,EACA/B,GACAa,EACAxH,EACAuB,IAIJ,GAAK3H,EAmBH6O,SAjBA,IACM9N,GAAUgF,GAAWhF,EAAOoO,sBAC9BpO,EACGoO,qBAAqB,CAAC9N,EAAcC,IACpC8N,KAAK,SAAUC,GACdxH,GAAQyH,QAAUD,EAAkBhO,GACpCwG,GAAQ0H,WAAaF,EAAkB/N,GACvCuN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAhF,EAAMhC,UACNgO,EAAKD,GAAK3N,MAAM6N,KAAMjM,GAY1B,OAVI6B,GAAWiK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQvJ,EAAIyQ,YAAY,UAClBC,UAAUtH,GAAMpK,EAASA,GAEjCuK,EAAMhH,UAAYgC,EAClB2L,GAAI3G,GACGgH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA+K,IAAa6D,KAEjBpP,EAAOkS,YAAc,SAAUtH,EAAM5C,EAAUuB,GAC7C6F,GAAS,EAAGxE,EAAM5C,EAAUuB,IAQ9B,IAAI4I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUtH,EAAO9C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWmD,GAC7BvB,EAAW5B,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmBxH,EAEvB,GAAIqH,GAAWtJ,QAAQyJ,GAAa,IAAMD,EAExC,OADAlO,EAAeqH,GAAmB5K,EAAY,aAAe0R,GACtD/I,IAGT,IACE,GAAI8I,EAAiB,CACnB,IAAIE,EAAczH,IAClB,GAAIqH,GAAWtJ,eAAe0J,GAAe,EAK3C,OAJApO,EACEqH,GACAV,EAAQ,uBAAyByH,GAE5BhJ,IAETuB,EAAQyH,GAEV,MAAOlO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIyN,EAAc,CAAE7H,KAAM/J,EAAWkK,MAAOA,GACxC2H,GAAa7D,IAAiBxL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUwK,GAEhC1H,GACFxB,GACE1D,EAAO4M,EAAa,CAClB/E,GAAI3G,KACJ+J,MAAOvI,IAAgBmK,GACvBnF,UACGmF,GAAa9D,KAAanI,GAAsB,KAC7CkI,GACA,KAEN1G,SAAU/F,EAAU+F,KAEtBuB,IAKFmJ,GAAmB,SAAU5H,EAAO9C,EAAUuB,GAChD6I,GAAUtH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBkH,IAE9B,IAAIC,GAAY3S,EAAOwL,IAGnBoH,GAAQD,IAAaA,GAAUlK,EAAIkK,GAAUlK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBkH,GAGVE,GACZtO,EAAQsO,GAAO9H,MACjBzF,MAAMC,QAAQsN,GAAM9H,KAChBsH,GAAUlO,MAAM,KAAM0O,GAAM9H,KAC5BsH,GAAUQ,GAAM9H,MAGxB,MAAOqD,IACPhO,EAAUgO,IA7IY,IAAUxD,GACxBkH,GArnBkBvG,GAnN9B,CAu9BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 57f7f5d..7eeed93 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 4ae9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 07eb; v12) */ /* eslint-env browser */ (function ( @@ -142,6 +142,10 @@ if (logSettings) warn("Settings", overwriteOptions); + // A server-created initial pageview can be enriched by this script. + var pageLoadId = + overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); + // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( overwriteOptions.ignoreMetrics || attr(scriptElement, "ignore-metrics") @@ -470,10 +474,12 @@ https: loc.protocol == https, timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, + page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, + session_id: collectMetricByString("se") + ? pageLoadId || uuid() + : undefinedVar, }); payload.sri = falseVar; @@ -551,6 +557,8 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -670,38 +678,39 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); + var originalId = pages === 0 ? pageLoadId : undefinedVar; + payload.page_id = + originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + k: k, + + metadata: stringify(metadata), + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -724,6 +733,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && !lastSendPath && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; @@ -793,18 +809,18 @@ path: page.path, }); + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { @@ -939,6 +955,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && !lastSendPath && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + metadata = appendMetadata(metadata, eventParams); if (event) { diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d4e8c8e..b523c06 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; dbab; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; cd80; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){ee=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");ee!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 8f61160..29b64bd 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 5f98; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 3731; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(q,V)||"sa",C=e.strictUtm||"true"==A(q,"strict-utm"),T=B+"_loaded";if(1==f[T])return m(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(q,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||A(q,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){m(ee)}E&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:F,page_id:N||R(),session_id:N||R()});if(M.sri=!1,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||m("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(q,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){m(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:g;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);x(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index a428f09..4185b7f 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ac4d; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 606e; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},oe=function(e){return"function"==typeof e},ce="namespace",se=e[ce]||J(z,ce)||"sa",ue=function(e,t){var n=g[se+"_metadata"];Z(n)&&(e=K(e,n));var r=g[Me];if(!oe(r))return Me&&m(Me+" not found, set window."+Me),e;try{return K(e,r.call(g,K(e,t)))}catch(a){F("metadata",a)}},le=e.strictUtm||J(z,"strict-utm")==r,pe=function(i,e){ee=!i&&re("q")?"":_;var t=(e||s.search).slice(1).split("&").filter(function(e){var t=e.indexOf("=");ee!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js index 8fc14a1..88e5d43 100644 --- a/dist/v12/auto-events.js +++ b/dist/v12/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; SRI-version; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,O=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",x=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,R="client"+$,I="pagehide",P="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 4cd0921..591ef34 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js index 8fc14a1..88e5d43 100644 --- a/dist/v12/custom/auto-events.js +++ b/dist/v12/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e658; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-27; e658; SRI-version; v12) */ function r(t,e){var n,o;t.hasAttribute("data-simple-event")||(n=!1,b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(b.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?n="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==h.location.hostname?n="outbound":b.emails&&/^mailto:/i.test(t.href)?n="email":b.phones&&/^tel:/i.test(t.href)&&(n="phone"),n&&(e?(o="saAutomatedLink(this, '"+n+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.addEventListener("click",function(){g(this,n)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(f,e,t,g){try{var m=undefined,n="https:",r=f.console,i="doNotTrack",h=f.navigator,d=f.location,v=d.host,a=f.document,o=h.userAgent,c="Not sending request ",y=!1,s=encodeURIComponent,p=decodeURIComponent,u=JSON.stringify,l=f.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=h.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=0,x=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=a.currentScript||a.querySelector('script[src*="'+t+'"]');g=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var A=function(e){return"string"==typeof e},I=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||I(E,V)||"sa",C=e.strictUtm||"true"==I(E,"strict-utm"),H=B+"_loaded";if(1==f[H])return g(c+"twice");f.sa_event_loaded=!0,f[H]=!0;var T,F=function(t,e,n){t=n?t:$(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=m}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||I(E,"hostname"),z=L||v,J={version:"custom_light_12",hostname:z};e.mode||I(E,"mode");try{T=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){g(ee)}x&&(J.bot=!0);var M=$(J,{ua:o,https:d.protocol==n,timezone:T,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return g("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||g("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||I(E,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||m,K=function(e,t){if(0,!N||P||X()){var n=$(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)F(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){F(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){g(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:m;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||m),p=$(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);A(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 4563a96..61f93a0 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index e8c6791..eb54145 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 6f40; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 070d; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(g,t,e,n,m){try{var v=undefined,y=!0,_=!1,r="true",a="https:",w="pageview",u="event",i="error",o=g.console,c="doNotTrack",b=g.navigator,s=g.location,x=s.host,l=g.document,p=b.userAgent,d="Not sending request ",f=d+"when ",O=_,h=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=g.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=b.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",I="platform",T="platformVersion",U="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=g.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},L=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ot=function(t){return"function"==typeof t},ct="namespace",st=t[ct]||J(z,ct)||"sa",ut=function(t,e){var n=g[st+"_metadata"];Z(n)&&(t=K(t,n));var r=g[qt];if(!ot(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(g,K(t,e)))}catch(a){F("metadata",a)}},lt=t.strictUtm||J(z,"strict-utm")==r,pt=function(i,t){tt=!i&&rt("q")?"":_;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==_&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index fe419aa..cba0523 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n // Manual collection may not have declared an allowed pageview yet.\n if (pageLoadId && !lastSendPath && !getPath()) {\n eventParams.page_id = undefinedVar;\n eventParams.session_id = undefinedVar;\n }\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","pageLoadId","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","getPath","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","pageviewData","deleteSourceInfo","originalId","currentPage","query","preparePageView","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 5ad37a9..ce99a39 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 12b3; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-06; 0ed5; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),U=function(e){return"function"==typeof e},V="namespace",B=e[V]||A(q,V)||"sa",C=e.strictUtm||"true"==A(q,"strict-utm"),T=B+"_loaded";if(1==f[T])return m(c+"twice");f.sa_event_loaded=!0,f[T]=!0;var F,H=function(t,e,n){t=n?t:I(M,Z,t),h.brave&&!n&&(t.brave=!0),h._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=g}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},L=e.hostname||A(q,"hostname"),z=L||v,J={version:"cdn_light_12",hostname:z};e.mode||A(q,"mode");try{F=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(ee){m(ee)}E&&(J.bot=!0);var M=I(J,{ua:o,https:d.protocol==n,timezone:F,page_id:N||R(),session_id:N||R()});if(M.sri=!0,w&&(M.mobile=w.mobile,M.brands=u(w.brands)),z!==v&&(M.hostname_original=v),i in h&&"1"==h[i])return m("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=v.indexOf(".")&&!/^[0-9.:]+$/.test(v)||L||m("Set hostname on "+v+". See "+j+"/overwrite-domain-name");var P,Z={},G=(e.referrer||A(q,"referrer")||a.referrer||"").replace(v,z).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||g,K=function(e,t){if(0,!N||P||X()){var n=I(J,{type:"append",original_id:t?e:M.page_id});if(t||!h.sendBeacon)H(n,0,!0);else try{h.sendBeacon.bind(h)(_+"/append",u(n))}catch(r){H(n,0,!0)}}};l("pagehide",K,!1);var Q,W,X=function(e){var t="";try{t=e||p(d.pathname)}catch(ee){m(ee)}return t},Y=function(e,t,n,r,i){e&&K(""+M.page_id,!0);var a=0===k?N:g;M.page_id=a||R();var o,c=z+Z.path,s=(o=t,(r||d.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(C?"":"?")+"(source|medium|content|term|campaign)"+(C?"":"|ref")+")=","i").test(e)}).join("&")||g),p=I(Z,{id:M.page_id,page_id:M.page_id,original_id:a,type:a?"append":"pageview",referrer:!t||n?G:null,query:s});return G=c,k++,p};!function(e,t,n,r){!r&&U(n)&&(r=n);var i,a;U(r);x(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // A server-created initial pageview can be enriched by this script.\n var pageLoadId =\n overwriteOptions.pageLoadId || attr(scriptElement, \"page-load-id\");\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar),\n\n // se = sessions\n session_id: collectMetricByString(\"se\")\n ? pageLoadId || uuid()\n : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n // Don't enrich an ignored server page before an allowed manual pageview.\n if (pageLoadId && !lastSendPath && !getPath()) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Capture each accepted pageview before waiting for client hints.\n var preparePageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n var originalId = pages === 0 ? pageLoadId : undefinedVar;\n payload.page_id =\n originalId || (collectDataOnLeave ? uuid() : undefinedVar);\n\n var currentPage = definedHostname + page.path;\n var query = getQueryParams(deleteSourceInfo, search);\n\n var data = assign(page, {\n id: payload.page_id,\n page_id: payload.page_id,\n original_id: originalId,\n type: originalId ? \"append\" : pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n return data;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n if (!path && !lastSendPath && pageLoadId) {\n // An ignored initial page must not receive event or leave enrichment.\n payload.page_id = collectDataOnLeave ? uuid() : undefinedVar;\n if (payload.session_id === pageLoadId) payload.session_id = uuid();\n pageLoadId = undefinedVar;\n }\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var delSrc = isPushState || userNavigated || !collectMetricByString(\"r\");\n var pageviewData = preparePageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata\n );\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendData(pageviewData, callback);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","pageLoadId","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","getPath","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","overwrite","path","pathname","preparePageView","isPushState","deleteSourceInfo","search","metadata","originalId","ignoreSource","currentPage","query","split","keyValue","RegExp","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","pageviewData","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAKtB,KAAe,WAAWsB,KAAKtB,GAIxDuB,EACFzB,EAAI0B,eAAiB1B,EAAI2B,cAAc,gBAAkBzC,EAAU,MAOrEC,EAAO,WAEL,IAAIyC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKvC,EAAIJ,KAAMI,EAAKqC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWtE,EAAOuE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKxE,GAAkB+D,OAG5D/D,EAAmBwD,EAAOxD,EAAkBqE,GAExCE,GAAarE,EAAK,WAAYF,GAGlC,IAAIyE,EACFzE,EAAiByE,YAAcpB,EAAKb,EAAe,gBAUjDkC,GAFMC,KAAKC,IAEJ,WACT,IAAIC,EAAe9E,EAAO+E,QAAU/E,EAAOgF,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,SAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF9F,EAAiB6F,IACjBxC,EAAKb,EAAeqD,IA2axB,KAjaME,EACF/F,EAAiB+F,WA3KJ,QA4Kb1C,EAAKb,EAAe,cAoClBwD,EAAiBF,EAAY,UACjC,GAnNc,GAmNV/F,EAAOiG,GAA4B,OAAO9F,EAAKgB,EAAa,SAChEnB,EAAOkG,iBApNO,EAqNdlG,EAAOiG,IArNO,EA4Nd,IA4DIE,EA5DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAO5C,EAAO+C,EAASC,EAAMJ,GAE/C3F,EAAIgG,QAAUH,IAAcF,EAAKK,OA/NzB,GAgORhG,EAAIiG,qBAAuBJ,IAAcF,EAAKO,MAhOtC,IAmOA,IAAIC,OACVC,IACJjF,EACA,eACAsC,OAAOM,KAAK4B,GACTU,OAAO,SAAUC,GAChB,OAAOX,EAAKW,IAAQ5G,IAErB6G,IAAI,SAAUD,GACb,OACE3F,EAAuB2F,GACvB,IACA3F,EAAuBgF,EAAKW,MAG/BE,KAAK,KACR,SACAtC,KAAKC,OAILsC,EACFlH,EAAiBmH,UAAY9D,EAAKb,EAAe,YAC/C4E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QA+UJ,eA9UIH,SAAUC,GAeDpH,EAAiBuH,MAAQlE,EAAKb,EAAe,QAYxD,IAEE0D,EACIsB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOpC,IACPrF,EAAKqF,IAQGjD,IAMD+E,EAAYO,KA7SP,GA+Sd,IAAIrB,EAAU/C,EAAO6D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvB6F,SAAUA,EACV4B,QAASrD,GAAoCC,IAG7CqD,WACItD,GAAcC,MAyBpB,GArBA6B,EAAQyB,KA7TM,EAiUVhG,IACFuE,EAAQ0B,OAASjG,EAAOiG,OACxB1B,EAAQ2B,OAAS1G,EAAUQ,EAAOkG,SAWhCd,IAAoBvG,IACtB0F,EAAQ4B,kBAAoBtH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EAnUYgB,4BAoUAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiBuH,QAAQ,OACxB,aAAa7F,KAAK1B,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIiG,EADA7B,EAAO,GAiBP8B,GAXAtI,EAAiBsI,UAAYjF,EAAKb,EAAe,aAGzBzB,EAAIuH,UAAY,IACrCpD,QAAQrE,EAAkBuG,GAC1BlC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS/E,EAcjCoI,EAAc,SAAUC,EAAIC,GAG9B,GAFI,GAEAhE,GAAe4D,GAAiBK,IAApC,CAEA,IAAIC,EAASnF,EAAO6D,EAAa,CAC/BuB,KAAM,SACNC,YAAaJ,EAAOD,EAAKjC,EAAQuB,UAKnC,GAAIW,IAAShI,EAAIqI,WAEf3C,EAASwC,EAAQxI,GAjZP,QAmZV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEP7C,EAASwC,EAAQxI,GAvZT,MA6ZduB,EA3Xe,WA2XgB6G,GA5ZhB,GAmaf,IAoDIU,EAAUC,EApDVR,EAAU,SAAUS,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa7H,EAAuBX,EAAI0I,UAC/C,MAAO9D,IACPrF,EAAKqF,IAMP,OAAO6D,GAMLE,EAAkB,SACpBC,EACAC,EACAP,EACAQ,EACAC,GAEIH,GAAahB,EAAY,GAAKhC,EAAQuB,SA/b9B,GAgcZ,IAAI6B,EAAuB,IAAVtH,EAAcoC,EAAatE,EAC5CoG,EAAQuB,QACN6B,GAAoCjF,IAEtC,IAnR6BkF,EAmRzBC,EAAczC,EAAkBZ,EAAK4C,KACrCU,GApRyBF,EAoRFJ,GAAkBC,GAnRjB9I,EAAI8I,QAC7B7G,MAAM,GACNmH,MAAM,KACNjD,OAAO,SAAUkD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACClE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKxD,KAAKyH,KAEpC/C,KAAK,MAEI9G,GA+PRiG,EAAO5C,EAAOgD,EAAM,CACtBgC,GAAIjC,EAAQuB,QACZA,QAASvB,EAAQuB,QACjBe,YAAac,EACbf,KAAMe,EAAa,SAvcJ,WAwcfrB,UAAWkB,GAAoBP,EAAWX,EAAW,KACrDwB,MAAOA,IAQT,OAHAxB,EAAWuB,EAEXxH,IACO+D,IAKM,SACbmD,EACAW,EACAR,EACAS,IAEKA,GAAexE,EAAW+D,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS1E,EAAWwE,GAEtBhH,EAAS+G,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcH,MAAM,MACVO,QACtBF,EAAc,IAAMC,EAAMpD,KAAK,MAGjC,IAAImC,EAAOV,EAAQwB,GAUnB,GARKd,GAASf,IAAgB5D,IAE5B8B,EAAQuB,QAA+BpD,IACnC6B,EAAQwB,aAAetD,IAAY8B,EAAQwB,WAAarD,KAC5DD,EAAatE,GAIViJ,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf5C,EAAK4C,KAAOA,EAKN3I,EAAIqB,KAAW0E,EAAK1E,GAAYrB,EAAIqB,IAK1C,IAIIyI,EAJAC,EAAOzK,EAAO0K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG9B,KAC/D,MAAOrD,IACPrF,EAAKqF,IAGP2D,EAAgBqB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB9B,MAGxCK,IAAWX,GACPA,EAASyB,MAhhBH,KAghBgB,IAAMlJ,EAKhC,IACI+J,EAAetB,EACjBC,EAFWA,GAAeL,IAAiB,EAI3CD,EACAmB,GAIES,EAAsB,WACxB1J,GAriBU,EAsiBVgF,EAASyE,IAGX,GAAKzJ,EAmBH0J,SAjBA,IACM7I,GAAU2D,EAAW3D,EAAO8I,sBAC9B9I,EACG8I,qBAAqB,CAAC5I,EAAcC,IACpC4I,KAAK,SAAUC,GACdzE,EAAQ0E,QAAUD,EAAkB9I,GACpCqE,EAAQ2E,WAAaF,EAAkB7I,GACvC0I,MAEDM,SAAMN,GAETA,IAEF,MAAO7B,GACP6B,MASNO,GAEA,MAAOpC,IACP9I,EAAK8I,KAxlBT,CA2lBEjJ,OACA,uBACA"} \ No newline at end of file diff --git a/package.json b/package.json index 639b29a..976f799 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "pretest": "pnpm run build:testing", "test": "node -r dotenv/config ./test/index.js", "test:matrix": "mocha test/helpers/get-browsers.test.js", + "test:unit": "mocha 'test/unit/*.test.js'", "test:deploy": "node --test test/deploy.test.mts", "posttest": "pnpm run build", "typecheck": "tsc --noEmit" @@ -39,16 +40,16 @@ "devDependencies": { "@types/node": "24.13.3", "acorn": "^8.18.0", - "browserstack-local": "^1.5.1", - "chai": "^4.2.0", + "browserstack-local": "^1.5.14", + "chai": "^4.5.0", "dotenv": "^8.2.0", - "eslint": "^6.7.2", + "eslint": "^8.57.1", "esprima": "^4.0.1", - "handlebars": "^4.7.6", - "mocha": "^6.2.3", - "nodemon": "^1.19.4", - "request": "^2.88.0", - "selenium-webdriver": "^4.3.1", + "handlebars": "^4.7.9", + "jsdom": "^26.1.0", + "mocha": "^12.0.2", + "nodemon": "^3.1.14", + "selenium-webdriver": "4.3.1", "typescript": "7.0.2", "uglify-js": "^3.9.4", "uuid-validate": "0.0.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e88fece..d5cffbd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + minimist@<1.2.6: ^1.2.8 + minimatch@<3.1.4: ^3.1.4 + brace-expansion@<1.1.18: ^1.1.18 + importers: .: @@ -19,34 +24,34 @@ importers: specifier: ^8.18.0 version: 8.18.0 browserstack-local: - specifier: ^1.5.1 - version: 1.5.1(supports-color@5.5.0) + specifier: ^1.5.14 + version: 1.5.14(supports-color@5.5.0) chai: - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^4.5.0 + version: 4.5.0 dotenv: specifier: ^8.2.0 version: 8.2.0 eslint: - specifier: ^6.7.2 - version: 6.7.2(supports-color@5.5.0) + specifier: ^8.57.1 + version: 8.57.1(supports-color@5.5.0) esprima: specifier: ^4.0.1 version: 4.0.1 handlebars: - specifier: ^4.7.6 - version: 4.7.6 + specifier: ^4.7.9 + version: 4.7.9 + jsdom: + specifier: ^26.1.0 + version: 26.1.0(supports-color@5.5.0) mocha: - specifier: ^6.2.3 - version: 6.2.3 + specifier: ^12.0.2 + version: 12.0.2 nodemon: - specifier: ^1.19.4 - version: 1.19.4 - request: - specifier: ^2.88.0 - version: 2.88.0 + specifier: ^3.1.14 + version: 3.1.14 selenium-webdriver: - specifier: ^4.3.1 + specifier: 4.3.1 version: 4.3.1 typescript: specifier: 7.0.2 @@ -60,11 +65,8 @@ importers: packages: - '@babel/code-frame@7.5.5': - resolution: {integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==} - - '@babel/highlight@7.5.0': - resolution: {integrity: sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} '@clack/core@1.4.3': resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} @@ -74,15 +76,80 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@types/node@24.13.3': resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -203,18 +270,16 @@ packages: cpu: [x64] os: [win32] + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - acorn-jsx@5.1.0: - resolution: {integrity: sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 - - acorn@7.1.1: - resolution: {integrity: sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} @@ -225,260 +290,121 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - ajv@6.10.2: - resolution: {integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==} - - ansi-align@2.0.0: - resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} - ansi-colors@3.2.3: - resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} - engines: {node: '>=6'} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansi-escapes@4.3.0: - resolution: {integrity: sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@3.0.0: - resolution: {integrity: sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==} - engines: {node: '>=4'} - - ansi-regex@4.1.0: - resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} - engines: {node: '>=6'} - - ansi-regex@5.0.0: - resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - - asn1@0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - - astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - - async-each@1.0.3: - resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.9.1: - resolution: {integrity: sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==} - balanced-match@1.0.0: resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} - base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - boxen@1.3.0: - resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} - engines: {node: '>=4'} + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserstack-local@1.5.1: - resolution: {integrity: sha512-T/wxyWDzvBHbDvl7fZKpFU7mYze6nrUkBhNy+d+8bXBqgQX10HTYvajIGO0wb49oGSLCPM0CMZTV/s7e6LF0sA==} - - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} + browserstack-local@1.5.14: + resolution: {integrity: sha512-JOoqBIcs3PbtnsBAyEx1kKDAXAnveBgY4A5m9NWUzj0UyXugmi4Ac9xsUjDT8lAfuzPiSzNbtwvH8RSG8xlBmg==} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - capture-stack-trace@1.0.1: - resolution: {integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==} - engines: {node: '>=0.10.0'} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - chai@4.2.0: - resolution: {integrity: sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - - chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - - ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - - cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-width@2.2.0: - resolution: {integrity: sha512-EJLbKSuvHTrVRynOXCYFTbQKZOFXWNe3/6DN1yrEH3TuuZT1x4dMQnCHnfCrBUUiGjO63enEIfaB17VaRl2d4A==} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} - cliui@5.0.0: - resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - configstore@3.1.2: - resolution: {integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==} - engines: {node: '>=4'} - - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - create-error-class@3.0.2: - resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} - engines: {node: '>=0.10.0'} - - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - - crypto-random-string@1.0.0: - resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} - engines: {node: '>=4'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} - debug@3.2.6: - resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -486,167 +412,77 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decode-uri-component@0.2.0: - resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} - engines: {node: '>=0.10'} - - deep-eql@3.0.1: - resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} - engines: {node: '>=0.12'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} deep-is@0.1.3: resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} - define-properties@1.1.3: - resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} - engines: {node: '>= 0.4'} - - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dot-prop@4.2.0: - resolution: {integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==} - engines: {node: '>=4'} - dotenv@8.2.0: resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} engines: {node: '>=8'} - duplexer3@0.1.4: - resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es-abstract@1.17.6: - resolution: {integrity: sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - eslint-scope@5.0.0: - resolution: {integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==} - engines: {node: '>=8.0.0'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - eslint-utils@1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@1.1.0: - resolution: {integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==} - engines: {node: '>=4'} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@6.7.2: - resolution: {integrity: sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - espree@6.1.2: - resolution: {integrity: sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==} - engines: {node: '>=6.0.0'} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.0.1: - resolution: {integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==} - engines: {node: '>=0.6'} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} - esrecurse@4.2.1: - resolution: {integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==} + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - - execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-json-stable-stringify@2.0.0: resolution: {integrity: sha512-eIgZvM9C3P05kg0qxfqaVU6Tma4QedCPIByQOcemV0vju8ot3cS2DpHi4m2G2JvbSMI152rjfLX0p1pkSdyPlQ==} @@ -663,185 +499,104 @@ packages: fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - figures@3.1.0: - resolution: {integrity: sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==} - engines: {node: '>=8'} - - file-entry-cache@5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - flat-cache@2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - - flat@4.1.0: - resolution: {integrity: sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==} - deprecated: Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1. - hasBin: true + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} - flatted@2.0.1: - resolution: {integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} - from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - - glob-parent@5.1.0: - resolution: {integrity: sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@7.1.3: - resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - globals@12.3.0: - resolution: {integrity: sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - got@6.7.1: - resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} - engines: {node: '>=4'} - - graceful-fs@4.2.1: - resolution: {integrity: sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handlebars@4.7.6: - resolution: {integrity: sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} hasBin: true - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.3: - resolution: {integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - has-symbols@1.0.1: - resolution: {integrity: sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==} - engines: {node: '>= 0.4'} - - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} immediate@3.0.6: @@ -851,10 +606,6 @@ packages: resolution: {integrity: sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==} engines: {node: '>=6'} - import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -866,412 +617,167 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.5: - resolution: {integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==} - deprecated: Please update to ini >=1.3.6 to avoid a prototype pollution issue - - inquirer@7.0.0: - resolution: {integrity: sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==} - engines: {node: '>=6.0.0'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - is-accessor-descriptor@0.1.6: - resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v0.1.7 - is-accessor-descriptor@1.0.0: - resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + is-glob@4.0.1: + resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v1.0.1 - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-buffer@2.0.4: - resolution: {integrity: sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==} - engines: {node: '>=4'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} - is-callable@1.2.0: - resolution: {integrity: sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==} - engines: {node: '>= 0.4'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} - is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-data-descriptor@0.1.4: - resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} - engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v0.1.5 + is-running@2.1.0: + resolution: {integrity: sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==} - is-data-descriptor@1.0.0: - resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} - engines: {node: '>=0.10.0'} - deprecated: Please upgrade to v1.0.1 + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} - is-date-object@1.0.2: - resolution: {integrity: sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==} - engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - is-descriptor@0.1.6: - resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} - engines: {node: '>=0.10.0'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - is-descriptor@1.0.2: - resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} - engines: {node: '>=0.10.0'} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + js-yaml@5.4.2: + resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==} + hasBin: true - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} + jszip@3.10.2: + resolution: {integrity: sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==} - is-glob@4.0.1: - resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} - engines: {node: '>=0.10.0'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - is-installed-globally@0.1.0: - resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} - engines: {node: '>=4'} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} - is-npm@1.0.0: - resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} - engines: {node: '>=0.10.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - is-promise@2.1.0: - resolution: {integrity: sha512-NECAi6wp6CgMesHuVUEK8JwjCvm/tvnn5pCbB42JOHp3mgUizN0nagXu4HEqQZBkieGEQ+jVcMKWqoVd6CDbLQ==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} - is-redirect@1.0.0: - resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} - engines: {node: '>=0.10.0'} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} - is-regex@1.1.0: - resolution: {integrity: sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==} - engines: {node: '>= 0.4'} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - is-retry-allowed@1.1.0: - resolution: {integrity: sha512-leC1bcIRBHjXtaZSM2gAXNeZsIOdDMgq/kHKAVKQ05JTwvb7hnvrHBEm6mnnMRyE7yu+ljNlcG8YUmALCevSxg==} - engines: {node: '>=0.10.0'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - is-running@2.1.0: - resolution: {integrity: sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} + mocha@12.0.2: + resolution: {integrity: sha512-SjAulGHxlMJLCD1bhvJBAiYwYxglydRzA9PDQ5MALq1oLRMMtIhxSQJ0olCFgA7c9YbTdxC0KOV0wl8JEDYVhA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - is-symbol@1.0.3: - resolution: {integrity: sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==} - engines: {node: '>= 0.4'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.13.1: - resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} - hasBin: true - - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema@0.2.3: - resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - jsprim@1.4.1: - resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==} - engines: {'0': node >=0.6.0} - - jszip@3.10.0: - resolution: {integrity: sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - - kind-of@5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - latest-version@3.1.0: - resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} - engines: {node: '>=4'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - lodash@4.17.15: - resolution: {integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==} - - log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} - - lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - - map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - - mime-db@1.43.0: - resolution: {integrity: sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.26: - resolution: {integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - minimatch@3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - - minimist@1.2.5: - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - - mkdirp@0.5.4: - resolution: {integrity: sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==} - deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - hasBin: true - - mkdirp@0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} - hasBin: true - - mocha@6.2.3: - resolution: {integrity: sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==} - engines: {node: '>= 6.0.0'} - hasBin: true - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.1: - resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - nan@2.14.1: - resolution: {integrity: sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==} - - nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.1: - resolution: {integrity: sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==} - - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-environment-flags@1.0.5: - resolution: {integrity: sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==} - - nodemon@1.19.4: - resolution: {integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==} - engines: {node: '>=4'} + nodemon@3.1.14: + resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} + engines: {node: '>=10'} hasBin: true nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - - object-inspect@1.7.0: - resolution: {integrity: sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - - object.assign@4.1.0: - resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} - engines: {node: '>= 0.4'} - - object.getownpropertydescriptors@2.1.0: - resolution: {integrity: sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==} - engines: {node: '>= 0.8'} - - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + nwsapi@2.2.28: + resolution: {integrity: sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.0: - resolution: {integrity: sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==} - engines: {node: '>=6'} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@2.2.2: - resolution: {integrity: sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==} - engines: {node: '>=6'} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json@4.0.1: - resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} - engines: {node: '>=4'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -1280,399 +786,206 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - pathval@1.1.0: - resolution: {integrity: sha512-qZ181q3ICkag/+lv1X6frDUF84pqCm30qild3LGbD84n0AC75CYwnWsQRDlpz7zDkU5NVcmhHh4LjXK0goLYZA==} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - ps-tree@1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.7.0: - resolution: {integrity: sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==} - pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - - punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.5.2: - resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} - engines: {node: '>=0.6'} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} readable-stream@2.3.6: resolution: {integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==} - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - - regexpp@2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - - registry-auth-token@3.4.0: - resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} - - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} - repeat-element@1.1.3: - resolution: {integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - request@2.88.0: - resolution: {integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==} - engines: {node: '>= 4'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - - rimraf@2.5.4: - resolution: {integrity: sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - run-async@2.3.0: - resolution: {integrity: sha512-Fx+QT3fGtS0jk8OvKyKgAB2YHPsrmqBRcMeTC5AZ+lp4vzXKPPrFSY3iLdgvjA3HVBkIvJeM6J80LRjx8bQwhA==} - engines: {node: '>=0.12.0'} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - rxjs@6.5.3: - resolution: {integrity: sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==} - engines: {npm: '>=2.0.0'} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + selenium-webdriver@4.3.1: resolution: {integrity: sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==} engines: {node: '>= 10.15.0'} - semver-diff@2.1.0: - resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} - engines: {node: '>=0.10.0'} - - semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - - semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} + serialize-javascript@7.1.2: + resolution: {integrity: sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==} + engines: {node: '>=20.0.0'} setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - signal-exit@3.0.2: - resolution: {integrity: sha512-meQNNykwecVxdu1RlYMKpQx4+wefIYpmxi6gexo/KAbwquJrBUrBmKYJrE8KFkVQAAVWEnwNdu21PgrD77J3xA==} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-url@0.4.0: - resolution: {integrity: sha512-liJwHPI9x9d9w5WSIjM58MqGmmb7XzNqwdUA3kSBQ4lmDngexlKwawGzK3J1mKXi6+sysoMDlpVyZh9sv5vRfw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - - split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sshpk@1.16.1: - resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} - engines: {node: '>=0.10.0'} - hasBin: true - - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - - stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - - string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - - string-width@4.2.0: - resolution: {integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==} - engines: {node: '>=8'} - - string.prototype.trimend@1.0.1: - resolution: {integrity: sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==} - - string.prototype.trimstart@1.0.1: - resolution: {integrity: sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - - strip-ansi@6.0.0: - resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - strip-json-comments@3.0.1: - resolution: {integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} - supports-color@6.0.0: - resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} - engines: {node: '>=6'} - - table@5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - temp-fs@0.9.9: - resolution: {integrity: sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==} - engines: {node: '>=0.8.0'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} - term-size@1.2.0: - resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} - engines: {node: '>=4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true - tough-cookie@2.4.3: - resolution: {integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==} - engines: {node: '>=0.8'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} - tslib@1.10.0: - resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} typescript@7.0.2: resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} @@ -1684,147 +997,92 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undefsafe@2.0.3: - resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - - unique-string@1.0.0: - resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} - engines: {node: '>=4'} - - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - - unzip-response@2.0.1: - resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} - engines: {node: '>=4'} - - upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - - update-notifier@2.5.0: - resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} - engines: {node: '>=4'} - uri-js@4.2.2: resolution: {integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==} - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid-validate@0.0.3: resolution: {integrity: sha512-Fykw5U4eZESbq739BeLvEBFRuJODfrlmjx5eJux7W817LjRaq4b7/i4t2zxQmhcX+fAj4nMfRdTzO4tmwLKn0w==} - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - - v8-compile-cache@2.1.0: - resolution: {integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} - which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} - wide-align@1.1.3: - resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} - widest-line@2.0.1: - resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} - engines: {node: '>=4'} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@5.1.0: - resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} - engines: {node: '>=6'} + workerpool@10.0.3: + resolution: {integrity: sha512-6z2Iis68Wqth93/G/wJP9u+R3O+d2XTlgWChGCwuT1qLbBsOYueGRZuJ++v3mtDP5KjYdy+WzvWC+VWETSVXJA==} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - - write@1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - - ws@8.8.1: - resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - xdg-basedir@3.0.0: - resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} - engines: {node: '>=4'} - - y18n@4.0.0: - resolution: {integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - yargs-parser@13.1.2: - resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} - - yargs-unparser@1.6.0: - resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} - engines: {node: '>=6'} - - yargs@13.3.2: - resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: - '@babel/code-frame@7.5.5': + '@asamuzakjp/css-color@3.2.0': dependencies: - '@babel/highlight': 7.5.0 - - '@babel/highlight@7.5.0': - dependencies: - chalk: 2.4.2 - esutils: 2.0.3 - js-tokens: 4.0.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 '@clack/core@1.4.3': dependencies: @@ -1838,17 +1096,76 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@types/keyv@3.1.4': + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@types/node': 24.13.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@types/node@24.13.3': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - undici-types: 7.18.2 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@eslint-community/eslint-utils@4.10.1(eslint@8.57.1(supports-color@5.5.0))': + dependencies: + eslint: 8.57.1(supports-color@5.5.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4(supports-color@5.5.0)': + dependencies: + ajv: 6.15.0 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.2.1 + js-yaml: 4.3.2 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} - '@types/responselike@1.0.3': + '@humanwhocodes/config-array@0.13.0(supports-color@5.5.0)': dependencies: - '@types/node': 24.13.3 + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.3 + + '@types/node@24.13.3': + dependencies: + undici-types: 7.18.2 '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -1910,13 +1227,13 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true + '@ungap/structured-clone@1.4.0': {} + abbrev@1.1.1: {} - acorn-jsx@5.1.0(acorn@7.1.1): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 7.1.1 - - acorn@7.1.1: {} + acorn: 8.18.0 acorn@8.18.0: {} @@ -1926,519 +1243,228 @@ snapshots: transitivePeerDependencies: - supports-color - ajv@6.10.2: + agent-base@7.1.4: {} + + ajv@6.15.0: dependencies: - fast-deep-equal: 2.0.1 + fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.0.0 json-schema-traverse: 0.4.1 uri-js: 4.2.2 - ansi-align@2.0.0: - dependencies: - string-width: 2.1.1 - - ansi-colors@3.2.3: {} - - ansi-escapes@4.3.0: - dependencies: - type-fest: 0.8.1 - - ansi-regex@3.0.0: {} - - ansi-regex@4.1.0: {} - - ansi-regex@5.0.0: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - anymatch@2.0.0(supports-color@5.5.0): - dependencies: - micromatch: 3.1.10(supports-color@5.5.0) - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color + ansi-regex@5.0.1: {} - argparse@1.0.10: + ansi-styles@4.3.0: dependencies: - sprintf-js: 1.0.3 - - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} + color-convert: 2.0.1 - array-unique@0.3.2: {} - - asn1@0.2.4: + anymatch@3.1.3: dependencies: - safer-buffer: 2.1.2 + normalize-path: 3.0.0 + picomatch: 2.3.2 - assert-plus@1.0.0: {} + argparse@2.0.1: {} assertion-error@1.1.0: {} - assign-symbols@1.0.0: {} - - astral-regex@1.0.0: {} - - async-each@1.0.3: {} - - asynckit@0.4.0: {} - - atob@2.1.2: {} - - aws-sign2@0.7.0: {} - - aws4@1.9.1: {} - balanced-match@1.0.0: {} - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.0 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 + balanced-match@4.0.4: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - binary-extensions@1.13.1: {} + binary-extensions@2.3.0: {} - bindings@1.5.0: + brace-expansion@1.1.21: dependencies: - file-uri-to-path: 1.0.0 - optional: true + balanced-match: 1.0.0 + concat-map: 0.0.1 - boxen@1.3.0: + brace-expansion@5.0.12: dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.2 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 + balanced-match: 4.0.4 - brace-expansion@1.1.11: + braces@3.0.3: dependencies: - balanced-match: 1.0.0 - concat-map: 0.0.1 - - braces@2.3.2(supports-color@5.5.0): - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.3 - snapdragon: 0.8.2(supports-color@5.5.0) - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + fill-range: 7.1.1 browser-stdout@1.3.1: {} - browserstack-local@1.5.1(supports-color@5.5.0): + browserstack-local@1.5.14(supports-color@5.5.0): dependencies: agent-base: 6.0.2(supports-color@5.5.0) https-proxy-agent: 5.0.1(supports-color@5.5.0) is-running: 2.1.0 - ps-tree: 1.2.0 - temp-fs: 0.9.9 + tree-kill: 1.2.2 transitivePeerDependencies: - supports-color - cache-base@1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.0 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - callsites@3.1.0: {} - camelcase@4.1.0: {} - - camelcase@5.3.1: {} - - capture-stack-trace@1.0.1: {} - - caseless@0.12.0: {} - - chai@4.2.0: + chai@4.5.0: dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 3.0.1 - get-func-name: 2.0.0 - pathval: 1.1.0 - type-detect: 4.0.8 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 - chalk@2.4.2: + chalk@4.1.2: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chardet@0.7.0: {} + ansi-styles: 4.3.0 + supports-color: 7.2.0 - check-error@1.0.2: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 - chokidar@2.1.8(supports-color@5.5.0): + chokidar@3.6.0: dependencies: - anymatch: 2.0.0(supports-color@5.5.0) - async-each: 1.0.3 - braces: 2.3.2(supports-color@5.5.0) - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 is-glob: 4.0.1 normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1(supports-color@5.5.0) - upath: 1.2.0 + readdirp: 3.6.0 optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color + fsevents: 2.3.3 - ci-info@1.6.0: {} - - class-utils@0.3.6: + chokidar@5.0.0: dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - - cli-boxes@1.0.0: {} + readdirp: 5.1.1 - cli-cursor@3.1.0: + color-convert@2.0.1: dependencies: - restore-cursor: 3.1.0 + color-name: 1.1.4 - cli-width@2.2.0: {} - - cliui@5.0.0: - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-name@1.1.3: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 + color-name@1.1.4: {} commander@2.20.3: {} - component-emitter@1.3.0: {} - concat-map@0.0.1: {} - configstore@3.1.2: - dependencies: - dot-prop: 4.2.0 - graceful-fs: 4.2.1 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - - copy-descriptor@0.1.1: {} - core-util-is@1.0.2: {} - create-error-class@3.0.2: - dependencies: - capture-stack-trace: 1.0.1 - - cross-spawn@5.1.0: + cross-spawn@7.0.6: dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@6.0.5: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - - crypto-random-string@1.0.0: {} + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - dashdash@1.14.1: + cssstyle@4.6.0: dependencies: - assert-plus: 1.0.0 + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 - debug@2.6.9(supports-color@5.5.0): + data-urls@5.0.0: dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 5.5.0 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 - debug@3.2.6(supports-color@5.5.0): + debug@4.3.4(supports-color@5.5.0): dependencies: ms: 2.1.2 optionalDependencies: supports-color: 5.5.0 - debug@3.2.6(supports-color@6.0.0): + debug@4.4.3(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: - supports-color: 6.0.0 + supports-color: 8.1.1 - debug@4.3.4(supports-color@5.5.0): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 5.5.0 - - decamelize@1.2.0: {} + decimal.js@10.6.0: {} - decode-uri-component@0.2.0: {} - - deep-eql@3.0.1: + deep-eql@4.1.4: dependencies: type-detect: 4.0.8 - deep-extend@0.6.0: {} - deep-is@0.1.3: {} - define-properties@1.1.3: - dependencies: - object-keys: 1.1.1 - - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.6 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.2 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.2 - isobject: 3.0.1 - - delayed-stream@1.0.0: {} - - diff@3.5.0: {} + diff@9.0.0: {} doctrine@3.0.0: dependencies: esutils: 2.0.3 - dot-prop@4.2.0: - dependencies: - is-obj: 1.0.1 - dotenv@8.2.0: {} - duplexer3@0.1.4: {} + entities@6.0.1: {} - duplexer@0.1.2: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - emoji-regex@7.0.3: {} - - emoji-regex@8.0.0: {} - - es-abstract@1.17.6: - dependencies: - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.1 - is-callable: 1.2.0 - is-regex: 1.1.0 - object-inspect: 1.7.0 - object-keys: 1.1.1 - object.assign: 4.1.0 - string.prototype.trimend: 1.0.1 - string.prototype.trimstart: 1.0.1 + escape-string-regexp@4.0.0: {} - es-to-primitive@1.2.1: + eslint-scope@7.2.2: dependencies: - is-callable: 1.2.0 - is-date-object: 1.0.2 - is-symbol: 1.0.3 + esrecurse: 4.3.0 + estraverse: 5.3.0 - escape-string-regexp@1.0.5: {} + eslint-visitor-keys@3.4.3: {} - eslint-scope@5.0.0: + eslint@8.57.1(supports-color@5.5.0): dependencies: - esrecurse: 4.2.1 - estraverse: 4.3.0 - - eslint-utils@1.4.3: - dependencies: - eslint-visitor-keys: 1.1.0 - - eslint-visitor-keys@1.1.0: {} - - eslint@6.7.2(supports-color@5.5.0): - dependencies: - '@babel/code-frame': 7.5.5 - ajv: 6.10.2 - chalk: 2.4.2 - cross-spawn: 6.0.5 + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1(supports-color@5.5.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4(supports-color@5.5.0) + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0(supports-color@5.5.0) + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.4.0 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 debug: 4.3.4(supports-color@5.5.0) doctrine: 3.0.0 - eslint-scope: 5.0.0 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.1.0 - espree: 6.1.2 - esquery: 1.0.1 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.0 - globals: 12.3.0 - ignore: 4.0.6 - import-fresh: 3.2.1 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 imurmurhash: 0.1.4 - inquirer: 7.0.0 is-glob: 4.0.1 - js-yaml: 3.13.1 + is-path-inside: 3.0.3 + js-yaml: 4.3.2 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.15 - minimatch: 3.0.4 - mkdirp: 0.5.5 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.0 - strip-ansi: 5.2.0 - strip-json-comments: 3.0.1 - table: 5.4.6 + optionator: 0.9.4 + strip-ansi: 6.0.1 text-table: 0.2.0 - v8-compile-cache: 2.1.0 transitivePeerDependencies: - supports-color - espree@6.1.2: + espree@9.6.1: dependencies: - acorn: 7.1.1 - acorn-jsx: 5.1.0(acorn@7.1.1) - eslint-visitor-keys: 1.1.0 + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} - esquery@1.0.1: + esquery@1.7.0: dependencies: - estraverse: 4.3.0 + estraverse: 5.3.0 - esrecurse@4.2.1: + esrecurse@4.3.0: dependencies: - estraverse: 4.3.0 + estraverse: 5.3.0 - estraverse@4.3.0: {} + estraverse@5.3.0: {} esutils@2.0.3: {} - event-stream@3.3.4: - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - - execa@0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.2 - strip-eof: 1.0.0 - - expand-brackets@2.1.4(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - - extend@3.0.2: {} - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - extglob@2.0.4(supports-color@5.5.0): - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4(supports-color@5.5.0) - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: {} - - fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.0.0: {} @@ -2454,185 +1480,92 @@ snapshots: dependencies: fast-string-width: 3.0.2 - figures@3.1.0: + fastq@1.20.3: dependencies: - escape-string-regexp: 1.0.5 + reusify: 1.1.0 - file-entry-cache@5.0.1: + file-entry-cache@6.0.1: dependencies: - flat-cache: 2.0.1 + flat-cache: 3.2.0 - file-uri-to-path@1.0.0: - optional: true - - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - - find-up@3.0.0: + fill-range@7.1.1: dependencies: - locate-path: 3.0.0 + to-regex-range: 5.0.1 - flat-cache@2.0.1: - dependencies: - flatted: 2.0.1 - rimraf: 2.6.3 - write: 1.0.3 + find-up-simple@1.0.1: {} - flat@4.1.0: + find-up@5.0.0: dependencies: - is-buffer: 2.0.4 - - flatted@2.0.1: {} - - for-in@1.0.2: {} - - forever-agent@0.6.1: {} + locate-path: 6.0.0 + path-exists: 4.0.0 - form-data@2.3.3: + flat-cache@3.2.0: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.26 - - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 + flatted: 3.4.4 + keyv: 4.5.4 + rimraf: 3.0.2 - from@0.1.7: {} + flatted@3.4.4: {} fs.realpath@1.0.0: {} - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.14.1 + fsevents@2.3.3: optional: true - function-bind@1.1.1: {} - - functional-red-black-tree@1.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.0: {} + get-func-name@2.0.2: {} - get-stream@3.0.0: {} - - get-value@2.0.6: {} - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - glob-parent@3.1.0: + glob-parent@5.1.2: dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 + is-glob: 4.0.1 - glob-parent@5.1.0: + glob-parent@6.0.2: dependencies: - is-glob: 4.0.1 + is-glob: 4.0.3 - glob@7.1.3: + glob@13.0.6: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.0.4 - once: 1.4.0 - path-is-absolute: 1.0.1 + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@7.1.6: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.4 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 - global-dirs@0.1.1: + globals@13.24.0: dependencies: - ini: 1.3.5 + type-fest: 0.20.2 - globals@12.3.0: - dependencies: - type-fest: 0.8.1 + graphemer@1.4.0: {} - got@6.7.1: + handlebars@4.7.9: dependencies: - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - create-error-class: 3.0.2 - duplexer3: 0.1.4 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.1.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.1.2 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - - graceful-fs@4.2.1: {} - - growl@1.10.5: {} - - handlebars@4.7.6: - dependencies: - minimist: 1.2.5 - neo-async: 2.6.1 + minimist: 1.2.8 + neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.9.4 - har-schema@2.0.0: {} - - har-validator@5.1.3: - dependencies: - ajv: 6.10.2 - har-schema: 2.0.0 - has-flag@3.0.0: {} - has-symbols@1.0.1: {} + has-flag@4.0.0: {} - has-value@0.3.1: + html-encoding-sniffer@4.0.0: dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 + whatwg-encoding: 3.1.1 - has-value@1.0.0: + http-proxy-agent@7.0.2(supports-color@5.5.0): dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - - has@1.0.3: - dependencies: - function-bind: 1.1.1 - - he@1.2.0: {} - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.1 - sshpk: 1.16.1 + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color https-proxy-agent@5.0.1(supports-color@5.5.0): dependencies: @@ -2641,13 +1574,20 @@ snapshots: transitivePeerDependencies: - supports-color - iconv-lite@0.4.24: + https-proxy-agent@7.0.6(supports-color@5.5.0): + dependencies: + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 ignore-by-default@1.0.1: {} - ignore@4.0.6: {} + ignore@5.3.2: {} immediate@3.0.6: {} @@ -2656,8 +1596,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-lazy@2.1.0: {} - imurmurhash@0.1.4: {} inflight@1.0.6: @@ -2667,434 +1605,191 @@ snapshots: inherits@2.0.4: {} - ini@1.3.5: {} - - inquirer@7.0.0: - dependencies: - ansi-escapes: 4.3.0 - chalk: 2.4.2 - cli-cursor: 3.1.0 - cli-width: 2.2.0 - external-editor: 3.1.0 - figures: 3.1.0 - lodash: 4.17.15 - mute-stream: 0.0.8 - run-async: 2.3.0 - rxjs: 6.5.3 - string-width: 4.2.0 - strip-ansi: 5.2.0 - through: 2.3.8 - - is-accessor-descriptor@0.1.6: - dependencies: - kind-of: 3.2.2 - - is-accessor-descriptor@1.0.0: - dependencies: - kind-of: 6.0.3 - - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - - is-buffer@1.1.6: {} - - is-buffer@2.0.4: {} - - is-callable@1.2.0: {} - - is-ci@1.2.1: - dependencies: - ci-info: 1.6.0 - - is-data-descriptor@0.1.4: - dependencies: - kind-of: 3.2.2 - - is-data-descriptor@1.0.0: - dependencies: - kind-of: 6.0.3 - - is-date-object@1.0.2: {} - - is-descriptor@0.1.6: - dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 - - is-descriptor@1.0.2: - dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.3 - - is-extendable@0.1.1: {} - - is-extendable@1.0.1: + is-binary-path@2.1.0: dependencies: - is-plain-object: 2.0.4 + binary-extensions: 2.3.0 is-extglob@2.1.1: {} - is-fullwidth-code-point@2.0.0: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - is-glob@4.0.1: dependencies: is-extglob: 2.1.1 - is-installed-globally@0.1.0: - dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 - - is-npm@1.0.0: {} - - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - - is-obj@1.0.1: {} - - is-path-inside@1.0.1: + is-glob@4.0.3: dependencies: - path-is-inside: 1.0.2 - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 + is-extglob: 2.1.1 - is-promise@2.1.0: {} + is-number@7.0.0: {} - is-redirect@1.0.0: {} + is-path-inside@3.0.3: {} - is-regex@1.1.0: - dependencies: - has-symbols: 1.0.1 + is-path-inside@4.0.0: {} - is-retry-allowed@1.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-running@2.1.0: {} - is-stream@1.1.0: {} - - is-symbol@1.0.3: - dependencies: - has-symbols: 1.0.1 - - is-typedarray@1.0.0: {} - - is-windows@1.0.2: {} + is-unicode-supported@0.1.0: {} isarray@1.0.0: {} isexe@2.0.0: {} - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - - isobject@3.0.1: {} - - isstream@0.1.2: {} - - js-tokens@4.0.0: {} - - js-yaml@3.13.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + js-yaml@5.4.2: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0(supports-color@5.5.0): + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2(supports-color@5.5.0) + https-proxy-agent: 7.0.6(supports-color@5.5.0) + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.28 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.21.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - jsbn@0.1.1: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} - json-schema@0.2.3: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} - - jsprim@1.4.1: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.2.3 - verror: 1.10.0 - - jszip@3.10.0: + jszip@3.10.2: dependencies: lie: 3.3.0 pako: 1.0.11 readable-stream: 2.3.6 setimmediate: 1.0.5 - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - - kind-of@5.1.0: {} - - kind-of@6.0.3: {} - - latest-version@3.1.0: + keyv@4.5.4: dependencies: - package-json: 4.0.1 + json-buffer: 3.0.1 - levn@0.3.0: + levn@0.4.1: dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 + prelude-ls: 1.2.1 + type-check: 0.4.0 lie@3.3.0: dependencies: immediate: 3.0.6 - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - lodash@4.17.15: {} - - log-symbols@2.2.0: - dependencies: - chalk: 2.4.2 - - lowercase-keys@1.0.1: {} - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - make-dir@1.3.0: + locate-path@6.0.0: dependencies: - pify: 3.0.0 - - map-cache@0.2.2: {} + p-locate: 5.0.0 - map-stream@0.1.0: {} - - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 + lodash.merge@4.6.2: {} - micromatch@3.1.10(supports-color@5.5.0): + loupe@2.3.7: dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2(supports-color@5.5.0) - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4(supports-color@5.5.0) - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13(supports-color@5.5.0) - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + get-func-name: 2.0.2 - mime-db@1.43.0: {} - - mime-types@2.1.26: - dependencies: - mime-db: 1.43.0 + lru-cache@10.4.3: {} - mimic-fn@2.1.0: {} + lru-cache@11.5.3: {} - minimatch@3.0.4: + minimatch@10.2.6: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 5.0.12 - minimist@1.2.5: {} - - mixin-deep@1.3.2: + minimatch@3.1.5: dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 + brace-expansion: 1.1.21 - mkdirp@0.5.4: - dependencies: - minimist: 1.2.5 + minimist@1.2.8: {} - mkdirp@0.5.5: - dependencies: - minimist: 1.2.5 + minipass@7.1.3: {} - mocha@6.2.3: + mocha@12.0.2: dependencies: - ansi-colors: 3.2.3 browser-stdout: 1.3.1 - debug: 3.2.6(supports-color@6.0.0) - diff: 3.5.0 - escape-string-regexp: 1.0.5 - find-up: 3.0.0 - glob: 7.1.3 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 3.13.1 - log-symbols: 2.2.0 - minimatch: 3.0.4 - mkdirp: 0.5.4 - ms: 2.1.1 - node-environment-flags: 1.0.5 - object.assign: 4.1.0 - strip-json-comments: 2.0.1 - supports-color: 6.0.0 - which: 1.3.1 - wide-align: 1.1.3 - yargs: 13.3.2 - yargs-parser: 13.1.2 - yargs-unparser: 1.6.0 - - ms@2.0.0: {} - - ms@2.1.1: {} + chokidar: 5.0.0 + debug: 4.4.3(supports-color@8.1.1) + diff: 9.0.0 + find-up-simple: 1.0.1 + glob: 13.0.6 + is-path-inside: 4.0.0 + is-unicode-supported: 0.1.0 + js-yaml: 5.4.2 + minimatch: 10.2.6 + ms: 2.1.3 + picocolors: 1.1.1 + serialize-javascript: 7.1.2 + strip-json-comments: 5.0.3 + supports-color: 8.1.1 + workerpool: 10.0.3 ms@2.1.2: {} - mute-stream@0.0.8: {} - - nan@2.14.1: - optional: true - - nanomatch@1.2.13(supports-color@5.5.0): - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2(supports-color@5.5.0) - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color + ms@2.1.3: {} natural-compare@1.4.0: {} - neo-async@2.6.1: {} + neo-async@2.6.2: {} - nice-try@1.0.5: {} - - node-environment-flags@1.0.5: - dependencies: - object.getownpropertydescriptors: 2.1.0 - semver: 5.7.1 - - nodemon@1.19.4: + nodemon@3.1.14: dependencies: - chokidar: 2.1.8(supports-color@5.5.0) - debug: 3.2.6(supports-color@5.5.0) + chokidar: 3.6.0 + debug: 4.3.4(supports-color@5.5.0) ignore-by-default: 1.0.1 - minimatch: 3.0.4 + minimatch: 10.2.6 pstree.remy: 1.1.8 - semver: 5.7.1 + semver: 7.8.5 + simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.0 - undefsafe: 2.0.3(supports-color@5.5.0) - update-notifier: 2.5.0 + undefsafe: 2.0.5 nopt@1.0.10: dependencies: abbrev: 1.1.1 - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - normalize-path@3.0.0: {} - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - - oauth-sign@0.9.0: {} - - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - - object-inspect@1.7.0: {} - - object-keys@1.1.1: {} - - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - - object.assign@4.1.0: - dependencies: - define-properties: 1.1.3 - function-bind: 1.1.1 - has-symbols: 1.0.1 - object-keys: 1.1.1 - - object.getownpropertydescriptors@2.1.0: - dependencies: - define-properties: 1.1.3 - es-abstract: 1.17.6 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 + nwsapi@2.2.28: {} once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@5.1.0: - dependencies: - mimic-fn: 2.1.0 - - optionator@0.8.3: + optionator@0.9.4: dependencies: deep-is: 0.1.3 fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - - os-tmpdir@1.0.2: {} - - p-finally@1.0.0: {} + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 - p-limit@2.2.2: + p-limit@3.1.0: dependencies: - p-try: 2.2.0 + yocto-queue: 0.1.0 - p-locate@3.0.0: + p-locate@5.0.0: dependencies: - p-limit: 2.2.2 - - p-try@2.2.0: {} - - package-json@4.0.1: - dependencies: - got: 6.7.1 - registry-auth-token: 3.4.0 - registry-url: 3.1.0 - semver: 5.7.1 + p-limit: 3.1.0 pako@1.0.11: {} @@ -3102,60 +1797,36 @@ snapshots: dependencies: callsites: 3.1.0 - pascalcase@0.1.1: {} - - path-dirname@1.0.2: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 - path-exists@3.0.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} - path-is-inside@1.0.2: {} - - path-key@2.0.1: {} + path-key@3.1.1: {} - pathval@1.1.0: {} - - pause-stream@0.0.11: + path-scurry@2.0.2: dependencies: - through: 2.3.8 - - performance-now@2.1.0: {} + lru-cache: 11.5.3 + minipass: 7.1.3 - pify@3.0.0: {} + pathval@1.1.1: {} - posix-character-classes@0.1.1: {} + picocolors@1.1.1: {} - prelude-ls@1.1.2: {} + picomatch@2.3.2: {} - prepend-http@1.0.4: {} + prelude-ls@1.2.1: {} process-nextick-args@2.0.1: {} - progress@2.0.3: {} - - ps-tree@1.2.0: - dependencies: - event-stream: 3.3.4 - - pseudomap@1.0.2: {} - - psl@1.7.0: {} - pstree.remy@1.1.8: {} - punycode@1.4.1: {} - - punycode@2.1.1: {} + punycode@2.3.1: {} - qs@6.5.2: {} - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.5 - minimist: 1.2.5 - strip-json-comments: 2.0.1 + queue-microtask@1.2.3: {} readable-stream@2.3.6: dependencies: @@ -3167,340 +1838,126 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readdirp@2.2.1(supports-color@5.5.0): + readdirp@3.6.0: dependencies: - graceful-fs: 4.2.1 - micromatch: 3.1.10(supports-color@5.5.0) - readable-stream: 2.3.6 - transitivePeerDependencies: - - supports-color - - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - - regexpp@2.0.1: {} - - registry-auth-token@3.4.0: - dependencies: - rc: 1.2.8 - safe-buffer: 5.1.2 - - registry-url@3.1.0: - dependencies: - rc: 1.2.8 - - remove-trailing-separator@1.1.0: {} - - repeat-element@1.1.3: {} - - repeat-string@1.6.1: {} - - request@2.88.0: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.9.1 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.3 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.26 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.2 - safe-buffer: 5.1.2 - tough-cookie: 2.4.3 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - - require-directory@2.1.1: {} + picomatch: 2.3.2 - require-main-filename@2.0.0: {} + readdirp@5.1.1: {} resolve-from@4.0.0: {} - resolve-url@0.2.1: {} - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.0 - signal-exit: 3.0.2 - - ret@0.1.15: {} - - rimraf@2.5.4: - dependencies: - glob: 7.1.6 - - rimraf@2.6.3: - dependencies: - glob: 7.1.6 + reusify@1.1.0: {} rimraf@3.0.2: dependencies: glob: 7.1.6 - run-async@2.3.0: - dependencies: - is-promise: 2.1.0 + rrweb-cssom@0.8.0: {} - rxjs@6.5.3: + run-parallel@1.2.0: dependencies: - tslib: 1.10.0 + queue-microtask: 1.2.3 safe-buffer@5.1.2: {} - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + selenium-webdriver@4.3.1: dependencies: - jszip: 3.10.0 - tmp: 0.2.1 - ws: 8.8.1 + jszip: 3.10.2 + tmp: 0.2.7 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - semver-diff@2.1.0: - dependencies: - semver: 5.7.1 - - semver@5.7.1: {} - - semver@6.3.0: {} - - set-blocking@2.0.0: {} + semver@7.8.5: {} - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 + serialize-javascript@7.1.2: {} setimmediate@1.0.5: {} - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - - shebang-regex@1.0.0: {} - - signal-exit@3.0.2: {} - - sisteransi@1.0.5: {} - - slice-ansi@2.1.0: - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: + shebang-command@2.0.0: dependencies: - kind-of: 3.2.2 + shebang-regex: 3.0.0 - snapdragon@0.8.2(supports-color@5.5.0): - dependencies: - base: 0.11.2 - debug: 2.6.9(supports-color@5.5.0) - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color + shebang-regex@3.0.0: {} - source-map-resolve@0.5.3: + simple-update-notifier@2.0.0: dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.0 - resolve-url: 0.2.1 - source-map-url: 0.4.0 - urix: 0.1.0 + semver: 7.8.5 - source-map-url@0.4.0: {} - - source-map@0.5.7: {} + sisteransi@1.0.5: {} source-map@0.6.1: {} - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - - split@0.3.3: - dependencies: - through: 2.3.8 - - sprintf-js@1.0.3: {} - - sshpk@1.16.1: - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - - stream-combiner@0.0.4: - dependencies: - duplexer: 0.1.2 - - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - - string-width@3.1.0: - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - - string-width@4.2.0: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.0 - - string.prototype.trimend@1.0.1: - dependencies: - define-properties: 1.1.3 - es-abstract: 1.17.6 - - string.prototype.trimstart@1.0.1: - dependencies: - define-properties: 1.1.3 - es-abstract: 1.17.6 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.0 - - strip-ansi@5.2.0: + strip-ansi@6.0.1: dependencies: - ansi-regex: 4.1.0 + ansi-regex: 5.0.1 - strip-ansi@6.0.0: - dependencies: - ansi-regex: 5.0.0 - - strip-eof@1.0.0: {} + strip-json-comments@3.1.1: {} - strip-json-comments@2.0.1: {} - - strip-json-comments@3.0.1: {} + strip-json-comments@5.0.3: {} supports-color@5.5.0: dependencies: has-flag: 3.0.0 - supports-color@6.0.0: - dependencies: - has-flag: 3.0.0 - - table@5.4.6: + supports-color@7.2.0: dependencies: - ajv: 6.10.2 - lodash: 4.17.15 - slice-ansi: 2.1.0 - string-width: 3.1.0 + has-flag: 4.0.0 - temp-fs@0.9.9: + supports-color@8.1.1: dependencies: - rimraf: 2.5.4 + has-flag: 4.0.0 - term-size@1.2.0: - dependencies: - execa: 0.7.0 + symbol-tree@3.2.4: {} text-table@0.2.0: {} - through@2.3.8: {} - - timed-out@4.0.1: {} - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - tmp@0.2.1: - dependencies: - rimraf: 3.0.2 + tldts-core@6.1.86: {} - to-object-path@0.3.0: + tldts@6.1.86: dependencies: - kind-of: 3.2.2 + tldts-core: 6.1.86 - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 + tmp@0.2.7: {} - to-regex@3.0.2: + to-regex-range@5.0.1: dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 + is-number: 7.0.0 touch@3.1.0: dependencies: nopt: 1.0.10 - tough-cookie@2.4.3: + tough-cookie@5.1.2: dependencies: - psl: 1.7.0 - punycode: 1.4.1 + tldts: 6.1.86 - tslib@1.10.0: {} - - tunnel-agent@0.6.0: + tr46@5.1.1: dependencies: - safe-buffer: 5.1.2 + punycode: 2.3.1 - tweetnacl@0.14.5: {} + tree-kill@1.2.2: {} - type-check@0.3.2: + type-check@0.4.0: dependencies: - prelude-ls: 1.1.2 + prelude-ls: 1.2.1 type-detect@4.0.8: {} - type-fest@0.8.1: {} + type-detect@4.1.0: {} + + type-fest@0.20.2: {} typescript@7.0.2: optionalDependencies: @@ -3529,137 +1986,51 @@ snapshots: dependencies: commander: 2.20.3 - undefsafe@2.0.3(supports-color@5.5.0): - dependencies: - debug: 2.6.9(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + undefsafe@2.0.5: {} undici-types@7.18.2: {} - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - - unique-string@1.0.0: - dependencies: - crypto-random-string: 1.0.0 - - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - - unzip-response@2.0.1: {} - - upath@1.2.0: {} - - update-notifier@2.5.0: - dependencies: - boxen: 1.3.0 - chalk: 2.4.2 - configstore: 3.1.2 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - uri-js@4.2.2: dependencies: - punycode: 2.1.1 - - urix@0.1.0: {} - - url-parse-lax@1.0.0: - dependencies: - prepend-http: 1.0.4 - - use@3.1.1: {} + punycode: 2.3.1 util-deprecate@1.0.2: {} uuid-validate@0.0.3: {} - uuid@3.4.0: {} - - v8-compile-cache@2.1.0: {} - - verror@1.10.0: + w3c-xmlserializer@5.0.0: dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 + xml-name-validator: 5.0.0 - which-module@2.0.0: {} + webidl-conversions@7.0.0: {} - which@1.3.1: + whatwg-encoding@3.1.1: dependencies: - isexe: 2.0.0 + iconv-lite: 0.6.3 - wide-align@1.1.3: + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: dependencies: - string-width: 2.1.1 + tr46: 5.1.1 + webidl-conversions: 7.0.0 - widest-line@2.0.1: + which@2.0.2: dependencies: - string-width: 2.1.1 + isexe: 2.0.0 - word-wrap@1.2.3: {} + word-wrap@1.2.5: {} wordwrap@1.0.0: {} - wrap-ansi@5.1.0: - dependencies: - ansi-styles: 3.2.1 - string-width: 3.1.0 - strip-ansi: 5.2.0 + workerpool@10.0.3: {} wrappy@1.0.2: {} - write-file-atomic@2.4.3: - dependencies: - graceful-fs: 4.2.1 - imurmurhash: 0.1.4 - signal-exit: 3.0.2 - - write@1.0.3: - dependencies: - mkdirp: 0.5.5 - - ws@8.8.1: {} - - xdg-basedir@3.0.0: {} - - y18n@4.0.0: {} + ws@8.21.3: {} - yallist@2.1.2: {} + xml-name-validator@5.0.0: {} - yargs-parser@13.1.2: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs-unparser@1.6.0: - dependencies: - flat: 4.1.0 - lodash: 4.17.15 - yargs: 13.3.2 + xmlchars@2.2.0: {} - yargs@13.3.2: - dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.0 - y18n: 4.0.0 - yargs-parser: 13.1.2 + yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index adb667b..688ea7c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,3 +10,7 @@ verifyDepsBeforeRun: error allowBuilds: fsevents: false nodemon: false +overrides: + minimist@<1.2.6: ^1.2.8 + minimatch@<3.1.4: ^3.1.4 + brace-expansion@<1.1.18: ^1.1.18 diff --git a/src/default.js b/src/default.js index d8dd4c9..8a61943 100644 --- a/src/default.js +++ b/src/default.js @@ -149,6 +149,10 @@ if (logSettings) warn("Settings", overwriteOptions); + // A server-created initial pageview can be enriched by this script. + var pageLoadId = + overwriteOptions.pageLoadId || attr(scriptElement, "page-load-id"); + /** if ignoremetrics **/ // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -538,10 +542,12 @@ https: loc.protocol == https, timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, + page_id: pageLoadId || (collectDataOnLeave ? uuid() : undefinedVar), // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, + session_id: collectMetricByString("se") + ? pageLoadId || uuid() + : undefinedVar, }); /** if sri **/ @@ -634,6 +640,8 @@ var sendOnLeave = function (id, push) { if (!collectDataOnLeave) return; + // Don't enrich an ignored server page before an allowed manual pageview. + if (pageLoadId && !lastSendPath && !getPath()) return; var append = assign(basePayload, { type: "append", @@ -767,42 +775,43 @@ var previousReferrer; - // Send page view and append data to it - var sendPageView = function ( + // Capture each accepted pageview before waiting for client hints. + var preparePageView = function ( isPushState, deleteSourceInfo, sameSite, search, - metadata, - callback + metadata ) { if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); + var originalId = pages === 0 ? pageLoadId : undefinedVar; + payload.page_id = + originalId || (collectDataOnLeave ? uuid() : undefinedVar); - var currentPage = definedHostname + getPath(); + var currentPage = definedHostname + page.path; var query = getQueryParams(deleteSourceInfo, search); - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - /** if ignoremetrics **/ - k: k, - /** endif **/ - - /** if metadata **/ - metadata: stringify(metadata), - /** endif **/ - }, - callback - ); + var data = assign(page, { + id: payload.page_id, + page_id: payload.page_id, + original_id: originalId, + type: originalId ? "append" : pageviewText, + referrer: !deleteSourceInfo || sameSite ? referrer : null, + query: query, + /** if ignoremetrics **/ + k: k, + /** endif **/ + + /** if metadata **/ + metadata: stringify(metadata), + /** endif **/ + }); previousReferrer = referrer; referrer = currentPage; pages++; + return data; }; var sameSite, userNavigated; @@ -825,6 +834,13 @@ // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); + if (!path && !lastSendPath && pageLoadId) { + // An ignored initial page must not receive event or leave enrichment. + payload.page_id = collectDataOnLeave ? uuid() : undefinedVar; + if (payload.session_id === pageLoadId) payload.session_id = uuid(); + pageLoadId = undefinedVar; + } + // Don't send the last path again (this could happen when pushState is used to change the path hash or search) if (!path || lastSendPath == path) return; @@ -908,18 +924,18 @@ }); /** endif **/ + var delSrc = isPushState || userNavigated || !collectMetricByString("r"); + var pageviewData = preparePageView( + isPushState, + delSrc, // r = referrers + sameSite, + querySearch, + metadata + ); + var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); + sendData(pageviewData, callback); }; if (!fetchedHighEntropyValues) { @@ -1069,6 +1085,12 @@ var eventParams = { type: eventText, event: event }; var firstPage = !userNavigated && pages < 2; + // Manual collection may not have declared an allowed pageview yet. + if (pageLoadId && !lastSendPath && !getPath()) { + eventParams.page_id = undefinedVar; + eventParams.session_id = undefinedVar; + } + /** if metadata **/ metadata = appendMetadata(metadata, eventParams); /** endif **/ diff --git a/test/helpers/get-browsers.js b/test/helpers/get-browsers.js index 2b24254..d7549f9 100644 --- a/test/helpers/get-browsers.js +++ b/test/helpers/get-browsers.js @@ -1,5 +1,3 @@ -const request = require("request"); - const { selectBrowsers } = require("./browser-matrix"); const { BROWSERSTACK_USERNAME, @@ -81,22 +79,21 @@ const withRetries = async ( ); }; -const requestJson = (options) => - new Promise((resolve, reject) => { - request( - { method: "GET", json: true, timeout: REQUEST_TIMEOUT, ...options }, - (error, response, body) => { - if (error) return reject(error); - if ( - !response || - response.statusCode < 200 || - response.statusCode >= 300 - ) - return reject(new Error(`HTTP ${response?.statusCode || "unknown"}`)); - return resolve(body); +const requestJson = async ({ url, auth }) => { + const headers = auth + ? { + Authorization: + "Basic " + + Buffer.from(`${auth.user}:${auth.pass}`).toString("base64"), } - ); + : undefined; + const response = await fetch(url, { + headers, + signal: AbortSignal.timeout(REQUEST_TIMEOUT), }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + return response.json(); +}; const requireArray = (source, value) => { if (!Array.isArray(value) || !value.length) diff --git a/test/unit/page-load-id.test.js b/test/unit/page-load-id.test.js new file mode 100644 index 0000000..82b1f97 --- /dev/null +++ b/test/unit/page-load-id.test.js @@ -0,0 +1,333 @@ +const { expect } = require("chai"); +const { runInContext } = require("vm"); +const { createDOM } = require("./helpers/dom"); + +const pageLoadId = "2c304ecc-1e0a-4fa6-86a8-1ba4684db774"; +const attributeId = "e35432dd-4af3-40c3-90ad-5a95d8e4fb1f"; +const requests = (dom) => + dom.sent + .filter(({ type }) => type === "image") + .map(({ url }) => new URL(url).searchParams); +const wait = () => new Promise((resolve) => setTimeout(resolve, 20)); + +describe("server page-load ID", function () { + for (const autoCollect of [false, true]) { + for (const reverseResolution of [false, true]) { + it(`preserves two pending ${ + autoCollect ? "automatic" : "manual" + } pageviews with ${ + reverseResolution ? "reversed" : "ordered" + } client hints`, async function () { + const dom = createDOM({ + url: "https://example.com/first?step=one", + settings: { pageLoadId, autoCollect, allowParams: "step" }, + beforeRun(context) { + runInContext( + `window.clientHints = []; + Object.defineProperty(navigator, "userAgentData", { + value: { + brands: [], + mobile: false, + getHighEntropyValues: function() { + return new Promise(function(resolve) { + window.clientHints.push(resolve); + }); + } + } + });`, + context + ); + }, + }); + if (autoCollect) { + dom.window.history.pushState({}, "", "/second?step=two"); + } else { + dom.window.sa_pageview("/first?step=one"); + dom.window.sa_pageview("/second?step=two"); + } + dom.window.sa_event("second_pending"); + const earlyEvent = requests(dom).find( + (params) => params.get("event") === "second_pending" + ); + expect(earlyEvent.get("page_id")).not.to.equal(pageLoadId); + + const resolvers = Array.from(dom.window.clientHints); + expect(resolvers).to.have.lengthOf(2); + if (reverseResolution) resolvers.reverse(); + for (const resolve of resolvers) { + resolve({ platform: "macOS", platformVersion: "15" }); + } + await wait(); + + const pageviews = requests(dom).filter( + (params) => params.get("type") !== "event" && params.has("path") + ); + expect(pageviews).to.have.lengthOf(2); + const initial = pageviews.find( + (params) => params.get("path") === "/first" + ); + expect(initial.get("type")).to.equal("append"); + expect(initial.get("original_id")).to.equal(pageLoadId); + expect(initial.get("page_id")).to.equal(pageLoadId); + expect(initial.get("query")).to.equal("step=one"); + const second = pageviews.find( + (params) => params.get("path") === "/second" + ); + expect(second.get("type")).to.equal("pageview"); + expect(second.has("original_id")).to.equal(false); + expect(second.get("id")).to.equal(earlyEvent.get("page_id")); + expect(second.get("query")).to.equal("step=two"); + expect(second.get("referrer")).to.equal("example.com/first"); + dom.window.close(); + }); + } + } + + it("keeps accepted manual attribution while client hints are pending", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + beforeRun(context) { + runInContext( + `Object.defineProperty(navigator, "userAgentData", { + value: { + brands: [], + mobile: false, + getHighEntropyValues: function() { + return new Promise(function(resolve) { + window.resolveClientHints = resolve; + }); + } + } + });`, + context + ); + }, + }); + dom.window.sa_pageview("/allowed"); + dom.window.sa_event("pending_hints"); + await wait(); + const early = requests(dom).find( + (params) => params.get("event") === "pending_hints" + ); + expect(early.get("page_id")).to.equal(pageLoadId); + expect(early.get("session_id")).to.equal(pageLoadId); + + // A later ignored call must not discard the accepted pageview's ID. + dom.window.sa_pageview("/ignore"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + const leave = JSON.parse( + dom.sent.find(({ type }) => type === "beacon").data + ); + expect(leave.original_id).to.equal(pageLoadId); + + dom.window.resolveClientHints({ platform: "macOS", platformVersion: "15" }); + await wait(); + const initial = requests(dom).find( + (params) => params.get("type") === "append" + ); + expect(initial.get("path")).to.equal("/allowed"); + expect(initial.get("id")).to.equal(pageLoadId); + expect(initial.get("original_id")).to.equal(pageLoadId); + dom.window.close(); + }); + + it("withholds ignored-URL attribution until a manual allowed pageview is declared", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + }); + dom.window.sa_event("before_pageview"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + await wait(); + const before = requests(dom).find( + (params) => params.get("event") === "before_pageview" + ); + expect(before.get("page_id")).not.to.equal(pageLoadId); + expect(before.get("session_id")).not.to.equal(pageLoadId); + expect(dom.sent.filter(({ type }) => type === "beacon")).to.be.empty; + + dom.window.sa_pageview("/allowed"); + dom.window.sa_event("after_pageview"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + await wait(); + const initial = requests(dom).find( + (params) => params.get("type") === "append" + ); + expect(initial.get("original_id")).to.equal(pageLoadId); + const after = requests(dom).find( + (params) => params.get("event") === "after_pageview" + ); + expect(after.get("page_id")).to.equal(pageLoadId); + expect(after.get("session_id")).to.equal(pageLoadId); + const leave = JSON.parse( + dom.sent.find(({ type }) => type === "beacon").data + ); + expect(leave.original_id).to.equal(pageLoadId); + dom.window.close(); + }); + + it("does not attribute ignored-page events or leave data to the server record", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, ignorePages: "/ignore" }, + }); + dom.window.sa_event("ignored_event"); + dom.window.dispatchEvent(new dom.window.Event("pagehide")); + await wait(); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).not.to.equal(pageLoadId); + expect(event.get("session_id")).not.to.equal(pageLoadId); + const leave = JSON.parse( + dom.sent.find(({ type }) => type === "beacon").data + ); + expect(leave.original_id).not.to.equal(pageLoadId); + dom.window.close(); + }); + + it("keeps the merge ID consistent for a manual allowed path on an ignored URL", async function () { + const dom = createDOM({ + url: "https://example.com/ignore", + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + }); + dom.window.sa_pageview("/allowed"); + dom.window.sa_event("allowed_event"); + await wait(); + const initial = requests(dom).find( + (params) => params.get("type") === "append" + ); + expect(initial.get("path")).to.equal("/allowed"); + expect(initial.get("id")).to.equal(pageLoadId); + expect(initial.get("original_id")).to.equal(pageLoadId); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).to.equal(pageLoadId); + dom.window.close(); + }); + + it("does not merge a later pageview into an ignored initial page", async function () { + const dom = createDOM({ + settings: { pageLoadId, autoCollect: false, ignorePages: "/ignore" }, + }); + dom.window.sa_pageview("/ignore"); + dom.window.sa_pageview("/allowed"); + await wait(); + const allowed = requests(dom).filter( + (params) => params.get("path") === "/allowed" + ); + expect(allowed).to.have.lengthOf(1); + expect(allowed[0].get("type")).to.equal("pageview"); + expect(allowed[0].has("original_id")).to.equal(false); + expect(allowed[0].get("id")).not.to.equal(pageLoadId); + dom.window.close(); + }); + + it("links events emitted before a manual first pageview to the server record", async function () { + const dom = createDOM({ settings: { pageLoadId, autoCollect: false } }); + dom.window.sa_event("early_event"); + await wait(); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).to.equal(pageLoadId); + expect(event.get("session_id")).to.equal(pageLoadId); + dom.window.close(); + }); + + it("enriches the initial record and creates new records for later pageviews", async function () { + const dom = createDOM({ settings: { pageLoadId, autoCollect: false } }); + dom.window.sa_pageview("/first"); + await wait(); + dom.window.sa_event("signup"); + dom.window.sa_pageview("/second"); + await wait(); + + const initial = requests(dom).find( + (params) => + params.get("path") === "/first" && params.get("type") === "append" + ); + expect(initial.get("original_id")).to.equal(pageLoadId); + expect(initial.get("session_id")).to.equal(pageLoadId); + expect(initial.has("collected_client_side")).to.equal(false); + const event = requests(dom).find( + (params) => params.get("type") === "event" + ); + expect(event.get("page_id")).to.equal(pageLoadId); + expect(event.get("id")).not.to.equal(pageLoadId); + const second = requests(dom).find( + (params) => params.get("type") === "pageview" + ); + expect(second.get("path")).to.equal("/second"); + expect(second.get("id")).not.to.equal(pageLoadId); + expect(second.get("session_id")).to.equal(pageLoadId); + expect(second.has("original_id")).to.equal(false); + dom.window.close(); + }); + + for (const settings of [{}, { pageLoadId }]) { + it(`reads the attribute with ${ + settings.pageLoadId ? "JavaScript precedence" : "no JavaScript setting" + }`, async function () { + const dom = createDOM({ + settings, + beforeRun(context) { + runInContext( + `Object.defineProperty(document, "currentScript", { value: { getAttribute: function(name) { return name === "data-page-load-id" ? "${attributeId}" : null; } } });`, + context + ); + }, + }); + await wait(); + expect(requests(dom)[0].get("original_id")).to.equal( + settings.pageLoadId || attributeId + ); + dom.window.close(); + }); + } + + it("keeps normal collection for an absent ID", async function () { + const dom = createDOM(); + await wait(); + const initial = requests(dom)[0]; + expect(initial.get("type")).to.equal("pageview"); + expect(initial.has("original_id")).to.equal(false); + dom.window.close(); + }); + + for (const invalidId of [ + "not-a-uuid", + "e35432dd-4af3-70c3-90ad-5a95d8e4fb1f", + ]) { + it(`leaves validation of ${invalidId} to the server`, async function () { + const dom = createDOM({ settings: { pageLoadId: invalidId } }); + await wait(); + const initial = requests(dom)[0]; + expect(initial.get("type")).to.equal("append"); + expect(initial.get("original_id")).to.equal(invalidId); + dom.window.close(); + }); + } + + it("merges when duration and scroll are disabled, without reusing the record on navigation", async function () { + const dom = createDOM({ + settings: { + pageLoadId, + autoCollect: false, + ignoreMetrics: "timeonpage,scrolled,sessions", + }, + }); + dom.window.sa_pageview("/first"); + await wait(); + dom.window.sa_pageview("/next"); + await wait(); + const [initial, next] = requests(dom); + expect(initial.get("original_id")).to.equal(pageLoadId); + expect(initial.has("session_id")).to.equal(false); + expect(next.get("type")).to.equal("pageview"); + expect(next.get("id")).not.to.equal(pageLoadId); + dom.window.close(); + }); +});