@agenus-io/recovery 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.global.js +1 -1
- package/dist/index.global.js.map +1 -1
- package/package.json +1 -1
package/dist/index.global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/getSession.ts","../src/utils/getFormData.ts","../node_modules/.pnpm/ua-parser-js@2.0.6/node_modules/ua-parser-js/src/main/ua-parser.mjs","../src/utils/getDeviceInfo.ts","../src/config.ts","../src/utils/getFingerprint.ts","../src/utils/getCartData.ts","../src/utils/sendEvent.tsx","../src/utils/formAbandonment.ts","../src/init.ts","../src/utils/parseConfigFromScriptTag.ts"],"sourcesContent":["// Exportação para uso em módulos\nimport UpselyRecovery from './init';\nimport { UpselyRecoveryConfig } from './types';\nimport { parseConfigFromScriptTag } from './utils/parseConfigFromScriptTag';\n\nexport default UpselyRecovery;\n\nconst defaultConfig: UpselyRecoveryConfig = {\n apiEndpoint: 'https://api-recuperation-dev.up.railway.app',\n debug: true,\n timeout: 5000,\n version: '1.0.0',\n};\n\n// Função para auto-inicialização via script tag\nexport async function autoInitFromScriptTag(): Promise<\n UpselyRecovery | undefined\n> {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n try {\n const scriptTag = document.currentScript as HTMLScriptElement | null;\n if (scriptTag) {\n const config = parseConfigFromScriptTag(scriptTag);\n return new UpselyRecovery({\n apiEndpoint: config.apiEndpoint || defaultConfig.apiEndpoint,\n debug: config.debug || defaultConfig.debug,\n timeout: config.timeout || defaultConfig.timeout,\n version: config.version || defaultConfig.version,\n apiKey: config.apiKey || defaultConfig.apiKey,\n });\n }\n } catch (err) {\n console.warn('[GomarkePixel] Erro no autoInitFromScriptTag:', err);\n }\n}\n\n// Para uso global (IIFE) - versão corrigida\nif (typeof window !== 'undefined') {\n // Expor a classe GomarkePixel\n (\n window as unknown as { UpselyRecovery: typeof UpselyRecovery }\n ).UpselyRecovery = UpselyRecovery;\n\n // Auto-inicialização se configurado via script tag\n // Usando IIFE assíncrona para evitar top-level await\n (async () => {\n const autoPixel = await autoInitFromScriptTag();\n if (autoPixel) {\n (window as unknown as { upselyRecovery: UpselyRecovery }).upselyRecovery =\n autoPixel;\n }\n })();\n}\n","export interface ISessionData {\n sessionId: string;\n lastActivity: number;\n createdAt: number;\n visitCount: number;\n firstVisit: number;\n}\n\n/**\n * Gerenciador de sessão persistente com suporte a cookies e localStorage\n */\nexport class GetSession {\n private sessionData: ISessionData;\n private storageKey: string = 'upsely_session';\n private cookieKey: string = 'upsely_session_id';\n private sessionTimeout: number = 30 * 60 * 1000; // 30 minutos\n private cookieExpirationDays: number = 365; // 1 ano para cookies\n private debug: boolean = false;\n\n constructor(sessionId?: string, debug: boolean = false) {\n this.debug = debug;\n this.sessionData = this.initializeSession(sessionId);\n this.startActivityTracking();\n }\n\n /**\n * Inicializa ou recupera dados da sessão\n */\n private initializeSession(providedSessionId?: string): ISessionData {\n const now = Date.now();\n\n // Tenta recuperar sessão do localStorage\n const stored = this.getStoredSession();\n\n // Tenta recuperar sessionId do cookie\n const cookieSessionId = this.getCookie(this.cookieKey);\n\n if (stored && this.isSessionValid(stored)) {\n // Sessão existente válida - atualiza última atividade\n stored.lastActivity = now;\n this.saveSession(stored);\n\n // Garante que o cookie também está atualizado\n if (cookieSessionId !== stored.sessionId) {\n this.setCookie(this.cookieKey, stored.sessionId);\n }\n\n return stored;\n }\n\n // Determina o sessionId a usar\n let finalSessionId: string;\n\n if (providedSessionId) {\n finalSessionId = providedSessionId;\n } else if (cookieSessionId) {\n finalSessionId = cookieSessionId;\n } else {\n finalSessionId = this.generateSessionId();\n }\n\n // Nova sessão ou sessão expirada\n const isFirstVisit = !stored && !cookieSessionId;\n const newSession: ISessionData = {\n sessionId: finalSessionId,\n lastActivity: now,\n createdAt: stored?.createdAt || now,\n visitCount: stored ? stored.visitCount + 1 : 1,\n firstVisit: stored?.firstVisit || now,\n };\n\n this.saveSession(newSession);\n this.setCookie(this.cookieKey, finalSessionId);\n\n if (this.debug) {\n console.log('[GetSession] Nova sessão criada:', {\n sessionId: finalSessionId,\n isFirstVisit,\n visitCount: newSession.visitCount,\n });\n }\n\n return newSession;\n }\n\n /**\n * Gera um novo sessionId único\n */\n private generateSessionId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n const random2 = Math.random().toString(36).substring(2, 15);\n return `session_${timestamp}_${random}${random2}`;\n }\n\n /**\n * Verifica se a sessão ainda é válida\n */\n private isSessionValid(session: ISessionData): boolean {\n const now = Date.now();\n return now - session.lastActivity < this.sessionTimeout;\n }\n\n /**\n * Salva dados da sessão no localStorage\n */\n private saveSession(session: ISessionData): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(this.storageKey, JSON.stringify(session));\n }\n } catch (error) {\n if (this.debug) {\n console.warn(\n '[GetSession] Erro ao salvar sessão no localStorage:',\n error\n );\n }\n }\n }\n\n /**\n * Recupera dados da sessão do localStorage\n */\n private getStoredSession(): ISessionData | null {\n try {\n if (typeof localStorage === 'undefined') {\n return null;\n }\n const stored = localStorage.getItem(this.storageKey);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as ISessionData;\n\n // Valida estrutura básica\n if (!parsed.sessionId || !parsed.lastActivity) {\n return null;\n }\n\n return parsed;\n } catch (error) {\n if (this.debug) {\n console.warn(\n '[GetSession] Erro ao recuperar sessão do localStorage:',\n error\n );\n }\n return null;\n }\n }\n\n /**\n * Define um cookie\n */\n private setCookie(name: string, value: string): void {\n try {\n if (typeof document === 'undefined') return;\n\n const expirationDate = new Date();\n expirationDate.setTime(\n expirationDate.getTime() +\n this.cookieExpirationDays * 24 * 60 * 60 * 1000\n );\n\n const expires = `expires=${expirationDate.toUTCString()}`;\n document.cookie = `${name}=${value};${expires};path=/;SameSite=Lax`;\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao definir cookie:', error);\n }\n }\n }\n\n /**\n * Obtém um cookie\n */\n private getCookie(name: string): string | null {\n try {\n if (typeof document === 'undefined') return null;\n\n const nameEQ = `${name}=`;\n const ca = document.cookie.split(';');\n\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n return c.substring(nameEQ.length, c.length);\n }\n }\n return null;\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao ler cookie:', error);\n }\n return null;\n }\n }\n\n /**\n * Remove um cookie\n */\n private removeCookie(name: string): void {\n try {\n if (typeof document === 'undefined') return;\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao remover cookie:', error);\n }\n }\n }\n\n /**\n * Inicia o rastreamento de atividade para renovar sessão automaticamente\n */\n private startActivityTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Atualiza atividade em eventos do usuário\n const events = [\n 'mousedown',\n 'mousemove',\n 'keypress',\n 'scroll',\n 'touchstart',\n 'click',\n ];\n const updateActivity = () => {\n this.updateLastActivity();\n };\n\n // Throttle para não atualizar muito frequentemente\n let lastUpdate = 0;\n const throttledUpdate = () => {\n const now = Date.now();\n if (now - lastUpdate > 60000) {\n // Atualiza no máximo a cada 1 minuto\n lastUpdate = now;\n updateActivity();\n }\n };\n\n events.forEach(event => {\n window.addEventListener(event, throttledUpdate, { passive: true });\n });\n\n // Atualiza ao focar na janela\n window.addEventListener('focus', updateActivity, { passive: true });\n }\n\n /**\n * Atualiza a última atividade da sessão\n */\n public updateLastActivity(): void {\n const now = Date.now();\n this.sessionData.lastActivity = now;\n this.saveSession(this.sessionData);\n }\n\n /**\n * Renova a sessão (cria nova se expirada)\n */\n public renewSession(): void {\n if (!this.isSessionValid(this.sessionData)) {\n const newSessionId = this.generateSessionId();\n this.sessionData = this.initializeSession(newSessionId);\n } else {\n this.updateLastActivity();\n }\n }\n\n /**\n * Obtém dados da sessão\n */\n public getSessionData(): ISessionData {\n // Atualiza última atividade antes de retornar\n this.updateLastActivity();\n return { ...this.sessionData };\n }\n\n /**\n * Obtém apenas o sessionId\n */\n public getSessionId(): string {\n return this.sessionData.sessionId;\n }\n\n /**\n * Verifica se a sessão está ativa\n */\n public isActive(): boolean {\n return this.isSessionValid(this.sessionData);\n }\n\n /**\n * Limpa dados da sessão\n */\n public clearSession(): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(this.storageKey);\n }\n this.removeCookie(this.cookieKey);\n\n if (this.debug) {\n console.log('[GetSession] Sessão limpa');\n }\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao limpar sessão:', error);\n }\n }\n }\n\n /**\n * Exporta dados da sessão\n */\n public exportSessionData(): string {\n return JSON.stringify(\n {\n session: this.sessionData,\n isActive: this.isActive(),\n timeUntilExpiration:\n this.sessionTimeout - (Date.now() - this.sessionData.lastActivity),\n },\n null,\n 2\n );\n }\n}\n","/**\n * Utilitário para capturar dados de todos os formulários na página\n */\n\nexport interface FormDataResult {\n formId: string;\n formData: Record<string, unknown>;\n formIndex: number;\n}\n\n/**\n * Captura dados de todos os formulários na página\n * @returns Array com dados de cada formulário encontrado\n */\nexport const getFormData = (): FormDataResult[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const forms = document.querySelectorAll('form');\n const results: FormDataResult[] = [];\n\n forms.forEach((form, index) => {\n const formData: Record<string, unknown> = {};\n const formId = form.id || form.name || `form_${index}`;\n\n // Captura todos os campos do formulário\n const inputs = form.querySelectorAll<HTMLInputElement>(\n 'input, textarea, select'\n );\n\n inputs.forEach(field => {\n const name = field.name || field.id;\n if (!name) return;\n\n let value: unknown;\n\n // Trata diferentes tipos de campos\n if (field.type === 'checkbox') {\n value = (field as HTMLInputElement).checked;\n } else if (field.type === 'radio') {\n // Para radio, pega o valor do radio selecionado no grupo\n const radioGroup = form.querySelectorAll<HTMLInputElement>(\n `input[type=\"radio\"][name=\"${name}\"]`\n );\n const checked = Array.from(radioGroup).find(r => r.checked);\n value = checked ? checked.value : null;\n } else if (field.tagName === 'SELECT') {\n const select = field as unknown as HTMLSelectElement;\n if (select.multiple) {\n // Para select múltiplo, retorna array de valores\n value = Array.from(select.selectedOptions).map(\n option => option.value\n );\n } else {\n value = select.value;\n }\n } else {\n value = (field as HTMLInputElement | HTMLTextAreaElement).value;\n }\n\n // Só adiciona se o campo tiver valor ou for checkbox/radio\n if (\n value !== null &&\n value !== undefined &&\n value !== '' &&\n (field.type === 'checkbox' || field.type === 'radio' || value !== '')\n ) {\n formData[name] = value;\n }\n });\n\n // Só adiciona o formulário se tiver dados\n if (Object.keys(formData).length > 0) {\n results.push({\n formId,\n formData,\n formIndex: index,\n });\n }\n });\n\n return results;\n};\n","// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.6\n Copyright © 2012-2025 Faisal Salman <f@faisalman.com>\n AGPLv3 License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.6',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n TYPEOF = {\n FUNCTION : 'function',\n OBJECT : 'object',\n STRING : 'string',\n UNDEFINED : 'undefined'\n },\n\n // properties\n BROWSER = 'browser',\n CPU = 'cpu',\n DEVICE = 'device',\n ENGINE = 'engine',\n OS = 'os',\n RESULT = 'result',\n\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH = 'sec-ch-ua',\n CH_FULL_VER_LIST= CH + '-full-version-list',\n CH_ARCH = CH + '-arch',\n CH_BITNESS = CH + '-' + BITNESS,\n CH_FORM_FACTORS = CH + '-form-factors',\n CH_MOBILE = CH + '-' + MOBILE,\n CH_MODEL = CH + '-' + MODEL,\n CH_PLATFORM = CH + '-' + PLATFORM,\n CH_PLATFORM_VER = CH_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== TYPEOF.UNDEFINED,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === TYPEOF.STRING;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n var propName = arr[i];\n if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n str = strip(/^\\s\\s*/, String(str));\n return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === TYPEOF.OBJECT && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == TYPEOF.FUNCTION) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(heytap|ovi|115|surf|qwant)browser\\/([\\d\\.]+)/i, // HeyTap/Ovi/115/Surf\n /(qwant)(?:ios|mobile)\\/([\\d\\.]+)/i, // Qwant\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq\n ], [NAME], [\n /ome\\/([\\w\\.]+) \\w* ?(iron) saf/i, // Iron\n /ome\\/([\\w\\.]+).+qihu (360)[es]e/i // 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(bing)(?:web|sapphire)\\/([\\w\\.]+)/i, // Bing\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n /(zalo(?:app)?)[\\/\\sa-z]*([\\w\\.-]+)/i // Zalo \n ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+(?= .+rv\\:.+gecko\\/\\d+)|[0-4][\\w\\.]+(?!.+compatible))/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i,\n /((ppc|powerpc)(64)?)( mac|;|\\))/i, // PowerPC\n /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n /mc680.0/i\n ], [[ARCHITECTURE, '68k']], [\n /winnt.+\\[axp/i\n ], [[ARCHITECTURE, 'alpha']]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)[\\/\\);]/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\b(?:ios|apple\\w+)\\/.+[\\(\\/](ipad)/i, // iPad\n /\\b(ipad)[\\d,]*[;\\] ].+(mac |i(pad)?)os/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei) ?([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][\\dc][adnt]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b(?:xiao)?((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\\d{0,2}\\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\\))/i, // Xiaomi Mi\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-k]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*?))( bui|\\)|;|\\/)/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /(?:blackberry|\\(bb10;) (\\w+)/i\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i,\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i, // OPPO\n /(hisense) ([ehv][\\w ]+)\\)/i, // Hisense\n /droid[^;]+; (philips)[_ ]([sv-x][\\d]{3,4}[xz]?)/i // Philips\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /(philips)[\\w ]+tv/i, // Philips\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i // Retroid Pocket\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield)( bui|\\))/i // Nvidia Portable\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) ([\\w ]+) os\\d/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid.+; ([\\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew|; hmsc).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\\/ ]([\\w\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, \"Chrome OS\"], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [TYPE, MODEL, VENDOR]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [BROWSER, [VERSION, MAJOR]],\n [ENGINE, [VERSION]],\n [OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [BROWSER, / ?browser$/i],\n [OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [BROWSER, [NAME, VERSION]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [VENDOR, MODEL]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != TYPEOF.UNDEFINED) break;\n } else if (strToCheck == TYPEOF.UNDEFINED && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || TYPEOF.UNDEFINED;\n };\n }\n\n if (!NAVIGATOR_UADATA) {\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n }\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH])],\n [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_MOBILE])],\n [MODEL, stripQuotes(uach[CH_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n\n this.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n this.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n this.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n this.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {\n this.set(NAME, 'Brave');\n }\n break;\n case DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(BROWSER, detect(BROWSER))\n .set(CPU, detect(CPU))\n .set(DEVICE, detect(DEVICE))\n .set(ENGINE, detect(ENGINE))\n .set(OS, detect(OS));\n }\n }\n return this;\n };\n\n this.parseUA = function () {\n if (this.itemType != RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n switch (this.itemType) {\n case BROWSER:\n this.set(MAJOR, majorize(this.get(VERSION)));\n break;\n case OS:\n if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {\n // Based on the assumption that iOS version is tightly coupled with Safari version\n var realVersion = /\\) Version\\/([\\d\\.]+)/.exec(this.ua); // Get Safari version\n if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {\n this.set(VERSION, realVersion[1]); // Set as iOS version\n }\n }\n break;\n }\n return this;\n };\n\n this.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n \n switch (this.itemType) {\n case BROWSER:\n case ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i=0; i<brands.length; i++) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(BROWSER, parse(BROWSER))\n .set(CPU, parse(CPU))\n .set(DEVICE, parse(DEVICE))\n .set(ENGINE, parse(ENGINE))\n .set(OS, parse(OS));\n }\n return this;\n };\n\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n\n return this;\n }\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === TYPEOF.OBJECT) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === TYPEOF.OBJECT) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n if (headers) {\n if (typeof headers.append === TYPEOF.FUNCTION) {\n // Convert Headers object into a plain object\n var kv = {};\n headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });\n headers = kv;\n } else {\n // Normalize headers field name into lowercase\n var normalized = {};\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n normalized[String(header).toLowerCase()] = headers[header];\n }\n }\n headers = normalized;\n }\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(BROWSER, this.getBrowser())\n .set(CPU, this.getCPU())\n .set(DEVICE, this.getDevice())\n .set(ENGINE, this.getEngine())\n .set(OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(BROWSER)],\n ['getCPU', createItemFunc(CPU)],\n ['getDevice', createItemFunc(DEVICE)],\n ['getEngine', createItemFunc(ENGINE)],\n ['getOS', createItemFunc(OS)],\n ['getResult', createItemFunc(RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};","import { Event } from '@/types';\nimport { UAParser } from 'ua-parser-js';\n\nexport function getDeviceInfo(): Event['device'] {\n const parser = new UAParser(navigator.userAgent);\n const result = parser.getResult();\n\n return {\n id: crypto.randomUUID(),\n type: (result.device.type || 'desktop') as Event['device']['type'], // 'mobile' | 'tablet' | 'desktop' | 'smarttv' | 'wearable' | 'embedded'\n os: {\n name: (result.os.name || 'Unknown') as Event['device']['os']['name'],\n version: result.os.version || '',\n },\n browser: {\n name: (result.browser.name || 'Unknown') as\n | Event['device']['browser']['name']\n | 'Other',\n version: (result.browser.version ||\n '') as Event['device']['browser']['version'],\n },\n engine: {\n name: result.engine.name || '',\n version: result.engine.version || '',\n },\n language: navigator.language,\n screen: {\n width: window.screen.width,\n height: window.screen.height,\n pixel_ratio: window.devicePixelRatio,\n },\n };\n}\n","export const APP_NAME = 'UPSELY';\nexport const VERSION = '0.0.1';\nexport const API_ENDPOINT = 'https://api.upsely.com';\n","import { APP_NAME } from '@/config';\n\nconst FINGERPRINT_KEY = `${APP_NAME}_FINGERPRINT_V1`;\n// const FINGERPRINT_TTL_DAYS = 365;\n\nexport type DeviceInfo = {\n userAgent: string;\n language: {\n primary: string;\n all: string[];\n };\n addBlock: boolean;\n incognito: boolean;\n platform: string;\n hardwareConcurrency: number | null;\n deviceMemory: number | null;\n screen: {\n width: number;\n height: number;\n pixelRatio: number;\n colorDepth: number;\n };\n timezone: string;\n timezoneOffset: number;\n locale: string;\n connection: {\n type: string;\n effectiveType: string;\n downlink: number;\n rtt: number;\n };\n plugins: string[];\n gpu: string;\n webgl2Support: boolean;\n fingerprint: string;\n};\n\n/**\n * Gera ou recupera o Fingerprint do device\n */\nexport async function getFingerprint(): Promise<string> {\n if (typeof window === 'undefined') return '';\n\n const cached = localStorage.getItem(FINGERPRINT_KEY);\n if (cached) return cached as string;\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n ctx?.fillText(APP_NAME, 10, 50);\n const canvasData = canvas.toDataURL();\n\n let gpuInfo = '';\n try {\n const gl = canvas.getContext('webgl') as WebGLRenderingContext | null;\n if (gl) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n gpuInfo = `${vendor} ${renderer}`;\n }\n }\n } catch {\n // eslint-disable-next-line no-empty\n }\n\n let pluginNames = '';\n try {\n pluginNames = Array.from(navigator.plugins || [])\n .map(p => p.name)\n .join(',');\n } catch {\n // eslint-disable-next-line no-empty\n }\n\n const timezoneOffset = new Date().getTimezoneOffset().toString();\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n const components = [\n navigator.userAgent,\n navigator.language,\n navigator.platform,\n navigator.hardwareConcurrency?.toString() || '',\n (\n navigator as unknown as { deviceMemory?: number }\n ).deviceMemory?.toString() || '',\n screen.width.toString(),\n screen.height.toString(),\n screen.colorDepth.toString(),\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n timezoneOffset,\n locale,\n canvasData,\n window.devicePixelRatio?.toString() || '',\n (navigator as unknown as { connection?: { effectiveType: string } })\n .connection?.effectiveType || '',\n pluginNames,\n gpuInfo,\n typeof (window as unknown as { WebGL2RenderingContext?: unknown })\n .WebGL2RenderingContext !== 'undefined'\n ? 'webgl2'\n : 'no-webgl2',\n ];\n\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(components.join('|'));\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const fingerprint = hashArray\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n localStorage.setItem(FINGERPRINT_KEY, fingerprint);\n return fingerprint;\n}\n","const STORAGE_KEY = 'cartData';\n\nexport const getCartData = () => {\n const cartData = localStorage.getItem(STORAGE_KEY);\n if (!cartData) return null;\n return JSON.parse(cartData);\n};\n","import { Event, UpselyRecoveryConfig } from '@/types';\nimport { getDeviceInfo } from './getDeviceInfo';\nimport { getFingerprint } from './getFingerprint';\nimport { getCartData } from './getCartData';\n\nexport interface SendEventParams {\n eventData: Event['data'];\n config: UpselyRecoveryConfig;\n sessionId: string;\n version: string;\n scriptUrl?: string;\n}\n\nexport const sendEvent = async ({\n eventData,\n config,\n sessionId,\n version,\n scriptUrl,\n}: SendEventParams): Promise<{\n success: boolean;\n timestamp: number;\n event_id: string;\n}> => {\n const deviceInfo = getDeviceInfo();\n const fingerprint = await getFingerprint();\n const cartData = getCartData();\n const payload: Event = {\n sessionId: sessionId ?? '',\n timestamp: Date.now(),\n fingerprint: fingerprint,\n user_agent: navigator.userAgent,\n page: {\n url: window.location.href,\n title: document.title,\n referrer: document.referrer,\n path: window.location.pathname,\n hostname: window.location.hostname,\n },\n data: {\n ...eventData,\n cart_data: cartData,\n },\n device: deviceInfo,\n meta: {\n version,\n recovery_source: 'upsely',\n environment: 'production',\n script_url: scriptUrl ?? '',\n },\n query_params: (() => {\n const search = window.location.search;\n if (!search || search.length <= 1) {\n return {};\n }\n\n const queryString = search.substring(1); // Remove o '?'\n return queryString.split('&').reduce(\n (acc, curr) => {\n if (!curr) return acc;\n const [key, value = ''] = curr.split('=');\n if (key) {\n (acc as Record<string, string>)[decodeURIComponent(key)] =\n decodeURIComponent(value);\n }\n return acc;\n },\n {} as Record<string, string>\n );\n })(),\n };\n\n const endPointUrl = `${config.apiEndpoint}/webhooks/abandoned-cart`;\n\n if (config.debug) {\n console.log('Sending event:', payload);\n }\n\n try {\n // Tentar sendBeacon primeiro (melhor para tracking)\n if (navigator.sendBeacon) {\n // const blob = new Blob([JSON.stringify(payload)]);\n\n const success = navigator.sendBeacon(\n endPointUrl,\n JSON.stringify(payload)\n );\n\n if (success) {\n return {\n success: true,\n event_id: `beacon_${Date.now()}`,\n timestamp: Date.now(),\n };\n }\n }\n\n // Fallback para fetch\n const response = await fetch(endPointUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n return {\n success: true,\n event_id: result.event_id || `fetch_${Date.now()}`,\n timestamp: Date.now(),\n };\n } catch (error) {\n if (config.debug) {\n console.error('Error sending event:', error);\n }\n\n return {\n success: false,\n event_id: `error_${Date.now()}`,\n timestamp: Date.now(),\n };\n }\n};\n","import { UpselyRecoveryConfig } from '@/types';\nimport { getFormData } from './getFormData';\nimport { sendEvent } from './sendEvent';\n\nexport interface FormAbandonmentConfig {\n config: UpselyRecoveryConfig;\n sessionId: string;\n version: string;\n scriptUrl?: string;\n}\n\n/**\n * Sistema de detecção e envio de dados de abandono de formulário\n */\nexport class FormAbandonment {\n private config: UpselyRecoveryConfig;\n private sessionId: string;\n private version: string;\n private scriptUrl?: string;\n private hasInteracted: boolean = false;\n private hasSent: boolean = false;\n private formInteractionListeners: (() => void)[] = [];\n private unloadListeners: (() => void)[] = [];\n\n constructor({\n config,\n sessionId,\n version,\n scriptUrl,\n }: FormAbandonmentConfig) {\n this.config = config;\n this.sessionId = sessionId;\n this.version = version;\n this.scriptUrl = scriptUrl;\n\n this.initialize();\n }\n\n /**\n * Inicializa o sistema de abandono\n */\n private initialize(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n // Rastreia interações com formulários\n this.trackFormInteractions();\n\n // Configura listeners para eventos de saída\n this.setupUnloadListeners();\n\n if (this.config.debug) {\n console.log('[FormAbandonment] Sistema inicializado');\n }\n }\n\n /**\n * Rastreia interações do usuário com formulários\n */\n private trackFormInteractions(): void {\n const forms = document.querySelectorAll('form');\n\n forms.forEach(form => {\n // Listener para quando o usuário foca em qualquer campo\n const focusHandler = () => {\n this.hasInteracted = true;\n if (this.config.debug) {\n console.log('[FormAbandonment] Usuário interagiu com formulário');\n }\n };\n\n // Listener para mudanças nos campos\n const changeHandler = () => {\n this.hasInteracted = true;\n };\n\n // Adiciona listeners em todos os campos do formulário\n const fields = form.querySelectorAll('input, textarea, select');\n fields.forEach(field => {\n field.addEventListener('focus', focusHandler, { passive: true });\n field.addEventListener('change', changeHandler, { passive: true });\n field.addEventListener('input', changeHandler, { passive: true });\n });\n\n // Armazena handlers para limpeza posterior\n this.formInteractionListeners.push(() => {\n fields.forEach(field => {\n field.removeEventListener('focus', focusHandler);\n field.removeEventListener('change', changeHandler);\n field.removeEventListener('input', changeHandler);\n });\n });\n });\n }\n\n /**\n * Configura listeners para eventos de saída da página\n */\n private setupUnloadListeners(): void {\n // beforeunload - dispara quando o usuário tenta fechar a página\n const beforeUnloadHandler = () => {\n this.handleAbandonment();\n };\n\n // visibilitychange - dispara quando a aba fica oculta\n const visibilityChangeHandler = () => {\n if (document.visibilityState === 'hidden') {\n this.handleAbandonment();\n }\n };\n\n // pagehide - dispara quando a página está sendo descarregada\n const pageHideHandler = () => {\n this.handleAbandonment();\n };\n\n window.addEventListener('beforeunload', beforeUnloadHandler);\n document.addEventListener('visibilitychange', visibilityChangeHandler);\n window.addEventListener('pagehide', pageHideHandler);\n\n // Armazena handlers para limpeza posterior\n this.unloadListeners.push(() => {\n window.removeEventListener('beforeunload', beforeUnloadHandler);\n document.removeEventListener('visibilitychange', visibilityChangeHandler);\n window.removeEventListener('pagehide', pageHideHandler);\n });\n }\n\n /**\n * Processa o abandono e envia dados se necessário\n */\n private handleAbandonment(): void {\n // Evita envios duplicados\n if (this.hasSent) {\n return;\n }\n\n // Só envia se o usuário interagiu com algum formulário\n if (!this.hasInteracted) {\n return;\n }\n\n // Captura dados dos formulários\n const formsData = getFormData();\n\n // Se não houver dados, não envia\n if (formsData.length === 0) {\n return;\n }\n\n // Marca como enviado para evitar duplicatas\n this.hasSent = true;\n\n // Prepara dados do evento\n const eventData: Record<string, unknown> = {\n event_type: 'form_abandonment',\n forms: formsData.map(form => ({\n form_id: form.formId,\n form_index: form.formIndex,\n fields: form.formData,\n field_count: Object.keys(form.formData).length,\n })),\n total_forms: formsData.length,\n timestamp: Date.now(),\n };\n\n // Envia evento usando sendBeacon (síncrono, mais confiável para unload)\n this.sendAbandonmentEvent(eventData);\n }\n\n /**\n * Envia evento de abandono\n */\n private sendAbandonmentEvent(eventData: Record<string, unknown>): void {\n // Usa sendEvent que já tem suporte para sendBeacon\n sendEvent({\n eventData,\n config: this.config,\n sessionId: this.sessionId,\n version: this.version,\n scriptUrl: this.scriptUrl,\n }).catch(error => {\n if (this.config.debug) {\n console.error('[FormAbandonment] Erro ao enviar evento:', error);\n }\n });\n }\n\n /**\n * Limpa todos os listeners\n */\n public destroy(): void {\n this.formInteractionListeners.forEach(cleanup => cleanup());\n this.unloadListeners.forEach(cleanup => cleanup());\n this.formInteractionListeners = [];\n this.unloadListeners = [];\n\n if (this.config.debug) {\n console.log('[FormAbandonment] Sistema destruído');\n }\n }\n}\n\n/**\n * Função helper para inicializar o sistema de abandono\n */\nexport const initializeFormAbandonment = (\n config: FormAbandonmentConfig\n): FormAbandonment => {\n return new FormAbandonment(config);\n};\n","/**\n * GomarkePixel - Pixel Tracker para Facebook e Google Analytics\n * Versão: 1.0.0\n */\n\nimport { UpselyRecoveryConfig } from './types';\nimport { GetSession } from './utils/getSession';\nimport { FormAbandonment } from './utils/formAbandonment';\n\nclass Initialization {\n private config: UpselyRecoveryConfig;\n private version: string = '1.0.0';\n private sessionId: string;\n private sessionManager: GetSession;\n private formAbandonment?: FormAbandonment;\n\n constructor(config: UpselyRecoveryConfig) {\n if (!config.apiEndpoint) {\n throw new Error('apiEndpoint é obrigatório');\n }\n\n this.config = {\n debug: false,\n version: this.version,\n ...config,\n };\n\n // Inicializa sessão persistente\n this.sessionManager = new GetSession(undefined, this.config.debug);\n this.sessionId = this.sessionManager.getSessionId();\n\n // Inicializa o pixel\n this.initialize();\n }\n\n private async initialize(): Promise<void> {\n // Inicializa sistema de abandono de formulário apenas no browser\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n try {\n // Obtém URL do script se disponível\n const scriptUrl = this.getScriptUrl();\n\n this.formAbandonment = new FormAbandonment({\n config: this.config,\n sessionId: this.sessionId,\n version: this.version,\n scriptUrl,\n });\n\n if (this.config.debug) {\n console.log(\n '[Initialization] Sistema de abandono de formulário inicializado'\n );\n }\n } catch (error) {\n if (this.config.debug) {\n console.error(\n '[Initialization] Erro ao inicializar sistema de abandono:',\n error\n );\n }\n }\n }\n }\n\n /**\n * Obtém a URL do script atual se disponível\n */\n private getScriptUrl(): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n // Tenta encontrar o script atual\n const scripts = document.getElementsByTagName('script');\n for (let i = 0; i < scripts.length; i++) {\n const script = scripts[i];\n if (script.src && script.src.includes('upsely')) {\n return script.src;\n }\n }\n\n // Tenta usar currentScript se disponível\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript?.src) {\n return currentScript.src;\n }\n\n return undefined;\n }\n\n /**\n * Atualiza a configuração\n */\n public updateConfig(newConfig: Partial<UpselyRecoveryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n /**\n * Obtém a configuração atual\n */\n public getConfig(): UpselyRecoveryConfig {\n return { ...this.config };\n }\n\n /**\n * Obtém a versão\n */\n public getVersion(): string {\n return this.version;\n }\n\n /**\n * Obtém o session ID\n */\n public getSessionId(): string {\n // Atualiza o sessionId caso tenha mudado\n this.sessionId = this.sessionManager.getSessionId();\n return this.sessionId;\n }\n\n /**\n * Obtém dados da sessão\n */\n public getSessionData() {\n return this.sessionManager.getSessionData();\n }\n\n /**\n * Verifica se a sessão está ativa\n */\n public isSessionActive(): boolean {\n return this.sessionManager.isActive();\n }\n\n /**\n * Atualiza a última atividade da sessão\n */\n public updateSessionActivity(): void {\n this.sessionManager.updateLastActivity();\n }\n\n /**\n * Renova a sessão\n */\n public renewSession(): void {\n this.sessionManager.renewSession();\n this.sessionId = this.sessionManager.getSessionId();\n }\n\n /**\n * Limpa a sessão\n */\n public clearSession(): void {\n this.sessionManager.clearSession();\n // Cria nova sessão após limpar\n this.sessionManager = new GetSession(undefined, this.config.debug);\n this.sessionId = this.sessionManager.getSessionId();\n }\n\n /**\n * Exporta dados da sessão\n */\n public exportSessionData(): string {\n return this.sessionManager.exportSessionData();\n }\n\n /**\n * Destrói o sistema de abandono de formulário\n */\n public destroyFormAbandonment(): void {\n if (this.formAbandonment) {\n this.formAbandonment.destroy();\n this.formAbandonment = undefined;\n }\n }\n}\n\n// Exportação para uso em módulos\nexport default Initialization;\n","import { UpselyRecoveryConfig } from '../types';\n\nexport const parseConfigFromScriptTag = (\n scriptTag: HTMLScriptElement\n): UpselyRecoveryConfig => {\n const config: UpselyRecoveryConfig = {\n apiEndpoint: scriptTag.getAttribute('data-api-endpoint') || undefined,\n apiKey: scriptTag.getAttribute('data-api-key') || undefined,\n debug: scriptTag.getAttribute('data-debug') === 'true',\n timeout: scriptTag.getAttribute('data-timeout')\n ? Number(scriptTag.getAttribute('data-timeout'))\n : 5000,\n };\n\n return config;\n};\n"],"mappings":";gdAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,2BAAAE,GAAA,YAAAC,KCWO,IAAMC,EAAN,KAAiB,CAQtB,YAAYC,EAAoBC,EAAiB,GAAO,CANxD,KAAQ,WAAqB,iBAC7B,KAAQ,UAAoB,oBAC5B,KAAQ,eAAyB,KAAU,IAC3C,KAAQ,qBAA+B,IACvC,KAAQ,MAAiB,GAGvB,KAAK,MAAQA,EACb,KAAK,YAAc,KAAK,kBAAkBD,CAAS,EACnD,KAAK,sBAAsB,CAC7B,CAKQ,kBAAkBE,EAA0C,CAClE,IAAMC,EAAM,KAAK,IAAI,EAGfC,EAAS,KAAK,iBAAiB,EAG/BC,EAAkB,KAAK,UAAU,KAAK,SAAS,EAErD,GAAID,GAAU,KAAK,eAAeA,CAAM,EAEtC,OAAAA,EAAO,aAAeD,EACtB,KAAK,YAAYC,CAAM,EAGnBC,IAAoBD,EAAO,WAC7B,KAAK,UAAU,KAAK,UAAWA,EAAO,SAAS,EAG1CA,EAIT,IAAIE,EAEAJ,EACFI,EAAiBJ,EACRG,EACTC,EAAiBD,EAEjBC,EAAiB,KAAK,kBAAkB,EAI1C,IAAMC,EAAe,CAACH,GAAU,CAACC,EAC3BG,EAA2B,CAC/B,UAAWF,EACX,aAAcH,EACd,UAAWC,GAAQ,WAAaD,EAChC,WAAYC,EAASA,EAAO,WAAa,EAAI,EAC7C,WAAYA,GAAQ,YAAcD,CACpC,EAEA,YAAK,YAAYK,CAAU,EAC3B,KAAK,UAAU,KAAK,UAAWF,CAAc,EAEzC,KAAK,OACP,QAAQ,IAAI,sCAAoC,CAC9C,UAAWA,EACX,aAAAC,EACA,WAAYC,EAAW,UACzB,CAAC,EAGIA,CACT,CAKQ,mBAA4B,CAClC,IAAMC,EAAY,KAAK,IAAI,EACrBC,EAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EACnDC,EAAU,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EAC1D,MAAO,WAAWF,CAAS,IAAIC,CAAM,GAAGC,CAAO,EACjD,CAKQ,eAAeC,EAAgC,CAErD,OADY,KAAK,IAAI,EACRA,EAAQ,aAAe,KAAK,cAC3C,CAKQ,YAAYA,EAA6B,CAC/C,GAAI,CACE,OAAO,aAAiB,KAC1B,aAAa,QAAQ,KAAK,WAAY,KAAK,UAAUA,CAAO,CAAC,CAEjE,OAASC,EAAO,CACV,KAAK,OACP,QAAQ,KACN,yDACAA,CACF,CAEJ,CACF,CAKQ,kBAAwC,CAC9C,GAAI,CACF,GAAI,OAAO,aAAiB,IAC1B,OAAO,KAET,IAAMT,EAAS,aAAa,QAAQ,KAAK,UAAU,EACnD,GAAI,CAACA,EAAQ,OAAO,KAEpB,IAAMU,EAAS,KAAK,MAAMV,CAAM,EAGhC,MAAI,CAACU,EAAO,WAAa,CAACA,EAAO,aACxB,KAGFA,CACT,OAASD,EAAO,CACd,OAAI,KAAK,OACP,QAAQ,KACN,4DACAA,CACF,EAEK,IACT,CACF,CAKQ,UAAUE,EAAcC,EAAqB,CACnD,GAAI,CACF,GAAI,OAAO,SAAa,IAAa,OAErC,IAAMC,EAAiB,IAAI,KAC3BA,EAAe,QACbA,EAAe,QAAQ,EACrB,KAAK,qBAAuB,GAAK,GAAK,GAAK,GAC/C,EAEA,IAAMC,EAAU,WAAWD,EAAe,YAAY,CAAC,GACvD,SAAS,OAAS,GAAGF,CAAI,IAAIC,CAAK,IAAIE,CAAO,sBAC/C,OAASL,EAAO,CACV,KAAK,OACP,QAAQ,KAAK,uCAAwCA,CAAK,CAE9D,CACF,CAKQ,UAAUE,EAA6B,CAC7C,GAAI,CACF,GAAI,OAAO,SAAa,IAAa,OAAO,KAE5C,IAAMI,EAAS,GAAGJ,CAAI,IAChBK,EAAK,SAAS,OAAO,MAAM,GAAG,EAEpC,QAASC,EAAI,EAAGA,EAAID,EAAG,OAAQC,IAAK,CAClC,IAAIC,EAAIF,EAAGC,CAAC,EACZ,KAAOC,EAAE,OAAO,CAAC,IAAM,KAAKA,EAAIA,EAAE,UAAU,EAAGA,EAAE,MAAM,EACvD,GAAIA,EAAE,QAAQH,CAAM,IAAM,EACxB,OAAOG,EAAE,UAAUH,EAAO,OAAQG,EAAE,MAAM,CAE9C,CACA,OAAO,IACT,OAAST,EAAO,CACd,OAAI,KAAK,OACP,QAAQ,KAAK,mCAAoCA,CAAK,EAEjD,IACT,CACF,CAKQ,aAAaE,EAAoB,CACvC,GAAI,CACF,GAAI,OAAO,SAAa,IAAa,OACrC,SAAS,OAAS,GAAGA,CAAI,iDAC3B,OAASF,EAAO,CACV,KAAK,OACP,QAAQ,KAAK,uCAAwCA,CAAK,CAE9D,CACF,CAKQ,uBAA8B,CACpC,GAAI,OAAO,OAAW,IAAa,OAGnC,IAAMU,EAAS,CACb,YACA,YACA,WACA,SACA,aACA,OACF,EACMC,EAAiB,IAAM,CAC3B,KAAK,mBAAmB,CAC1B,EAGIC,EAAa,EACXC,EAAkB,IAAM,CAC5B,IAAMvB,EAAM,KAAK,IAAI,EACjBA,EAAMsB,EAAa,MAErBA,EAAatB,EACbqB,EAAe,EAEnB,EAEAD,EAAO,QAAQI,GAAS,CACtB,OAAO,iBAAiBA,EAAOD,EAAiB,CAAE,QAAS,EAAK,CAAC,CACnE,CAAC,EAGD,OAAO,iBAAiB,QAASF,EAAgB,CAAE,QAAS,EAAK,CAAC,CACpE,CAKO,oBAA2B,CAChC,IAAMrB,EAAM,KAAK,IAAI,EACrB,KAAK,YAAY,aAAeA,EAChC,KAAK,YAAY,KAAK,WAAW,CACnC,CAKO,cAAqB,CAC1B,GAAK,KAAK,eAAe,KAAK,WAAW,EAIvC,KAAK,mBAAmB,MAJkB,CAC1C,IAAMyB,EAAe,KAAK,kBAAkB,EAC5C,KAAK,YAAc,KAAK,kBAAkBA,CAAY,CACxD,CAGF,CAKO,gBAA+B,CAEpC,YAAK,mBAAmB,EACjB,CAAE,GAAG,KAAK,WAAY,CAC/B,CAKO,cAAuB,CAC5B,OAAO,KAAK,YAAY,SAC1B,CAKO,UAAoB,CACzB,OAAO,KAAK,eAAe,KAAK,WAAW,CAC7C,CAKO,cAAqB,CAC1B,GAAI,CACE,OAAO,aAAiB,KAC1B,aAAa,WAAW,KAAK,UAAU,EAEzC,KAAK,aAAa,KAAK,SAAS,EAE5B,KAAK,OACP,QAAQ,IAAI,8BAA2B,CAE3C,OAASf,EAAO,CACV,KAAK,OACP,QAAQ,KAAK,yCAAuCA,CAAK,CAE7D,CACF,CAKO,mBAA4B,CACjC,OAAO,KAAK,UACV,CACE,QAAS,KAAK,YACd,SAAU,KAAK,SAAS,EACxB,oBACE,KAAK,gBAAkB,KAAK,IAAI,EAAI,KAAK,YAAY,aACzD,EACA,KACA,CACF,CACF,CACF,EC5TO,IAAMgB,GAAc,IAAwB,CACjD,GAAI,OAAO,SAAa,IACtB,MAAO,CAAC,EAGV,IAAMC,EAAQ,SAAS,iBAAiB,MAAM,EACxCC,EAA4B,CAAC,EAEnC,OAAAD,EAAM,QAAQ,CAACE,EAAMC,IAAU,CAC7B,IAAMC,EAAoC,CAAC,EACrCC,EAASH,EAAK,IAAMA,EAAK,MAAQ,QAAQC,CAAK,GAGrCD,EAAK,iBAClB,yBACF,EAEO,QAAQI,GAAS,CACtB,IAAMC,EAAOD,EAAM,MAAQA,EAAM,GACjC,GAAI,CAACC,EAAM,OAEX,IAAIC,EAGJ,GAAIF,EAAM,OAAS,WACjBE,EAASF,EAA2B,gBAC3BA,EAAM,OAAS,QAAS,CAEjC,IAAMG,EAAaP,EAAK,iBACtB,6BAA6BK,CAAI,IACnC,EACMG,EAAU,MAAM,KAAKD,CAAU,EAAE,KAAKE,GAAKA,EAAE,OAAO,EAC1DH,EAAQE,EAAUA,EAAQ,MAAQ,IACpC,SAAWJ,EAAM,UAAY,SAAU,CACrC,IAAMM,EAASN,EACXM,EAAO,SAETJ,EAAQ,MAAM,KAAKI,EAAO,eAAe,EAAE,IACzCC,GAAUA,EAAO,KACnB,EAEAL,EAAQI,EAAO,KAEnB,MACEJ,EAASF,EAAiD,MAK1DE,GAAU,MAEVA,IAAU,KACTF,EAAM,OAAS,YAAcA,EAAM,OAAS,SAAWE,IAAU,MAElEJ,EAASG,CAAI,EAAIC,EAErB,CAAC,EAGG,OAAO,KAAKJ,CAAQ,EAAE,OAAS,GACjCH,EAAQ,KAAK,CACX,OAAAI,EACA,SAAAD,EACA,UAAWD,CACb,CAAC,CAEL,CAAC,EAEMF,CACT,EC5DI,IAAIa,GAAc,QACdC,GAAgB,IAChBC,GAAc,aACdC,EAAc,GACdC,GAAc,IACdC,EAAS,CACL,SAAc,WACd,OAAc,SACd,OAAc,SACd,UAAc,WAClB,EAGAC,EAAc,UACdC,EAAc,MACdC,EAAc,SACdC,EAAc,SACdC,EAAc,KACdC,EAAc,SAEdC,EAAc,OACdC,EAAc,OACdC,EAAc,SACdC,EAAc,UACdC,EAAc,eACdC,GAAc,QACdC,EAAc,QAGdC,GAAc,UACdC,EAAc,SACdC,EAAc,SACdC,EAAc,UACdC,EAAc,WACdC,GAAc,KACdC,GAAc,WAGdC,EAAc,QAGdC,GAAc,SACdC,EAAc,cACdC,GAAc,kBACdC,EAAc,WACdC,GAAc,kBACdC,GAAc,UACdC,EAAc,YACdC,GAAkBD,EAAK,qBACvBE,GAAkBF,EAAK,QACvBG,GAAkBH,EAAK,IAAMD,GAC7BK,GAAkBJ,EAAK,gBACvBK,GAAkBL,EAAK,IAAMb,EAC7BmB,GAAkBN,EAAK,IAAMf,EAC7BsB,GAAkBP,EAAK,IAAMH,EAC7BW,GAAkBD,GAAc,WAChCE,GAAkB,CAACf,GAAQE,GAAaT,EAAQF,EAAOY,EAAUC,GAAaf,EAAcY,EAAaI,EAAO,EAGhHW,GAAc,SACdC,EAAc,QACdC,GAAc,OACdC,GAAc,aACdC,EAAc,SACdC,GAAc,SACdC,GAAc,SACdC,GAAc,QACdC,GAAc,KACdC,GAAc,YACdC,GAAc,WACdC,GAAc,SACdC,GAAc,UACdC,GAAc,OACdC,EAAc,UACdC,GAAc,QACdC,EAAc,OACdC,GAAc,SACdC,GAAc,QAGdC,GAAc,SACdC,GAAc,WACdC,EAAc,aACdC,GAAc,OACdC,GAAc,UACdC,GAAc,QACdC,GAAc,WACdC,GAAc,QAEdC,EAAiB,UACjBC,GAAiB,WAGjBC,GAAc,UAEdC,GAAsB,OAAO,SAAWpE,EAAO,UAC/CqE,EAAuBD,IAAY,OAAO,UAClB,OAAO,UACP,OACxBE,EAAuBD,GAAaA,EAAU,cACtBA,EAAU,cACV,OAMxBE,GAAS,SAAUC,EAAYC,EAAY,CACvC,IAAIC,EAAY,CAAC,EACbC,EAAWF,EACf,GAAI,CAACG,GAAaH,CAAU,EAAG,CAC3BE,EAAW,CAAC,EACZ,QAASE,KAAKJ,EACV,QAASK,KAAKL,EAAWI,CAAC,EACtBF,EAASG,CAAC,EAAIL,EAAWI,CAAC,EAAEC,CAAC,EAAE,OAAOH,EAASG,CAAC,EAAIH,EAASG,CAAC,EAAI,CAAC,CAAC,CAGhF,CACA,QAASC,KAAKP,EACVE,EAAUK,CAAC,EAAIJ,EAASI,CAAC,GAAKJ,EAASI,CAAC,EAAE,OAAS,IAAM,EAAIJ,EAASI,CAAC,EAAE,OAAOP,EAAWO,CAAC,CAAC,EAAIP,EAAWO,CAAC,EAEjH,OAAOL,CACX,EACAM,GAAY,SAAUC,EAAK,CAEvB,QADIC,EAAQ,CAAC,EACJL,EAAE,EAAGA,EAAEI,EAAI,OAAQJ,IACxBK,EAAMD,EAAIJ,CAAC,EAAE,YAAY,CAAC,EAAII,EAAIJ,CAAC,EAEvC,OAAOK,CACX,EACAC,GAAM,SAAUC,EAAMC,EAAM,CACxB,GAAI,OAAOD,IAASpF,EAAO,QAAUoF,EAAK,OAAS,EAAG,CAClD,QAASP,KAAKO,EACV,GAAIE,EAASD,CAAI,GAAKC,EAASF,EAAKP,CAAC,CAAC,EAAG,MAAO,GAEpD,MAAO,EACX,CACA,OAAOU,GAASH,CAAI,EAAIE,EAASD,CAAI,GAAKC,EAASF,CAAI,EAAI,EAC/D,EACAR,GAAe,SAAUY,EAAKC,EAAM,CAChC,QAASC,KAAQF,EACb,MAAO,mCAAmC,KAAKE,CAAI,IAAMD,EAAOb,GAAaY,EAAIE,CAAI,CAAC,EAAI,GAElG,EACAH,GAAW,SAAUI,EAAK,CACtB,OAAO,OAAOA,IAAQ3F,EAAO,MACjC,EACA4F,GAAkB,SAAUC,EAAQ,CAChC,GAAKA,EAGL,SAFIZ,EAAM,CAAC,EACPa,EAASC,EAAM,SAAUF,CAAM,EAAE,MAAM,GAAG,EACrChB,EAAI,EAAGA,EAAIiB,EAAO,OAAQjB,IAC/B,GAAIiB,EAAOjB,CAAC,EAAE,QAAQ,GAAG,EAAI,GAAI,CAC7B,IAAImB,EAAQC,GAAKH,EAAOjB,CAAC,CAAC,EAAE,MAAM,KAAK,EACvCI,EAAIJ,CAAC,EAAI,CAAE,MAAQmB,EAAM,CAAC,EAAG,QAAUA,EAAM,CAAC,CAAE,CACpD,MACIf,EAAIJ,CAAC,EAAIoB,GAAKH,EAAOjB,CAAC,CAAC,EAG/B,OAAOI,EACX,EACAK,EAAW,SAAUY,EAAK,CACtB,OAAOX,GAASW,CAAG,EAAIA,EAAI,YAAY,EAAIA,CAC/C,EACAC,GAAW,SAAUC,EAAS,CAC1B,OAAOb,GAASa,CAAO,EAAIL,EAAM,WAAYK,CAAO,EAAE,MAAM,GAAG,EAAE,CAAC,EAAI,MAC1E,EACAC,EAAW,SAAUpB,EAAK,CACtB,QAASJ,KAAKI,EACV,GAAKA,EAAI,eAAeJ,CAAC,EAEzB,KAAIyB,EAAWrB,EAAIJ,CAAC,EAChB,OAAOyB,GAAYtG,EAAO,QAAUsG,EAAS,QAAU,EACvD,KAAKA,EAAS,CAAC,CAAC,EAAIA,EAAS,CAAC,EAE9B,KAAKA,CAAQ,EAAI,OAGzB,OAAO,IACX,EACAP,EAAQ,SAAUQ,EAASL,EAAK,CAC5B,OAAOX,GAASW,CAAG,EAAIA,EAAI,QAAQK,EAASzG,CAAK,EAAIoG,CACzD,EACAM,GAAc,SAAUN,EAAK,CACzB,OAAOH,EAAM,SAAUG,CAAG,CAC9B,EACAD,GAAO,SAAUC,EAAKO,EAAK,CACvB,OAAAP,EAAMH,EAAM,SAAU,OAAOG,CAAG,CAAC,EAC1B,OAAOO,IAAQzG,EAAO,UAAYkG,EAAMA,EAAI,UAAU,EAAGO,CAAG,CAC3E,EAMIC,GAAY,SAAUC,EAAIC,EAAQ,CAE9B,GAAG,GAACD,GAAM,CAACC,GAKX,QAHI/B,EAAI,EAAGC,EAAGC,EAAG8B,EAAGC,EAAGC,EAASC,EAGzBnC,EAAI+B,EAAO,QAAU,CAACG,GAAS,CAElC,IAAIE,EAAQL,EAAO/B,CAAC,EAChBqC,EAAQN,EAAO/B,EAAI,CAAC,EAIxB,IAHAC,EAAIC,EAAI,EAGDD,EAAImC,EAAM,QAAU,CAACF,GAEnBE,EAAMnC,CAAC,GAGZ,GAFAiC,EAAUE,EAAMnC,GAAG,EAAE,KAAK6B,CAAE,EAEtBI,EACF,IAAKF,EAAI,EAAGA,EAAIK,EAAM,OAAQL,IAC1BG,EAAQD,EAAQ,EAAEhC,CAAC,EACnB+B,EAAII,EAAML,CAAC,EAEP,OAAOC,IAAM9G,EAAO,QAAU8G,EAAE,OAAS,EACrCA,EAAE,SAAW,EACT,OAAOA,EAAE,CAAC,GAAK9G,EAAO,SAEtB,KAAK8G,EAAE,CAAC,CAAC,EAAIA,EAAE,CAAC,EAAE,KAAK,KAAME,CAAK,EAGlC,KAAKF,EAAE,CAAC,CAAC,EAAIA,EAAE,CAAC,EAEbA,EAAE,QAAU,IAEf,OAAOA,EAAE,CAAC,IAAM9G,EAAO,UAAY,EAAE8G,EAAE,CAAC,EAAE,MAAQA,EAAE,CAAC,EAAE,MACnDA,EAAE,OAAS,EACX,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,MAAM,KAAMA,EAAE,MAAM,CAAC,CAAC,EAAI,OAGpD,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,KAAK,KAAME,EAAOF,EAAE,CAAC,CAAC,EAAI,OAGpDA,EAAE,QAAU,EAEZ,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQA,EAAM,QAAQF,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAI,OAC1CA,EAAE,QAAU,EACnB,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,KAAK,KAAME,EAAM,QAAQF,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAI,OAC3DA,EAAE,OAAS,IAClB,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,MAAM,KAAM,CAACE,EAAM,QAAQF,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAE,OAAOA,EAAE,MAAM,CAAC,CAAC,CAAC,EAAI,SAKpG,KAAKA,CAAC,EAAIE,GAAgB,OAK1CnC,GAAK,CACT,CACJ,EAEAsC,EAAY,SAAUjB,EAAKkB,EAAK,CAE5B,QAASvC,KAAKuC,EAEV,GAAI,OAAOA,EAAIvC,CAAC,IAAM7E,EAAO,QAAUoH,EAAIvC,CAAC,EAAE,OAAS,GACnD,QAASC,EAAI,EAAGA,EAAIsC,EAAIvC,CAAC,EAAE,OAAQC,IAC/B,GAAIK,GAAIiC,EAAIvC,CAAC,EAAEC,CAAC,EAAGoB,CAAG,EAClB,OAAQrB,IAAM9E,GAAW,OAAY8E,UAGtCM,GAAIiC,EAAIvC,CAAC,EAAGqB,CAAG,EACtB,OAAQrB,IAAM9E,GAAW,OAAY8E,EAG7C,OAAOuC,EAAI,eAAe,GAAG,EAAIA,EAAI,GAAG,EAAIlB,CACpD,EAMImB,GAAoB,CAChB,GAAU,OACV,UAAW,OACX,SAAU,MACV,IAAU,CAAC,MAAO,MAAM,EACxB,GAAU,CAAC,MAAO,KAAK,EACvB,MAAU,MACV,EAAU,MACV,EAAU,MACV,MAAU,MACV,GAAU,CAAC,MAAO,MAAM,EACxB,GAAU,EACd,EAEAC,GAAiB,CACb,SAAc,aACd,OAAc,SACd,OAAc,CAAC,SAAU,MAAM,EAC/B,QAAc,KACd,SAAc,QACd,GAAc,CAAC,KAAM,IAAI,EACzB,IAAc,CAAC,UAAW,SAAS,EACnC,IAAc,MAClB,EAEAC,GAAkB,CACd,OAAkB,gBAClB,KAAkB,iBAClB,gBAAkB,0BAClB,iBAAkB,kBAClB,kBAAkB,iBAClB,iBAAkB,gBAClB,eAAkB,eAClB,aAAkB,cAClB,OAAkB,WAC1B,EAMIC,GAAiB,CAEjB,QAAU,CAAC,CAGP,8BACA,EAAG,CAAC9G,EAAS,CAACH,EAAM0D,EAAgB,QAAQ,CAAC,EAAG,CAChD,2BACA,EAAG,CAACvD,EAAS,CAACH,EAAMqD,GAAK,UAAU,CAAC,EAAG,CACvC,6BACA,EAAG,CAAClD,EAAS,CAACH,EAAM,MAAM,CAAC,EAAG,CAG9B,4BACA,mDACA,yCACA,EAAG,CAACA,EAAMG,CAAO,EAAG,CACpB,uBACA,EAAG,CAACA,EAAS,CAACH,EAAMuD,GAAM,OAAO,CAAC,EAAG,CACrC,0BACA,EAAG,CAACpD,EAAS,CAACH,EAAMuD,GAAM,KAAK,CAAC,EAAG,CACnC,mBACA,EAAG,CAACpD,EAAS,CAACH,EAAMuD,EAAK,CAAC,EAAG,CAG7B,wDACA,EAAG,CAACpD,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAC/B,6CACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,uBACA,uEAGA,4DACA,2BAGA,yQAEA,iDACA,oCACA,sCACA,EAAG,CAACA,EAAMG,CAAO,EAAG,CACpB,2BACA,EAAG,CAACA,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAC/B,mBACA,EAAG,CAACG,EAAS,CAACH,EAAM,YAAY,CAAC,EAAG,CACpC,mDACA,EAAG,CAACG,EAAS,CAACH,EAAM,WAAW,CAAC,EAAG,CACnC,+BACA,+BACA,4BACA,EAAG,CAACG,EAAS,CAACH,EAAM,QAAQ,CAAC,EAAG,CAChC,uBACA,EAAG,CAACG,EAAS,CAACH,EAAM,WAAW,CAAC,EAAG,CACnC,6CACA,EAAG,CAACG,EAAS,CAACH,EAAM,IAAI,CAAC,EAAG,CAC5B,kCACA,EAAG,CAACG,EAAS,CAACH,EAAM,QAAQ,CAAC,EAAG,CAChC,uBACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAWqC,GAASsB,EAAc,CAAC,EAAG,CAC1D,yBACA,EAAG,CAAC,CAAC3D,EAAM,OAAQ,YAAc2D,EAAc,EAAGxD,CAAO,EAAG,CAC5D,qBACA,EAAG,CAACA,EAAS,CAACH,EAAMsD,GAAQ,QAAQ,CAAC,EAAG,CACxC,mBACA,EAAG,CAACnD,EAAS,CAACH,EAAMuD,GAAM,QAAQ,CAAC,EAAG,CACtC,wBACA,EAAG,CAACpD,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,oBACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,mBACA,EAAG,CAACG,EAAS,CAACH,EAAMuD,GAAM,QAAQ,CAAC,EAAG,CACtC,yBACA,EAAG,CAACpD,EAAS,CAACH,EAAM,OAAS2D,EAAc,CAAC,EAAG,CAC/C,oBACA,EAAG,CAACxD,EAAS,CAACH,EAAM0D,EAAgBJ,EAAO,CAAC,EAAG,CAC/C,6BACA,EAAG,CAACnD,EAAS,CAACH,EAAM,KAAK,CAAC,EAAG,CAC7B,oBACA,EAAG,CAAC,CAACA,EAAM,OAAQ,WAAW,EAAGG,CAAO,EAAG,CAC3C,uDACA,EAAG,CAAC,CAACH,EAAM,OAAQ,KAAO2D,EAAc,EAAGxD,CAAO,EAAG,CACrD,4BACA,EAAG,CAACA,EAAS,CAACH,EAAM6C,EAAU,WAAW,CAAC,EAAG,CAC7C,wBACA,EAAG,CAAC1C,EAAS,CAACH,EAAMyD,GAAQ,WAAW,CAAC,EAAG,CAC3C,0BACA,EAAG,CAAC,CAACzD,EAAMyD,GAAQ,SAAS,EAAGtD,CAAO,EAAG,CACzC,gCACA,iDACA,oEACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,qBACA,EAAG,CAACH,CAAI,EAAG,CACX,kCACA,kCACA,EAAG,CAACG,EAASH,CAAI,EAAG,CAGpB,6DACA,EAAG,CAAC,CAACA,EAAMwD,EAAQ,EAAGrD,EAAS,CAACF,EAAMa,CAAK,CAAC,EAAG,CAC/C,uCACA,kCACA,4BACA,4BACA,4BACA,6BACA,qCACA,qCACA,6CACA,EAAG,CAACd,EAAMG,EAAS,CAACF,EAAMa,CAAK,CAAC,EAAG,CACnC,8BACA,EAAG,CAACX,EAAS,CAACH,EAAM,KAAK,EAAG,CAACC,EAAMa,CAAK,CAAC,EAAG,CAC5C,4CACA,EAAG,CAACX,EAAS,CAACH,EAAM,QAAQ,EAAG,CAACC,EAAMa,CAAK,CAAC,EAAG,CAC/C,oBACA,EAAG,CAACd,EAAM,CAACC,EAAMa,CAAK,CAAC,EAAG,CAC1B,qCACA,EAAG,CAAC,CAACd,EAAM,OAAQ,MAAM,EAAGG,EAAS,CAACF,EAAMa,CAAK,CAAC,EAAG,CAErD,4BACA,EAAG,CAACd,EAAMG,CAAO,EAAG,CAEpB,kCACA,EAAG,CAACA,EAAS,CAACH,EAAMkD,GAAO,WAAW,CAAC,EAAG,CAE1C,kCACA,EAAG,CAAC/C,EAAS,CAACH,EAAMqD,GAAK,WAAW,CAAC,EAAG,CAExC,6BACA,EAAG,CAAC,CAACrD,EAAMkD,GAAO,UAAU,EAAG/C,CAAO,EAAG,CAEzC,yDACA,EAAG,CAACA,EAAS,CAACH,EAAM,UAAY2D,EAAc,CAAC,EAAG,CAElD,2BACA,EAAG,CAACxD,EAAS,CAACH,EAAM0D,EAAgB,QAAQ,CAAC,EAAG,CAEhD,6DACA,EAAG,CAAC1D,EAAMG,CAAO,EAAG,CAEpB,mDACA,EAAG,CAACA,EAAS,CAACH,EAAM0D,EAAgB,QAAQ,CAAC,EAAG,CAChD,qCACA,EAAG,CAAC,CAAC1D,EAAM0D,EAAgB,QAAQ,CAAC,EAAG,CACvC,kCACA,EAAG,CAACvD,EAASH,CAAI,EAAG,CACpB,8CACA,EAAG,CAACA,EAAM,CAACG,EAAS,GAAG,CAAC,EAAG,CAE3B,4BACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CAGpB,4CACA,EAAG,CAAC,CAACH,EAAM0D,EAAgBJ,EAAO,EAAGnD,CAAO,EAAG,CAC/C,sCACA,EAAG,CAAC,CAACH,EAAM,UAAU,EAAGG,CAAO,EAAG,CAClC,gCACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,qCACA,EAAG,CAACA,EAAS,CAACH,EAAMsD,GAAQ,UAAU,CAAC,EAAG,CAC1C,6BACA,cACA,8FAEA,sFAEA,wBACA,4EAGA,wHAEA,wBACA,EAAG,CAACtD,EAAM,CAACG,EAAS,KAAM,GAAG,CAAC,EAAG,CAEjC,sBACA,EAAG,CAACH,EAAM,CAACG,EAAS,YAAaZ,CAAK,CAAC,CAC3C,EAEA,IAAM,CAAC,CAEH,mCACA,EAAG,CAAC,CAACa,EAAc,OAAO,CAAC,EAAG,CAE9B,eACA,0BACA,EAAG,CAAC,CAACA,EAAc,MAAM,CAAC,EAAG,CAE7B,qCACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,EAAG,CAE9B,+BACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,EAAG,CAG9B,sCACA,EAAG,CAAC,CAACA,EAAc,KAAK,CAAC,EAAG,CAE5B,eACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,EAAG,CAE9B,oGACA,mCACA,qCACA,EAAG,CAAC,CAACA,EAAc,OAAQb,EAAOwF,CAAQ,CAAC,EAAG,CAC9C,UACA,EAAG,CAAC,CAAC3E,EAAc,KAAK,CAAC,EAAG,CAC5B,eACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,CAC/B,EAEA,OAAS,CAAC,CAON,iFACA,EAAG,CAACE,EAAO,CAACJ,EAAQ2C,CAAO,EAAG,CAAC5C,EAAMQ,CAAM,CAAC,EAAG,CAC/C,iEACA,0CACA,eACA,EAAG,CAACH,EAAO,CAACJ,EAAQ2C,CAAO,EAAG,CAAC5C,EAAMO,CAAM,CAAC,EAAG,CAG/C,yCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ8B,CAAK,EAAG,CAAC/B,EAAMO,CAAM,CAAC,EAAG,CAC7C,sCACA,yCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ8B,CAAK,EAAG,CAAC/B,EAAMQ,CAAM,CAAC,EAAG,CAC7C,eACA,EAAG,CAACH,EAAO,CAACJ,EAAQ8B,CAAK,CAAC,EAAG,CAG7B,+BACA,EAAG,CAAC1B,EAAO,CAACJ,EAAQ4C,EAAK,EAAG,CAAC7C,EAAMO,CAAM,CAAC,EAAG,CAG7C,4FACA,EAAG,CAACF,EAAO,CAACJ,EAAQoC,EAAK,EAAG,CAACrC,EAAMQ,CAAM,CAAC,EAAG,CAC7C,sBACA,EAAG,CAACH,EAAO,CAACJ,EAAQoC,EAAK,EAAG,CAACrC,EAAMO,CAAM,CAAC,EAAG,CAG7C,+OACA,EAAG,CAACF,EAAO,CAACJ,EAAQkC,EAAM,EAAG,CAACnC,EAAMQ,CAAM,CAAC,EAAG,CAC9C,8BACA,iEACA,EAAG,CAACH,EAAO,CAACJ,EAAQkC,EAAM,EAAG,CAACnC,EAAMO,CAAM,CAAC,EAAG,CAG9C,wEACA,qDACA,EAAE,CAAC,CAACF,EAAO,KAAM,GAAG,EAAG,CAACJ,EAAQ8C,EAAM,EAAG,CAAC/C,EAAMQ,CAAM,CAAC,EAAG,CAE1D,kDACA,yBACA,uCACA,iDACA,4DACA,sHACA,uBACA,EAAG,CAAC,CAACH,EAAO,KAAM,GAAG,EAAG,CAACJ,EAAQ8C,EAAM,EAAG,CAAC/C,EAAMO,CAAM,CAAC,EAAG,CAG3D,6GACA,wCACA,EAAG,CAACF,EAAO,CAACJ,EAAQyC,EAAO,EAAG,CAAC1C,EAAMO,CAAM,CAAC,EAAG,CAG/C,sBACA,iEACA,EAAG,CAACF,EAAO,CAACJ,EAAQ0C,EAAI,EAAG,CAAC3C,EAAMO,CAAM,CAAC,EAAG,CAC5C,+BACA,EAAG,CAACF,EAAO,CAACJ,EAAQ0G,EAAW,CAAE,QAAY,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAAG,IAAMhE,EAAK,CAAC,EAAG,CAAC3C,EAAMQ,CAAM,CAAC,EAAG,CAGzH,8DACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,2BACA,kCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,MAAM,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG9C,iCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,QAAQ,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGhD,8IACA,0EACA,EAAG,CAACF,EAAO,CAACJ,EAAQmC,EAAM,EAAG,CAACpC,EAAMQ,CAAM,CAAC,EAAG,CAC9C,uCACA,EAAG,CAACH,EAAO,CAACJ,EAAQmC,EAAM,EAAG,CAACpC,EAAMO,CAAM,CAAC,EAAG,CAG9C,iFACA,yCACA,8EACA,EAAG,CAACF,EAAO,CAACJ,EAAQuC,EAAQ,EAAG,CAACxC,EAAMO,CAAM,CAAC,EAAG,CAChD,mCACA,EAAG,CAACF,EAAO,CAACJ,EAAQuC,EAAQ,EAAG,CAACxC,EAAMQ,CAAM,CAAC,EAAG,CAGhD,+DACA,EAAG,CAACH,EAAO,CAACJ,EAAQqC,EAAE,EAAG,CAACtC,EAAMQ,CAAM,CAAC,EAAG,CAC1C,sDACA,sEACA,sBACA,EAAG,CAACH,EAAO,CAACJ,EAAQqC,EAAE,EAAG,CAACtC,EAAMO,CAAM,CAAC,EAAG,CAG1C,sBACA,EAAG,CAACN,EAAQI,EAAO,CAACL,EAAMQ,CAAM,CAAC,EAAG,CACpC,4CACA,0CACA,EAAG,CAAC,CAACH,EAAO,KAAM,GAAG,EAAG,CAACL,EAAMO,CAAM,EAAG,CAACN,EAAQ,OAAO,CAAC,EAAG,CAG5D,uBACA,EAAG,CAACI,EAAO,CAACJ,EAAQiC,CAAM,EAAG,CAAClC,EAAMQ,CAAM,CAAC,EAAG,CAE9C,sNACA,EAAG,CAACH,EAAO,CAACJ,EAAQiC,CAAM,EAAG,CAAClC,EAAMO,CAAM,CAAC,EAAG,CAC9C,6BACA,EAAG,CAACN,EAAQI,CAAK,EAAG,CAGpB,qGACA,EAAG,CAACA,EAAO,CAACJ,EAAQ6C,CAAI,EAAG,CAAC9C,EAAMO,CAAM,CAAC,EAAG,CAC5C,oBACA,+BACA,EAAG,CAAC,CAACF,EAAO,eAAe,EAAG,CAACJ,EAAQ6C,CAAI,EAAG,CAAC9C,EAAMQ,CAAM,CAAC,EAAG,CAG/D,eACA,yCACA,8BACA,EAAG,CAACH,EAAO,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMQ,CAAM,CAAC,EAAG,CAC9C,+CACA,EAAG,CAAC,CAACH,EAAO,QAAS,eAAe,EAAG,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMO,CAAM,CAAC,EAAG,CAG1E,8BACA,EAAG,CAACF,EAAOJ,EAAQ,CAACD,EAAMQ,CAAM,CAAC,EAAG,CACpC,gCACA,+BACA,EAAG,CAACH,EAAO,CAACJ,EAAQgC,EAAU,EAAG,CAACjC,EAAMO,CAAM,CAAC,EAAG,CAGlD,mFACA,EAAG,CAACF,EAAO,CAACJ,EAAQ+B,EAAI,EAAG,CAAChC,EAAMQ,CAAM,CAAC,EAAG,CAC5C,+CACA,EAAG,CAACH,EAAO,CAACJ,EAAQ+B,EAAI,EAAG,CAAChC,EAAMO,CAAM,CAAC,EAAG,CAG5C,YACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAC7C,2CAGA,oCACA,+EACA,EAAG,CAACP,EAAQ,CAACI,EAAO,KAAM,GAAG,EAAG,CAACL,EAAMO,CAAM,CAAC,EAAG,CAGjD,oBACA,0HACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAC7C,8RACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,iBACA,EAAG,CAAC,CAACN,EAAQ6E,CAAQ,EAAGzE,EAAO,CAACL,EAAM2G,EAAW,CAAE,OAAW,CAAC,UAAW,OAAO,EAAG,IAAM,QAAS,CAAC,CAAC,EAAG,CAGxG,qCACA,EAAG,CAACtG,EAAO,CAACJ,EAAQ,MAAM,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAG9C,8BACA,mBACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,OAAO,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG/C,gDACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,SAAS,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGjD,8BACA,kCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,WAAW,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGnD,gBACA,6CACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,wCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,WAAW,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGnD,0CACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,SAAS,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGjD,+CACA,gEACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,QAAQ,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAChD,0BACA,8BACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,QAAQ,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGhD,YACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,mBACA,4EACA,EAAG,CAACN,EAAQI,EAAO,CAACL,EAAMQ,CAAM,CAAC,EAAG,CAEpC,sIAGA,+EACA,mBACA,8BACA,wBACA,6BACA,kDACA,EAAG,CAACP,EAAQI,EAAO,CAACL,EAAMO,CAAM,CAAC,EAAG,CAEpC,2BACA,uCACA,sBACA,EAAG,CAACN,EAAQI,EAAO,CAACL,EAAMQ,CAAM,CAAC,EAAG,CAEpC,gBACA,EAAG,CAACH,EAAO,CAACJ,EAAQsC,EAAS,EAAG,CAACvC,EAAMQ,CAAM,CAAC,EAAG,CACjD,mCACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,WAAW,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CACnD,sDACA,EAAG,CAACF,EAAO,CAACJ,EAAQwC,EAAM,EAAG,CAACzC,EAAMQ,CAAM,CAAC,EAAG,CAC9C,iBACA,EAAG,CAACP,EAAQI,EAAO,CAACL,EAAMO,CAAM,CAAC,EAAG,CACpC,oBACA,EAAG,CAAC,CAACF,EAAO,MAAO,GAAG,EAAG,CAACJ,EAAQsC,EAAS,EAAG,CAACvC,EAAMO,CAAM,CAAC,EAAG,CAC/D,qDACA,EAAG,CAACF,EAAO,CAACJ,EAAQ+C,EAAK,EAAG,CAAChD,EAAMQ,CAAM,CAAC,EAAG,CAC7C,uCACA,EAAG,CAACH,EAAO,CAACJ,EAAQ+C,EAAK,EAAG,CAAChD,EAAMO,CAAM,CAAC,EAAG,CAM7C,qBACA,sBACA,EAAG,CAACN,EAAQ,CAACD,EAAMS,CAAO,CAAC,EAAG,CAC9B,qBACA,EAAG,CAAC,CAACJ,EAAO,IAAK,SAAS,EAAG,CAACJ,EAAQ2C,CAAO,EAAG,CAAC5C,EAAMS,CAAO,CAAC,EAAG,CAClE,mCACA,0BACA,EAAG,CAACR,EAAQI,EAAO,CAACL,EAAMS,CAAO,CAAC,EAAG,CACrC,4DACA,EAAG,CAAC,CAACR,EAAQqC,EAAE,EAAG,CAACtC,EAAMS,CAAO,CAAC,EAAG,CACpC,cACA,EAAG,CAACR,EAAQ,CAACI,EAAO0B,EAAM,KAAK,EAAG,CAAC/B,EAAMS,CAAO,CAAC,EAAG,CACpD,gCACA,EAAG,CAAC,CAACJ,EAAO8C,EAAW,mBAAmB,EAAG,CAAClD,EAAQiC,CAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CACjF,6BACA,EAAG,CAAC,CAACJ,EAAO,IAAK,aAAa,EAAG,CAACJ,EAAQiC,CAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CACrE,iBACA,EAAG,CAAC,CAACJ,EAAO8C,EAAW,WAAW,EAAG,CAAClD,EAAQiC,CAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CACzE,QACA,EAAG,CAAC,CAACJ,EAAO8C,CAAU,EAAG,CAAClD,EAAQiC,CAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CAC7D,aACA,EAAG,CAACJ,EAAO,CAACJ,EAAQsD,EAAQ,EAAG,CAACvD,EAAMS,CAAO,CAAC,EAAG,CACjD,2BACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMS,CAAO,CAAC,EAAG,CAC/C,kBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQwC,EAAM,EAAG,CAACzC,EAAMS,CAAO,CAAC,EAAG,CAC/C,uBACA,qBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ4C,EAAK,EAAG,CAAC7C,EAAMS,CAAO,CAAC,EAAE,CAC7C,0BACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ6C,CAAI,EAAG,CAAC9C,EAAMS,CAAO,CAAC,EAAG,CAC7C,wBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ8C,EAAM,EAAG,CAAC/C,EAAMS,CAAO,CAAC,EAAG,CAC/C,2BACA,EAAG,CAACR,EAAQI,EAAO,CAACL,EAAMS,CAAO,CAAC,EAAG,CACrC,0CACA,2DACA,EAAG,CAAC,CAACR,EAAQ,YAAa,KAAM0G,EAAW,CAAC,GAAK,KAAK,CAAC,EAAG,CAACtG,EAAOoF,EAAI,EAAG,CAACzF,EAAMS,CAAO,CAAC,EAAG,CAM3F,oBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ6C,CAAI,EAAG,CAAC9C,EAAMM,EAAO,CAAC,EAAG,CAC7C,oCACA,EAAG,CAACD,EAAO,CAACJ,EAAQsC,EAAS,EAAG,CAACvC,EAAMM,EAAO,CAAC,EAAG,CAClD,UACA,oBACA,8BACA,EAAG,CAACL,EAAQI,EAAO,CAACL,EAAMM,EAAO,CAAC,EAAG,CACrC,6BACA,EAAG,CAACD,EAAO,CAACJ,EAAQwC,EAAM,EAAG,CAACzC,EAAMM,EAAO,CAAC,EAAG,CAM/C,6CACA,EAAG,CAACD,EAAO,CAACJ,EAAQ2C,CAAO,EAAG,CAAC5C,EAAMU,CAAQ,CAAC,EAAG,CACjD,iBACA,4DACA,EAAG,CAACT,EAAQI,EAAO,CAACL,EAAMU,CAAQ,CAAC,EAAG,CACtC,8BACA,EAAG,CAACL,EAAO,CAACJ,EAAQ0C,EAAI,EAAG,CAAC3C,EAAMU,CAAQ,CAAC,EAAG,CAC9C,sCACA,EAAG,CAACL,EAAO,CAACJ,EAAQ8B,CAAK,EAAG,CAAC/B,EAAMU,CAAQ,CAAC,EAAG,CAC/C,eACA,EAAG,CAACL,EAAO,CAACJ,EAAQyC,EAAO,EAAG,CAAC1C,EAAMU,CAAQ,CAAC,EAAG,CACjD,aACA,EAAG,CAACL,EAAO,CAACJ,EAAQuC,EAAQ,EAAG,CAACxC,EAAMU,CAAQ,CAAC,EAAG,CAClD,iBACA,EAAG,CAACL,EAAO,CAACJ,EAAQ6C,CAAI,EAAG,CAAC9C,EAAMU,CAAQ,CAAC,EAAG,CAC9C,cACA,EAAG,CAACL,EAAO,CAACJ,EAAQqC,EAAE,EAAG,CAACtC,EAAMU,CAAQ,CAAC,EAAG,CAC5C,2BACA,EAAG,CAACL,EAAO,CAACJ,EAAQ+C,EAAK,EAAG,CAAChD,EAAMU,CAAQ,CAAC,EAAG,CAM/C,sBACA,EAAG,CAACL,EAAO,CAACJ,EAAQiC,CAAM,EAAG,CAAClC,EAAMW,EAAE,CAAC,EAAG,CAC1C,uBACA,EAAG,CAACV,EAAQI,EAAO,CAACL,EAAMW,EAAE,CAAC,EAAG,CAChC,2BACA,EAAG,CAACN,EAAO,CAACJ,EAAQsD,EAAQ,EAAG,CAACvD,EAAMW,EAAE,CAAC,EAAG,CAC5C,yBACA,EAAG,CAAC,CAACX,EAAMW,EAAE,CAAC,EAAG,CAMjB,sCACA,EAAG,CAACV,EAAQ,CAACD,EAAMY,EAAQ,CAAC,EAAG,CAC/B,YACA,EAAG,CAACP,EAAO,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMY,EAAQ,CAAC,EAAG,CAChD,oBACA,EAAG,CAACP,EAAO,CAACJ,EAAQ8B,CAAK,EAAG,CAAC/B,EAAMY,EAAQ,CAAC,EAAG,CAC/C,cACA,EAAG,CAAC,CAACZ,EAAMY,EAAQ,CAAC,EAAG,CAMvB,sDACA,EAAG,CAACP,EAAO,CAACL,EAAMS,CAAO,CAAC,EAAG,CAC7B,yEACA,EAAG,CAAC,CAACT,EAAMS,CAAO,CAAC,EAAG,CACtB,8EACA,EAAG,CAACJ,EAAO,CAACL,EAAM2G,EAAW,CAAE,OAAW,SAAU,GAAO,KAAM,IAAMnG,CAAO,CAAC,CAAC,EAAG,CACnF,8CACA,EAAG,CAAC,CAACR,EAAMQ,CAAM,CAAC,EAAG,CACrB,gEACA,EAAG,CAAC,CAACR,EAAMO,CAAM,CAAC,EAAG,CACrB,kCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,SAAS,CAAC,CAClC,EAEA,OAAS,CAAC,CAEN,4BACA,EAAG,CAACC,EAAS,CAACH,EAAMqD,GAAK,MAAM,CAAC,EAAG,CAEnC,sBACA,EAAG,CAACrD,EAAMG,CAAO,EAAG,CAEpB,2CACA,EAAG,CAACA,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAE/B,uBACA,4EACA,0BACA,yCACA,8BAEA,aACA,EAAG,CAACA,EAAMG,CAAO,EAAG,CACpB,aACA,EAAG,CAAC,CAACH,EAAM,QAAQ,CAAC,EAAG,CAEvB,+BACA,EAAG,CAACG,EAASH,CAAI,CACrB,EAEA,GAAK,CAAC,CAGF,8BACA,EAAG,CAAC,CAACA,EAAM,IAAK,GAAG,EAAG,CAACG,EAASyG,EAAWE,EAAiB,CAAC,EAAG,CAChE,+DAEA,kFACA,EAAG,CAAC9G,EAAMG,CAAO,EAAG,CACpB,qCACA,yCACA,EAAG,CAAC,CAACA,EAAS,UAAW,GAAIyG,EAAWE,EAAiB,EAAG,CAAC9G,EAAM4D,EAAO,CAAC,EAAG,CAC9E,2BACA,EAAG,CAAC5D,EAAMG,CAAO,EAAG,CAGpB,uDACA,sFACA,sBACA,EAAG,CAAC,CAACA,EAAS,KAAM,GAAG,EAAG,CAACH,EAAM,KAAK,CAAC,EAAG,CAC1C,0BACA,iDACA,EAAG,CAAC,CAACA,EAAM,OAAO,EAAG,CAACG,EAAS,KAAM,GAAG,CAAC,EAAG,CAG5C,2BACA,EAAG,CAACA,EAAS,CAACH,EAAMoD,EAAa,UAAU,CAAC,EAAG,CAC/C,4BACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,EAAa,UAAU,CAAC,EAAG,CAC/C,6CACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,EAAa,eAAe,CAAC,EAAG,CACpD,0BACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,EAAa,QAAQ,CAAC,EAAG,CAC7C,mBACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,CAAU,CAAC,EAAG,CAGlC,sCACA,EAAG,CAACjD,EAASH,CAAI,EAAG,CACpB,kCACA,EAAG,CAAC,CAACA,EAAM,OAAQ,UAAU,EAAGG,CAAO,EAAG,CAC1C,8BAEA,kIACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,YACA,EAAG,CAACA,EAAS,CAACH,EAAMkC,EAAU,CAAC,EAAG,CAClC,6DACA,EAAG,CAAC/B,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,iFACA,EAAG,CAACG,EAAS,CAACH,EAAMsD,GAAQ,KAAK,CAAC,EAAG,CACrC,uCACA,+CACA,EAAG,CAACnD,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAC/B,uCAEA,EAAG,CAAC,CAACG,EAASyG,EAAW,CAAC,GAAK,MAAM,GAAK,MAAM,GAAK,KAAK,GAAK,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,MAAM,EAAI,MAAM,IAAI,IAAI,CAAC,EAAG,CAAC5G,EAAM,OAAO,CAAC,EAAG,CAC1J,sCACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CAGjC,kCACA,EAAG,CAAC,CAACA,EAAM,WAAW,EAAGG,CAAO,EAAE,CAGlC,qBACA,iBACA,2BAGA,gCACA,2BACA,wBAGA,wCACA,oCACA,qEACA,0SAEA,sCACA,6BACA,2DACA,oBACA,6EACA,kBACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,qBACA,EAAG,CAAC,CAACH,EAAM,SAAS,EAAGG,CAAO,EAAG,CACjC,mDACA,oBACA,EAAG,CAACH,EAAMG,CAAO,CACrB,CACJ,EAMI+G,IAAgB,UAAY,CACxB,IAAIP,EAAQ,CAAE,KAAO,CAAC,EAAG,SAAW,CAAC,EAAG,YAAc,CAAC,EAAG,SAAW,CAAC,CAAC,EACvE,OAAAb,EAAS,KAAKa,EAAM,KAAM,CACtB,CAACjH,EAAS,CAACM,EAAMG,EAASE,GAAOJ,CAAI,CAAC,EACtC,CAACN,EAAK,CAACS,CAAY,CAAC,EACpB,CAACR,EAAQ,CAACK,EAAMK,EAAOJ,CAAM,CAAC,EAC9B,CAACL,EAAQ,CAACG,EAAMG,CAAO,CAAC,EACxB,CAACL,EAAI,CAACE,EAAMG,CAAO,CAAC,CACxB,CAAC,EACD2F,EAAS,KAAKa,EAAM,SAAU,CAC1B,CAACjH,EAAS,CAACS,EAASE,EAAK,CAAC,EAC1B,CAACR,EAAQ,CAACM,CAAO,CAAC,EAClB,CAACL,EAAI,CAACK,CAAO,CAAC,CAClB,CAAC,EACD2F,EAAS,KAAKa,EAAM,YAAa,CAC7B,CAACjH,EAAS,aAAa,EACvB,CAACI,EAAI,QAAQ,CACjB,CAAC,EACDgG,EAAS,KAAKa,EAAM,SAAU,CAC1B,CAACjH,EAAS,CAACM,EAAMG,CAAO,CAAC,EACzB,CAACR,EAAK,CAACS,CAAY,CAAC,EACpB,CAACR,EAAQ,CAACM,EAAQI,CAAK,CAAC,EACxB,CAACT,EAAQ,CAACG,EAAMG,CAAO,CAAC,EACxB,CAACL,EAAI,CAACE,EAAMG,CAAO,CAAC,CACxB,CAAC,EACMwG,CACf,GAAG,EAECQ,GAAc,SAAUC,EAAMC,EAAU,CAExC,IAAIC,EAAaJ,GAAa,KAAKG,CAAQ,EACvCE,EAAiBL,GAAa,SAASG,CAAQ,GAAK,EACpDG,EAAeN,GAAa,YAAYG,CAAQ,GAAK,EACrDI,EAAiBP,GAAa,SAASG,CAAQ,GAAK,EAExD,SAASK,GAAS,CACd5B,EAAS,KAAK,KAAMwB,CAAU,CAClC,CAEA,OAAAI,EAAM,UAAU,QAAU,UAAY,CAClC,OAAON,CACX,EAEAM,EAAM,UAAU,gBAAkB,UAAY,CAG1C,OAAK3D,EAOEA,EACE,qBAAqBjC,EAAa,EAClC,KAAK,SAAU6F,EAAK,CACjB,OAAOP,EACE,MAAM,IAAIQ,GAASD,EAAK,EAAK,CAAC,EAC9B,QAAQ,EACR,IAAI,CACzB,CAAC,EAbUP,EACE,QAAQ,EACR,IAAI,CAYrB,EAEAM,EAAM,UAAU,iBAAmB,UAAY,CAC3C,OAAON,EAAK,cAAc,EAAE,IAAI,CACpC,EAEIC,GAAYtH,IACZ2H,EAAM,UAAU,GAAK,SAAUG,EAAY,CACvC,IAAIC,EAAK,GACT,QAASxD,KAAK,KACV,GAAI,KAAK,eAAeA,CAAC,GAAK,CAACM,GAAI2C,EAAgBjD,CAAC,GAAKS,EAASyC,EAAehC,EAAMgC,EAAc,KAAKlD,CAAC,CAAC,EAAI,KAAKA,CAAC,CAAC,GAAKS,EAASyC,EAAehC,EAAMgC,EAAcK,CAAU,EAAIA,CAAU,GAE5L,GADAC,EAAK,GACDD,GAAcpI,EAAO,UAAW,cAC7BoI,GAAcpI,EAAO,WAAaqI,EAAI,CAC7CA,EAAK,CAACA,EACN,KACJ,CAEJ,OAAOA,CACX,EACAJ,EAAM,UAAU,SAAW,UAAY,CACnC,IAAI/B,EAAMpG,EACV,QAAS+E,KAAKmD,EACN,OAAO,KAAKA,EAAenD,CAAC,CAAC,IAAO7E,EAAO,YAC3CkG,IAAQA,EAAM,IAAMpG,GAAS,KAAKkI,EAAenD,CAAC,CAAC,GAG3D,OAAOqB,GAAOlG,EAAO,SACzB,GAGCsE,IACD2D,EAAM,UAAU,KAAO,SAAUK,EAAI,CACjC,IAAIC,EAAO,KACPC,EAAe,UAAY,CAC3B,QAAS9C,KAAQ6C,EACTA,EAAK,eAAe7C,CAAI,IACxB,KAAKA,CAAI,EAAI6C,EAAK7C,CAAI,EAGlC,EACA8C,EAAa,UAAY,CACrB,GAAKP,EAAM,UAAU,GACrB,SAAWA,EAAM,UAAU,QAC/B,EACA,IAAIQ,EAAc,IAAID,EACtB,OAAAF,EAAGG,CAAW,EACPA,CACX,GAGG,IAAIR,CACf,EAMA,SAASE,GAAUO,EAAMC,EAAY,CAGjC,GAFAD,EAAOA,GAAQ,CAAC,EAChBrC,EAAS,KAAK,KAAMhE,EAAa,EAC7BsG,EACAtC,EAAS,KAAK,KAAM,CAChB,CAAC/E,GAAQsE,GAAgB8C,EAAK9G,CAAE,CAAC,CAAC,EAClC,CAACJ,GAAaoE,GAAgB8C,EAAK7G,EAAgB,CAAC,CAAC,EACrD,CAACd,EAAQ,MAAM,KAAK2H,EAAKzG,EAAS,CAAC,CAAC,EACpC,CAACpB,EAAO2F,GAAYkC,EAAKxG,EAAQ,CAAC,CAAC,EACnC,CAACT,EAAU+E,GAAYkC,EAAKvG,EAAW,CAAC,CAAC,EACzC,CAACT,GAAa8E,GAAYkC,EAAKtG,EAAe,CAAC,CAAC,EAChD,CAACzB,EAAc6F,GAAYkC,EAAK5G,EAAO,CAAC,CAAC,EACzC,CAACP,EAAaqE,GAAgB8C,EAAK1G,EAAe,CAAC,CAAC,EACpD,CAACL,GAAS6E,GAAYkC,EAAK3G,EAAU,CAAC,CAAC,CAC3C,CAAC,MAED,SAAS2D,KAAQgD,EACV,KAAK,eAAehD,CAAI,GAAK,OAAOgD,EAAKhD,CAAI,IAAM1F,EAAO,YAAW,KAAK0F,CAAI,EAAIgD,EAAKhD,CAAI,EAG1G,CAEA,SAASkD,GAAQhB,EAAUjB,EAAIkC,EAAQC,EAAM,CAEzC,YAAK,IAAM,SAAUpD,EAAM,CACvB,OAAKA,EACE,KAAK,KAAK,eAAeA,CAAI,EAAI,KAAK,KAAKA,CAAI,EAAI,OADxC,KAAK,IAE3B,EAEA,KAAK,IAAM,SAAUA,EAAMC,EAAK,CAC5B,YAAK,KAAKD,CAAI,EAAIC,EACX,IACX,EAEA,KAAK,MAAQ,SAAUoD,EAAI,CACvB,YAAK,KAAOA,EACL,IACX,EAEA,KAAK,cAAgB,UAAY,CAC7B,GAAI1E,GAAaA,EAAU,WAAa,KAAK,GACzC,OAAQ,KAAK,SAAU,CACnB,KAAKpE,EAEGoE,EAAU,OAAS,OAAOA,EAAU,MAAM,SAAWrE,EAAO,UAC5D,KAAK,IAAIO,EAAM,OAAO,EAE1B,MACJ,KAAKJ,EAEG,CAAC,KAAK,IAAIK,CAAI,GAAK8D,GAAoBA,EAAiBvD,CAAM,GAC9D,KAAK,IAAIP,EAAMO,CAAM,EAGrB,KAAK,IAAIF,CAAK,GAAK,aAAewD,GAAa,OAAOA,EAAU,aAAerE,EAAO,WAAaqE,EAAU,gBAAkBA,EAAU,eAAiB,GAC1J,KAAK,IAAIxD,EAAO,MAAM,EACjB,IAAIL,EAAMQ,CAAM,EAEzB,MACJ,KAAKX,EAEG,CAAC,KAAK,IAAIE,CAAI,GAAK+D,GAAoBA,EAAiB7C,CAAQ,GAChE,KAAK,IAAIlB,EAAM+D,EAAiB7C,CAAQ,CAAC,EAE7C,MACJ,KAAKnB,EACD,IAAI0I,EAAO,KAAK,KACZC,EAAS,SAAUrB,EAAU,CAC7B,OAAOoB,EAAKpB,CAAQ,EACX,QAAQ,EACR,cAAc,EACd,IAAI,CACjB,EACA,KAAK,IAAI3H,EAASgJ,EAAOhJ,CAAO,CAAC,EAC5B,IAAIC,EAAK+I,EAAO/I,CAAG,CAAC,EACpB,IAAIC,EAAQ8I,EAAO9I,CAAM,CAAC,EAC1B,IAAIC,EAAQ6I,EAAO7I,CAAM,CAAC,EAC1B,IAAIC,EAAI4I,EAAO5I,CAAE,CAAC,CAC/B,CAEJ,OAAO,IACX,EAEA,KAAK,QAAU,UAAY,CAIvB,OAHI,KAAK,UAAYC,GACjBoG,GAAU,KAAK,KAAK,KAAM,KAAK,GAAI,KAAK,MAAM,EAE1C,KAAK,SAAU,CACnB,KAAKzG,EACD,KAAK,IAAIW,GAAOuF,GAAS,KAAK,IAAIzF,CAAO,CAAC,CAAC,EAC3C,MACJ,KAAKL,EACD,GAAI,KAAK,IAAIE,CAAI,GAAK,OAAS,KAAK,IAAIG,CAAO,GAAK,OAAQ,CAExD,IAAIwI,EAAc,wBAAwB,KAAK,KAAK,EAAE,EAClDA,GAAe,SAASA,EAAY,CAAC,EAAE,UAAU,EAAE,CAAC,EAAG,EAAE,GAAK,IAC9D,KAAK,IAAIxI,EAASwI,EAAY,CAAC,CAAC,CAExC,CACA,KACR,CACA,OAAO,IACX,EAEA,KAAK,QAAU,UAAY,CACvB,IAAIJ,EAAO,KAAK,KACZD,EAAS,KAAK,OAElB,OAAQ,KAAK,SAAU,CACnB,KAAK5I,EACL,KAAKG,EACD,IAAI+I,EAASL,EAAKtH,EAAW,GAAKsH,EAAKxH,EAAM,EAAG8H,EAChD,GAAID,EACA,QAAStE,EAAE,EAAGA,EAAEsE,EAAO,OAAQtE,IAAK,CAChC,IAAIwE,EAAYF,EAAOtE,CAAC,EAAE,OAASsE,EAAOtE,CAAC,EACvCyE,EAAeH,EAAOtE,CAAC,EAAE,QACzB,KAAK,UAAY5E,GACjB,CAAC,eAAe,KAAKoJ,CAAS,IAC7B,CAACD,GACG,QAAQ,KAAKA,CAAQ,GAAKC,GAAa3F,IACvC0F,GAAYxF,IAAQ,WAAW,KAAKyF,CAAS,KAE9CA,EAAYlC,EAAUkC,EAAW9B,EAAe,EAChD6B,EAAW,KAAK,IAAI7I,CAAI,EAClB6I,GAAY,CAAC,QAAQ,KAAKA,CAAQ,GAAK,QAAQ,KAAKC,CAAS,GAC/D,KAAK,IAAI9I,EAAM8I,CAAS,EACnB,IAAI3I,EAAS4I,CAAY,EACzB,IAAI1I,GAAOuF,GAASmD,CAAY,CAAC,EAE1CF,EAAWC,GAEf,KAAK,UAAYjJ,GAAUiJ,GAAa3F,IACxC,KAAK,IAAIhD,EAAS4I,CAAY,CAEtC,CAEJ,MACJ,KAAKpJ,EACD,IAAIqJ,EAAWT,EAAKnI,CAAY,EAC5B4I,IACIA,GAAYT,EAAKnH,EAAO,GAAK,OAAM4H,GAAY,MACnD7C,GAAU,KAAK,KAAK,KAAM6C,EAAW,IAAKV,CAAM,GAEpD,MACJ,KAAK1I,EAID,GAHI2I,EAAK/H,CAAM,GACX,KAAK,IAAIP,EAAMO,CAAM,EAErB+H,EAAKjI,CAAK,IACV,KAAK,IAAIA,EAAOiI,EAAKjI,CAAK,CAAC,EACvB,CAAC,KAAK,IAAIL,CAAI,GAAK,CAAC,KAAK,IAAIC,CAAM,GAAG,CACtC,IAAI+I,EAAU,CAAC,EACf9C,GAAU,KAAK8C,EAAS,YAAcV,EAAKjI,CAAK,EAAI,IAAKgI,CAAM,EAC3D,CAAC,KAAK,IAAIrI,CAAI,GAAOgJ,EAAQ,MAC7B,KAAK,IAAIhJ,EAAMgJ,EAAQ,IAAI,EAE3B,CAAC,KAAK,IAAI/I,CAAM,GAAO+I,EAAQ,QAC/B,KAAK,IAAI/I,EAAQ+I,EAAQ,MAAM,CAEvC,CAEJ,GAAIV,EAAKvH,CAAW,EAAG,CACnB,IAAIkI,EACJ,GAAI,OAAOX,EAAKvH,CAAW,GAAM,SAE7B,QADImI,EAAM,EACH,CAACD,GAAMC,EAAMZ,EAAKvH,CAAW,EAAE,QAClCkI,EAAKtC,EAAU2B,EAAKvH,CAAW,EAAEmI,GAAK,EAAGpC,EAAc,OAG3DmC,EAAKtC,EAAU2B,EAAKvH,CAAW,EAAG+F,EAAc,EAEpD,KAAK,IAAI9G,EAAMiJ,CAAE,CACrB,CACA,MACJ,KAAKpJ,EACD,IAAIsJ,EAASb,EAAKrH,CAAQ,EAC1B,GAAGkI,EAAQ,CACP,IAAIC,EAAYd,EAAKpH,EAAW,EAC5BiI,GAAUxF,KAASyF,EAAa,SAASzD,GAASyD,CAAS,EAAG,EAAE,GAAK,GAAK,KAAO,MACrF,KAAK,IAAIrJ,EAAMoJ,CAAM,EAChB,IAAIjJ,EAASkJ,CAAS,CAC/B,CAEI,KAAK,IAAIrJ,CAAI,GAAK4D,IAAW2E,EAAKjI,CAAK,GAAK,QAC5C,KAAK,IAAIN,EAAM,MAAM,EAChB,IAAIG,EAAS,MAAS,EAE/B,MACJ,KAAKJ,EACD,IAAI0I,GAAO,KAAK,KACZa,EAAQ,SAAUjC,GAAU,CAC5B,OAAOoB,GAAKpB,EAAQ,EACX,QAAQ,EACR,MAAMkB,CAAI,EACV,QAAQ,EACR,IAAI,CACjB,EACA,KAAK,IAAI7I,EAAS4J,EAAM5J,CAAO,CAAC,EAC3B,IAAIC,EAAK2J,EAAM3J,CAAG,CAAC,EACnB,IAAIC,EAAQ0J,EAAM1J,CAAM,CAAC,EACzB,IAAIC,EAAQyJ,EAAMzJ,CAAM,CAAC,EACzB,IAAIC,EAAIwJ,EAAMxJ,CAAE,CAAC,CAC9B,CACA,OAAO,IACX,EAEAgG,EAAS,KAAK,KAAM,CAChB,CAAC,WAAYuB,CAAQ,EACrB,CAAC,KAAMjB,CAAE,EACT,CAAC,OAAQmC,CAAI,EACb,CAAC,SAAUD,CAAM,EACjB,CAAC,OAAQnB,GAAY,KAAME,CAAQ,CAAC,CACxC,CAAC,EAEM,IACX,CAEA,SAASkC,EAAUnD,EAAIlC,EAAYsF,EAAS,CAkBxC,GAhBI,OAAOpD,IAAO3G,EAAO,QACjB4E,GAAa+B,EAAI,EAAI,GACjB,OAAOlC,IAAezE,EAAO,SAC7B+J,EAAUtF,GAEdA,EAAakC,IAEboD,EAAUpD,EACVlC,EAAa,QAEjBkC,EAAK,QACE,OAAOA,IAAO3G,EAAO,QAAU,CAAC4E,GAAaH,EAAY,EAAI,IACpEsF,EAAUtF,EACVA,EAAa,QAGbsF,EACA,GAAI,OAAOA,EAAQ,SAAW/J,EAAO,SAAU,CAE3C,IAAIgK,EAAK,CAAC,EACVD,EAAQ,QAAQ,SAAUE,EAAGlF,EAAG,CAAEiF,EAAG,OAAOjF,CAAC,EAAE,YAAY,CAAC,EAAIkF,CAAG,CAAC,EACpEF,EAAUC,CACd,KAAO,CAEH,IAAIE,EAAa,CAAC,EAClB,QAASrE,KAAUkE,EACXA,EAAQ,eAAelE,CAAM,IAC7BqE,EAAW,OAAOrE,CAAM,EAAE,YAAY,CAAC,EAAIkE,EAAQlE,CAAM,GAGjEkE,EAAUG,CACd,CAGJ,GAAI,EAAE,gBAAgBJ,GAClB,OAAO,IAAIA,EAASnD,EAAIlC,EAAYsF,CAAO,EAAE,UAAU,EAG3D,IAAII,EAAY,OAAOxD,IAAO3G,EAAO,OAAS2G,EACrBoD,GAAWA,EAAQlK,EAAU,EAAIkK,EAAQlK,EAAU,EAClDwE,GAAaA,EAAU,UAAaA,EAAU,UAC5CvE,EAExBsK,EAAW,IAAIjC,GAAS4B,EAAS,EAAI,EACrCM,EAAW5F,EACCF,GAAOiD,GAAgB/C,CAAU,EACjC+C,GAEZ8C,EAAiB,SAAU1C,EAAU,CACjC,OAAIA,GAAYtH,EACL,UAAY,CACf,OAAO,IAAIsI,GAAOhB,EAAUuC,EAAWE,EAAUD,CAAQ,EAC5C,IAAI,KAAMD,CAAS,EACnB,IAAIlK,EAAS,KAAK,WAAW,CAAC,EAC9B,IAAIC,EAAK,KAAK,OAAO,CAAC,EACtB,IAAIC,EAAQ,KAAK,UAAU,CAAC,EAC5B,IAAIC,EAAQ,KAAK,UAAU,CAAC,EAC5B,IAAIC,EAAI,KAAK,MAAM,CAAC,EACpB,IAAI,CACrB,EAEO,UAAY,CACf,OAAO,IAAIuI,GAAOhB,EAAUuC,EAAWE,EAASzC,CAAQ,EAAGwC,CAAQ,EACtD,QAAQ,EACR,IAAI,CACrB,CAER,EAGJ,OAAA/D,EAAS,KAAK,KAAM,CAChB,CAAC,aAAciE,EAAerK,CAAO,CAAC,EACtC,CAAC,SAAUqK,EAAepK,CAAG,CAAC,EAC9B,CAAC,YAAaoK,EAAenK,CAAM,CAAC,EACpC,CAAC,YAAamK,EAAelK,CAAM,CAAC,EACpC,CAAC,QAASkK,EAAejK,CAAE,CAAC,EAC5B,CAAC,YAAaiK,EAAehK,CAAM,CAAC,EACpC,CAAC,QAAS,UAAY,CAAE,OAAO6J,CAAW,CAAC,EAC3C,CAAC,QAAS,SAAUxD,EAAI,CACpB,OAAIpB,GAASoB,CAAE,IAAGwD,EAAYlE,GAAKU,EAAI/G,EAAa,GAC7C,IACX,CAAC,CACL,CAAC,EACA,MAAMuK,CAAS,EAET,IACX,CAEAL,EAAS,QAAUnK,GACnBmK,EAAS,QAAW9E,GAAU,CAACzE,EAAMG,EAASE,GAAOJ,CAAI,CAAC,EAC1DsJ,EAAS,IAAM9E,GAAU,CAACrE,CAAY,CAAC,EACvCmJ,EAAS,OAAS9E,GAAU,CAACnE,EAAOJ,EAAQD,EAAMM,GAASC,EAAQE,EAASD,EAAQE,EAAUE,EAAQ,CAAC,EACvG0I,EAAS,OAASA,EAAS,GAAK9E,GAAU,CAACzE,EAAMG,CAAO,CAAC,ECz8CtD,SAAS6J,IAAiC,CAE/C,IAAMC,EADS,IAAIC,EAAS,UAAU,SAAS,EACzB,UAAU,EAEhC,MAAO,CACL,GAAI,OAAO,WAAW,EACtB,KAAOD,EAAO,OAAO,MAAQ,UAC7B,GAAI,CACF,KAAOA,EAAO,GAAG,MAAQ,UACzB,QAASA,EAAO,GAAG,SAAW,EAChC,EACA,QAAS,CACP,KAAOA,EAAO,QAAQ,MAAQ,UAG9B,QAAUA,EAAO,QAAQ,SACvB,EACJ,EACA,OAAQ,CACN,KAAMA,EAAO,OAAO,MAAQ,GAC5B,QAASA,EAAO,OAAO,SAAW,EACpC,EACA,SAAU,UAAU,SACpB,OAAQ,CACN,MAAO,OAAO,OAAO,MACrB,OAAQ,OAAO,OAAO,OACtB,YAAa,OAAO,gBACtB,CACF,CACF,CChCO,IAAME,GAAW,SCExB,IAAMC,GAAkB,GAAGC,EAAQ,kBAsCnC,eAAsBC,IAAkC,CACtD,GAAI,OAAO,OAAW,IAAa,MAAO,GAE1C,IAAMC,EAAS,aAAa,QAAQH,EAAe,EACnD,GAAIG,EAAQ,OAAOA,EAEnB,IAAMC,EAAS,SAAS,cAAc,QAAQ,EAClCA,EAAO,WAAW,IAAI,GAC7B,SAASH,GAAU,GAAI,EAAE,EAC9B,IAAMI,EAAaD,EAAO,UAAU,EAEhCE,EAAU,GACd,GAAI,CACF,IAAMC,EAAKH,EAAO,WAAW,OAAO,EACpC,GAAIG,EAAI,CACN,IAAMC,EAAYD,EAAG,aAAa,2BAA2B,EAC7D,GAAIC,EAAW,CACb,IAAMC,EAASF,EAAG,aAAaC,EAAU,qBAAqB,EACxDE,GAAWH,EAAG,aAAaC,EAAU,uBAAuB,EAClEF,EAAU,GAAGG,CAAM,IAAIC,EAAQ,EACjC,CACF,CACF,MAAQ,CAER,CAEA,IAAIC,EAAc,GAClB,GAAI,CACFA,EAAc,MAAM,KAAK,UAAU,SAAW,CAAC,CAAC,EAC7C,IAAIC,GAAKA,EAAE,IAAI,EACf,KAAK,GAAG,CACb,MAAQ,CAER,CAEA,IAAMC,EAAiB,IAAI,KAAK,EAAE,kBAAkB,EAAE,SAAS,EACzDC,EAAS,KAAK,eAAe,EAAE,gBAAgB,EAAE,OAEjDC,EAAa,CACjB,UAAU,UACV,UAAU,SACV,UAAU,SACV,UAAU,qBAAqB,SAAS,GAAK,GAE3C,UACA,cAAc,SAAS,GAAK,GAC9B,OAAO,MAAM,SAAS,EACtB,OAAO,OAAO,SAAS,EACvB,OAAO,WAAW,SAAS,EAC3B,KAAK,eAAe,EAAE,gBAAgB,EAAE,SACxCF,EACAC,EACAT,EACA,OAAO,kBAAkB,SAAS,GAAK,GACtC,UACE,YAAY,eAAiB,GAChCM,EACAL,EACA,OAAQ,OACL,uBAA2B,IAC1B,SACA,WACN,EAGMU,EADU,IAAI,YAAY,EACL,OAAOD,EAAW,KAAK,GAAG,CAAC,EAChDE,EAAa,MAAM,OAAO,OAAO,OAAO,UAAWD,CAAU,EAE7DE,EADY,MAAM,KAAK,IAAI,WAAWD,CAAU,CAAC,EAEpD,IAAIE,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EACxC,KAAK,EAAE,EAEV,oBAAa,QAAQnB,GAAiBkB,CAAW,EAC1CA,CACT,CClHA,IAAME,GAAc,WAEPC,GAAc,IAAM,CAC/B,IAAMC,EAAW,aAAa,QAAQF,EAAW,EACjD,OAAKE,EACE,KAAK,MAAMA,CAAQ,EADJ,IAExB,ECOO,IAAMC,GAAY,MAAO,CAC9B,UAAAC,EACA,OAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,CACF,IAIM,CACJ,IAAMC,EAAaC,GAAc,EAC3BC,EAAc,MAAMC,GAAe,EACnCC,EAAWC,GAAY,EACvBC,EAAiB,CACrB,UAAWT,GAAa,GACxB,UAAW,KAAK,IAAI,EACpB,YAAaK,EACb,WAAY,UAAU,UACtB,KAAM,CACJ,IAAK,OAAO,SAAS,KACrB,MAAO,SAAS,MAChB,SAAU,SAAS,SACnB,KAAM,OAAO,SAAS,SACtB,SAAU,OAAO,SAAS,QAC5B,EACA,KAAM,CACJ,GAAGP,EACH,UAAWS,CACb,EACA,OAAQJ,EACR,KAAM,CACJ,QAAAF,EACA,gBAAiB,SACjB,YAAa,aACb,WAAYC,GAAa,EAC3B,EACA,cAAe,IAAM,CACnB,IAAMQ,EAAS,OAAO,SAAS,OAC/B,MAAI,CAACA,GAAUA,EAAO,QAAU,EACvB,CAAC,EAGUA,EAAO,UAAU,CAAC,EACnB,MAAM,GAAG,EAAE,OAC5B,CAACC,EAAKC,IAAS,CACb,GAAI,CAACA,EAAM,OAAOD,EAClB,GAAM,CAACE,EAAKC,EAAQ,EAAE,EAAIF,EAAK,MAAM,GAAG,EACxC,OAAIC,IACDF,EAA+B,mBAAmBE,CAAG,CAAC,EACrD,mBAAmBC,CAAK,GAErBH,CACT,EACA,CAAC,CACH,CACF,GAAG,CACL,EAEMI,EAAc,GAAGhB,EAAO,WAAW,2BAErCA,EAAO,OACT,QAAQ,IAAI,iBAAkBU,CAAO,EAGvC,GAAI,CAEF,GAAI,UAAU,YAGI,UAAU,WACxBM,EACA,KAAK,UAAUN,CAAO,CACxB,EAGE,MAAO,CACL,QAAS,GACT,SAAU,UAAU,KAAK,IAAI,CAAC,GAC9B,UAAW,KAAK,IAAI,CACtB,EAKJ,IAAMO,EAAW,MAAM,MAAMD,EAAa,CACxC,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAUN,CAAO,EAC5B,UAAW,EACb,CAAC,EAED,GAAI,CAACO,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,EAInE,MAAO,CACL,QAAS,GACT,UAHa,MAAMA,EAAS,KAAK,GAGhB,UAAY,SAAS,KAAK,IAAI,CAAC,GAChD,UAAW,KAAK,IAAI,CACtB,CACF,OAASC,EAAO,CACd,OAAIlB,EAAO,OACT,QAAQ,MAAM,uBAAwBkB,CAAK,EAGtC,CACL,QAAS,GACT,SAAU,SAAS,KAAK,IAAI,CAAC,GAC7B,UAAW,KAAK,IAAI,CACtB,CACF,CACF,EClHO,IAAMC,GAAN,KAAsB,CAU3B,YAAY,CACV,OAAAC,EACA,UAAAC,EACA,QAAAC,EACA,UAAAC,CACF,EAA0B,CAV1B,KAAQ,cAAyB,GACjC,KAAQ,QAAmB,GAC3B,KAAQ,yBAA2C,CAAC,EACpD,KAAQ,gBAAkC,CAAC,EAQzC,KAAK,OAASH,EACd,KAAK,UAAYC,EACjB,KAAK,QAAUC,EACf,KAAK,UAAYC,EAEjB,KAAK,WAAW,CAClB,CAKQ,YAAmB,CACrB,OAAO,OAAW,KAAe,OAAO,SAAa,MAKzD,KAAK,sBAAsB,EAG3B,KAAK,qBAAqB,EAEtB,KAAK,OAAO,OACd,QAAQ,IAAI,wCAAwC,EAExD,CAKQ,uBAA8B,CACtB,SAAS,iBAAiB,MAAM,EAExC,QAAQC,GAAQ,CAEpB,IAAMC,EAAe,IAAM,CACzB,KAAK,cAAgB,GACjB,KAAK,OAAO,OACd,QAAQ,IAAI,0DAAoD,CAEpE,EAGMC,EAAgB,IAAM,CAC1B,KAAK,cAAgB,EACvB,EAGMC,EAASH,EAAK,iBAAiB,yBAAyB,EAC9DG,EAAO,QAAQC,GAAS,CACtBA,EAAM,iBAAiB,QAASH,EAAc,CAAE,QAAS,EAAK,CAAC,EAC/DG,EAAM,iBAAiB,SAAUF,EAAe,CAAE,QAAS,EAAK,CAAC,EACjEE,EAAM,iBAAiB,QAASF,EAAe,CAAE,QAAS,EAAK,CAAC,CAClE,CAAC,EAGD,KAAK,yBAAyB,KAAK,IAAM,CACvCC,EAAO,QAAQC,GAAS,CACtBA,EAAM,oBAAoB,QAASH,CAAY,EAC/CG,EAAM,oBAAoB,SAAUF,CAAa,EACjDE,EAAM,oBAAoB,QAASF,CAAa,CAClD,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAKQ,sBAA6B,CAEnC,IAAMG,EAAsB,IAAM,CAChC,KAAK,kBAAkB,CACzB,EAGMC,EAA0B,IAAM,CAChC,SAAS,kBAAoB,UAC/B,KAAK,kBAAkB,CAE3B,EAGMC,EAAkB,IAAM,CAC5B,KAAK,kBAAkB,CACzB,EAEA,OAAO,iBAAiB,eAAgBF,CAAmB,EAC3D,SAAS,iBAAiB,mBAAoBC,CAAuB,EACrE,OAAO,iBAAiB,WAAYC,CAAe,EAGnD,KAAK,gBAAgB,KAAK,IAAM,CAC9B,OAAO,oBAAoB,eAAgBF,CAAmB,EAC9D,SAAS,oBAAoB,mBAAoBC,CAAuB,EACxE,OAAO,oBAAoB,WAAYC,CAAe,CACxD,CAAC,CACH,CAKQ,mBAA0B,CAOhC,GALI,KAAK,SAKL,CAAC,KAAK,cACR,OAIF,IAAMC,EAAYC,GAAY,EAG9B,GAAID,EAAU,SAAW,EACvB,OAIF,KAAK,QAAU,GAGf,IAAME,EAAqC,CACzC,WAAY,mBACZ,MAAOF,EAAU,IAAIR,IAAS,CAC5B,QAASA,EAAK,OACd,WAAYA,EAAK,UACjB,OAAQA,EAAK,SACb,YAAa,OAAO,KAAKA,EAAK,QAAQ,EAAE,MAC1C,EAAE,EACF,YAAaQ,EAAU,OACvB,UAAW,KAAK,IAAI,CACtB,EAGA,KAAK,qBAAqBE,CAAS,CACrC,CAKQ,qBAAqBA,EAA0C,CAErEC,GAAU,CACR,UAAAD,EACA,OAAQ,KAAK,OACb,UAAW,KAAK,UAChB,QAAS,KAAK,QACd,UAAW,KAAK,SAClB,CAAC,EAAE,MAAME,GAAS,CACZ,KAAK,OAAO,OACd,QAAQ,MAAM,2CAA4CA,CAAK,CAEnE,CAAC,CACH,CAKO,SAAgB,CACrB,KAAK,yBAAyB,QAAQC,GAAWA,EAAQ,CAAC,EAC1D,KAAK,gBAAgB,QAAQA,GAAWA,EAAQ,CAAC,EACjD,KAAK,yBAA2B,CAAC,EACjC,KAAK,gBAAkB,CAAC,EAEpB,KAAK,OAAO,OACd,QAAQ,IAAI,wCAAqC,CAErD,CACF,ECjMA,IAAMC,GAAN,KAAqB,CAOnB,YAAYC,EAA8B,CAL1C,KAAQ,QAAkB,QAMxB,GAAI,CAACA,EAAO,YACV,MAAM,IAAI,MAAM,iCAA2B,EAG7C,KAAK,OAAS,CACZ,MAAO,GACP,QAAS,KAAK,QACd,GAAGA,CACL,EAGA,KAAK,eAAiB,IAAIC,EAAW,OAAW,KAAK,OAAO,KAAK,EACjE,KAAK,UAAY,KAAK,eAAe,aAAa,EAGlD,KAAK,WAAW,CAClB,CAEA,MAAc,YAA4B,CAExC,GAAI,OAAO,OAAW,KAAe,OAAO,SAAa,IACvD,GAAI,CAEF,IAAMC,EAAY,KAAK,aAAa,EAEpC,KAAK,gBAAkB,IAAIC,GAAgB,CACzC,OAAQ,KAAK,OACb,UAAW,KAAK,UAChB,QAAS,KAAK,QACd,UAAAD,CACF,CAAC,EAEG,KAAK,OAAO,OACd,QAAQ,IACN,oEACF,CAEJ,OAASE,EAAO,CACV,KAAK,OAAO,OACd,QAAQ,MACN,4DACAA,CACF,CAEJ,CAEJ,CAKQ,cAAmC,CACzC,GAAI,OAAO,SAAa,IACtB,OAIF,IAAMC,EAAU,SAAS,qBAAqB,QAAQ,EACtD,QAASC,EAAI,EAAGA,EAAID,EAAQ,OAAQC,IAAK,CACvC,IAAMC,EAASF,EAAQC,CAAC,EACxB,GAAIC,EAAO,KAAOA,EAAO,IAAI,SAAS,QAAQ,EAC5C,OAAOA,EAAO,GAElB,CAGA,IAAMC,EAAgB,SAAS,cAC/B,GAAIA,GAAe,IACjB,OAAOA,EAAc,GAIzB,CAKO,aAAaC,EAAgD,CAClE,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,GAAGA,CAAU,CAC/C,CAKO,WAAkC,CACvC,MAAO,CAAE,GAAG,KAAK,MAAO,CAC1B,CAKO,YAAqB,CAC1B,OAAO,KAAK,OACd,CAKO,cAAuB,CAE5B,YAAK,UAAY,KAAK,eAAe,aAAa,EAC3C,KAAK,SACd,CAKO,gBAAiB,CACtB,OAAO,KAAK,eAAe,eAAe,CAC5C,CAKO,iBAA2B,CAChC,OAAO,KAAK,eAAe,SAAS,CACtC,CAKO,uBAA8B,CACnC,KAAK,eAAe,mBAAmB,CACzC,CAKO,cAAqB,CAC1B,KAAK,eAAe,aAAa,EACjC,KAAK,UAAY,KAAK,eAAe,aAAa,CACpD,CAKO,cAAqB,CAC1B,KAAK,eAAe,aAAa,EAEjC,KAAK,eAAiB,IAAIR,EAAW,OAAW,KAAK,OAAO,KAAK,EACjE,KAAK,UAAY,KAAK,eAAe,aAAa,CACpD,CAKO,mBAA4B,CACjC,OAAO,KAAK,eAAe,kBAAkB,CAC/C,CAKO,wBAA+B,CAChC,KAAK,kBACP,KAAK,gBAAgB,QAAQ,EAC7B,KAAK,gBAAkB,OAE3B,CACF,EAGOS,GAAQX,GCjLR,IAAMY,GACXC,IAEqC,CACnC,YAAaA,EAAU,aAAa,mBAAmB,GAAK,OAC5D,OAAQA,EAAU,aAAa,cAAc,GAAK,OAClD,MAAOA,EAAU,aAAa,YAAY,IAAM,OAChD,QAASA,EAAU,aAAa,cAAc,EAC1C,OAAOA,EAAU,aAAa,cAAc,CAAC,EAC7C,GACN,GXPF,IAAOC,GAAQC,GAETC,GAAsC,CAC1C,YAAa,8CACb,MAAO,GACP,QAAS,IACT,QAAS,OACX,EAGA,eAAsBC,IAEpB,CACA,GAAI,SAAO,OAAW,KAAe,OAAO,SAAa,KAEzD,GAAI,CACF,IAAMC,EAAY,SAAS,cAC3B,GAAIA,EAAW,CACb,IAAMC,EAASC,GAAyBF,CAAS,EACjD,OAAO,IAAIH,GAAe,CACxB,YAAaI,EAAO,aAAeH,GAAc,YACjD,MAAOG,EAAO,OAASH,GAAc,MACrC,QAASG,EAAO,SAAWH,GAAc,QACzC,QAASG,EAAO,SAAWH,GAAc,QACzC,OAAQG,EAAO,QAAUH,GAAc,MACzC,CAAC,CACH,CACF,OAASK,EAAK,CACZ,QAAQ,KAAK,gDAAiDA,CAAG,CACnE,CACF,CAGI,OAAO,OAAW,MAGlB,OACA,eAAiBN,IAIlB,SAAY,CACX,IAAMO,EAAY,MAAML,GAAsB,EAC1CK,IACD,OAAyD,eACxDA,EAEN,GAAG","names":["index_exports","__export","autoInitFromScriptTag","index_default","GetSession","sessionId","debug","providedSessionId","now","stored","cookieSessionId","finalSessionId","isFirstVisit","newSession","timestamp","random","random2","session","error","parsed","name","value","expirationDate","expires","nameEQ","ca","i","c","events","updateActivity","lastUpdate","throttledUpdate","event","newSessionId","getFormData","forms","results","form","index","formData","formId","field","name","value","radioGroup","checked","r","select","option","LIBVERSION","UA_MAX_LENGTH","USER_AGENT","EMPTY","UNKNOWN","TYPEOF","BROWSER","CPU","DEVICE","ENGINE","OS","RESULT","NAME","TYPE","VENDOR","VERSION","ARCHITECTURE","MAJOR","MODEL","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","XR","EMBEDDED","INAPP","BRANDS","FORMFACTORS","FULLVERLIST","PLATFORM","PLATFORMVER","BITNESS","CH","CH_FULL_VER_LIST","CH_ARCH","CH_BITNESS","CH_FORM_FACTORS","CH_MOBILE","CH_MODEL","CH_PLATFORM","CH_PLATFORM_VER","CH_ALL_VALUES","AMAZON","APPLE","ASUS","BLACKBERRY","GOOGLE","HUAWEI","LENOVO","HONOR","LG","MICROSOFT","MOTOROLA","NVIDIA","ONEPLUS","OPPO","SAMSUNG","SHARP","SONY","XIAOMI","ZEBRA","CHROME","CHROMIUM","CHROMECAST","EDGE","FIREFOX","OPERA","FACEBOOK","SOGOU","PREFIX_MOBILE","SUFFIX_BROWSER","WINDOWS","isWindow","NAVIGATOR","NAVIGATOR_UADATA","extend","defaultRgx","extensions","mergedRgx","extraRgx","isExtensions","i","j","k","enumerize","arr","enums","has","str1","str2","lowerize","isString","obj","deep","prop","val","itemListToArray","header","tokens","strip","token","trim","str","majorize","version","setProps","propName","pattern","stripQuotes","len","rgxMapper","ua","arrays","p","q","matches","match","regex","props","strMapper","map","windowsVersionMap","formFactorsMap","browserHintsMap","defaultRegexes","defaultProps","createIData","item","itemType","init_props","is_ignoreProps","is_ignoreRgx","toString_props","IData","res","UACHData","strToCheck","is","cb","that","IDataResolve","resolveData","uach","isHttpUACH","UAItem","rgxMap","uaCH","ch","data","detect","realVersion","brands","prevName","brandName","brandVersion","archName","reParse","ff","idx","osName","osVersion","parse","UAParser","headers","kv","v","normalized","userAgent","httpUACH","regexMap","createItemFunc","getDeviceInfo","result","UAParser","APP_NAME","FINGERPRINT_KEY","APP_NAME","getFingerprint","cached","canvas","canvasData","gpuInfo","gl","debugInfo","vendor","renderer","pluginNames","p","timezoneOffset","locale","components","dataBuffer","hashBuffer","fingerprint","b","STORAGE_KEY","getCartData","cartData","sendEvent","eventData","config","sessionId","version","scriptUrl","deviceInfo","getDeviceInfo","fingerprint","getFingerprint","cartData","getCartData","payload","search","acc","curr","key","value","endPointUrl","response","error","FormAbandonment","config","sessionId","version","scriptUrl","form","focusHandler","changeHandler","fields","field","beforeUnloadHandler","visibilityChangeHandler","pageHideHandler","formsData","getFormData","eventData","sendEvent","error","cleanup","Initialization","config","GetSession","scriptUrl","FormAbandonment","error","scripts","i","script","currentScript","newConfig","init_default","parseConfigFromScriptTag","scriptTag","index_default","init_default","defaultConfig","autoInitFromScriptTag","scriptTag","config","parseConfigFromScriptTag","err","autoPixel"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/getSession.ts","../src/utils/getFormData.ts","../node_modules/.pnpm/ua-parser-js@2.0.6/node_modules/ua-parser-js/src/main/ua-parser.mjs","../src/utils/getDeviceInfo.ts","../src/config.ts","../src/utils/getFingerprint.ts","../src/utils/getCartData.ts","../src/utils/sendEvent.tsx","../src/utils/formAbandonment.ts","../src/init.ts","../src/utils/parseConfigFromScriptTag.ts"],"sourcesContent":["// Exportação para uso em módulos\nimport UpselyRecovery from './init';\nimport { UpselyRecoveryConfig } from './types';\nimport { parseConfigFromScriptTag } from './utils/parseConfigFromScriptTag';\n\nexport default UpselyRecovery;\n\nconst defaultConfig: UpselyRecoveryConfig = {\n apiEndpoint: 'https://api-upsely-webhook-dev.up.railway.app',\n debug: true,\n timeout: 5000,\n version: '1.0.0',\n};\n\n// Função para auto-inicialização via script tag\nexport async function autoInitFromScriptTag(): Promise<\n UpselyRecovery | undefined\n> {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n try {\n const scriptTag = document.currentScript as HTMLScriptElement | null;\n if (scriptTag) {\n const config = parseConfigFromScriptTag(scriptTag);\n return new UpselyRecovery({\n apiEndpoint: config.apiEndpoint || defaultConfig.apiEndpoint,\n debug: config.debug || defaultConfig.debug,\n timeout: config.timeout || defaultConfig.timeout,\n version: config.version || defaultConfig.version,\n apiKey: config.apiKey || defaultConfig.apiKey,\n });\n }\n } catch (err) {\n console.warn('[GomarkePixel] Erro no autoInitFromScriptTag:', err);\n }\n}\n\n// Para uso global (IIFE) - versão corrigida\nif (typeof window !== 'undefined') {\n // Expor a classe GomarkePixel\n (\n window as unknown as { UpselyRecovery: typeof UpselyRecovery }\n ).UpselyRecovery = UpselyRecovery;\n\n // Auto-inicialização se configurado via script tag\n // Usando IIFE assíncrona para evitar top-level await\n (async () => {\n const autoPixel = await autoInitFromScriptTag();\n if (autoPixel) {\n (window as unknown as { upselyRecovery: UpselyRecovery }).upselyRecovery =\n autoPixel;\n }\n })();\n}\n","export interface ISessionData {\n sessionId: string;\n lastActivity: number;\n createdAt: number;\n visitCount: number;\n firstVisit: number;\n}\n\n/**\n * Gerenciador de sessão persistente com suporte a cookies e localStorage\n */\nexport class GetSession {\n private sessionData: ISessionData;\n private storageKey: string = 'upsely_session';\n private cookieKey: string = 'upsely_session_id';\n private sessionTimeout: number = 30 * 60 * 1000; // 30 minutos\n private cookieExpirationDays: number = 365; // 1 ano para cookies\n private debug: boolean = false;\n\n constructor(sessionId?: string, debug: boolean = false) {\n this.debug = debug;\n this.sessionData = this.initializeSession(sessionId);\n this.startActivityTracking();\n }\n\n /**\n * Inicializa ou recupera dados da sessão\n */\n private initializeSession(providedSessionId?: string): ISessionData {\n const now = Date.now();\n\n // Tenta recuperar sessão do localStorage\n const stored = this.getStoredSession();\n\n // Tenta recuperar sessionId do cookie\n const cookieSessionId = this.getCookie(this.cookieKey);\n\n if (stored && this.isSessionValid(stored)) {\n // Sessão existente válida - atualiza última atividade\n stored.lastActivity = now;\n this.saveSession(stored);\n\n // Garante que o cookie também está atualizado\n if (cookieSessionId !== stored.sessionId) {\n this.setCookie(this.cookieKey, stored.sessionId);\n }\n\n return stored;\n }\n\n // Determina o sessionId a usar\n let finalSessionId: string;\n\n if (providedSessionId) {\n finalSessionId = providedSessionId;\n } else if (cookieSessionId) {\n finalSessionId = cookieSessionId;\n } else {\n finalSessionId = this.generateSessionId();\n }\n\n // Nova sessão ou sessão expirada\n const isFirstVisit = !stored && !cookieSessionId;\n const newSession: ISessionData = {\n sessionId: finalSessionId,\n lastActivity: now,\n createdAt: stored?.createdAt || now,\n visitCount: stored ? stored.visitCount + 1 : 1,\n firstVisit: stored?.firstVisit || now,\n };\n\n this.saveSession(newSession);\n this.setCookie(this.cookieKey, finalSessionId);\n\n if (this.debug) {\n console.log('[GetSession] Nova sessão criada:', {\n sessionId: finalSessionId,\n isFirstVisit,\n visitCount: newSession.visitCount,\n });\n }\n\n return newSession;\n }\n\n /**\n * Gera um novo sessionId único\n */\n private generateSessionId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n const random2 = Math.random().toString(36).substring(2, 15);\n return `session_${timestamp}_${random}${random2}`;\n }\n\n /**\n * Verifica se a sessão ainda é válida\n */\n private isSessionValid(session: ISessionData): boolean {\n const now = Date.now();\n return now - session.lastActivity < this.sessionTimeout;\n }\n\n /**\n * Salva dados da sessão no localStorage\n */\n private saveSession(session: ISessionData): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(this.storageKey, JSON.stringify(session));\n }\n } catch (error) {\n if (this.debug) {\n console.warn(\n '[GetSession] Erro ao salvar sessão no localStorage:',\n error\n );\n }\n }\n }\n\n /**\n * Recupera dados da sessão do localStorage\n */\n private getStoredSession(): ISessionData | null {\n try {\n if (typeof localStorage === 'undefined') {\n return null;\n }\n const stored = localStorage.getItem(this.storageKey);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as ISessionData;\n\n // Valida estrutura básica\n if (!parsed.sessionId || !parsed.lastActivity) {\n return null;\n }\n\n return parsed;\n } catch (error) {\n if (this.debug) {\n console.warn(\n '[GetSession] Erro ao recuperar sessão do localStorage:',\n error\n );\n }\n return null;\n }\n }\n\n /**\n * Define um cookie\n */\n private setCookie(name: string, value: string): void {\n try {\n if (typeof document === 'undefined') return;\n\n const expirationDate = new Date();\n expirationDate.setTime(\n expirationDate.getTime() +\n this.cookieExpirationDays * 24 * 60 * 60 * 1000\n );\n\n const expires = `expires=${expirationDate.toUTCString()}`;\n document.cookie = `${name}=${value};${expires};path=/;SameSite=Lax`;\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao definir cookie:', error);\n }\n }\n }\n\n /**\n * Obtém um cookie\n */\n private getCookie(name: string): string | null {\n try {\n if (typeof document === 'undefined') return null;\n\n const nameEQ = `${name}=`;\n const ca = document.cookie.split(';');\n\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n return c.substring(nameEQ.length, c.length);\n }\n }\n return null;\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao ler cookie:', error);\n }\n return null;\n }\n }\n\n /**\n * Remove um cookie\n */\n private removeCookie(name: string): void {\n try {\n if (typeof document === 'undefined') return;\n document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao remover cookie:', error);\n }\n }\n }\n\n /**\n * Inicia o rastreamento de atividade para renovar sessão automaticamente\n */\n private startActivityTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Atualiza atividade em eventos do usuário\n const events = [\n 'mousedown',\n 'mousemove',\n 'keypress',\n 'scroll',\n 'touchstart',\n 'click',\n ];\n const updateActivity = () => {\n this.updateLastActivity();\n };\n\n // Throttle para não atualizar muito frequentemente\n let lastUpdate = 0;\n const throttledUpdate = () => {\n const now = Date.now();\n if (now - lastUpdate > 60000) {\n // Atualiza no máximo a cada 1 minuto\n lastUpdate = now;\n updateActivity();\n }\n };\n\n events.forEach(event => {\n window.addEventListener(event, throttledUpdate, { passive: true });\n });\n\n // Atualiza ao focar na janela\n window.addEventListener('focus', updateActivity, { passive: true });\n }\n\n /**\n * Atualiza a última atividade da sessão\n */\n public updateLastActivity(): void {\n const now = Date.now();\n this.sessionData.lastActivity = now;\n this.saveSession(this.sessionData);\n }\n\n /**\n * Renova a sessão (cria nova se expirada)\n */\n public renewSession(): void {\n if (!this.isSessionValid(this.sessionData)) {\n const newSessionId = this.generateSessionId();\n this.sessionData = this.initializeSession(newSessionId);\n } else {\n this.updateLastActivity();\n }\n }\n\n /**\n * Obtém dados da sessão\n */\n public getSessionData(): ISessionData {\n // Atualiza última atividade antes de retornar\n this.updateLastActivity();\n return { ...this.sessionData };\n }\n\n /**\n * Obtém apenas o sessionId\n */\n public getSessionId(): string {\n return this.sessionData.sessionId;\n }\n\n /**\n * Verifica se a sessão está ativa\n */\n public isActive(): boolean {\n return this.isSessionValid(this.sessionData);\n }\n\n /**\n * Limpa dados da sessão\n */\n public clearSession(): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(this.storageKey);\n }\n this.removeCookie(this.cookieKey);\n\n if (this.debug) {\n console.log('[GetSession] Sessão limpa');\n }\n } catch (error) {\n if (this.debug) {\n console.warn('[GetSession] Erro ao limpar sessão:', error);\n }\n }\n }\n\n /**\n * Exporta dados da sessão\n */\n public exportSessionData(): string {\n return JSON.stringify(\n {\n session: this.sessionData,\n isActive: this.isActive(),\n timeUntilExpiration:\n this.sessionTimeout - (Date.now() - this.sessionData.lastActivity),\n },\n null,\n 2\n );\n }\n}\n","/**\n * Utilitário para capturar dados de todos os formulários na página\n */\n\nexport interface FormDataResult {\n formId: string;\n formData: Record<string, unknown>;\n formIndex: number;\n}\n\n/**\n * Captura dados de todos os formulários na página\n * @returns Array com dados de cada formulário encontrado\n */\nexport const getFormData = (): FormDataResult[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const forms = document.querySelectorAll('form');\n const results: FormDataResult[] = [];\n\n forms.forEach((form, index) => {\n const formData: Record<string, unknown> = {};\n const formId = form.id || form.name || `form_${index}`;\n\n // Captura todos os campos do formulário\n const inputs = form.querySelectorAll<HTMLInputElement>(\n 'input, textarea, select'\n );\n\n inputs.forEach(field => {\n const name = field.name || field.id;\n if (!name) return;\n\n let value: unknown;\n\n // Trata diferentes tipos de campos\n if (field.type === 'checkbox') {\n value = (field as HTMLInputElement).checked;\n } else if (field.type === 'radio') {\n // Para radio, pega o valor do radio selecionado no grupo\n const radioGroup = form.querySelectorAll<HTMLInputElement>(\n `input[type=\"radio\"][name=\"${name}\"]`\n );\n const checked = Array.from(radioGroup).find(r => r.checked);\n value = checked ? checked.value : null;\n } else if (field.tagName === 'SELECT') {\n const select = field as unknown as HTMLSelectElement;\n if (select.multiple) {\n // Para select múltiplo, retorna array de valores\n value = Array.from(select.selectedOptions).map(\n option => option.value\n );\n } else {\n value = select.value;\n }\n } else {\n value = (field as HTMLInputElement | HTMLTextAreaElement).value;\n }\n\n // Só adiciona se o campo tiver valor ou for checkbox/radio\n if (\n value !== null &&\n value !== undefined &&\n value !== '' &&\n (field.type === 'checkbox' || field.type === 'radio' || value !== '')\n ) {\n formData[name] = value;\n }\n });\n\n // Só adiciona o formulário se tiver dados\n if (Object.keys(formData).length > 0) {\n results.push({\n formId,\n formData,\n formIndex: index,\n });\n }\n });\n\n return results;\n};\n","// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.6\n Copyright © 2012-2025 Faisal Salman <f@faisalman.com>\n AGPLv3 License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.6',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n TYPEOF = {\n FUNCTION : 'function',\n OBJECT : 'object',\n STRING : 'string',\n UNDEFINED : 'undefined'\n },\n\n // properties\n BROWSER = 'browser',\n CPU = 'cpu',\n DEVICE = 'device',\n ENGINE = 'engine',\n OS = 'os',\n RESULT = 'result',\n\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH = 'sec-ch-ua',\n CH_FULL_VER_LIST= CH + '-full-version-list',\n CH_ARCH = CH + '-arch',\n CH_BITNESS = CH + '-' + BITNESS,\n CH_FORM_FACTORS = CH + '-form-factors',\n CH_MOBILE = CH + '-' + MOBILE,\n CH_MODEL = CH + '-' + MODEL,\n CH_PLATFORM = CH + '-' + PLATFORM,\n CH_PLATFORM_VER = CH_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== TYPEOF.UNDEFINED,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === TYPEOF.STRING;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n var propName = arr[i];\n if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n str = strip(/^\\s\\s*/, String(str));\n return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === TYPEOF.OBJECT && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == TYPEOF.FUNCTION) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(heytap|ovi|115|surf|qwant)browser\\/([\\d\\.]+)/i, // HeyTap/Ovi/115/Surf\n /(qwant)(?:ios|mobile)\\/([\\d\\.]+)/i, // Qwant\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq\n ], [NAME], [\n /ome\\/([\\w\\.]+) \\w* ?(iron) saf/i, // Iron\n /ome\\/([\\w\\.]+).+qihu (360)[es]e/i // 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(bing)(?:web|sapphire)\\/([\\w\\.]+)/i, // Bing\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n /(zalo(?:app)?)[\\/\\sa-z]*([\\w\\.-]+)/i // Zalo \n ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+(?= .+rv\\:.+gecko\\/\\d+)|[0-4][\\w\\.]+(?!.+compatible))/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i,\n /((ppc|powerpc)(64)?)( mac|;|\\))/i, // PowerPC\n /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n /mc680.0/i\n ], [[ARCHITECTURE, '68k']], [\n /winnt.+\\[axp/i\n ], [[ARCHITECTURE, 'alpha']]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)[\\/\\);]/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\b(?:ios|apple\\w+)\\/.+[\\(\\/](ipad)/i, // iPad\n /\\b(ipad)[\\d,]*[;\\] ].+(mac |i(pad)?)os/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei) ?([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][\\dc][adnt]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b(?:xiao)?((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\\d{0,2}\\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\\))/i, // Xiaomi Mi\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-k]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*?))( bui|\\)|;|\\/)/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /(?:blackberry|\\(bb10;) (\\w+)/i\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i,\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i, // OPPO\n /(hisense) ([ehv][\\w ]+)\\)/i, // Hisense\n /droid[^;]+; (philips)[_ ]([sv-x][\\d]{3,4}[xz]?)/i // Philips\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /(philips)[\\w ]+tv/i, // Philips\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i // Retroid Pocket\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield)( bui|\\))/i // Nvidia Portable\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) ([\\w ]+) os\\d/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid.+; ([\\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew|; hmsc).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\\/ ]([\\w\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, \"Chrome OS\"], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [TYPE, MODEL, VENDOR]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [BROWSER, [VERSION, MAJOR]],\n [ENGINE, [VERSION]],\n [OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [BROWSER, / ?browser$/i],\n [OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [BROWSER, [NAME, VERSION]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [VENDOR, MODEL]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != TYPEOF.UNDEFINED) break;\n } else if (strToCheck == TYPEOF.UNDEFINED && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || TYPEOF.UNDEFINED;\n };\n }\n\n if (!NAVIGATOR_UADATA) {\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n }\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH])],\n [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_MOBILE])],\n [MODEL, stripQuotes(uach[CH_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n\n this.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n this.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n this.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n this.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {\n this.set(NAME, 'Brave');\n }\n break;\n case DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(BROWSER, detect(BROWSER))\n .set(CPU, detect(CPU))\n .set(DEVICE, detect(DEVICE))\n .set(ENGINE, detect(ENGINE))\n .set(OS, detect(OS));\n }\n }\n return this;\n };\n\n this.parseUA = function () {\n if (this.itemType != RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n switch (this.itemType) {\n case BROWSER:\n this.set(MAJOR, majorize(this.get(VERSION)));\n break;\n case OS:\n if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {\n // Based on the assumption that iOS version is tightly coupled with Safari version\n var realVersion = /\\) Version\\/([\\d\\.]+)/.exec(this.ua); // Get Safari version\n if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {\n this.set(VERSION, realVersion[1]); // Set as iOS version\n }\n }\n break;\n }\n return this;\n };\n\n this.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n \n switch (this.itemType) {\n case BROWSER:\n case ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i=0; i<brands.length; i++) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(BROWSER, parse(BROWSER))\n .set(CPU, parse(CPU))\n .set(DEVICE, parse(DEVICE))\n .set(ENGINE, parse(ENGINE))\n .set(OS, parse(OS));\n }\n return this;\n };\n\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n\n return this;\n }\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === TYPEOF.OBJECT) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === TYPEOF.OBJECT) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n if (headers) {\n if (typeof headers.append === TYPEOF.FUNCTION) {\n // Convert Headers object into a plain object\n var kv = {};\n headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });\n headers = kv;\n } else {\n // Normalize headers field name into lowercase\n var normalized = {};\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n normalized[String(header).toLowerCase()] = headers[header];\n }\n }\n headers = normalized;\n }\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(BROWSER, this.getBrowser())\n .set(CPU, this.getCPU())\n .set(DEVICE, this.getDevice())\n .set(ENGINE, this.getEngine())\n .set(OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(BROWSER)],\n ['getCPU', createItemFunc(CPU)],\n ['getDevice', createItemFunc(DEVICE)],\n ['getEngine', createItemFunc(ENGINE)],\n ['getOS', createItemFunc(OS)],\n ['getResult', createItemFunc(RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};","import { Event } from '@/types';\nimport { UAParser } from 'ua-parser-js';\n\nexport function getDeviceInfo(): Event['device'] {\n const parser = new UAParser(navigator.userAgent);\n const result = parser.getResult();\n\n return {\n id: crypto.randomUUID(),\n type: (result.device.type || 'desktop') as Event['device']['type'], // 'mobile' | 'tablet' | 'desktop' | 'smarttv' | 'wearable' | 'embedded'\n os: {\n name: (result.os.name || 'Unknown') as Event['device']['os']['name'],\n version: result.os.version || '',\n },\n browser: {\n name: (result.browser.name || 'Unknown') as\n | Event['device']['browser']['name']\n | 'Other',\n version: (result.browser.version ||\n '') as Event['device']['browser']['version'],\n },\n engine: {\n name: result.engine.name || '',\n version: result.engine.version || '',\n },\n language: navigator.language,\n screen: {\n width: window.screen.width,\n height: window.screen.height,\n pixel_ratio: window.devicePixelRatio,\n },\n };\n}\n","export const APP_NAME = 'UPSELY';\nexport const VERSION = '0.0.1';\nexport const API_ENDPOINT = 'https://api.upsely.com';\n","import { APP_NAME } from '@/config';\n\nconst FINGERPRINT_KEY = `${APP_NAME}_FINGERPRINT_V1`;\n// const FINGERPRINT_TTL_DAYS = 365;\n\nexport type DeviceInfo = {\n userAgent: string;\n language: {\n primary: string;\n all: string[];\n };\n addBlock: boolean;\n incognito: boolean;\n platform: string;\n hardwareConcurrency: number | null;\n deviceMemory: number | null;\n screen: {\n width: number;\n height: number;\n pixelRatio: number;\n colorDepth: number;\n };\n timezone: string;\n timezoneOffset: number;\n locale: string;\n connection: {\n type: string;\n effectiveType: string;\n downlink: number;\n rtt: number;\n };\n plugins: string[];\n gpu: string;\n webgl2Support: boolean;\n fingerprint: string;\n};\n\n/**\n * Gera ou recupera o Fingerprint do device\n */\nexport async function getFingerprint(): Promise<string> {\n if (typeof window === 'undefined') return '';\n\n const cached = localStorage.getItem(FINGERPRINT_KEY);\n if (cached) return cached as string;\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n ctx?.fillText(APP_NAME, 10, 50);\n const canvasData = canvas.toDataURL();\n\n let gpuInfo = '';\n try {\n const gl = canvas.getContext('webgl') as WebGLRenderingContext | null;\n if (gl) {\n const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n if (debugInfo) {\n const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n gpuInfo = `${vendor} ${renderer}`;\n }\n }\n } catch {\n // eslint-disable-next-line no-empty\n }\n\n let pluginNames = '';\n try {\n pluginNames = Array.from(navigator.plugins || [])\n .map(p => p.name)\n .join(',');\n } catch {\n // eslint-disable-next-line no-empty\n }\n\n const timezoneOffset = new Date().getTimezoneOffset().toString();\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n const components = [\n navigator.userAgent,\n navigator.language,\n navigator.platform,\n navigator.hardwareConcurrency?.toString() || '',\n (\n navigator as unknown as { deviceMemory?: number }\n ).deviceMemory?.toString() || '',\n screen.width.toString(),\n screen.height.toString(),\n screen.colorDepth.toString(),\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n timezoneOffset,\n locale,\n canvasData,\n window.devicePixelRatio?.toString() || '',\n (navigator as unknown as { connection?: { effectiveType: string } })\n .connection?.effectiveType || '',\n pluginNames,\n gpuInfo,\n typeof (window as unknown as { WebGL2RenderingContext?: unknown })\n .WebGL2RenderingContext !== 'undefined'\n ? 'webgl2'\n : 'no-webgl2',\n ];\n\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(components.join('|'));\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const fingerprint = hashArray\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n localStorage.setItem(FINGERPRINT_KEY, fingerprint);\n return fingerprint;\n}\n","const STORAGE_KEY = 'cartData';\n\nexport const getCartData = () => {\n const cartData = localStorage.getItem(STORAGE_KEY);\n if (!cartData) return null;\n return JSON.parse(cartData);\n};\n","import { Event, UpselyRecoveryConfig } from '@/types';\nimport { getDeviceInfo } from './getDeviceInfo';\nimport { getFingerprint } from './getFingerprint';\nimport { getCartData } from './getCartData';\n\nexport interface SendEventParams {\n eventData: Event['data'];\n config: UpselyRecoveryConfig;\n sessionId: string;\n version: string;\n scriptUrl?: string;\n}\n\nexport const sendEvent = async ({\n eventData,\n config,\n sessionId,\n version,\n scriptUrl,\n}: SendEventParams): Promise<{\n success: boolean;\n timestamp: number;\n event_id: string;\n}> => {\n const deviceInfo = getDeviceInfo();\n const fingerprint = await getFingerprint();\n const cartData = getCartData();\n const payload: Event = {\n sessionId: sessionId ?? '',\n timestamp: Date.now(),\n fingerprint: fingerprint,\n user_agent: navigator.userAgent,\n page: {\n url: window.location.href,\n title: document.title,\n referrer: document.referrer,\n path: window.location.pathname,\n hostname: window.location.hostname,\n },\n data: {\n ...eventData,\n cart_data: cartData,\n },\n device: deviceInfo,\n meta: {\n version,\n recovery_source: 'upsely',\n environment: 'production',\n script_url: scriptUrl ?? '',\n },\n query_params: (() => {\n const search = window.location.search;\n if (!search || search.length <= 1) {\n return {};\n }\n\n const queryString = search.substring(1); // Remove o '?'\n return queryString.split('&').reduce(\n (acc, curr) => {\n if (!curr) return acc;\n const [key, value = ''] = curr.split('=');\n if (key) {\n (acc as Record<string, string>)[decodeURIComponent(key)] =\n decodeURIComponent(value);\n }\n return acc;\n },\n {} as Record<string, string>\n );\n })(),\n };\n\n const endPointUrl = `${config.apiEndpoint}/webhooks/abandoned-cart`;\n\n if (config.debug) {\n console.log('Sending event:', payload);\n }\n\n try {\n // Tentar sendBeacon primeiro (melhor para tracking)\n if (navigator.sendBeacon) {\n // const blob = new Blob([JSON.stringify(payload)]);\n\n const success = navigator.sendBeacon(\n endPointUrl,\n JSON.stringify(payload)\n );\n\n if (success) {\n return {\n success: true,\n event_id: `beacon_${Date.now()}`,\n timestamp: Date.now(),\n };\n }\n }\n\n // Fallback para fetch\n const response = await fetch(endPointUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const result = await response.json();\n return {\n success: true,\n event_id: result.event_id || `fetch_${Date.now()}`,\n timestamp: Date.now(),\n };\n } catch (error) {\n if (config.debug) {\n console.error('Error sending event:', error);\n }\n\n return {\n success: false,\n event_id: `error_${Date.now()}`,\n timestamp: Date.now(),\n };\n }\n};\n","import { UpselyRecoveryConfig } from '@/types';\nimport { getFormData } from './getFormData';\nimport { sendEvent } from './sendEvent';\n\nexport interface FormAbandonmentConfig {\n config: UpselyRecoveryConfig;\n sessionId: string;\n version: string;\n scriptUrl?: string;\n}\n\n/**\n * Sistema de detecção e envio de dados de abandono de formulário\n */\nexport class FormAbandonment {\n private config: UpselyRecoveryConfig;\n private sessionId: string;\n private version: string;\n private scriptUrl?: string;\n private hasInteracted: boolean = false;\n private hasSent: boolean = false;\n private formInteractionListeners: (() => void)[] = [];\n private unloadListeners: (() => void)[] = [];\n\n constructor({\n config,\n sessionId,\n version,\n scriptUrl,\n }: FormAbandonmentConfig) {\n this.config = config;\n this.sessionId = sessionId;\n this.version = version;\n this.scriptUrl = scriptUrl;\n\n this.initialize();\n }\n\n /**\n * Inicializa o sistema de abandono\n */\n private initialize(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n // Rastreia interações com formulários\n this.trackFormInteractions();\n\n // Configura listeners para eventos de saída\n this.setupUnloadListeners();\n\n if (this.config.debug) {\n console.log('[FormAbandonment] Sistema inicializado');\n }\n }\n\n /**\n * Rastreia interações do usuário com formulários\n */\n private trackFormInteractions(): void {\n const forms = document.querySelectorAll('form');\n\n forms.forEach(form => {\n // Listener para quando o usuário foca em qualquer campo\n const focusHandler = () => {\n this.hasInteracted = true;\n if (this.config.debug) {\n console.log('[FormAbandonment] Usuário interagiu com formulário');\n }\n };\n\n // Listener para mudanças nos campos\n const changeHandler = () => {\n this.hasInteracted = true;\n };\n\n // Adiciona listeners em todos os campos do formulário\n const fields = form.querySelectorAll('input, textarea, select');\n fields.forEach(field => {\n field.addEventListener('focus', focusHandler, { passive: true });\n field.addEventListener('change', changeHandler, { passive: true });\n field.addEventListener('input', changeHandler, { passive: true });\n });\n\n // Armazena handlers para limpeza posterior\n this.formInteractionListeners.push(() => {\n fields.forEach(field => {\n field.removeEventListener('focus', focusHandler);\n field.removeEventListener('change', changeHandler);\n field.removeEventListener('input', changeHandler);\n });\n });\n });\n }\n\n /**\n * Configura listeners para eventos de saída da página\n */\n private setupUnloadListeners(): void {\n // beforeunload - dispara quando o usuário tenta fechar a página\n const beforeUnloadHandler = () => {\n this.handleAbandonment();\n };\n\n // visibilitychange - dispara quando a aba fica oculta\n const visibilityChangeHandler = () => {\n if (document.visibilityState === 'hidden') {\n this.handleAbandonment();\n }\n };\n\n // pagehide - dispara quando a página está sendo descarregada\n const pageHideHandler = () => {\n this.handleAbandonment();\n };\n\n window.addEventListener('beforeunload', beforeUnloadHandler);\n document.addEventListener('visibilitychange', visibilityChangeHandler);\n window.addEventListener('pagehide', pageHideHandler);\n\n // Armazena handlers para limpeza posterior\n this.unloadListeners.push(() => {\n window.removeEventListener('beforeunload', beforeUnloadHandler);\n document.removeEventListener('visibilitychange', visibilityChangeHandler);\n window.removeEventListener('pagehide', pageHideHandler);\n });\n }\n\n /**\n * Processa o abandono e envia dados se necessário\n */\n private handleAbandonment(): void {\n // Evita envios duplicados\n if (this.hasSent) {\n return;\n }\n\n // Só envia se o usuário interagiu com algum formulário\n if (!this.hasInteracted) {\n return;\n }\n\n // Captura dados dos formulários\n const formsData = getFormData();\n\n // Se não houver dados, não envia\n if (formsData.length === 0) {\n return;\n }\n\n // Marca como enviado para evitar duplicatas\n this.hasSent = true;\n\n // Prepara dados do evento\n const eventData: Record<string, unknown> = {\n event_type: 'form_abandonment',\n forms: formsData.map(form => ({\n form_id: form.formId,\n form_index: form.formIndex,\n fields: form.formData,\n field_count: Object.keys(form.formData).length,\n })),\n total_forms: formsData.length,\n timestamp: Date.now(),\n };\n\n // Envia evento usando sendBeacon (síncrono, mais confiável para unload)\n this.sendAbandonmentEvent(eventData);\n }\n\n /**\n * Envia evento de abandono\n */\n private sendAbandonmentEvent(eventData: Record<string, unknown>): void {\n // Usa sendEvent que já tem suporte para sendBeacon\n sendEvent({\n eventData,\n config: this.config,\n sessionId: this.sessionId,\n version: this.version,\n scriptUrl: this.scriptUrl,\n }).catch(error => {\n if (this.config.debug) {\n console.error('[FormAbandonment] Erro ao enviar evento:', error);\n }\n });\n }\n\n /**\n * Limpa todos os listeners\n */\n public destroy(): void {\n this.formInteractionListeners.forEach(cleanup => cleanup());\n this.unloadListeners.forEach(cleanup => cleanup());\n this.formInteractionListeners = [];\n this.unloadListeners = [];\n\n if (this.config.debug) {\n console.log('[FormAbandonment] Sistema destruído');\n }\n }\n}\n\n/**\n * Função helper para inicializar o sistema de abandono\n */\nexport const initializeFormAbandonment = (\n config: FormAbandonmentConfig\n): FormAbandonment => {\n return new FormAbandonment(config);\n};\n","/**\n * GomarkePixel - Pixel Tracker para Facebook e Google Analytics\n * Versão: 1.0.0\n */\n\nimport { UpselyRecoveryConfig } from './types';\nimport { GetSession } from './utils/getSession';\nimport { FormAbandonment } from './utils/formAbandonment';\n\nclass Initialization {\n private config: UpselyRecoveryConfig;\n private version: string = '1.0.0';\n private sessionId: string;\n private sessionManager: GetSession;\n private formAbandonment?: FormAbandonment;\n\n constructor(config: UpselyRecoveryConfig) {\n if (!config.apiEndpoint) {\n throw new Error('apiEndpoint é obrigatório');\n }\n\n this.config = {\n debug: false,\n version: this.version,\n ...config,\n };\n\n // Inicializa sessão persistente\n this.sessionManager = new GetSession(undefined, this.config.debug);\n this.sessionId = this.sessionManager.getSessionId();\n\n // Inicializa o pixel\n this.initialize();\n }\n\n private async initialize(): Promise<void> {\n // Inicializa sistema de abandono de formulário apenas no browser\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n try {\n // Obtém URL do script se disponível\n const scriptUrl = this.getScriptUrl();\n\n this.formAbandonment = new FormAbandonment({\n config: this.config,\n sessionId: this.sessionId,\n version: this.version,\n scriptUrl,\n });\n\n if (this.config.debug) {\n console.log(\n '[Initialization] Sistema de abandono de formulário inicializado'\n );\n }\n } catch (error) {\n if (this.config.debug) {\n console.error(\n '[Initialization] Erro ao inicializar sistema de abandono:',\n error\n );\n }\n }\n }\n }\n\n /**\n * Obtém a URL do script atual se disponível\n */\n private getScriptUrl(): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n // Tenta encontrar o script atual\n const scripts = document.getElementsByTagName('script');\n for (let i = 0; i < scripts.length; i++) {\n const script = scripts[i];\n if (script.src && script.src.includes('upsely')) {\n return script.src;\n }\n }\n\n // Tenta usar currentScript se disponível\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript?.src) {\n return currentScript.src;\n }\n\n return undefined;\n }\n\n /**\n * Atualiza a configuração\n */\n public updateConfig(newConfig: Partial<UpselyRecoveryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n }\n\n /**\n * Obtém a configuração atual\n */\n public getConfig(): UpselyRecoveryConfig {\n return { ...this.config };\n }\n\n /**\n * Obtém a versão\n */\n public getVersion(): string {\n return this.version;\n }\n\n /**\n * Obtém o session ID\n */\n public getSessionId(): string {\n // Atualiza o sessionId caso tenha mudado\n this.sessionId = this.sessionManager.getSessionId();\n return this.sessionId;\n }\n\n /**\n * Obtém dados da sessão\n */\n public getSessionData() {\n return this.sessionManager.getSessionData();\n }\n\n /**\n * Verifica se a sessão está ativa\n */\n public isSessionActive(): boolean {\n return this.sessionManager.isActive();\n }\n\n /**\n * Atualiza a última atividade da sessão\n */\n public updateSessionActivity(): void {\n this.sessionManager.updateLastActivity();\n }\n\n /**\n * Renova a sessão\n */\n public renewSession(): void {\n this.sessionManager.renewSession();\n this.sessionId = this.sessionManager.getSessionId();\n }\n\n /**\n * Limpa a sessão\n */\n public clearSession(): void {\n this.sessionManager.clearSession();\n // Cria nova sessão após limpar\n this.sessionManager = new GetSession(undefined, this.config.debug);\n this.sessionId = this.sessionManager.getSessionId();\n }\n\n /**\n * Exporta dados da sessão\n */\n public exportSessionData(): string {\n return this.sessionManager.exportSessionData();\n }\n\n /**\n * Destrói o sistema de abandono de formulário\n */\n public destroyFormAbandonment(): void {\n if (this.formAbandonment) {\n this.formAbandonment.destroy();\n this.formAbandonment = undefined;\n }\n }\n}\n\n// Exportação para uso em módulos\nexport default Initialization;\n","import { UpselyRecoveryConfig } from '../types';\n\nexport const parseConfigFromScriptTag = (\n scriptTag: HTMLScriptElement\n): UpselyRecoveryConfig => {\n const config: UpselyRecoveryConfig = {\n apiEndpoint: scriptTag.getAttribute('data-api-endpoint') || undefined,\n apiKey: scriptTag.getAttribute('data-api-key') || undefined,\n debug: scriptTag.getAttribute('data-debug') === 'true',\n timeout: scriptTag.getAttribute('data-timeout')\n ? Number(scriptTag.getAttribute('data-timeout'))\n : 5000,\n };\n\n return config;\n};\n"],"mappings":"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","names":["index_exports","__export","autoInitFromScriptTag","index_default","GetSession","sessionId","debug","providedSessionId","now","stored","cookieSessionId","finalSessionId","isFirstVisit","newSession","timestamp","random","random2","session","error","parsed","name","value","expirationDate","expires","nameEQ","ca","i","c","events","updateActivity","lastUpdate","throttledUpdate","event","newSessionId","getFormData","forms","results","form","index","formData","formId","field","name","value","radioGroup","checked","r","select","option","LIBVERSION","UA_MAX_LENGTH","USER_AGENT","EMPTY","UNKNOWN","TYPEOF","BROWSER","CPU","DEVICE","ENGINE","OS","RESULT","NAME","TYPE","VENDOR","VERSION","ARCHITECTURE","MAJOR","MODEL","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","XR","EMBEDDED","INAPP","BRANDS","FORMFACTORS","FULLVERLIST","PLATFORM","PLATFORMVER","BITNESS","CH","CH_FULL_VER_LIST","CH_ARCH","CH_BITNESS","CH_FORM_FACTORS","CH_MOBILE","CH_MODEL","CH_PLATFORM","CH_PLATFORM_VER","CH_ALL_VALUES","AMAZON","APPLE","ASUS","BLACKBERRY","GOOGLE","HUAWEI","LENOVO","HONOR","LG","MICROSOFT","MOTOROLA","NVIDIA","ONEPLUS","OPPO","SAMSUNG","SHARP","SONY","XIAOMI","ZEBRA","CHROME","CHROMIUM","CHROMECAST","EDGE","FIREFOX","OPERA","FACEBOOK","SOGOU","PREFIX_MOBILE","SUFFIX_BROWSER","WINDOWS","isWindow","NAVIGATOR","NAVIGATOR_UADATA","extend","defaultRgx","extensions","mergedRgx","extraRgx","isExtensions","i","j","k","enumerize","arr","enums","has","str1","str2","lowerize","isString","obj","deep","prop","val","itemListToArray","header","tokens","strip","token","trim","str","majorize","version","setProps","propName","pattern","stripQuotes","len","rgxMapper","ua","arrays","p","q","matches","match","regex","props","strMapper","map","windowsVersionMap","formFactorsMap","browserHintsMap","defaultRegexes","defaultProps","createIData","item","itemType","init_props","is_ignoreProps","is_ignoreRgx","toString_props","IData","res","UACHData","strToCheck","is","cb","that","IDataResolve","resolveData","uach","isHttpUACH","UAItem","rgxMap","uaCH","ch","data","detect","realVersion","brands","prevName","brandName","brandVersion","archName","reParse","ff","idx","osName","osVersion","parse","UAParser","headers","kv","v","normalized","userAgent","httpUACH","regexMap","createItemFunc","getDeviceInfo","result","UAParser","APP_NAME","FINGERPRINT_KEY","APP_NAME","getFingerprint","cached","canvas","canvasData","gpuInfo","gl","debugInfo","vendor","renderer","pluginNames","p","timezoneOffset","locale","components","dataBuffer","hashBuffer","fingerprint","b","STORAGE_KEY","getCartData","cartData","sendEvent","eventData","config","sessionId","version","scriptUrl","deviceInfo","getDeviceInfo","fingerprint","getFingerprint","cartData","getCartData","payload","search","acc","curr","key","value","endPointUrl","response","error","FormAbandonment","config","sessionId","version","scriptUrl","form","focusHandler","changeHandler","fields","field","beforeUnloadHandler","visibilityChangeHandler","pageHideHandler","formsData","getFormData","eventData","sendEvent","error","cleanup","Initialization","config","GetSession","scriptUrl","FormAbandonment","error","scripts","i","script","currentScript","newConfig","init_default","parseConfigFromScriptTag","scriptTag","index_default","init_default","defaultConfig","autoInitFromScriptTag","scriptTag","config","parseConfigFromScriptTag","err","autoPixel"]}
|