@fingerprintjs/fingerprintjs
Advanced tools
Comparing version 3.0.2 to 3.0.3
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -247,3 +247,3 @@ * | ||
var version = "3.0.2"; | ||
var version = "3.0.3"; | ||
@@ -303,74 +303,252 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w = window; | ||
var n = navigator; | ||
var w = window; | ||
function isAudioParam(value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
var d = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w, | ||
'msSetImmediate' in w, | ||
'msIndexedDB' in w, | ||
'msMaxTouchPoints' in n, | ||
'msPointerEnabled' in n, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n, | ||
'webkitTemporaryStorage' in n, | ||
n.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w, | ||
'BatteryManager' in w, | ||
'webkitMediaStream' in w, | ||
'webkitSpeechGrammar' in w, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w, | ||
'CSSPrimitiveValue' in w, | ||
'Counter' in w, | ||
n.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n, | ||
'WebKitMediaKeys' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return (countTruthy([ | ||
'safari' in w, | ||
!('DeviceMotionEvent' in w), | ||
!('ongestureend' in w), | ||
!('standalone' in n), | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n, | ||
((_a = d.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d.documentElement.style, | ||
'MediaRecorderErrorEvent' in w, | ||
'mozInnerScreenX' in w, | ||
'CSSMozDocumentRule' in w, | ||
'CanvasCaptureMediaStream' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w), | ||
'RTCEncodedAudioFrame' in w, | ||
'' + w.Intl === '[object Intl]', | ||
'' + w.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent. | ||
* It doesn't check that the browser is based on WebKit, there is a separate function for this. | ||
* | ||
* @link https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map | ||
*/ | ||
function isWebKit606OrNewer() { | ||
// Checked in Safari 9–14 | ||
return (countTruthy([ | ||
'DOMRectList' in w, | ||
'RTCPeerConnectionIceEvent' in w, | ||
'SVGGeometryElement' in w, | ||
'ontransitioncancel' in w, | ||
]) >= 3); | ||
} | ||
var w$1 = window; | ||
var d$1 = document; | ||
// Inspired by and based on https://github.com/cozylife/audio-fingerprint | ||
function getAudioFingerprint() { | ||
return tslib.__awaiter(this, void 0, void 0, function () { | ||
var AudioContext, context, oscillator, compressor, _i, _a, _b, name_1, value, param; | ||
return tslib.__generator(this, function (_c) { | ||
// On iOS 11, audio context can only be used in response to user interaction. | ||
// We require users to explicitly enable audio fingerprinting on iOS 11. | ||
// See https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (n.userAgent.match(/OS 11.+Version\/11.+Safari/)) { | ||
// See comment for excludeUserAgent and https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
return [2 /*return*/, -1]; | ||
var AudioContext, context, oscillator, compressor, buffer, error_1; | ||
return tslib.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
// In some browsers, audio context always stays suspended unless the context is started in response to a user action | ||
// (e.g. a click or a tap). It prevents audio fingerprint from being taken at an arbitrary moment of time. | ||
// Such browsers are old and unpopular, so the audio fingerprinting is just skipped in them. | ||
// See a similar case explanation at https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (doesCurrentBrowserSuspendAudioContext()) { | ||
return [2 /*return*/, -1]; | ||
} | ||
AudioContext = w$1.OfflineAudioContext || w$1.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
setAudioParam(context, oscillator.frequency, 10000); | ||
compressor = context.createDynamicsCompressor(); | ||
setAudioParam(context, compressor.threshold, -50); | ||
setAudioParam(context, compressor.knee, 40); | ||
setAudioParam(context, compressor.ratio, 12); | ||
setAudioParam(context, compressor.reduction, -20); | ||
setAudioParam(context, compressor.attack, 0); | ||
setAudioParam(context, compressor.release, 0.25); | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, 4, 5]); | ||
return [4 /*yield*/, renderAudio(context)]; | ||
case 2: | ||
buffer = _a.sent(); | ||
return [3 /*break*/, 5]; | ||
case 3: | ||
error_1 = _a.sent(); | ||
if (error_1.name === "timeout" /* Timeout */ || error_1.name === "suspended" /* Suspended */) { | ||
return [2 /*return*/, -3]; | ||
} | ||
throw error_1; | ||
case 4: | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
return [7 /*endfinally*/]; | ||
case 5: return [2 /*return*/, getHash(buffer.getChannelData(0))]; | ||
} | ||
AudioContext = w.OfflineAudioContext || w.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
oscillator.frequency.setValueAtTime(10000, context.currentTime); | ||
compressor = context.createDynamicsCompressor(); | ||
for (_i = 0, _a = [ | ||
['threshold', -50], | ||
['knee', 40], | ||
['ratio', 12], | ||
['reduction', -20], | ||
['attack', 0], | ||
['release', 0.25], | ||
]; _i < _a.length; _i++) { | ||
_b = _a[_i], name_1 = _b[0], value = _b[1]; | ||
param = compressor[name_1]; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
context.startRendering(); | ||
return [2 /*return*/, new Promise(function (resolve) { | ||
var audioTimeoutId = setTimeout(function () { | ||
context.oncomplete = null; | ||
resolve(-3); | ||
}, 1000); | ||
context.oncomplete = function (event) { | ||
var afp; | ||
try { | ||
clearTimeout(audioTimeoutId); | ||
afp = event.renderedBuffer | ||
.getChannelData(0) | ||
.slice(4500, 5000) | ||
.reduce(function (acc, val) { return acc + Math.abs(val); }, 0); | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
} | ||
catch (error) { | ||
resolve(-4); | ||
return; | ||
} | ||
resolve(afp); | ||
}; | ||
})]; | ||
}); | ||
}); | ||
} | ||
/** | ||
* Checks if the current browser is known to always suspend audio context | ||
*/ | ||
function doesCurrentBrowserSuspendAudioContext() { | ||
return isWebKit() && !isDesktopSafari() && !isWebKit606OrNewer(); | ||
} | ||
function setAudioParam(context, param, value) { | ||
var isAudioParam = function (value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
}; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
function renderAudio(context) { | ||
var resumeTriesMaxCount = 3; | ||
var resumeRetryDelay = 500; | ||
var runningTimeout = 1000; | ||
return new Promise(function (resolve, reject) { | ||
context.oncomplete = function (event) { return resolve(event.renderedBuffer); }; | ||
var resumeTriesLeft = resumeTriesMaxCount; | ||
var tryResume = function () { | ||
context.startRendering(); | ||
switch (context.state) { | ||
case 'running': | ||
setTimeout(function () { return reject(makeInnerError("timeout" /* Timeout */)); }, runningTimeout); | ||
break; | ||
// Sometimes the audio context doesn't start after calling `startRendering` (in addition to the cases where | ||
// audio context doesn't start at all). A known case is starting an audio context when the browser tab is in | ||
// background on iPhone. Retries usually help in this case. | ||
case 'suspended': | ||
// The audio context can reject starting until the tab is in foreground. Long fingerprint duration | ||
// in background isn't a problem, therefore the retry attempts don't count in background. It can lead to | ||
// a situation when a fingerprint takes very long time and finishes successfully. FYI, the audio context | ||
// can be suspended when `document.hidden === false` and start running after a retry. | ||
if (!d$1.hidden) { | ||
resumeTriesLeft--; | ||
} | ||
if (resumeTriesLeft > 0) { | ||
setTimeout(tryResume, resumeRetryDelay); | ||
} | ||
else { | ||
reject(makeInnerError("suspended" /* Suspended */)); | ||
} | ||
break; | ||
} | ||
}; | ||
tryResume(); | ||
}); | ||
} | ||
function getHash(signal) { | ||
var hash = 0; | ||
for (var i = 4500; i < 5000; ++i) { | ||
hash += Math.abs(signal[i]); | ||
} | ||
return hash; | ||
} | ||
function makeInnerError(name) { | ||
var error = new Error(name); | ||
error.name = name; | ||
return error; | ||
} | ||
var d = document; | ||
var d$2 = document; | ||
// We use m or w because these two characters take up the maximum width. | ||
@@ -461,7 +639,7 @@ // And we use a LLi so that the same matching fonts can get separated. | ||
function getFonts() { | ||
var h = d.body; | ||
var h = d$2.body; | ||
// div to load spans for the base fonts | ||
var baseFontsDiv = d.createElement('div'); | ||
var baseFontsDiv = d$2.createElement('div'); | ||
// div to load spans for the fonts to detect | ||
var fontsDiv = d.createElement('div'); | ||
var fontsDiv = d$2.createElement('div'); | ||
var defaultWidth = {}; | ||
@@ -471,3 +649,3 @@ var defaultHeight = {}; | ||
var createSpan = function () { | ||
var span = d.createElement('span'); | ||
var span = d$2.createElement('span'); | ||
span.textContent = testString; | ||
@@ -545,112 +723,2 @@ for (var _i = 0, _a = Object.keys(fontSpanStyle); _i < _a.length; _i++) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w$1 = window; | ||
var n$1 = navigator; | ||
var d$1 = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w$1, | ||
'msSetImmediate' in w$1, | ||
'msIndexedDB' in w$1, | ||
'msMaxTouchPoints' in n$1, | ||
'msPointerEnabled' in n$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w$1, 'MSStream' in w$1, 'msLaunchUri' in n$1, 'msSaveBlob' in n$1]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n$1, | ||
'webkitTemporaryStorage' in n$1, | ||
n$1.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w$1, | ||
'BatteryManager' in w$1, | ||
'webkitMediaStream' in w$1, | ||
'webkitSpeechGrammar' in w$1, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w$1, | ||
'CSSPrimitiveValue' in w$1, | ||
'Counter' in w$1, | ||
n$1.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n$1, | ||
'WebKitMediaKeys' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$1; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n$1, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$1, | ||
'mozInnerScreenX' in w$1, | ||
'CSSMozDocumentRule' in w$1, | ||
'CanvasCaptureMediaStream' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w$1), | ||
'RTCEncodedAudioFrame' in w$1, | ||
'' + w$1.Intl === '[object Intl]', | ||
'' + w$1.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
function getPlugins() { | ||
@@ -761,3 +829,3 @@ if (isTrident()) { | ||
var n$2 = navigator; | ||
var n$1 = navigator; | ||
var w$2 = window; | ||
@@ -774,7 +842,7 @@ /** | ||
var touchEvent; | ||
if (n$2.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$2.maxTouchPoints); | ||
if (n$1.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$1.maxTouchPoints); | ||
} | ||
else if (n$2.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$2.msMaxTouchPoints; | ||
else if (n$1.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$1.msMaxTouchPoints; | ||
} | ||
@@ -800,18 +868,18 @@ try { | ||
var n$3 = navigator; | ||
var n$2 = navigator; | ||
function getLanguages() { | ||
var result = []; | ||
var language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
var language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$3.languages)) { | ||
if (Array.isArray(n$2.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
result.push(n$2.languages); | ||
} | ||
} | ||
else if (typeof n$3.languages === 'string') { | ||
var languages = n$3.languages; | ||
else if (typeof n$2.languages === 'string') { | ||
var languages = n$2.languages; | ||
if (languages) { | ||
@@ -967,3 +1035,3 @@ result.push(languages.split(',')); | ||
var d$2 = document; | ||
var d$3 = document; | ||
/** | ||
@@ -986,6 +1054,6 @@ * navigator.cookieEnabled cannot detect custom or nuanced cookie blocking configurations. For example, when blocking | ||
// Create cookie | ||
d$2.cookie = 'cookietest=1'; | ||
var result = d$2.cookie.indexOf('cookietest=') !== -1; | ||
d$3.cookie = 'cookietest=1'; | ||
var result = d$3.cookie.indexOf('cookietest=') !== -1; | ||
// Delete cookie | ||
d$2.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
d$3.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
return result; | ||
@@ -1005,3 +1073,3 @@ } | ||
var sources = { | ||
// Expected errors and default values must be handled inside the functions | ||
// Expected errors and default values must be handled inside the functions. Unexpected errors must be thrown. | ||
osCpu: getOsCpu, | ||
@@ -1008,0 +1076,0 @@ languages: getLanguages, |
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -4,0 +4,0 @@ * |
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -243,3 +243,3 @@ * | ||
var version = "3.0.2"; | ||
var version = "3.0.3"; | ||
@@ -299,74 +299,252 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w = window; | ||
var n = navigator; | ||
var w = window; | ||
function isAudioParam(value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
var d = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w, | ||
'msSetImmediate' in w, | ||
'msIndexedDB' in w, | ||
'msMaxTouchPoints' in n, | ||
'msPointerEnabled' in n, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n, | ||
'webkitTemporaryStorage' in n, | ||
n.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w, | ||
'BatteryManager' in w, | ||
'webkitMediaStream' in w, | ||
'webkitSpeechGrammar' in w, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w, | ||
'CSSPrimitiveValue' in w, | ||
'Counter' in w, | ||
n.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n, | ||
'WebKitMediaKeys' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return (countTruthy([ | ||
'safari' in w, | ||
!('DeviceMotionEvent' in w), | ||
!('ongestureend' in w), | ||
!('standalone' in n), | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n, | ||
((_a = d.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d.documentElement.style, | ||
'MediaRecorderErrorEvent' in w, | ||
'mozInnerScreenX' in w, | ||
'CSSMozDocumentRule' in w, | ||
'CanvasCaptureMediaStream' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w), | ||
'RTCEncodedAudioFrame' in w, | ||
'' + w.Intl === '[object Intl]', | ||
'' + w.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent. | ||
* It doesn't check that the browser is based on WebKit, there is a separate function for this. | ||
* | ||
* @link https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map | ||
*/ | ||
function isWebKit606OrNewer() { | ||
// Checked in Safari 9–14 | ||
return (countTruthy([ | ||
'DOMRectList' in w, | ||
'RTCPeerConnectionIceEvent' in w, | ||
'SVGGeometryElement' in w, | ||
'ontransitioncancel' in w, | ||
]) >= 3); | ||
} | ||
var w$1 = window; | ||
var d$1 = document; | ||
// Inspired by and based on https://github.com/cozylife/audio-fingerprint | ||
function getAudioFingerprint() { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var AudioContext, context, oscillator, compressor, _i, _a, _b, name_1, value, param; | ||
return __generator(this, function (_c) { | ||
// On iOS 11, audio context can only be used in response to user interaction. | ||
// We require users to explicitly enable audio fingerprinting on iOS 11. | ||
// See https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (n.userAgent.match(/OS 11.+Version\/11.+Safari/)) { | ||
// See comment for excludeUserAgent and https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
return [2 /*return*/, -1]; | ||
var AudioContext, context, oscillator, compressor, buffer, error_1; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
// In some browsers, audio context always stays suspended unless the context is started in response to a user action | ||
// (e.g. a click or a tap). It prevents audio fingerprint from being taken at an arbitrary moment of time. | ||
// Such browsers are old and unpopular, so the audio fingerprinting is just skipped in them. | ||
// See a similar case explanation at https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (doesCurrentBrowserSuspendAudioContext()) { | ||
return [2 /*return*/, -1]; | ||
} | ||
AudioContext = w$1.OfflineAudioContext || w$1.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
setAudioParam(context, oscillator.frequency, 10000); | ||
compressor = context.createDynamicsCompressor(); | ||
setAudioParam(context, compressor.threshold, -50); | ||
setAudioParam(context, compressor.knee, 40); | ||
setAudioParam(context, compressor.ratio, 12); | ||
setAudioParam(context, compressor.reduction, -20); | ||
setAudioParam(context, compressor.attack, 0); | ||
setAudioParam(context, compressor.release, 0.25); | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, 4, 5]); | ||
return [4 /*yield*/, renderAudio(context)]; | ||
case 2: | ||
buffer = _a.sent(); | ||
return [3 /*break*/, 5]; | ||
case 3: | ||
error_1 = _a.sent(); | ||
if (error_1.name === "timeout" /* Timeout */ || error_1.name === "suspended" /* Suspended */) { | ||
return [2 /*return*/, -3]; | ||
} | ||
throw error_1; | ||
case 4: | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
return [7 /*endfinally*/]; | ||
case 5: return [2 /*return*/, getHash(buffer.getChannelData(0))]; | ||
} | ||
AudioContext = w.OfflineAudioContext || w.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
oscillator.frequency.setValueAtTime(10000, context.currentTime); | ||
compressor = context.createDynamicsCompressor(); | ||
for (_i = 0, _a = [ | ||
['threshold', -50], | ||
['knee', 40], | ||
['ratio', 12], | ||
['reduction', -20], | ||
['attack', 0], | ||
['release', 0.25], | ||
]; _i < _a.length; _i++) { | ||
_b = _a[_i], name_1 = _b[0], value = _b[1]; | ||
param = compressor[name_1]; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
context.startRendering(); | ||
return [2 /*return*/, new Promise(function (resolve) { | ||
var audioTimeoutId = setTimeout(function () { | ||
context.oncomplete = null; | ||
resolve(-3); | ||
}, 1000); | ||
context.oncomplete = function (event) { | ||
var afp; | ||
try { | ||
clearTimeout(audioTimeoutId); | ||
afp = event.renderedBuffer | ||
.getChannelData(0) | ||
.slice(4500, 5000) | ||
.reduce(function (acc, val) { return acc + Math.abs(val); }, 0); | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
} | ||
catch (error) { | ||
resolve(-4); | ||
return; | ||
} | ||
resolve(afp); | ||
}; | ||
})]; | ||
}); | ||
}); | ||
} | ||
/** | ||
* Checks if the current browser is known to always suspend audio context | ||
*/ | ||
function doesCurrentBrowserSuspendAudioContext() { | ||
return isWebKit() && !isDesktopSafari() && !isWebKit606OrNewer(); | ||
} | ||
function setAudioParam(context, param, value) { | ||
var isAudioParam = function (value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
}; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
function renderAudio(context) { | ||
var resumeTriesMaxCount = 3; | ||
var resumeRetryDelay = 500; | ||
var runningTimeout = 1000; | ||
return new Promise(function (resolve, reject) { | ||
context.oncomplete = function (event) { return resolve(event.renderedBuffer); }; | ||
var resumeTriesLeft = resumeTriesMaxCount; | ||
var tryResume = function () { | ||
context.startRendering(); | ||
switch (context.state) { | ||
case 'running': | ||
setTimeout(function () { return reject(makeInnerError("timeout" /* Timeout */)); }, runningTimeout); | ||
break; | ||
// Sometimes the audio context doesn't start after calling `startRendering` (in addition to the cases where | ||
// audio context doesn't start at all). A known case is starting an audio context when the browser tab is in | ||
// background on iPhone. Retries usually help in this case. | ||
case 'suspended': | ||
// The audio context can reject starting until the tab is in foreground. Long fingerprint duration | ||
// in background isn't a problem, therefore the retry attempts don't count in background. It can lead to | ||
// a situation when a fingerprint takes very long time and finishes successfully. FYI, the audio context | ||
// can be suspended when `document.hidden === false` and start running after a retry. | ||
if (!d$1.hidden) { | ||
resumeTriesLeft--; | ||
} | ||
if (resumeTriesLeft > 0) { | ||
setTimeout(tryResume, resumeRetryDelay); | ||
} | ||
else { | ||
reject(makeInnerError("suspended" /* Suspended */)); | ||
} | ||
break; | ||
} | ||
}; | ||
tryResume(); | ||
}); | ||
} | ||
function getHash(signal) { | ||
var hash = 0; | ||
for (var i = 4500; i < 5000; ++i) { | ||
hash += Math.abs(signal[i]); | ||
} | ||
return hash; | ||
} | ||
function makeInnerError(name) { | ||
var error = new Error(name); | ||
error.name = name; | ||
return error; | ||
} | ||
var d = document; | ||
var d$2 = document; | ||
// We use m or w because these two characters take up the maximum width. | ||
@@ -457,7 +635,7 @@ // And we use a LLi so that the same matching fonts can get separated. | ||
function getFonts() { | ||
var h = d.body; | ||
var h = d$2.body; | ||
// div to load spans for the base fonts | ||
var baseFontsDiv = d.createElement('div'); | ||
var baseFontsDiv = d$2.createElement('div'); | ||
// div to load spans for the fonts to detect | ||
var fontsDiv = d.createElement('div'); | ||
var fontsDiv = d$2.createElement('div'); | ||
var defaultWidth = {}; | ||
@@ -467,3 +645,3 @@ var defaultHeight = {}; | ||
var createSpan = function () { | ||
var span = d.createElement('span'); | ||
var span = d$2.createElement('span'); | ||
span.textContent = testString; | ||
@@ -541,112 +719,2 @@ for (var _i = 0, _a = Object.keys(fontSpanStyle); _i < _a.length; _i++) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w$1 = window; | ||
var n$1 = navigator; | ||
var d$1 = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w$1, | ||
'msSetImmediate' in w$1, | ||
'msIndexedDB' in w$1, | ||
'msMaxTouchPoints' in n$1, | ||
'msPointerEnabled' in n$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w$1, 'MSStream' in w$1, 'msLaunchUri' in n$1, 'msSaveBlob' in n$1]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n$1, | ||
'webkitTemporaryStorage' in n$1, | ||
n$1.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w$1, | ||
'BatteryManager' in w$1, | ||
'webkitMediaStream' in w$1, | ||
'webkitSpeechGrammar' in w$1, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w$1, | ||
'CSSPrimitiveValue' in w$1, | ||
'Counter' in w$1, | ||
n$1.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n$1, | ||
'WebKitMediaKeys' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$1; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n$1, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$1, | ||
'mozInnerScreenX' in w$1, | ||
'CSSMozDocumentRule' in w$1, | ||
'CanvasCaptureMediaStream' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w$1), | ||
'RTCEncodedAudioFrame' in w$1, | ||
'' + w$1.Intl === '[object Intl]', | ||
'' + w$1.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
function getPlugins() { | ||
@@ -757,3 +825,3 @@ if (isTrident()) { | ||
var n$2 = navigator; | ||
var n$1 = navigator; | ||
var w$2 = window; | ||
@@ -770,7 +838,7 @@ /** | ||
var touchEvent; | ||
if (n$2.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$2.maxTouchPoints); | ||
if (n$1.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$1.maxTouchPoints); | ||
} | ||
else if (n$2.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$2.msMaxTouchPoints; | ||
else if (n$1.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$1.msMaxTouchPoints; | ||
} | ||
@@ -796,18 +864,18 @@ try { | ||
var n$3 = navigator; | ||
var n$2 = navigator; | ||
function getLanguages() { | ||
var result = []; | ||
var language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
var language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$3.languages)) { | ||
if (Array.isArray(n$2.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
result.push(n$2.languages); | ||
} | ||
} | ||
else if (typeof n$3.languages === 'string') { | ||
var languages = n$3.languages; | ||
else if (typeof n$2.languages === 'string') { | ||
var languages = n$2.languages; | ||
if (languages) { | ||
@@ -963,3 +1031,3 @@ result.push(languages.split(',')); | ||
var d$2 = document; | ||
var d$3 = document; | ||
/** | ||
@@ -982,6 +1050,6 @@ * navigator.cookieEnabled cannot detect custom or nuanced cookie blocking configurations. For example, when blocking | ||
// Create cookie | ||
d$2.cookie = 'cookietest=1'; | ||
var result = d$2.cookie.indexOf('cookietest=') !== -1; | ||
d$3.cookie = 'cookietest=1'; | ||
var result = d$3.cookie.indexOf('cookietest=') !== -1; | ||
// Delete cookie | ||
d$2.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
d$3.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
return result; | ||
@@ -1001,3 +1069,3 @@ } | ||
var sources = { | ||
// Expected errors and default values must be handled inside the functions | ||
// Expected errors and default values must be handled inside the functions. Unexpected errors must be thrown. | ||
osCpu: getOsCpu, | ||
@@ -1004,0 +1072,0 @@ languages: getLanguages, |
456
dist/fp.js
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -308,3 +308,3 @@ * | ||
var version = "3.0.2"; | ||
var version = "3.0.3"; | ||
@@ -364,74 +364,252 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w = window; | ||
var n = navigator; | ||
var w = window; | ||
function isAudioParam(value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
var d = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w, | ||
'msSetImmediate' in w, | ||
'msIndexedDB' in w, | ||
'msMaxTouchPoints' in n, | ||
'msPointerEnabled' in n, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n, | ||
'webkitTemporaryStorage' in n, | ||
n.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w, | ||
'BatteryManager' in w, | ||
'webkitMediaStream' in w, | ||
'webkitSpeechGrammar' in w, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w, | ||
'CSSPrimitiveValue' in w, | ||
'Counter' in w, | ||
n.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n, | ||
'WebKitMediaKeys' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return (countTruthy([ | ||
'safari' in w, | ||
!('DeviceMotionEvent' in w), | ||
!('ongestureend' in w), | ||
!('standalone' in n), | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n, | ||
((_a = d.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d.documentElement.style, | ||
'MediaRecorderErrorEvent' in w, | ||
'mozInnerScreenX' in w, | ||
'CSSMozDocumentRule' in w, | ||
'CanvasCaptureMediaStream' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w), | ||
'RTCEncodedAudioFrame' in w, | ||
'' + w.Intl === '[object Intl]', | ||
'' + w.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent. | ||
* It doesn't check that the browser is based on WebKit, there is a separate function for this. | ||
* | ||
* @link https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map | ||
*/ | ||
function isWebKit606OrNewer() { | ||
// Checked in Safari 9–14 | ||
return (countTruthy([ | ||
'DOMRectList' in w, | ||
'RTCPeerConnectionIceEvent' in w, | ||
'SVGGeometryElement' in w, | ||
'ontransitioncancel' in w, | ||
]) >= 3); | ||
} | ||
var w$1 = window; | ||
var d$1 = document; | ||
// Inspired by and based on https://github.com/cozylife/audio-fingerprint | ||
function getAudioFingerprint() { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var AudioContext, context, oscillator, compressor, _i, _a, _b, name_1, value, param; | ||
return __generator(this, function (_c) { | ||
// On iOS 11, audio context can only be used in response to user interaction. | ||
// We require users to explicitly enable audio fingerprinting on iOS 11. | ||
// See https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (n.userAgent.match(/OS 11.+Version\/11.+Safari/)) { | ||
// See comment for excludeUserAgent and https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
return [2 /*return*/, -1]; | ||
var AudioContext, context, oscillator, compressor, buffer, error_1; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
// In some browsers, audio context always stays suspended unless the context is started in response to a user action | ||
// (e.g. a click or a tap). It prevents audio fingerprint from being taken at an arbitrary moment of time. | ||
// Such browsers are old and unpopular, so the audio fingerprinting is just skipped in them. | ||
// See a similar case explanation at https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (doesCurrentBrowserSuspendAudioContext()) { | ||
return [2 /*return*/, -1]; | ||
} | ||
AudioContext = w$1.OfflineAudioContext || w$1.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
setAudioParam(context, oscillator.frequency, 10000); | ||
compressor = context.createDynamicsCompressor(); | ||
setAudioParam(context, compressor.threshold, -50); | ||
setAudioParam(context, compressor.knee, 40); | ||
setAudioParam(context, compressor.ratio, 12); | ||
setAudioParam(context, compressor.reduction, -20); | ||
setAudioParam(context, compressor.attack, 0); | ||
setAudioParam(context, compressor.release, 0.25); | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, 4, 5]); | ||
return [4 /*yield*/, renderAudio(context)]; | ||
case 2: | ||
buffer = _a.sent(); | ||
return [3 /*break*/, 5]; | ||
case 3: | ||
error_1 = _a.sent(); | ||
if (error_1.name === "timeout" /* Timeout */ || error_1.name === "suspended" /* Suspended */) { | ||
return [2 /*return*/, -3]; | ||
} | ||
throw error_1; | ||
case 4: | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
return [7 /*endfinally*/]; | ||
case 5: return [2 /*return*/, getHash(buffer.getChannelData(0))]; | ||
} | ||
AudioContext = w.OfflineAudioContext || w.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
oscillator.frequency.setValueAtTime(10000, context.currentTime); | ||
compressor = context.createDynamicsCompressor(); | ||
for (_i = 0, _a = [ | ||
['threshold', -50], | ||
['knee', 40], | ||
['ratio', 12], | ||
['reduction', -20], | ||
['attack', 0], | ||
['release', 0.25], | ||
]; _i < _a.length; _i++) { | ||
_b = _a[_i], name_1 = _b[0], value = _b[1]; | ||
param = compressor[name_1]; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
context.startRendering(); | ||
return [2 /*return*/, new Promise(function (resolve) { | ||
var audioTimeoutId = setTimeout(function () { | ||
context.oncomplete = null; | ||
resolve(-3); | ||
}, 1000); | ||
context.oncomplete = function (event) { | ||
var afp; | ||
try { | ||
clearTimeout(audioTimeoutId); | ||
afp = event.renderedBuffer | ||
.getChannelData(0) | ||
.slice(4500, 5000) | ||
.reduce(function (acc, val) { return acc + Math.abs(val); }, 0); | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
} | ||
catch (error) { | ||
resolve(-4); | ||
return; | ||
} | ||
resolve(afp); | ||
}; | ||
})]; | ||
}); | ||
}); | ||
} | ||
/** | ||
* Checks if the current browser is known to always suspend audio context | ||
*/ | ||
function doesCurrentBrowserSuspendAudioContext() { | ||
return isWebKit() && !isDesktopSafari() && !isWebKit606OrNewer(); | ||
} | ||
function setAudioParam(context, param, value) { | ||
var isAudioParam = function (value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
}; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
function renderAudio(context) { | ||
var resumeTriesMaxCount = 3; | ||
var resumeRetryDelay = 500; | ||
var runningTimeout = 1000; | ||
return new Promise(function (resolve, reject) { | ||
context.oncomplete = function (event) { return resolve(event.renderedBuffer); }; | ||
var resumeTriesLeft = resumeTriesMaxCount; | ||
var tryResume = function () { | ||
context.startRendering(); | ||
switch (context.state) { | ||
case 'running': | ||
setTimeout(function () { return reject(makeInnerError("timeout" /* Timeout */)); }, runningTimeout); | ||
break; | ||
// Sometimes the audio context doesn't start after calling `startRendering` (in addition to the cases where | ||
// audio context doesn't start at all). A known case is starting an audio context when the browser tab is in | ||
// background on iPhone. Retries usually help in this case. | ||
case 'suspended': | ||
// The audio context can reject starting until the tab is in foreground. Long fingerprint duration | ||
// in background isn't a problem, therefore the retry attempts don't count in background. It can lead to | ||
// a situation when a fingerprint takes very long time and finishes successfully. FYI, the audio context | ||
// can be suspended when `document.hidden === false` and start running after a retry. | ||
if (!d$1.hidden) { | ||
resumeTriesLeft--; | ||
} | ||
if (resumeTriesLeft > 0) { | ||
setTimeout(tryResume, resumeRetryDelay); | ||
} | ||
else { | ||
reject(makeInnerError("suspended" /* Suspended */)); | ||
} | ||
break; | ||
} | ||
}; | ||
tryResume(); | ||
}); | ||
} | ||
function getHash(signal) { | ||
var hash = 0; | ||
for (var i = 4500; i < 5000; ++i) { | ||
hash += Math.abs(signal[i]); | ||
} | ||
return hash; | ||
} | ||
function makeInnerError(name) { | ||
var error = new Error(name); | ||
error.name = name; | ||
return error; | ||
} | ||
var d = document; | ||
var d$2 = document; | ||
// We use m or w because these two characters take up the maximum width. | ||
@@ -522,7 +700,7 @@ // And we use a LLi so that the same matching fonts can get separated. | ||
function getFonts() { | ||
var h = d.body; | ||
var h = d$2.body; | ||
// div to load spans for the base fonts | ||
var baseFontsDiv = d.createElement('div'); | ||
var baseFontsDiv = d$2.createElement('div'); | ||
// div to load spans for the fonts to detect | ||
var fontsDiv = d.createElement('div'); | ||
var fontsDiv = d$2.createElement('div'); | ||
var defaultWidth = {}; | ||
@@ -532,3 +710,3 @@ var defaultHeight = {}; | ||
var createSpan = function () { | ||
var span = d.createElement('span'); | ||
var span = d$2.createElement('span'); | ||
span.textContent = testString; | ||
@@ -606,112 +784,2 @@ for (var _i = 0, _a = Object.keys(fontSpanStyle); _i < _a.length; _i++) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w$1 = window; | ||
var n$1 = navigator; | ||
var d$1 = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w$1, | ||
'msSetImmediate' in w$1, | ||
'msIndexedDB' in w$1, | ||
'msMaxTouchPoints' in n$1, | ||
'msPointerEnabled' in n$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w$1, 'MSStream' in w$1, 'msLaunchUri' in n$1, 'msSaveBlob' in n$1]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n$1, | ||
'webkitTemporaryStorage' in n$1, | ||
n$1.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w$1, | ||
'BatteryManager' in w$1, | ||
'webkitMediaStream' in w$1, | ||
'webkitSpeechGrammar' in w$1, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w$1, | ||
'CSSPrimitiveValue' in w$1, | ||
'Counter' in w$1, | ||
n$1.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n$1, | ||
'WebKitMediaKeys' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$1; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n$1, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$1, | ||
'mozInnerScreenX' in w$1, | ||
'CSSMozDocumentRule' in w$1, | ||
'CanvasCaptureMediaStream' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w$1), | ||
'RTCEncodedAudioFrame' in w$1, | ||
'' + w$1.Intl === '[object Intl]', | ||
'' + w$1.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
function getPlugins() { | ||
@@ -822,3 +890,3 @@ if (isTrident()) { | ||
var n$2 = navigator; | ||
var n$1 = navigator; | ||
var w$2 = window; | ||
@@ -835,7 +903,7 @@ /** | ||
var touchEvent; | ||
if (n$2.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$2.maxTouchPoints); | ||
if (n$1.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$1.maxTouchPoints); | ||
} | ||
else if (n$2.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$2.msMaxTouchPoints; | ||
else if (n$1.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$1.msMaxTouchPoints; | ||
} | ||
@@ -861,18 +929,18 @@ try { | ||
var n$3 = navigator; | ||
var n$2 = navigator; | ||
function getLanguages() { | ||
var result = []; | ||
var language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
var language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$3.languages)) { | ||
if (Array.isArray(n$2.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
result.push(n$2.languages); | ||
} | ||
} | ||
else if (typeof n$3.languages === 'string') { | ||
var languages = n$3.languages; | ||
else if (typeof n$2.languages === 'string') { | ||
var languages = n$2.languages; | ||
if (languages) { | ||
@@ -1028,3 +1096,3 @@ result.push(languages.split(',')); | ||
var d$2 = document; | ||
var d$3 = document; | ||
/** | ||
@@ -1047,6 +1115,6 @@ * navigator.cookieEnabled cannot detect custom or nuanced cookie blocking configurations. For example, when blocking | ||
// Create cookie | ||
d$2.cookie = 'cookietest=1'; | ||
var result = d$2.cookie.indexOf('cookietest=') !== -1; | ||
d$3.cookie = 'cookietest=1'; | ||
var result = d$3.cookie.indexOf('cookietest=') !== -1; | ||
// Delete cookie | ||
d$2.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
d$3.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
return result; | ||
@@ -1066,3 +1134,3 @@ } | ||
var sources = { | ||
// Expected errors and default values must be handled inside the functions | ||
// Expected errors and default values must be handled inside the functions. Unexpected errors must be thrown. | ||
osCpu: getOsCpu, | ||
@@ -1069,0 +1137,0 @@ languages: getLanguages, |
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -9,2 +9,2 @@ * | ||
var FingerprintJS=function(e){"use strict";function t(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function r(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function o(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function i(e,t){return[e[0]^t[0],e[1]^t[1]]}function a(e){return e=i(e,[0,e[0]>>>1]),e=i(e=n(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=i(e=n(e,[3301882366,444984403]),[0,e[0]>>>1])}function c(e,c){c=c||0;var u,s=(e=e||"").length%16,l=e.length-s,f=[0,c],d=[0,c],h=[0,0],v=[0,0],g=[2277735313,289559509],p=[1291169091,658871167];for(u=0;u<l;u+=16)h=[255&e.charCodeAt(u+4)|(255&e.charCodeAt(u+5))<<8|(255&e.charCodeAt(u+6))<<16|(255&e.charCodeAt(u+7))<<24,255&e.charCodeAt(u)|(255&e.charCodeAt(u+1))<<8|(255&e.charCodeAt(u+2))<<16|(255&e.charCodeAt(u+3))<<24],v=[255&e.charCodeAt(u+12)|(255&e.charCodeAt(u+13))<<8|(255&e.charCodeAt(u+14))<<16|(255&e.charCodeAt(u+15))<<24,255&e.charCodeAt(u+8)|(255&e.charCodeAt(u+9))<<8|(255&e.charCodeAt(u+10))<<16|(255&e.charCodeAt(u+11))<<24],h=r(h=n(h,g),31),f=t(f=r(f=i(f,h=n(h,p)),27),d),f=t(n(f,[0,5]),[0,1390208809]),v=r(v=n(v,p),33),d=t(d=r(d=i(d,v=n(v,g)),31),f),d=t(n(d,[0,5]),[0,944331445]);switch(h=[0,0],v=[0,0],s){case 15:v=i(v,o([0,e.charCodeAt(u+14)],48));case 14:v=i(v,o([0,e.charCodeAt(u+13)],40));case 13:v=i(v,o([0,e.charCodeAt(u+12)],32));case 12:v=i(v,o([0,e.charCodeAt(u+11)],24));case 11:v=i(v,o([0,e.charCodeAt(u+10)],16));case 10:v=i(v,o([0,e.charCodeAt(u+9)],8));case 9:v=n(v=i(v,[0,e.charCodeAt(u+8)]),p),d=i(d,v=n(v=r(v,33),g));case 8:h=i(h,o([0,e.charCodeAt(u+7)],56));case 7:h=i(h,o([0,e.charCodeAt(u+6)],48));case 6:h=i(h,o([0,e.charCodeAt(u+5)],40));case 5:h=i(h,o([0,e.charCodeAt(u+4)],32));case 4:h=i(h,o([0,e.charCodeAt(u+3)],24));case 3:h=i(h,o([0,e.charCodeAt(u+2)],16));case 2:h=i(h,o([0,e.charCodeAt(u+1)],8));case 1:h=n(h=i(h,[0,e.charCodeAt(u)]),g),f=i(f,h=n(h=r(h,31),p))}return f=t(f=i(f,[0,e.length]),d=i(d,[0,e.length])),d=t(d,f),f=t(f=a(f),d=a(d)),d=t(d,f),("00000000"+(f[0]>>>0).toString(16)).slice(-8)+("00000000"+(f[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}var u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function s(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(t){i(t)}}function c(e){try{u(r.throw(e))}catch(t){i(t)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,c)}u((r=r.apply(e,t||[])).next())}))}function l(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(c){i=[6,c],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}function f(e){return"number"==typeof e?0|e:parseInt(e)}function d(e){return"number"==typeof e?e:parseFloat(e)}function h(e){return e.reduce((function(e,t){return e+(t?1:0)}),0)}var v=navigator,g=window;function p(e){return e&&"function"==typeof e.setValueAtTime}var m=document,y=["monospace","sans-serif","serif"],w=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],S={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal",position:"absolute",left:"-9999px",fontSize:"48px"};var b=window,C=navigator,A=document;function M(){return h(["MSCSSMatrix"in b,"msSetImmediate"in b,"msIndexedDB"in b,"msMaxTouchPoints"in C,"msPointerEnabled"in C])>=4}function T(){return h(["msWriteProfilerMark"in b,"MSStream"in b,"msLaunchUri"in C,"msSaveBlob"in C])>=3&&!M()}function k(){return h(["webkitPersistentStorage"in C,"webkitTemporaryStorage"in C,0===C.vendor.indexOf("Google"),"webkitResolveLocalFileSystemURL"in b,"BatteryManager"in b,"webkitMediaStream"in b,"webkitSpeechGrammar"in b])>=5}function x(e){return e.toDataURL()}var P=navigator,O=window;var I=navigator;var D=window;var E=window;var R=window;var B=document;var L={osCpu:function(){return navigator.oscpu},languages:function(){var e=[],t=I.language||I.userLanguage||I.browserLanguage||I.systemLanguage;if(void 0!==t&&e.push([t]),Array.isArray(I.languages))k()&&h([!("MediaSettingsRange"in b),"RTCEncodedAudioFrame"in b,""+b.Intl=="[object Intl]",""+b.Reflect=="[object Reflect]"])>=3||e.push(I.languages);else if("string"==typeof I.languages){var n=I.languages;n&&e.push(n.split(","))}return e},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){var e=[f(D.screen.width),f(D.screen.height)];return e.sort().reverse(),e},availableScreenResolution:function(){if(E.screen.availWidth&&E.screen.availHeight){var e=[f(E.screen.availWidth),f(E.screen.availHeight)];return e.sort().reverse(),e}},hardwareConcurrency:function(){try{var e=f(navigator.hardwareConcurrency);return isNaN(e)?1:e}catch(t){return 1}},timezoneOffset:function(){var e=(new Date).getFullYear();return Math.max(d(new Date(e,0,1).getTimezoneOffset()),d(new Date(e,6,1).getTimezoneOffset()))},timezone:function(){var e;if(null===(e=R.Intl)||void 0===e?void 0:e.DateTimeFormat)return(new R.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!M()&&!T())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(M())return[];if(navigator.plugins){for(var e=[],t=0;t<navigator.plugins.length;++t){var n=navigator.plugins[t];if(n){for(var r=[],o=0;o<n.length;++o){var i=n[o];r.push({type:i.type,suffixes:i.suffixes})}e.push({name:n.name,description:n.description,mimeTypes:r})}}return e}},canvas:function(){var e=function(){var e=document.createElement("canvas");return e.width=240,e.height=140,e.style.display="inline",[e,e.getContext("2d")]}(),t=e[0],n=e[1];if(!function(e,t){return!(!t||!e.toDataURL)}(t,n))return{winding:!1,data:""};n.rect(0,0,10,10),n.rect(2,2,6,6);var r=!n.isPointInPath(5,5,"evenodd");n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",n.font="11pt no-real-font-123";var o="Cwm fjordbank 😃 gly";return n.fillText(o,2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText(o,4,45),n.globalCompositeOperation="multiply",n.fillStyle="rgb(255,0,255)",n.beginPath(),n.arc(50,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(0,255,255)",n.beginPath(),n.arc(100,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,255,0)",n.beginPath(),n.arc(75,100,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,0,255)",n.arc(75,75,75,0,2*Math.PI,!0),n.arc(75,75,25,0,2*Math.PI,!0),n.fill("evenodd"),{winding:r,data:x(t)}},touchSupport:function(){var e,t=0;void 0!==P.maxTouchPoints?t=f(P.maxTouchPoints):void 0!==P.msMaxTouchPoints&&(t=P.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(n){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in O}},fonts:function(){var e=m.body,t=m.createElement("div"),n=m.createElement("div"),r={},o={},i=function(){var e=m.createElement("span");e.textContent="mmMwWLliI0O&1";for(var t=0,n=Object.keys(S);t<n.length;t++){var r=n[t];e.style[r]=S[r]}return e},a=function(e){return y.some((function(t,n){return e[n].offsetWidth!==r[t]||e[n].offsetHeight!==o[t]}))},c=y.map((function(e){var n=i();return n.style.fontFamily=e,t.appendChild(n),n}));e.appendChild(t);for(var u=0,s=y.length;u<s;u++)r[y[u]]=c[u].offsetWidth,o[y[u]]=c[u].offsetHeight;var l=function(){for(var e={},t=function(t){e[t]=y.map((function(e){var r=function(e,t){var n=i();return n.style.fontFamily="'"+e+"',"+t,n}(t,e);return n.appendChild(r),r}))},r=0,o=w;r<o.length;r++){t(o[r])}return e}();e.appendChild(n);for(var f=[],d=0,h=w.length;d<h;d++)a(l[w[d]])&&f.push(w[d]);return e.removeChild(n),e.removeChild(t),f},audio:function(){return s(this,void 0,void 0,(function(){var e,t,n,r,o,i,a,c,u,s;return l(this,(function(l){if(v.userAgent.match(/OS 11.+Version\/11.+Safari/))return[2,-1];if(!(e=g.OfflineAudioContext||g.webkitOfflineAudioContext))return[2,-2];for(t=new e(1,44100,44100),(n=t.createOscillator()).type="triangle",n.frequency.setValueAtTime(1e4,t.currentTime),r=t.createDynamicsCompressor(),o=0,i=[["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]];o<i.length;o++)c=(a=i[o])[0],u=a[1],p(s=r[c])&&s.setValueAtTime(u,t.currentTime);return n.connect(r),r.connect(t.destination),n.start(0),t.startRendering(),[2,new Promise((function(e){var o=setTimeout((function(){t.oncomplete=null,e(-3)}),1e3);t.oncomplete=function(t){var i;try{clearTimeout(o),i=t.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce((function(e,t){return e+Math.abs(t)}),0),n.disconnect(),r.disconnect()}catch(a){return void e(-4)}e(i)}}))]}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(e){try{return e.toSource(),!0}catch(t){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{B.cookie="cookietest=1";var e=-1!==B.cookie.indexOf("cookietest=");return B.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(t){return!1}}};function F(e,t,n){return s(this,void 0,void 0,(function(){var r,o,i,a,c,s,f,d,h;return l(this,(function(l){switch(l.label){case 0:r=Date.now(),o={},i=0,a=Object.keys(e),l.label=1;case 1:if(!(i<a.length))return[3,7];if(c=a[i],function(e,t){for(var n=0,r=e.length;n<r;++n)if(e[n]===t)return!0;return!1}(n,c))return[3,6];s=void 0,l.label=2;case 2:return l.trys.push([2,4,,5]),h={},[4,e[c](t)];case 3:return h.value=l.sent(),s=h,[3,5];case 4:return f=l.sent(),s=f&&"object"==typeof f&&"message"in f?{error:f}:{error:{message:f}},[3,5];case 5:d=Date.now(),o[c]=u(u({},s),{duration:d-r}),r=d,l.label=6;case 6:return i++,[3,1];case 7:return[2,o]}}))}))}function G(e){return JSON.stringify(e,(function(e,t){var n;return t instanceof Error?u(u({},t),{message:t.message,stack:null===(n=t.stack)||void 0===n?void 0:n.split("\n")}):t}),2)}function H(e){return c(function(e){for(var t="",n=0,r=Object.keys(e);n<r.length;n++){var o=r[n],i=e[o],a=i.error?"error":JSON.stringify(i.value);t+=(t?"|":"")+o.replace(/([:|\\])/g,"\\$1")+":"+a}return t}(e))}var U=function(){function e(){}return e.prototype.get=function(e){return void 0===e&&(e={}),s(this,void 0,void 0,(function(){var t,n;return l(this,(function(r){switch(r.label){case 0:return[4,F(L,void 0,[])];case 1:return t=r.sent(),n=function(e){var t;return{components:e,get visitorId(){return void 0===t&&(t=H(this.components)),t},set visitorId(e){t=e}}}(t),e.debug&&console.log("Copy the text below to get the debug data:\n\n```\nversion: 3.0.2\nuserAgent: "+navigator.userAgent+"\ngetOptions: "+JSON.stringify(e,void 0,2)+"\nvisitorId: "+n.visitorId+"\ncomponents: "+G(t)+"\n```"),[2,n]}}))}))},e}();function W(e){var t=(void 0===e?{}:e).delayFallback,n=void 0===t?50:t;return s(this,void 0,void 0,(function(){return l(this,(function(e){switch(e.label){case 0:return[4,(t=n,new Promise((function(e){window.requestIdleCallback?window.requestIdleCallback((function(){return e()})):setTimeout(e,t)})))];case 1:return e.sent(),[2,new U]}var t}))}))}var j={load:W,hashComponents:H,componentsToDebugString:G},N=c;return e.componentsToDebugString=G,e.default=j,e.getComponents=F,e.hashComponents=H,e.isChromium=k,e.isDesktopSafari=function(){return"safari"in b},e.isEdgeHTML=T,e.isGecko=function(){var e;return h(["buildID"in C,(null===(e=A.documentElement)||void 0===e?void 0:e.style)&&"MozAppearance"in A.documentElement.style,"MediaRecorderErrorEvent"in b,"mozInnerScreenX"in b,"CSSMozDocumentRule"in b,"CanvasCaptureMediaStream"in b])>=4},e.isTrident=M,e.isWebKit=function(){return h(["ApplePayError"in b,"CSSPrimitiveValue"in b,"Counter"in b,0===C.vendor.indexOf("Apple"),"getStorageUpdates"in C,"WebKitMediaKeys"in b])>=4},e.load=W,e.murmurX64Hash128=N,e}({}); | ||
var FingerprintJS=function(e){"use strict";function t(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function r(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function o(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function i(e,t){return[e[0]^t[0],e[1]^t[1]]}function a(e){return e=i(e,[0,e[0]>>>1]),e=i(e=n(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=i(e=n(e,[3301882366,444984403]),[0,e[0]>>>1])}function c(e,c){c=c||0;var u,s=(e=e||"").length%16,l=e.length-s,f=[0,c],d=[0,c],h=[0,0],v=[0,0],g=[2277735313,289559509],p=[1291169091,658871167];for(u=0;u<l;u+=16)h=[255&e.charCodeAt(u+4)|(255&e.charCodeAt(u+5))<<8|(255&e.charCodeAt(u+6))<<16|(255&e.charCodeAt(u+7))<<24,255&e.charCodeAt(u)|(255&e.charCodeAt(u+1))<<8|(255&e.charCodeAt(u+2))<<16|(255&e.charCodeAt(u+3))<<24],v=[255&e.charCodeAt(u+12)|(255&e.charCodeAt(u+13))<<8|(255&e.charCodeAt(u+14))<<16|(255&e.charCodeAt(u+15))<<24,255&e.charCodeAt(u+8)|(255&e.charCodeAt(u+9))<<8|(255&e.charCodeAt(u+10))<<16|(255&e.charCodeAt(u+11))<<24],h=r(h=n(h,g),31),f=t(f=r(f=i(f,h=n(h,p)),27),d),f=t(n(f,[0,5]),[0,1390208809]),v=r(v=n(v,p),33),d=t(d=r(d=i(d,v=n(v,g)),31),f),d=t(n(d,[0,5]),[0,944331445]);switch(h=[0,0],v=[0,0],s){case 15:v=i(v,o([0,e.charCodeAt(u+14)],48));case 14:v=i(v,o([0,e.charCodeAt(u+13)],40));case 13:v=i(v,o([0,e.charCodeAt(u+12)],32));case 12:v=i(v,o([0,e.charCodeAt(u+11)],24));case 11:v=i(v,o([0,e.charCodeAt(u+10)],16));case 10:v=i(v,o([0,e.charCodeAt(u+9)],8));case 9:v=n(v=i(v,[0,e.charCodeAt(u+8)]),p),d=i(d,v=n(v=r(v,33),g));case 8:h=i(h,o([0,e.charCodeAt(u+7)],56));case 7:h=i(h,o([0,e.charCodeAt(u+6)],48));case 6:h=i(h,o([0,e.charCodeAt(u+5)],40));case 5:h=i(h,o([0,e.charCodeAt(u+4)],32));case 4:h=i(h,o([0,e.charCodeAt(u+3)],24));case 3:h=i(h,o([0,e.charCodeAt(u+2)],16));case 2:h=i(h,o([0,e.charCodeAt(u+1)],8));case 1:h=n(h=i(h,[0,e.charCodeAt(u)]),g),f=i(f,h=n(h=r(h,31),p))}return f=t(f=i(f,[0,e.length]),d=i(d,[0,e.length])),d=t(d,f),f=t(f=a(f),d=a(d)),d=t(d,f),("00000000"+(f[0]>>>0).toString(16)).slice(-8)+("00000000"+(f[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}var u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function s(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(t){i(t)}}function c(e){try{u(r.throw(e))}catch(t){i(t)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,c)}u((r=r.apply(e,t||[])).next())}))}function l(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(c){i=[6,c],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}function f(e){return"number"==typeof e?0|e:parseInt(e)}function d(e){return"number"==typeof e?e:parseFloat(e)}function h(e){return e.reduce((function(e,t){return e+(t?1:0)}),0)}var v=window,g=navigator,p=document;function m(){return h(["MSCSSMatrix"in v,"msSetImmediate"in v,"msIndexedDB"in v,"msMaxTouchPoints"in g,"msPointerEnabled"in g])>=4}function y(){return h(["msWriteProfilerMark"in v,"MSStream"in v,"msLaunchUri"in g,"msSaveBlob"in g])>=3&&!m()}function w(){return h(["webkitPersistentStorage"in g,"webkitTemporaryStorage"in g,0===g.vendor.indexOf("Google"),"webkitResolveLocalFileSystemURL"in v,"BatteryManager"in v,"webkitMediaStream"in v,"webkitSpeechGrammar"in v])>=5}function b(){return h(["ApplePayError"in v,"CSSPrimitiveValue"in v,"Counter"in v,0===g.vendor.indexOf("Apple"),"getStorageUpdates"in g,"WebKitMediaKeys"in v])>=4}function S(){return h(["safari"in v,!("DeviceMotionEvent"in v),!("ongestureend"in v),!("standalone"in g)])>=3}var C=window,A=document;function M(e,t,n){(function(e){return e&&"function"==typeof e.setValueAtTime})(t)&&t.setValueAtTime(n,e.currentTime)}function T(e){return new Promise((function(t,n){e.oncomplete=function(e){return t(e.renderedBuffer)};var r=3,o=function(){switch(e.startRendering(),e.state){case"running":setTimeout((function(){return n(x("timeout"))}),1e3);break;case"suspended":A.hidden||r--,r>0?setTimeout(o,500):n(x("suspended"))}};o()}))}function k(e){for(var t=0,n=4500;n<5e3;++n)t+=Math.abs(e[n]);return t}function x(e){var t=new Error(e);return t.name=e,t}var P=document,I=["monospace","sans-serif","serif"],O=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],E={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal",position:"absolute",left:"-9999px",fontSize:"48px"};function D(e){return e.toDataURL()}var R=navigator,B=window;var L=navigator;var F=window;var G=window;var H=window;var U=document;var W={osCpu:function(){return navigator.oscpu},languages:function(){var e=[],t=L.language||L.userLanguage||L.browserLanguage||L.systemLanguage;if(void 0!==t&&e.push([t]),Array.isArray(L.languages))w()&&h([!("MediaSettingsRange"in v),"RTCEncodedAudioFrame"in v,""+v.Intl=="[object Intl]",""+v.Reflect=="[object Reflect]"])>=3||e.push(L.languages);else if("string"==typeof L.languages){var n=L.languages;n&&e.push(n.split(","))}return e},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){var e=[f(F.screen.width),f(F.screen.height)];return e.sort().reverse(),e},availableScreenResolution:function(){if(G.screen.availWidth&&G.screen.availHeight){var e=[f(G.screen.availWidth),f(G.screen.availHeight)];return e.sort().reverse(),e}},hardwareConcurrency:function(){try{var e=f(navigator.hardwareConcurrency);return isNaN(e)?1:e}catch(t){return 1}},timezoneOffset:function(){var e=(new Date).getFullYear();return Math.max(d(new Date(e,0,1).getTimezoneOffset()),d(new Date(e,6,1).getTimezoneOffset()))},timezone:function(){var e;if(null===(e=H.Intl)||void 0===e?void 0:e.DateTimeFormat)return(new H.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!m()&&!y())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(m())return[];if(navigator.plugins){for(var e=[],t=0;t<navigator.plugins.length;++t){var n=navigator.plugins[t];if(n){for(var r=[],o=0;o<n.length;++o){var i=n[o];r.push({type:i.type,suffixes:i.suffixes})}e.push({name:n.name,description:n.description,mimeTypes:r})}}return e}},canvas:function(){var e=function(){var e=document.createElement("canvas");return e.width=240,e.height=140,e.style.display="inline",[e,e.getContext("2d")]}(),t=e[0],n=e[1];if(!function(e,t){return!(!t||!e.toDataURL)}(t,n))return{winding:!1,data:""};n.rect(0,0,10,10),n.rect(2,2,6,6);var r=!n.isPointInPath(5,5,"evenodd");n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",n.font="11pt no-real-font-123";var o="Cwm fjordbank 😃 gly";return n.fillText(o,2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText(o,4,45),n.globalCompositeOperation="multiply",n.fillStyle="rgb(255,0,255)",n.beginPath(),n.arc(50,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(0,255,255)",n.beginPath(),n.arc(100,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,255,0)",n.beginPath(),n.arc(75,100,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,0,255)",n.arc(75,75,75,0,2*Math.PI,!0),n.arc(75,75,25,0,2*Math.PI,!0),n.fill("evenodd"),{winding:r,data:D(t)}},touchSupport:function(){var e,t=0;void 0!==R.maxTouchPoints?t=f(R.maxTouchPoints):void 0!==R.msMaxTouchPoints&&(t=R.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(n){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in B}},fonts:function(){var e=P.body,t=P.createElement("div"),n=P.createElement("div"),r={},o={},i=function(){var e=P.createElement("span");e.textContent="mmMwWLliI0O&1";for(var t=0,n=Object.keys(E);t<n.length;t++){var r=n[t];e.style[r]=E[r]}return e},a=function(e){return I.some((function(t,n){return e[n].offsetWidth!==r[t]||e[n].offsetHeight!==o[t]}))},c=I.map((function(e){var n=i();return n.style.fontFamily=e,t.appendChild(n),n}));e.appendChild(t);for(var u=0,s=I.length;u<s;u++)r[I[u]]=c[u].offsetWidth,o[I[u]]=c[u].offsetHeight;var l=function(){for(var e={},t=function(t){e[t]=I.map((function(e){var r=function(e,t){var n=i();return n.style.fontFamily="'"+e+"',"+t,n}(t,e);return n.appendChild(r),r}))},r=0,o=O;r<o.length;r++){t(o[r])}return e}();e.appendChild(n);for(var f=[],d=0,h=O.length;d<h;d++)a(l[O[d]])&&f.push(O[d]);return e.removeChild(n),e.removeChild(t),f},audio:function(){return s(this,void 0,void 0,(function(){var e,t,n,r,o,i;return l(this,(function(a){switch(a.label){case 0:if(b()&&!S()&&!(h(["DOMRectList"in v,"RTCPeerConnectionIceEvent"in v,"SVGGeometryElement"in v,"ontransitioncancel"in v])>=3))return[2,-1];if(!(e=C.OfflineAudioContext||C.webkitOfflineAudioContext))return[2,-2];t=new e(1,44100,44100),(n=t.createOscillator()).type="triangle",M(t,n.frequency,1e4),r=t.createDynamicsCompressor(),M(t,r.threshold,-50),M(t,r.knee,40),M(t,r.ratio,12),M(t,r.reduction,-20),M(t,r.attack,0),M(t,r.release,.25),n.connect(r),r.connect(t.destination),n.start(0),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,T(t)];case 2:return o=a.sent(),[3,5];case 3:if("timeout"===(i=a.sent()).name||"suspended"===i.name)return[2,-3];throw i;case 4:return n.disconnect(),r.disconnect(),[7];case 5:return[2,k(o.getChannelData(0))]}}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(e){try{return e.toSource(),!0}catch(t){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{U.cookie="cookietest=1";var e=-1!==U.cookie.indexOf("cookietest=");return U.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(t){return!1}}};function j(e,t,n){return s(this,void 0,void 0,(function(){var r,o,i,a,c,s,f,d,h;return l(this,(function(l){switch(l.label){case 0:r=Date.now(),o={},i=0,a=Object.keys(e),l.label=1;case 1:if(!(i<a.length))return[3,7];if(c=a[i],function(e,t){for(var n=0,r=e.length;n<r;++n)if(e[n]===t)return!0;return!1}(n,c))return[3,6];s=void 0,l.label=2;case 2:return l.trys.push([2,4,,5]),h={},[4,e[c](t)];case 3:return h.value=l.sent(),s=h,[3,5];case 4:return f=l.sent(),s=f&&"object"==typeof f&&"message"in f?{error:f}:{error:{message:f}},[3,5];case 5:d=Date.now(),o[c]=u(u({},s),{duration:d-r}),r=d,l.label=6;case 6:return i++,[3,1];case 7:return[2,o]}}))}))}function N(e){return JSON.stringify(e,(function(e,t){var n;return t instanceof Error?u(u({},t),{message:t.message,stack:null===(n=t.stack)||void 0===n?void 0:n.split("\n")}):t}),2)}function z(e){return c(function(e){for(var t="",n=0,r=Object.keys(e);n<r.length;n++){var o=r[n],i=e[o],a=i.error?"error":JSON.stringify(i.value);t+=(t?"|":"")+o.replace(/([:|\\])/g,"\\$1")+":"+a}return t}(e))}var V=function(){function e(){}return e.prototype.get=function(e){return void 0===e&&(e={}),s(this,void 0,void 0,(function(){var t,n;return l(this,(function(r){switch(r.label){case 0:return[4,j(W,void 0,[])];case 1:return t=r.sent(),n=function(e){var t;return{components:e,get visitorId(){return void 0===t&&(t=z(this.components)),t},set visitorId(e){t=e}}}(t),e.debug&&console.log("Copy the text below to get the debug data:\n\n```\nversion: 3.0.3\nuserAgent: "+navigator.userAgent+"\ngetOptions: "+JSON.stringify(e,void 0,2)+"\nvisitorId: "+n.visitorId+"\ncomponents: "+N(t)+"\n```"),[2,n]}}))}))},e}();function J(e){var t=(void 0===e?{}:e).delayFallback,n=void 0===t?50:t;return s(this,void 0,void 0,(function(){return l(this,(function(e){switch(e.label){case 0:return[4,(t=n,new Promise((function(e){window.requestIdleCallback?window.requestIdleCallback((function(){return e()})):setTimeout(e,t)})))];case 1:return e.sent(),[2,new V]}var t}))}))}var q={load:J,hashComponents:z,componentsToDebugString:N},K=c;return e.componentsToDebugString=N,e.default=q,e.getComponents=j,e.hashComponents=z,e.isChromium=w,e.isDesktopSafari=S,e.isEdgeHTML=y,e.isGecko=function(){var e;return h(["buildID"in g,(null===(e=p.documentElement)||void 0===e?void 0:e.style)&&"MozAppearance"in p.documentElement.style,"MediaRecorderErrorEvent"in v,"mozInnerScreenX"in v,"CSSMozDocumentRule"in v,"CanvasCaptureMediaStream"in v])>=4},e.isTrident=m,e.isWebKit=b,e.load=J,e.murmurX64Hash128=K,e}({}); |
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -311,3 +311,3 @@ * | ||
var version = "3.0.2"; | ||
var version = "3.0.3"; | ||
@@ -367,74 +367,252 @@ function requestIdleCallbackIfAvailable(fallbackTimeout) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w = window; | ||
var n = navigator; | ||
var w = window; | ||
function isAudioParam(value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
var d = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w, | ||
'msSetImmediate' in w, | ||
'msIndexedDB' in w, | ||
'msMaxTouchPoints' in n, | ||
'msPointerEnabled' in n, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n, | ||
'webkitTemporaryStorage' in n, | ||
n.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w, | ||
'BatteryManager' in w, | ||
'webkitMediaStream' in w, | ||
'webkitSpeechGrammar' in w, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w, | ||
'CSSPrimitiveValue' in w, | ||
'Counter' in w, | ||
n.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n, | ||
'WebKitMediaKeys' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return (countTruthy([ | ||
'safari' in w, | ||
!('DeviceMotionEvent' in w), | ||
!('ongestureend' in w), | ||
!('standalone' in n), | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n, | ||
((_a = d.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d.documentElement.style, | ||
'MediaRecorderErrorEvent' in w, | ||
'mozInnerScreenX' in w, | ||
'CSSMozDocumentRule' in w, | ||
'CanvasCaptureMediaStream' in w, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w), | ||
'RTCEncodedAudioFrame' in w, | ||
'' + w.Intl === '[object Intl]', | ||
'' + w.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
/** | ||
* Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent. | ||
* It doesn't check that the browser is based on WebKit, there is a separate function for this. | ||
* | ||
* @link https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map | ||
*/ | ||
function isWebKit606OrNewer() { | ||
// Checked in Safari 9–14 | ||
return (countTruthy([ | ||
'DOMRectList' in w, | ||
'RTCPeerConnectionIceEvent' in w, | ||
'SVGGeometryElement' in w, | ||
'ontransitioncancel' in w, | ||
]) >= 3); | ||
} | ||
var w$1 = window; | ||
var d$1 = document; | ||
// Inspired by and based on https://github.com/cozylife/audio-fingerprint | ||
function getAudioFingerprint() { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var AudioContext, context, oscillator, compressor, _i, _a, _b, name_1, value, param; | ||
return __generator(this, function (_c) { | ||
// On iOS 11, audio context can only be used in response to user interaction. | ||
// We require users to explicitly enable audio fingerprinting on iOS 11. | ||
// See https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (n.userAgent.match(/OS 11.+Version\/11.+Safari/)) { | ||
// See comment for excludeUserAgent and https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
return [2 /*return*/, -1]; | ||
var AudioContext, context, oscillator, compressor, buffer, error_1; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
// In some browsers, audio context always stays suspended unless the context is started in response to a user action | ||
// (e.g. a click or a tap). It prevents audio fingerprint from being taken at an arbitrary moment of time. | ||
// Such browsers are old and unpopular, so the audio fingerprinting is just skipped in them. | ||
// See a similar case explanation at https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088 | ||
if (doesCurrentBrowserSuspendAudioContext()) { | ||
return [2 /*return*/, -1]; | ||
} | ||
AudioContext = w$1.OfflineAudioContext || w$1.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
setAudioParam(context, oscillator.frequency, 10000); | ||
compressor = context.createDynamicsCompressor(); | ||
setAudioParam(context, compressor.threshold, -50); | ||
setAudioParam(context, compressor.knee, 40); | ||
setAudioParam(context, compressor.ratio, 12); | ||
setAudioParam(context, compressor.reduction, -20); | ||
setAudioParam(context, compressor.attack, 0); | ||
setAudioParam(context, compressor.release, 0.25); | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, 4, 5]); | ||
return [4 /*yield*/, renderAudio(context)]; | ||
case 2: | ||
buffer = _a.sent(); | ||
return [3 /*break*/, 5]; | ||
case 3: | ||
error_1 = _a.sent(); | ||
if (error_1.name === "timeout" /* Timeout */ || error_1.name === "suspended" /* Suspended */) { | ||
return [2 /*return*/, -3]; | ||
} | ||
throw error_1; | ||
case 4: | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
return [7 /*endfinally*/]; | ||
case 5: return [2 /*return*/, getHash(buffer.getChannelData(0))]; | ||
} | ||
AudioContext = w.OfflineAudioContext || w.webkitOfflineAudioContext; | ||
if (!AudioContext) { | ||
return [2 /*return*/, -2]; | ||
} | ||
context = new AudioContext(1, 44100, 44100); | ||
oscillator = context.createOscillator(); | ||
oscillator.type = 'triangle'; | ||
oscillator.frequency.setValueAtTime(10000, context.currentTime); | ||
compressor = context.createDynamicsCompressor(); | ||
for (_i = 0, _a = [ | ||
['threshold', -50], | ||
['knee', 40], | ||
['ratio', 12], | ||
['reduction', -20], | ||
['attack', 0], | ||
['release', 0.25], | ||
]; _i < _a.length; _i++) { | ||
_b = _a[_i], name_1 = _b[0], value = _b[1]; | ||
param = compressor[name_1]; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
oscillator.connect(compressor); | ||
compressor.connect(context.destination); | ||
oscillator.start(0); | ||
context.startRendering(); | ||
return [2 /*return*/, new Promise(function (resolve) { | ||
var audioTimeoutId = setTimeout(function () { | ||
context.oncomplete = null; | ||
resolve(-3); | ||
}, 1000); | ||
context.oncomplete = function (event) { | ||
var afp; | ||
try { | ||
clearTimeout(audioTimeoutId); | ||
afp = event.renderedBuffer | ||
.getChannelData(0) | ||
.slice(4500, 5000) | ||
.reduce(function (acc, val) { return acc + Math.abs(val); }, 0); | ||
oscillator.disconnect(); | ||
compressor.disconnect(); | ||
} | ||
catch (error) { | ||
resolve(-4); | ||
return; | ||
} | ||
resolve(afp); | ||
}; | ||
})]; | ||
}); | ||
}); | ||
} | ||
/** | ||
* Checks if the current browser is known to always suspend audio context | ||
*/ | ||
function doesCurrentBrowserSuspendAudioContext() { | ||
return isWebKit() && !isDesktopSafari() && !isWebKit606OrNewer(); | ||
} | ||
function setAudioParam(context, param, value) { | ||
var isAudioParam = function (value) { | ||
return value && typeof value.setValueAtTime === 'function'; | ||
}; | ||
if (isAudioParam(param)) { | ||
param.setValueAtTime(value, context.currentTime); | ||
} | ||
} | ||
function renderAudio(context) { | ||
var resumeTriesMaxCount = 3; | ||
var resumeRetryDelay = 500; | ||
var runningTimeout = 1000; | ||
return new Promise(function (resolve, reject) { | ||
context.oncomplete = function (event) { return resolve(event.renderedBuffer); }; | ||
var resumeTriesLeft = resumeTriesMaxCount; | ||
var tryResume = function () { | ||
context.startRendering(); | ||
switch (context.state) { | ||
case 'running': | ||
setTimeout(function () { return reject(makeInnerError("timeout" /* Timeout */)); }, runningTimeout); | ||
break; | ||
// Sometimes the audio context doesn't start after calling `startRendering` (in addition to the cases where | ||
// audio context doesn't start at all). A known case is starting an audio context when the browser tab is in | ||
// background on iPhone. Retries usually help in this case. | ||
case 'suspended': | ||
// The audio context can reject starting until the tab is in foreground. Long fingerprint duration | ||
// in background isn't a problem, therefore the retry attempts don't count in background. It can lead to | ||
// a situation when a fingerprint takes very long time and finishes successfully. FYI, the audio context | ||
// can be suspended when `document.hidden === false` and start running after a retry. | ||
if (!d$1.hidden) { | ||
resumeTriesLeft--; | ||
} | ||
if (resumeTriesLeft > 0) { | ||
setTimeout(tryResume, resumeRetryDelay); | ||
} | ||
else { | ||
reject(makeInnerError("suspended" /* Suspended */)); | ||
} | ||
break; | ||
} | ||
}; | ||
tryResume(); | ||
}); | ||
} | ||
function getHash(signal) { | ||
var hash = 0; | ||
for (var i = 4500; i < 5000; ++i) { | ||
hash += Math.abs(signal[i]); | ||
} | ||
return hash; | ||
} | ||
function makeInnerError(name) { | ||
var error = new Error(name); | ||
error.name = name; | ||
return error; | ||
} | ||
var d = document; | ||
var d$2 = document; | ||
// We use m or w because these two characters take up the maximum width. | ||
@@ -525,7 +703,7 @@ // And we use a LLi so that the same matching fonts can get separated. | ||
function getFonts() { | ||
var h = d.body; | ||
var h = d$2.body; | ||
// div to load spans for the base fonts | ||
var baseFontsDiv = d.createElement('div'); | ||
var baseFontsDiv = d$2.createElement('div'); | ||
// div to load spans for the fonts to detect | ||
var fontsDiv = d.createElement('div'); | ||
var fontsDiv = d$2.createElement('div'); | ||
var defaultWidth = {}; | ||
@@ -535,3 +713,3 @@ var defaultHeight = {}; | ||
var createSpan = function () { | ||
var span = d.createElement('span'); | ||
var span = d$2.createElement('span'); | ||
span.textContent = testString; | ||
@@ -609,112 +787,2 @@ for (var _i = 0, _a = Object.keys(fontSpanStyle); _i < _a.length; _i++) { | ||
/* | ||
* Functions to help with browser features | ||
*/ | ||
var w$1 = window; | ||
var n$1 = navigator; | ||
var d$1 = document; | ||
/** | ||
* Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isTrident() { | ||
// The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020 | ||
return (countTruthy([ | ||
'MSCSSMatrix' in w$1, | ||
'msSetImmediate' in w$1, | ||
'msIndexedDB' in w$1, | ||
'msMaxTouchPoints' in n$1, | ||
'msPointerEnabled' in n$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isEdgeHTML() { | ||
// Based on research in October 2020 | ||
return (countTruthy(['msWriteProfilerMark' in w$1, 'MSStream' in w$1, 'msLaunchUri' in n$1, 'msSaveBlob' in n$1]) >= 3 && | ||
!isTrident()); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isChromium() { | ||
// Based on research in October 2020. Tested to detect Chromium 42-86. | ||
return (countTruthy([ | ||
'webkitPersistentStorage' in n$1, | ||
'webkitTemporaryStorage' in n$1, | ||
n$1.vendor.indexOf('Google') === 0, | ||
'webkitResolveLocalFileSystemURL' in w$1, | ||
'BatteryManager' in w$1, | ||
'webkitMediaStream' in w$1, | ||
'webkitSpeechGrammar' in w$1, | ||
]) >= 5); | ||
} | ||
/** | ||
* Checks whether the browser is based on mobile or desktop Safari without using user-agent. | ||
* All iOS browsers use WebKit (the Safari engine). | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isWebKit() { | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'ApplePayError' in w$1, | ||
'CSSPrimitiveValue' in w$1, | ||
'Counter' in w$1, | ||
n$1.vendor.indexOf('Apple') === 0, | ||
'getStorageUpdates' in n$1, | ||
'WebKitMediaKeys' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the WebKit browser is a desktop Safari. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isDesktopSafari() { | ||
return 'safari' in w$1; | ||
} | ||
/** | ||
* Checks whether the browser is based on Gecko (Firefox engine) without using user-agent. | ||
* | ||
* Warning for package users: | ||
* This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk. | ||
*/ | ||
function isGecko() { | ||
var _a; | ||
// Based on research in September 2020 | ||
return (countTruthy([ | ||
'buildID' in n$1, | ||
((_a = d$1.documentElement) === null || _a === void 0 ? void 0 : _a.style) && 'MozAppearance' in d$1.documentElement.style, | ||
'MediaRecorderErrorEvent' in w$1, | ||
'mozInnerScreenX' in w$1, | ||
'CSSMozDocumentRule' in w$1, | ||
'CanvasCaptureMediaStream' in w$1, | ||
]) >= 4); | ||
} | ||
/** | ||
* Checks whether the browser is based on Chromium version ≥86 without using user-agent. | ||
* It doesn't check that the browser is based on Chromium, there is a separate function for this. | ||
*/ | ||
function isChromium86OrNewer() { | ||
// Checked in Chrome 85 vs Chrome 86 both on desktop and Android | ||
return (countTruthy([ | ||
!('MediaSettingsRange' in w$1), | ||
'RTCEncodedAudioFrame' in w$1, | ||
'' + w$1.Intl === '[object Intl]', | ||
'' + w$1.Reflect === '[object Reflect]', | ||
]) >= 3); | ||
} | ||
function getPlugins() { | ||
@@ -825,3 +893,3 @@ if (isTrident()) { | ||
var n$2 = navigator; | ||
var n$1 = navigator; | ||
var w$2 = window; | ||
@@ -838,7 +906,7 @@ /** | ||
var touchEvent; | ||
if (n$2.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$2.maxTouchPoints); | ||
if (n$1.maxTouchPoints !== undefined) { | ||
maxTouchPoints = toInt(n$1.maxTouchPoints); | ||
} | ||
else if (n$2.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$2.msMaxTouchPoints; | ||
else if (n$1.msMaxTouchPoints !== undefined) { | ||
maxTouchPoints = n$1.msMaxTouchPoints; | ||
} | ||
@@ -864,18 +932,18 @@ try { | ||
var n$3 = navigator; | ||
var n$2 = navigator; | ||
function getLanguages() { | ||
var result = []; | ||
var language = n$3.language || n$3.userLanguage || n$3.browserLanguage || n$3.systemLanguage; | ||
var language = n$2.language || n$2.userLanguage || n$2.browserLanguage || n$2.systemLanguage; | ||
if (language !== undefined) { | ||
result.push([language]); | ||
} | ||
if (Array.isArray(n$3.languages)) { | ||
if (Array.isArray(n$2.languages)) { | ||
// Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode: | ||
// the value of `navigator.language`. Therefore the value is ignored in this browser. | ||
if (!(isChromium() && isChromium86OrNewer())) { | ||
result.push(n$3.languages); | ||
result.push(n$2.languages); | ||
} | ||
} | ||
else if (typeof n$3.languages === 'string') { | ||
var languages = n$3.languages; | ||
else if (typeof n$2.languages === 'string') { | ||
var languages = n$2.languages; | ||
if (languages) { | ||
@@ -1031,3 +1099,3 @@ result.push(languages.split(',')); | ||
var d$2 = document; | ||
var d$3 = document; | ||
/** | ||
@@ -1050,6 +1118,6 @@ * navigator.cookieEnabled cannot detect custom or nuanced cookie blocking configurations. For example, when blocking | ||
// Create cookie | ||
d$2.cookie = 'cookietest=1'; | ||
var result = d$2.cookie.indexOf('cookietest=') !== -1; | ||
d$3.cookie = 'cookietest=1'; | ||
var result = d$3.cookie.indexOf('cookietest=') !== -1; | ||
// Delete cookie | ||
d$2.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
d$3.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT'; | ||
return result; | ||
@@ -1069,3 +1137,3 @@ } | ||
var sources = { | ||
// Expected errors and default values must be handled inside the functions | ||
// Expected errors and default values must be handled inside the functions. Unexpected errors must be thrown. | ||
osCpu: getOsCpu, | ||
@@ -1072,0 +1140,0 @@ languages: getLanguages, |
/** | ||
* FingerprintJS v3.0.2 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* FingerprintJS v3.0.3 - Copyright (c) FingerprintJS, Inc, 2020 (https://fingerprintjs.com) | ||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. | ||
@@ -9,2 +9,2 @@ * | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FingerprintJS={})}(this,(function(e){"use strict";function t(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function r(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function o(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function i(e,t){return[e[0]^t[0],e[1]^t[1]]}function a(e){return e=i(e,[0,e[0]>>>1]),e=i(e=n(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=i(e=n(e,[3301882366,444984403]),[0,e[0]>>>1])}function c(e,c){c=c||0;var u,s=(e=e||"").length%16,l=e.length-s,f=[0,c],d=[0,c],h=[0,0],v=[0,0],g=[2277735313,289559509],p=[1291169091,658871167];for(u=0;u<l;u+=16)h=[255&e.charCodeAt(u+4)|(255&e.charCodeAt(u+5))<<8|(255&e.charCodeAt(u+6))<<16|(255&e.charCodeAt(u+7))<<24,255&e.charCodeAt(u)|(255&e.charCodeAt(u+1))<<8|(255&e.charCodeAt(u+2))<<16|(255&e.charCodeAt(u+3))<<24],v=[255&e.charCodeAt(u+12)|(255&e.charCodeAt(u+13))<<8|(255&e.charCodeAt(u+14))<<16|(255&e.charCodeAt(u+15))<<24,255&e.charCodeAt(u+8)|(255&e.charCodeAt(u+9))<<8|(255&e.charCodeAt(u+10))<<16|(255&e.charCodeAt(u+11))<<24],h=r(h=n(h,g),31),f=t(f=r(f=i(f,h=n(h,p)),27),d),f=t(n(f,[0,5]),[0,1390208809]),v=r(v=n(v,p),33),d=t(d=r(d=i(d,v=n(v,g)),31),f),d=t(n(d,[0,5]),[0,944331445]);switch(h=[0,0],v=[0,0],s){case 15:v=i(v,o([0,e.charCodeAt(u+14)],48));case 14:v=i(v,o([0,e.charCodeAt(u+13)],40));case 13:v=i(v,o([0,e.charCodeAt(u+12)],32));case 12:v=i(v,o([0,e.charCodeAt(u+11)],24));case 11:v=i(v,o([0,e.charCodeAt(u+10)],16));case 10:v=i(v,o([0,e.charCodeAt(u+9)],8));case 9:v=n(v=i(v,[0,e.charCodeAt(u+8)]),p),d=i(d,v=n(v=r(v,33),g));case 8:h=i(h,o([0,e.charCodeAt(u+7)],56));case 7:h=i(h,o([0,e.charCodeAt(u+6)],48));case 6:h=i(h,o([0,e.charCodeAt(u+5)],40));case 5:h=i(h,o([0,e.charCodeAt(u+4)],32));case 4:h=i(h,o([0,e.charCodeAt(u+3)],24));case 3:h=i(h,o([0,e.charCodeAt(u+2)],16));case 2:h=i(h,o([0,e.charCodeAt(u+1)],8));case 1:h=n(h=i(h,[0,e.charCodeAt(u)]),g),f=i(f,h=n(h=r(h,31),p))}return f=t(f=i(f,[0,e.length]),d=i(d,[0,e.length])),d=t(d,f),f=t(f=a(f),d=a(d)),d=t(d,f),("00000000"+(f[0]>>>0).toString(16)).slice(-8)+("00000000"+(f[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}var u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function s(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(t){i(t)}}function c(e){try{u(r.throw(e))}catch(t){i(t)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,c)}u((r=r.apply(e,t||[])).next())}))}function l(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(c){i=[6,c],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}function f(e){return"number"==typeof e?0|e:parseInt(e)}function d(e){return"number"==typeof e?e:parseFloat(e)}function h(e){return e.reduce((function(e,t){return e+(t?1:0)}),0)}var v=navigator,g=window;function p(e){return e&&"function"==typeof e.setValueAtTime}var m=document,y=["monospace","sans-serif","serif"],b=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],w={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal",position:"absolute",left:"-9999px",fontSize:"48px"};var S=window,C=navigator,A=document;function M(){return h(["MSCSSMatrix"in S,"msSetImmediate"in S,"msIndexedDB"in S,"msMaxTouchPoints"in C,"msPointerEnabled"in C])>=4}function T(){return h(["msWriteProfilerMark"in S,"MSStream"in S,"msLaunchUri"in C,"msSaveBlob"in C])>=3&&!M()}function x(){return h(["webkitPersistentStorage"in C,"webkitTemporaryStorage"in C,0===C.vendor.indexOf("Google"),"webkitResolveLocalFileSystemURL"in S,"BatteryManager"in S,"webkitMediaStream"in S,"webkitSpeechGrammar"in S])>=5}function k(e){return e.toDataURL()}var P=navigator,O=window;var I=navigator;var D=window;var E=window;var R=window;var B=document;var L={osCpu:function(){return navigator.oscpu},languages:function(){var e=[],t=I.language||I.userLanguage||I.browserLanguage||I.systemLanguage;if(void 0!==t&&e.push([t]),Array.isArray(I.languages))x()&&h([!("MediaSettingsRange"in S),"RTCEncodedAudioFrame"in S,""+S.Intl=="[object Intl]",""+S.Reflect=="[object Reflect]"])>=3||e.push(I.languages);else if("string"==typeof I.languages){var n=I.languages;n&&e.push(n.split(","))}return e},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){var e=[f(D.screen.width),f(D.screen.height)];return e.sort().reverse(),e},availableScreenResolution:function(){if(E.screen.availWidth&&E.screen.availHeight){var e=[f(E.screen.availWidth),f(E.screen.availHeight)];return e.sort().reverse(),e}},hardwareConcurrency:function(){try{var e=f(navigator.hardwareConcurrency);return isNaN(e)?1:e}catch(t){return 1}},timezoneOffset:function(){var e=(new Date).getFullYear();return Math.max(d(new Date(e,0,1).getTimezoneOffset()),d(new Date(e,6,1).getTimezoneOffset()))},timezone:function(){var e;if(null===(e=R.Intl)||void 0===e?void 0:e.DateTimeFormat)return(new R.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!M()&&!T())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(M())return[];if(navigator.plugins){for(var e=[],t=0;t<navigator.plugins.length;++t){var n=navigator.plugins[t];if(n){for(var r=[],o=0;o<n.length;++o){var i=n[o];r.push({type:i.type,suffixes:i.suffixes})}e.push({name:n.name,description:n.description,mimeTypes:r})}}return e}},canvas:function(){var e=function(){var e=document.createElement("canvas");return e.width=240,e.height=140,e.style.display="inline",[e,e.getContext("2d")]}(),t=e[0],n=e[1];if(!function(e,t){return!(!t||!e.toDataURL)}(t,n))return{winding:!1,data:""};n.rect(0,0,10,10),n.rect(2,2,6,6);var r=!n.isPointInPath(5,5,"evenodd");n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",n.font="11pt no-real-font-123";var o="Cwm fjordbank 😃 gly";return n.fillText(o,2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText(o,4,45),n.globalCompositeOperation="multiply",n.fillStyle="rgb(255,0,255)",n.beginPath(),n.arc(50,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(0,255,255)",n.beginPath(),n.arc(100,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,255,0)",n.beginPath(),n.arc(75,100,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,0,255)",n.arc(75,75,75,0,2*Math.PI,!0),n.arc(75,75,25,0,2*Math.PI,!0),n.fill("evenodd"),{winding:r,data:k(t)}},touchSupport:function(){var e,t=0;void 0!==P.maxTouchPoints?t=f(P.maxTouchPoints):void 0!==P.msMaxTouchPoints&&(t=P.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(n){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in O}},fonts:function(){var e=m.body,t=m.createElement("div"),n=m.createElement("div"),r={},o={},i=function(){var e=m.createElement("span");e.textContent="mmMwWLliI0O&1";for(var t=0,n=Object.keys(w);t<n.length;t++){var r=n[t];e.style[r]=w[r]}return e},a=function(e){return y.some((function(t,n){return e[n].offsetWidth!==r[t]||e[n].offsetHeight!==o[t]}))},c=y.map((function(e){var n=i();return n.style.fontFamily=e,t.appendChild(n),n}));e.appendChild(t);for(var u=0,s=y.length;u<s;u++)r[y[u]]=c[u].offsetWidth,o[y[u]]=c[u].offsetHeight;var l=function(){for(var e={},t=function(t){e[t]=y.map((function(e){var r=function(e,t){var n=i();return n.style.fontFamily="'"+e+"',"+t,n}(t,e);return n.appendChild(r),r}))},r=0,o=b;r<o.length;r++){t(o[r])}return e}();e.appendChild(n);for(var f=[],d=0,h=b.length;d<h;d++)a(l[b[d]])&&f.push(b[d]);return e.removeChild(n),e.removeChild(t),f},audio:function(){return s(this,void 0,void 0,(function(){var e,t,n,r,o,i,a,c,u,s;return l(this,(function(l){if(v.userAgent.match(/OS 11.+Version\/11.+Safari/))return[2,-1];if(!(e=g.OfflineAudioContext||g.webkitOfflineAudioContext))return[2,-2];for(t=new e(1,44100,44100),(n=t.createOscillator()).type="triangle",n.frequency.setValueAtTime(1e4,t.currentTime),r=t.createDynamicsCompressor(),o=0,i=[["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]];o<i.length;o++)c=(a=i[o])[0],u=a[1],p(s=r[c])&&s.setValueAtTime(u,t.currentTime);return n.connect(r),r.connect(t.destination),n.start(0),t.startRendering(),[2,new Promise((function(e){var o=setTimeout((function(){t.oncomplete=null,e(-3)}),1e3);t.oncomplete=function(t){var i;try{clearTimeout(o),i=t.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce((function(e,t){return e+Math.abs(t)}),0),n.disconnect(),r.disconnect()}catch(a){return void e(-4)}e(i)}}))]}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(e){try{return e.toSource(),!0}catch(t){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{B.cookie="cookietest=1";var e=-1!==B.cookie.indexOf("cookietest=");return B.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(t){return!1}}};function F(e,t,n){return s(this,void 0,void 0,(function(){var r,o,i,a,c,s,f,d,h;return l(this,(function(l){switch(l.label){case 0:r=Date.now(),o={},i=0,a=Object.keys(e),l.label=1;case 1:if(!(i<a.length))return[3,7];if(c=a[i],function(e,t){for(var n=0,r=e.length;n<r;++n)if(e[n]===t)return!0;return!1}(n,c))return[3,6];s=void 0,l.label=2;case 2:return l.trys.push([2,4,,5]),h={},[4,e[c](t)];case 3:return h.value=l.sent(),s=h,[3,5];case 4:return f=l.sent(),s=f&&"object"==typeof f&&"message"in f?{error:f}:{error:{message:f}},[3,5];case 5:d=Date.now(),o[c]=u(u({},s),{duration:d-r}),r=d,l.label=6;case 6:return i++,[3,1];case 7:return[2,o]}}))}))}function G(e){return JSON.stringify(e,(function(e,t){var n;return t instanceof Error?u(u({},t),{message:t.message,stack:null===(n=t.stack)||void 0===n?void 0:n.split("\n")}):t}),2)}function H(e){return c(function(e){for(var t="",n=0,r=Object.keys(e);n<r.length;n++){var o=r[n],i=e[o],a=i.error?"error":JSON.stringify(i.value);t+=(t?"|":"")+o.replace(/([:|\\])/g,"\\$1")+":"+a}return t}(e))}var U=function(){function e(){}return e.prototype.get=function(e){return void 0===e&&(e={}),s(this,void 0,void 0,(function(){var t,n;return l(this,(function(r){switch(r.label){case 0:return[4,F(L,void 0,[])];case 1:return t=r.sent(),n=function(e){var t;return{components:e,get visitorId(){return void 0===t&&(t=H(this.components)),t},set visitorId(e){t=e}}}(t),e.debug&&console.log("Copy the text below to get the debug data:\n\n```\nversion: 3.0.2\nuserAgent: "+navigator.userAgent+"\ngetOptions: "+JSON.stringify(e,void 0,2)+"\nvisitorId: "+n.visitorId+"\ncomponents: "+G(t)+"\n```"),[2,n]}}))}))},e}();function j(e){var t=(void 0===e?{}:e).delayFallback,n=void 0===t?50:t;return s(this,void 0,void 0,(function(){return l(this,(function(e){switch(e.label){case 0:return[4,(t=n,new Promise((function(e){window.requestIdleCallback?window.requestIdleCallback((function(){return e()})):setTimeout(e,t)})))];case 1:return e.sent(),[2,new U]}var t}))}))}var W={load:j,hashComponents:H,componentsToDebugString:G},N=c;e.componentsToDebugString=G,e.default=W,e.getComponents=F,e.hashComponents=H,e.isChromium=x,e.isDesktopSafari=function(){return"safari"in S},e.isEdgeHTML=T,e.isGecko=function(){var e;return h(["buildID"in C,(null===(e=A.documentElement)||void 0===e?void 0:e.style)&&"MozAppearance"in A.documentElement.style,"MediaRecorderErrorEvent"in S,"mozInnerScreenX"in S,"CSSMozDocumentRule"in S,"CanvasCaptureMediaStream"in S])>=4},e.isTrident=M,e.isWebKit=function(){return h(["ApplePayError"in S,"CSSPrimitiveValue"in S,"Counter"in S,0===C.vendor.indexOf("Apple"),"getStorageUpdates"in C,"WebKitMediaKeys"in S])>=4},e.load=j,e.murmurX64Hash128=N,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FingerprintJS={})}(this,(function(e){"use strict";function t(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function n(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]}function r(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function o(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function i(e,t){return[e[0]^t[0],e[1]^t[1]]}function a(e){return e=i(e,[0,e[0]>>>1]),e=i(e=n(e,[4283543511,3981806797]),[0,e[0]>>>1]),e=i(e=n(e,[3301882366,444984403]),[0,e[0]>>>1])}function c(e,c){c=c||0;var u,s=(e=e||"").length%16,l=e.length-s,f=[0,c],d=[0,c],h=[0,0],v=[0,0],g=[2277735313,289559509],p=[1291169091,658871167];for(u=0;u<l;u+=16)h=[255&e.charCodeAt(u+4)|(255&e.charCodeAt(u+5))<<8|(255&e.charCodeAt(u+6))<<16|(255&e.charCodeAt(u+7))<<24,255&e.charCodeAt(u)|(255&e.charCodeAt(u+1))<<8|(255&e.charCodeAt(u+2))<<16|(255&e.charCodeAt(u+3))<<24],v=[255&e.charCodeAt(u+12)|(255&e.charCodeAt(u+13))<<8|(255&e.charCodeAt(u+14))<<16|(255&e.charCodeAt(u+15))<<24,255&e.charCodeAt(u+8)|(255&e.charCodeAt(u+9))<<8|(255&e.charCodeAt(u+10))<<16|(255&e.charCodeAt(u+11))<<24],h=r(h=n(h,g),31),f=t(f=r(f=i(f,h=n(h,p)),27),d),f=t(n(f,[0,5]),[0,1390208809]),v=r(v=n(v,p),33),d=t(d=r(d=i(d,v=n(v,g)),31),f),d=t(n(d,[0,5]),[0,944331445]);switch(h=[0,0],v=[0,0],s){case 15:v=i(v,o([0,e.charCodeAt(u+14)],48));case 14:v=i(v,o([0,e.charCodeAt(u+13)],40));case 13:v=i(v,o([0,e.charCodeAt(u+12)],32));case 12:v=i(v,o([0,e.charCodeAt(u+11)],24));case 11:v=i(v,o([0,e.charCodeAt(u+10)],16));case 10:v=i(v,o([0,e.charCodeAt(u+9)],8));case 9:v=n(v=i(v,[0,e.charCodeAt(u+8)]),p),d=i(d,v=n(v=r(v,33),g));case 8:h=i(h,o([0,e.charCodeAt(u+7)],56));case 7:h=i(h,o([0,e.charCodeAt(u+6)],48));case 6:h=i(h,o([0,e.charCodeAt(u+5)],40));case 5:h=i(h,o([0,e.charCodeAt(u+4)],32));case 4:h=i(h,o([0,e.charCodeAt(u+3)],24));case 3:h=i(h,o([0,e.charCodeAt(u+2)],16));case 2:h=i(h,o([0,e.charCodeAt(u+1)],8));case 1:h=n(h=i(h,[0,e.charCodeAt(u)]),g),f=i(f,h=n(h=r(h,31),p))}return f=t(f=i(f,[0,e.length]),d=i(d,[0,e.length])),d=t(d,f),f=t(f=a(f),d=a(d)),d=t(d,f),("00000000"+(f[0]>>>0).toString(16)).slice(-8)+("00000000"+(f[1]>>>0).toString(16)).slice(-8)+("00000000"+(d[0]>>>0).toString(16)).slice(-8)+("00000000"+(d[1]>>>0).toString(16)).slice(-8)}var u=function(){return(u=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function s(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(t){i(t)}}function c(e){try{u(r.throw(e))}catch(t){i(t)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,c)}u((r=r.apply(e,t||[])).next())}))}function l(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(c){i=[6,c],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}function f(e){return"number"==typeof e?0|e:parseInt(e)}function d(e){return"number"==typeof e?e:parseFloat(e)}function h(e){return e.reduce((function(e,t){return e+(t?1:0)}),0)}var v=window,g=navigator,p=document;function m(){return h(["MSCSSMatrix"in v,"msSetImmediate"in v,"msIndexedDB"in v,"msMaxTouchPoints"in g,"msPointerEnabled"in g])>=4}function y(){return h(["msWriteProfilerMark"in v,"MSStream"in v,"msLaunchUri"in g,"msSaveBlob"in g])>=3&&!m()}function b(){return h(["webkitPersistentStorage"in g,"webkitTemporaryStorage"in g,0===g.vendor.indexOf("Google"),"webkitResolveLocalFileSystemURL"in v,"BatteryManager"in v,"webkitMediaStream"in v,"webkitSpeechGrammar"in v])>=5}function w(){return h(["ApplePayError"in v,"CSSPrimitiveValue"in v,"Counter"in v,0===g.vendor.indexOf("Apple"),"getStorageUpdates"in g,"WebKitMediaKeys"in v])>=4}function S(){return h(["safari"in v,!("DeviceMotionEvent"in v),!("ongestureend"in v),!("standalone"in g)])>=3}var C=window,A=document;function M(e,t,n){(function(e){return e&&"function"==typeof e.setValueAtTime})(t)&&t.setValueAtTime(n,e.currentTime)}function T(e){return new Promise((function(t,n){e.oncomplete=function(e){return t(e.renderedBuffer)};var r=3,o=function(){switch(e.startRendering(),e.state){case"running":setTimeout((function(){return n(k("timeout"))}),1e3);break;case"suspended":A.hidden||r--,r>0?setTimeout(o,500):n(k("suspended"))}};o()}))}function x(e){for(var t=0,n=4500;n<5e3;++n)t+=Math.abs(e[n]);return t}function k(e){var t=new Error(e);return t.name=e,t}var P=document,O=["monospace","sans-serif","serif"],I=["sans-serif-thin","ARNO PRO","Agency FB","Arabic Typesetting","Arial Unicode MS","AvantGarde Bk BT","BankGothic Md BT","Batang","Bitstream Vera Sans Mono","Calibri","Century","Century Gothic","Clarendon","EUROSTILE","Franklin Gothic","Futura Bk BT","Futura Md BT","GOTHAM","Gill Sans","HELV","Haettenschweiler","Helvetica Neue","Humanst521 BT","Leelawadee","Letter Gothic","Levenim MT","Lucida Bright","Lucida Sans","Menlo","MS Mincho","MS Outlook","MS Reference Specialty","MS UI Gothic","MT Extra","MYRIAD PRO","Marlett","Meiryo UI","Microsoft Uighur","Minion Pro","Monotype Corsiva","PMingLiU","Pristina","SCRIPTINA","Segoe UI Light","Serifa","SimHei","Small Fonts","Staccato222 BT","TRAJAN PRO","Univers CE 55 Medium","Vrinda","ZWAdobeF"],E={fontStyle:"normal",fontWeight:"normal",letterSpacing:"normal",lineBreak:"auto",lineHeight:"normal",textTransform:"none",textAlign:"left",textDecoration:"none",textShadow:"none",whiteSpace:"normal",wordBreak:"normal",wordSpacing:"normal",position:"absolute",left:"-9999px",fontSize:"48px"};function D(e){return e.toDataURL()}var R=navigator,B=window;var L=navigator;var F=window;var G=window;var H=window;var U=document;var j={osCpu:function(){return navigator.oscpu},languages:function(){var e=[],t=L.language||L.userLanguage||L.browserLanguage||L.systemLanguage;if(void 0!==t&&e.push([t]),Array.isArray(L.languages))b()&&h([!("MediaSettingsRange"in v),"RTCEncodedAudioFrame"in v,""+v.Intl=="[object Intl]",""+v.Reflect=="[object Reflect]"])>=3||e.push(L.languages);else if("string"==typeof L.languages){var n=L.languages;n&&e.push(n.split(","))}return e},colorDepth:function(){return window.screen.colorDepth},deviceMemory:function(){return navigator.deviceMemory},screenResolution:function(){var e=[f(F.screen.width),f(F.screen.height)];return e.sort().reverse(),e},availableScreenResolution:function(){if(G.screen.availWidth&&G.screen.availHeight){var e=[f(G.screen.availWidth),f(G.screen.availHeight)];return e.sort().reverse(),e}},hardwareConcurrency:function(){try{var e=f(navigator.hardwareConcurrency);return isNaN(e)?1:e}catch(t){return 1}},timezoneOffset:function(){var e=(new Date).getFullYear();return Math.max(d(new Date(e,0,1).getTimezoneOffset()),d(new Date(e,6,1).getTimezoneOffset()))},timezone:function(){var e;if(null===(e=H.Intl)||void 0===e?void 0:e.DateTimeFormat)return(new H.Intl.DateTimeFormat).resolvedOptions().timeZone},sessionStorage:function(){try{return!!window.sessionStorage}catch(e){return!0}},localStorage:function(){try{return!!window.localStorage}catch(e){return!0}},indexedDB:function(){if(!m()&&!y())try{return!!window.indexedDB}catch(e){return!0}},openDatabase:function(){return!!window.openDatabase},cpuClass:function(){return navigator.cpuClass},platform:function(){return navigator.platform},plugins:function(){if(m())return[];if(navigator.plugins){for(var e=[],t=0;t<navigator.plugins.length;++t){var n=navigator.plugins[t];if(n){for(var r=[],o=0;o<n.length;++o){var i=n[o];r.push({type:i.type,suffixes:i.suffixes})}e.push({name:n.name,description:n.description,mimeTypes:r})}}return e}},canvas:function(){var e=function(){var e=document.createElement("canvas");return e.width=240,e.height=140,e.style.display="inline",[e,e.getContext("2d")]}(),t=e[0],n=e[1];if(!function(e,t){return!(!t||!e.toDataURL)}(t,n))return{winding:!1,data:""};n.rect(0,0,10,10),n.rect(2,2,6,6);var r=!n.isPointInPath(5,5,"evenodd");n.textBaseline="alphabetic",n.fillStyle="#f60",n.fillRect(125,1,62,20),n.fillStyle="#069",n.font="11pt no-real-font-123";var o="Cwm fjordbank 😃 gly";return n.fillText(o,2,15),n.fillStyle="rgba(102, 204, 0, 0.2)",n.font="18pt Arial",n.fillText(o,4,45),n.globalCompositeOperation="multiply",n.fillStyle="rgb(255,0,255)",n.beginPath(),n.arc(50,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(0,255,255)",n.beginPath(),n.arc(100,50,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,255,0)",n.beginPath(),n.arc(75,100,50,0,2*Math.PI,!0),n.closePath(),n.fill(),n.fillStyle="rgb(255,0,255)",n.arc(75,75,75,0,2*Math.PI,!0),n.arc(75,75,25,0,2*Math.PI,!0),n.fill("evenodd"),{winding:r,data:D(t)}},touchSupport:function(){var e,t=0;void 0!==R.maxTouchPoints?t=f(R.maxTouchPoints):void 0!==R.msMaxTouchPoints&&(t=R.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(n){e=!1}return{maxTouchPoints:t,touchEvent:e,touchStart:"ontouchstart"in B}},fonts:function(){var e=P.body,t=P.createElement("div"),n=P.createElement("div"),r={},o={},i=function(){var e=P.createElement("span");e.textContent="mmMwWLliI0O&1";for(var t=0,n=Object.keys(E);t<n.length;t++){var r=n[t];e.style[r]=E[r]}return e},a=function(e){return O.some((function(t,n){return e[n].offsetWidth!==r[t]||e[n].offsetHeight!==o[t]}))},c=O.map((function(e){var n=i();return n.style.fontFamily=e,t.appendChild(n),n}));e.appendChild(t);for(var u=0,s=O.length;u<s;u++)r[O[u]]=c[u].offsetWidth,o[O[u]]=c[u].offsetHeight;var l=function(){for(var e={},t=function(t){e[t]=O.map((function(e){var r=function(e,t){var n=i();return n.style.fontFamily="'"+e+"',"+t,n}(t,e);return n.appendChild(r),r}))},r=0,o=I;r<o.length;r++){t(o[r])}return e}();e.appendChild(n);for(var f=[],d=0,h=I.length;d<h;d++)a(l[I[d]])&&f.push(I[d]);return e.removeChild(n),e.removeChild(t),f},audio:function(){return s(this,void 0,void 0,(function(){var e,t,n,r,o,i;return l(this,(function(a){switch(a.label){case 0:if(w()&&!S()&&!(h(["DOMRectList"in v,"RTCPeerConnectionIceEvent"in v,"SVGGeometryElement"in v,"ontransitioncancel"in v])>=3))return[2,-1];if(!(e=C.OfflineAudioContext||C.webkitOfflineAudioContext))return[2,-2];t=new e(1,44100,44100),(n=t.createOscillator()).type="triangle",M(t,n.frequency,1e4),r=t.createDynamicsCompressor(),M(t,r.threshold,-50),M(t,r.knee,40),M(t,r.ratio,12),M(t,r.reduction,-20),M(t,r.attack,0),M(t,r.release,.25),n.connect(r),r.connect(t.destination),n.start(0),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,T(t)];case 2:return o=a.sent(),[3,5];case 3:if("timeout"===(i=a.sent()).name||"suspended"===i.name)return[2,-3];throw i;case 4:return n.disconnect(),r.disconnect(),[7];case 5:return[2,x(o.getChannelData(0))]}}))}))},pluginsSupport:function(){return void 0!==navigator.plugins},productSub:function(){return navigator.productSub},emptyEvalLength:function(){return eval.toString().length},errorFF:function(){try{throw"a"}catch(e){try{return e.toSource(),!0}catch(t){return!1}}},vendor:function(){return navigator.vendor},chrome:function(){return void 0!==window.chrome},cookiesEnabled:function(){try{U.cookie="cookietest=1";var e=-1!==U.cookie.indexOf("cookietest=");return U.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",e}catch(t){return!1}}};function W(e,t,n){return s(this,void 0,void 0,(function(){var r,o,i,a,c,s,f,d,h;return l(this,(function(l){switch(l.label){case 0:r=Date.now(),o={},i=0,a=Object.keys(e),l.label=1;case 1:if(!(i<a.length))return[3,7];if(c=a[i],function(e,t){for(var n=0,r=e.length;n<r;++n)if(e[n]===t)return!0;return!1}(n,c))return[3,6];s=void 0,l.label=2;case 2:return l.trys.push([2,4,,5]),h={},[4,e[c](t)];case 3:return h.value=l.sent(),s=h,[3,5];case 4:return f=l.sent(),s=f&&"object"==typeof f&&"message"in f?{error:f}:{error:{message:f}},[3,5];case 5:d=Date.now(),o[c]=u(u({},s),{duration:d-r}),r=d,l.label=6;case 6:return i++,[3,1];case 7:return[2,o]}}))}))}function N(e){return JSON.stringify(e,(function(e,t){var n;return t instanceof Error?u(u({},t),{message:t.message,stack:null===(n=t.stack)||void 0===n?void 0:n.split("\n")}):t}),2)}function z(e){return c(function(e){for(var t="",n=0,r=Object.keys(e);n<r.length;n++){var o=r[n],i=e[o],a=i.error?"error":JSON.stringify(i.value);t+=(t?"|":"")+o.replace(/([:|\\])/g,"\\$1")+":"+a}return t}(e))}var V=function(){function e(){}return e.prototype.get=function(e){return void 0===e&&(e={}),s(this,void 0,void 0,(function(){var t,n;return l(this,(function(r){switch(r.label){case 0:return[4,W(j,void 0,[])];case 1:return t=r.sent(),n=function(e){var t;return{components:e,get visitorId(){return void 0===t&&(t=z(this.components)),t},set visitorId(e){t=e}}}(t),e.debug&&console.log("Copy the text below to get the debug data:\n\n```\nversion: 3.0.3\nuserAgent: "+navigator.userAgent+"\ngetOptions: "+JSON.stringify(e,void 0,2)+"\nvisitorId: "+n.visitorId+"\ncomponents: "+N(t)+"\n```"),[2,n]}}))}))},e}();function J(e){var t=(void 0===e?{}:e).delayFallback,n=void 0===t?50:t;return s(this,void 0,void 0,(function(){return l(this,(function(e){switch(e.label){case 0:return[4,(t=n,new Promise((function(e){window.requestIdleCallback?window.requestIdleCallback((function(){return e()})):setTimeout(e,t)})))];case 1:return e.sent(),[2,new V]}var t}))}))}var q={load:J,hashComponents:z,componentsToDebugString:N},K=c;e.componentsToDebugString=N,e.default=q,e.getComponents=W,e.hashComponents=z,e.isChromium=b,e.isDesktopSafari=S,e.isEdgeHTML=y,e.isGecko=function(){var e;return h(["buildID"in g,(null===(e=p.documentElement)||void 0===e?void 0:e.style)&&"MozAppearance"in p.documentElement.style,"MediaRecorderErrorEvent"in v,"mozInnerScreenX"in v,"CSSMozDocumentRule"in v,"CanvasCaptureMediaStream"in v])>=4},e.isTrident=m,e.isWebKit=w,e.load=J,e.murmurX64Hash128=K,Object.defineProperty(e,"__esModule",{value:!0})})); |
{ | ||
"name": "@fingerprintjs/fingerprintjs", | ||
"description": "Modern & flexible browser fingerprinting library", | ||
"version": "3.0.2", | ||
"version": "3.0.3", | ||
"keywords": [ | ||
@@ -6,0 +6,0 @@ "fraud", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
249114
5416
0