{"version":3,"sources":["../src/constants/index.ts","../src/utils/md5.ts","../src/utils/environment.ts","../src/utils/fingerprint.ts","../src/fingerprints/canvas.ts","../src/fingerprints/webgl.ts","../src/fingerprints/audio.ts","../src/fingerprints/fonts.ts","../src/core/DeviceUUID.ts"],"names":["wordCount","i","h"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n  BrowserPatterns,\n  VersionPatterns,\n  OSPatterns,\n  PlatformPatterns,\n  DeviceUUIDOptions,\n  AgentInfo,\n} from '../types';\n\n/**\n * List of known bot user agents\n */\nexport const BOTS: readonly string[] = [\n  '\\\\+https:\\\\/\\\\/developers.google.com\\\\/\\\\+\\\\/web\\\\/snippet\\\\/',\n  'googlebot',\n  'baiduspider',\n  'gurujibot',\n  'yandexbot',\n  'slurp',\n  'msnbot',\n  'bingbot',\n  'facebookexternalhit',\n  'linkedinbot',\n  'twitterbot',\n  'slackbot',\n  'telegrambot',\n  'applebot',\n  'pingdom',\n  'tumblr ',\n  'Embedly',\n  'spbot',\n] as const;\n\n/**\n * Compiled regex for bot detection\n */\nexport const IS_BOT_REGEXP = new RegExp(`^.*(${BOTS.join('|')}).*$`);\n\n/**\n * Browser version detection patterns\n */\nexport const VERSION_PATTERNS: Readonly<VersionPatterns> = {\n  Edge: /(?:Edge|Edg)\\/([\\d\\w.-]+)/i,\n  Firefox: /firefox\\/([\\d\\w.-]+)/i,\n  IE: /msie\\s([\\d.]+[\\d])|trident\\/\\d+\\.\\d+;.*[rv:]+(\\d+\\.\\d)/i,\n  Chrome: /chrome\\/([\\d\\w.-]+)/i,\n  Chromium: /(?:chromium|crios)\\/([\\d\\w.-]+)/i,\n  Safari: /version\\/([\\d\\w.-]+)/i,\n  Opera: /version\\/([\\d\\w.-]+)|OPR\\/([\\d\\w.-]+)/i,\n  Ps3: /([\\d\\w.-]+)\\)\\s*$/i,\n  Psp: /([\\d\\w.-]+)\\)?\\s*$/i,\n  Amaya: /amaya\\/([\\d\\w.-]+)/i,\n  SeaMonkey: /seamonkey\\/([\\d\\w.-]+)/i,\n  OmniWeb: /omniweb\\/v([\\d\\w.-]+)/i,\n  Flock: /flock\\/([\\d\\w.-]+)/i,\n  Epiphany: /epiphany\\/([\\d\\w.-]+)/i,\n  WinJs: /msapphost\\/([\\d\\w.-]+)/i,\n  PhantomJS: /phantomjs\\/([\\d\\w.-]+)/i,\n  UC: /UCBrowser\\/([\\d\\w.]+)/i,\n} as const;\n\n/**\n * Browser detection patterns\n */\nexport const BROWSER_PATTERNS: Readonly<BrowserPatterns> = {\n  Edge: /edge|edg\\//i,\n  Amaya: /amaya/i,\n  Konqueror: /konqueror/i,\n  Epiphany: /epiphany/i,\n  SeaMonkey: /seamonkey/i,\n  Flock: /flock/i,\n  OmniWeb: /omniweb/i,\n  Chromium: /chromium|crios/i,\n  Chrome: /chrome/i,\n  Safari: /safari/i,\n  IE: /msie|trident/i,\n  Opera: /opera|OPR/i,\n  PS3: /playstation 3/i,\n  PSP: /playstation portable/i,\n  Firefox: /firefox/i,\n  WinJs: /msapphost/i,\n  PhantomJS: /phantomjs/i,\n  UC: /UCBrowser/i,\n} as const;\n\n/**\n * Operating system detection patterns\n */\nexport const OS_PATTERNS: Readonly<OSPatterns> = {\n  Windows11: /windows nt 10\\.0/i,\n  Windows10: /windows nt 10\\.0/i,\n  Windows81: /windows nt 6\\.3/i,\n  Windows8: /windows nt 6\\.2/i,\n  Windows7: /windows nt 6\\.1/i,\n  UnknownWindows: /windows nt 6\\.\\d+/i,\n  WindowsVista: /windows nt 6\\.0/i,\n  Windows2003: /windows nt 5\\.2/i,\n  WindowsXP: /windows nt 5\\.1/i,\n  Windows2000: /windows nt 5\\.0/i,\n  WindowsPhone8: /windows phone 8\\./,\n  OSXCheetah: /os x 10[._]0/i,\n  OSXPuma: /os x 10[._]1(\\D|$)/i,\n  OSXJaguar: /os x 10[._]2/i,\n  OSXPanther: /os x 10[._]3/i,\n  OSXTiger: /os x 10[._]4/i,\n  OSXLeopard: /os x 10[._]5/i,\n  OSXSnowLeopard: /os x 10[._]6/i,\n  OSXLion: /os x 10[._]7/i,\n  OSXMountainLion: /os x 10[._]8/i,\n  OSXMavericks: /os x 10[._]9/i,\n  OSXYosemite: /os x 10[._]10/i,\n  OSXElCapitan: /os x 10[._]11/i,\n  OSXSierra: /os x 10[._]12/i,\n  OSXHighSierra: /os x 10[._]13/i,\n  OSXMojave: /os x 10[._]14/i,\n  OSXCatalina: /os x 10[._]15/i,\n  MacOSBigSur: /mac os x 1[01][._](?:16|[6-9]|\\d{2})|os x 10[._]16/i,\n  MacOSMonterey: /mac os x 12[._]/i,\n  MacOSVentura: /mac os x 13[._]/i,\n  MacOSSonoma: /mac os x 14[._]/i,\n  MacOSSequoia: /mac os x 15[._]/i,\n  Mac: /os x|mac os/i,\n  Linux: /linux/i,\n  Linux64: /linux x86_64/i,\n  ChromeOS: /cros/i,\n  Wii: /wii/i,\n  PS3: /playstation 3/i,\n  PSP: /playstation portable/i,\n  iPad: /\\(ipad\\b/i,\n  iPhone: /\\(iphone\\b/i,\n  Bada: /Bada\\/(\\d+)\\.(\\d+)/i,\n  Curl: /curl\\/(\\d+)\\.(\\d+)\\.(\\d+)/i,\n} as const;\n\n/**\n * Platform detection patterns\n */\nexport const PLATFORM_PATTERNS: Readonly<PlatformPatterns> = {\n  Windows: /windows nt/i,\n  WindowsPhone: /windows phone/i,\n  Mac: /macintosh/i,\n  Linux: /linux/i,\n  Wii: /wii/i,\n  Playstation: /playstation/i,\n  iPad: /ipad/i,\n  iPod: /ipod/i,\n  iPhone: /iphone/i,\n  Android: /android/i,\n  Blackberry: /blackberry/i,\n  Samsung: /samsung/i,\n  Curl: /curl/i,\n} as const;\n\n/**\n * Default configuration options\n */\nexport const DEFAULT_OPTIONS: Readonly<DeviceUUIDOptions> = {\n  version: false,\n  language: false,\n  platform: true,\n  os: true,\n  pixelDepth: true,\n  colorDepth: true,\n  resolution: false,\n  isAuthoritative: true,\n  silkAccelerated: true,\n  isKindleFire: true,\n  isDesktop: true,\n  isMobile: true,\n  isTablet: true,\n  isWindows: true,\n  isLinux: true,\n  isLinux64: true,\n  isChromeOS: true,\n  isMac: true,\n  isiPad: true,\n  isiPhone: true,\n  isiPod: true,\n  isAndroid: true,\n  isSamsung: true,\n  isSmartTV: true,\n  isRaspberry: true,\n  isBlackberry: true,\n  isTouchScreen: true,\n  isOpera: false,\n  isIE: false,\n  isEdge: false,\n  isIECompatibilityMode: false,\n  isSafari: false,\n  isFirefox: false,\n  isWebkit: false,\n  isChrome: false,\n  isKonqueror: false,\n  isOmniWeb: false,\n  isSeaMonkey: false,\n  isFlock: false,\n  isAmaya: false,\n  isPhantomJS: false,\n  isEpiphany: false,\n  source: false,\n  cpuCores: false,\n} as const;\n\n/**\n * Default agent information\n */\nexport const DEFAULT_AGENT: Readonly<Omit<AgentInfo, 'hashInt' | 'hashMD5'>> = {\n  isAuthoritative: true,\n  isMobile: false,\n  isTablet: false,\n  isiPad: false,\n  isiPod: false,\n  isiPhone: false,\n  isAndroid: false,\n  isBlackberry: false,\n  isOpera: false,\n  isIE: false,\n  isEdge: false,\n  isIECompatibilityMode: false,\n  isSafari: false,\n  isFirefox: false,\n  isWebkit: false,\n  isChrome: false,\n  isKonqueror: false,\n  isOmniWeb: false,\n  isSeaMonkey: false,\n  isFlock: false,\n  isAmaya: false,\n  isPhantomJS: false,\n  isEpiphany: false,\n  isDesktop: false,\n  isWindows: false,\n  isLinux: false,\n  isLinux64: false,\n  isMac: false,\n  isChromeOS: false,\n  isBada: false,\n  isSamsung: false,\n  isRaspberry: false,\n  isBot: false,\n  isCurl: false,\n  isAndroidTablet: false,\n  isWinJs: false,\n  isKindleFire: false,\n  isSilk: false,\n  isCaptive: false,\n  isSmartTV: false,\n  isUC: false,\n  isTouchScreen: false,\n  silkAccelerated: false,\n  colorDepth: -1,\n  pixelDepth: -1,\n  resolution: [0, 0],\n  cpuCores: -1,\n  language: 'unknown',\n  browser: 'unknown',\n  version: 'unknown',\n  os: 'unknown',\n  platform: 'unknown',\n  geoIp: {},\n  source: '',\n} as const;\n","/**\n * MD5 Hash Implementation\n * Pure JavaScript MD5 implementation for browser and Node.js compatibility\n */\n\n/**\n * Rotate left bitwise operation\n */\nconst rotateLeft = (value: number, shiftBits: number): number => {\n  return (value << shiftBits) | (value >>> (32 - shiftBits));\n};\n\n/**\n * Add two numbers with unsigned 32-bit arithmetic\n */\nconst addUnsigned = (x: number, y: number): number => {\n  const x8 = x & 0x80000000;\n  const y8 = y & 0x80000000;\n  const x4 = x & 0x40000000;\n  const y4 = y & 0x40000000;\n  const result = (x & 0x3fffffff) + (y & 0x3fffffff);\n\n  if (x4 & y4) {\n    return result ^ 0x80000000 ^ x8 ^ y8;\n  }\n  if (x4 | y4) {\n    if (result & 0x40000000) {\n      return result ^ 0xc0000000 ^ x8 ^ y8;\n    } else {\n      return result ^ 0x40000000 ^ x8 ^ y8;\n    }\n  } else {\n    return result ^ x8 ^ y8;\n  }\n};\n\n/**\n * MD5 auxiliary function F\n */\nconst f = (x: number, y: number, z: number): number => {\n  return (x & y) | (~x & z);\n};\n\n/**\n * MD5 auxiliary function G\n */\nconst g = (x: number, y: number, z: number): number => {\n  return (x & z) | (y & ~z);\n};\n\n/**\n * MD5 auxiliary function H\n */\nconst h = (x: number, y: number, z: number): number => {\n  return x ^ y ^ z;\n};\n\n/**\n * MD5 auxiliary function I\n */\nconst i = (x: number, y: number, z: number): number => {\n  return y ^ (x | ~z);\n};\n\n/**\n * MD5 FF transformation\n */\nconst ff = (\n  a: number,\n  b: number,\n  c: number,\n  d: number,\n  x: number,\n  s: number,\n  ac: number\n): number => {\n  a = addUnsigned(a, addUnsigned(addUnsigned(f(b, c, d), x), ac));\n  return addUnsigned(rotateLeft(a, s), b);\n};\n\n/**\n * MD5 GG transformation\n */\nconst gg = (\n  a: number,\n  b: number,\n  c: number,\n  d: number,\n  x: number,\n  s: number,\n  ac: number\n): number => {\n  a = addUnsigned(a, addUnsigned(addUnsigned(g(b, c, d), x), ac));\n  return addUnsigned(rotateLeft(a, s), b);\n};\n\n/**\n * MD5 HH transformation\n */\nconst hh = (\n  a: number,\n  b: number,\n  c: number,\n  d: number,\n  x: number,\n  s: number,\n  ac: number\n): number => {\n  a = addUnsigned(a, addUnsigned(addUnsigned(h(b, c, d), x), ac));\n  return addUnsigned(rotateLeft(a, s), b);\n};\n\n/**\n * MD5 II transformation\n */\nconst ii = (\n  a: number,\n  b: number,\n  c: number,\n  d: number,\n  x: number,\n  s: number,\n  ac: number\n): number => {\n  a = addUnsigned(a, addUnsigned(addUnsigned(i(b, c, d), x), ac));\n  return addUnsigned(rotateLeft(a, s), b);\n};\n\n/**\n * Convert string to word array for MD5 processing\n */\nconst convertToWordArray = (str: string): number[] => {\n  const messageLength = str.length;\n  const numberOfWordsTemp1 = messageLength + 8;\n  const numberOfWordsTemp2 = (numberOfWordsTemp1 - (numberOfWordsTemp1 % 64)) / 64;\n  const numberOfWords = (numberOfWordsTemp2 + 1) * 16;\n  const wordArray: number[] = new Array(numberOfWords - 1);\n  let bytePosition = 0;\n  let byteCount = 0;\n\n  while (byteCount < messageLength) {\n    const wordCount = (byteCount - (byteCount % 4)) / 4;\n    bytePosition = (byteCount % 4) * 8;\n    wordArray[wordCount] = wordArray[wordCount] | (str.charCodeAt(byteCount) << bytePosition);\n    byteCount++;\n  }\n\n  const wordCount = (byteCount - (byteCount % 4)) / 4;\n  bytePosition = (byteCount % 4) * 8;\n  wordArray[wordCount] = wordArray[wordCount] | (0x80 << bytePosition);\n  wordArray[numberOfWords - 2] = messageLength << 3;\n  wordArray[numberOfWords - 1] = messageLength >>> 29;\n\n  return wordArray;\n};\n\n/**\n * Convert word to hexadecimal string\n */\nconst wordToHex = (value: number): string => {\n  let wordToHexValue = '';\n  let wordToHexValueTemp = '';\n\n  for (let count = 0; count <= 3; count++) {\n    const byte = (value >>> (count * 8)) & 255;\n    wordToHexValueTemp = '0' + byte.toString(16);\n    wordToHexValue = wordToHexValue + wordToHexValueTemp.substr(wordToHexValueTemp.length - 2, 2);\n  }\n\n  return wordToHexValue;\n};\n\n/**\n * UTF-8 encode a string\n */\nconst utf8Encode = (str: string): string => {\n  str = str.replace(/\\r\\n/g, '\\n');\n  let utftext = '';\n\n  for (let n = 0; n < str.length; n++) {\n    const c = str.charCodeAt(n);\n\n    if (c < 128) {\n      utftext += String.fromCharCode(c);\n    } else if (c > 127 && c < 2048) {\n      utftext += String.fromCharCode((c >> 6) | 192);\n      utftext += String.fromCharCode((c & 63) | 128);\n    } else {\n      utftext += String.fromCharCode((c >> 12) | 224);\n      utftext += String.fromCharCode(((c >> 6) & 63) | 128);\n      utftext += String.fromCharCode((c & 63) | 128);\n    }\n  }\n\n  return utftext;\n};\n\n/**\n * Calculate MD5 hash of a string\n * @param str - Input string to hash\n * @returns MD5 hash as lowercase hexadecimal string\n */\nexport const hashMD5 = (str: string): string => {\n  // MD5 shift amounts\n  const S11 = 7,\n    S12 = 12,\n    S13 = 17,\n    S14 = 22;\n  const S21 = 5,\n    S22 = 9,\n    S23 = 14,\n    S24 = 20;\n  const S31 = 4,\n    S32 = 11,\n    S33 = 16,\n    S34 = 23;\n  const S41 = 6,\n    S42 = 10,\n    S43 = 15,\n    S44 = 21;\n\n  str = utf8Encode(str);\n  const x = convertToWordArray(str);\n\n  let a = 0x67452301;\n  let b = 0xefcdab89;\n  let c = 0x98badcfe;\n  let d = 0x10325476;\n\n  for (let k = 0; k < x.length; k += 16) {\n    const AA = a;\n    const BB = b;\n    const CC = c;\n    const DD = d;\n\n    // Round 1\n    a = ff(a, b, c, d, x[k + 0], S11, 0xd76aa478);\n    d = ff(d, a, b, c, x[k + 1], S12, 0xe8c7b756);\n    c = ff(c, d, a, b, x[k + 2], S13, 0x242070db);\n    b = ff(b, c, d, a, x[k + 3], S14, 0xc1bdceee);\n    a = ff(a, b, c, d, x[k + 4], S11, 0xf57c0faf);\n    d = ff(d, a, b, c, x[k + 5], S12, 0x4787c62a);\n    c = ff(c, d, a, b, x[k + 6], S13, 0xa8304613);\n    b = ff(b, c, d, a, x[k + 7], S14, 0xfd469501);\n    a = ff(a, b, c, d, x[k + 8], S11, 0x698098d8);\n    d = ff(d, a, b, c, x[k + 9], S12, 0x8b44f7af);\n    c = ff(c, d, a, b, x[k + 10], S13, 0xffff5bb1);\n    b = ff(b, c, d, a, x[k + 11], S14, 0x895cd7be);\n    a = ff(a, b, c, d, x[k + 12], S11, 0x6b901122);\n    d = ff(d, a, b, c, x[k + 13], S12, 0xfd987193);\n    c = ff(c, d, a, b, x[k + 14], S13, 0xa679438e);\n    b = ff(b, c, d, a, x[k + 15], S14, 0x49b40821);\n\n    // Round 2\n    a = gg(a, b, c, d, x[k + 1], S21, 0xf61e2562);\n    d = gg(d, a, b, c, x[k + 6], S22, 0xc040b340);\n    c = gg(c, d, a, b, x[k + 11], S23, 0x265e5a51);\n    b = gg(b, c, d, a, x[k + 0], S24, 0xe9b6c7aa);\n    a = gg(a, b, c, d, x[k + 5], S21, 0xd62f105d);\n    d = gg(d, a, b, c, x[k + 10], S22, 0x2441453);\n    c = gg(c, d, a, b, x[k + 15], S23, 0xd8a1e681);\n    b = gg(b, c, d, a, x[k + 4], S24, 0xe7d3fbc8);\n    a = gg(a, b, c, d, x[k + 9], S21, 0x21e1cde6);\n    d = gg(d, a, b, c, x[k + 14], S22, 0xc33707d6);\n    c = gg(c, d, a, b, x[k + 3], S23, 0xf4d50d87);\n    b = gg(b, c, d, a, x[k + 8], S24, 0x455a14ed);\n    a = gg(a, b, c, d, x[k + 13], S21, 0xa9e3e905);\n    d = gg(d, a, b, c, x[k + 2], S22, 0xfcefa3f8);\n    c = gg(c, d, a, b, x[k + 7], S23, 0x676f02d9);\n    b = gg(b, c, d, a, x[k + 12], S24, 0x8d2a4c8a);\n\n    // Round 3\n    a = hh(a, b, c, d, x[k + 5], S31, 0xfffa3942);\n    d = hh(d, a, b, c, x[k + 8], S32, 0x8771f681);\n    c = hh(c, d, a, b, x[k + 11], S33, 0x6d9d6122);\n    b = hh(b, c, d, a, x[k + 14], S34, 0xfde5380c);\n    a = hh(a, b, c, d, x[k + 1], S31, 0xa4beea44);\n    d = hh(d, a, b, c, x[k + 4], S32, 0x4bdecfa9);\n    c = hh(c, d, a, b, x[k + 7], S33, 0xf6bb4b60);\n    b = hh(b, c, d, a, x[k + 10], S34, 0xbebfbc70);\n    a = hh(a, b, c, d, x[k + 13], S31, 0x289b7ec6);\n    d = hh(d, a, b, c, x[k + 0], S32, 0xeaa127fa);\n    c = hh(c, d, a, b, x[k + 3], S33, 0xd4ef3085);\n    b = hh(b, c, d, a, x[k + 6], S34, 0x4881d05);\n    a = hh(a, b, c, d, x[k + 9], S31, 0xd9d4d039);\n    d = hh(d, a, b, c, x[k + 12], S32, 0xe6db99e5);\n    c = hh(c, d, a, b, x[k + 15], S33, 0x1fa27cf8);\n    b = hh(b, c, d, a, x[k + 2], S34, 0xc4ac5665);\n\n    // Round 4\n    a = ii(a, b, c, d, x[k + 0], S41, 0xf4292244);\n    d = ii(d, a, b, c, x[k + 7], S42, 0x432aff97);\n    c = ii(c, d, a, b, x[k + 14], S43, 0xab9423a7);\n    b = ii(b, c, d, a, x[k + 5], S44, 0xfc93a039);\n    a = ii(a, b, c, d, x[k + 12], S41, 0x655b59c3);\n    d = ii(d, a, b, c, x[k + 3], S42, 0x8f0ccc92);\n    c = ii(c, d, a, b, x[k + 10], S43, 0xffeff47d);\n    b = ii(b, c, d, a, x[k + 1], S44, 0x85845dd1);\n    a = ii(a, b, c, d, x[k + 8], S41, 0x6fa87e4f);\n    d = ii(d, a, b, c, x[k + 15], S42, 0xfe2ce6e0);\n    c = ii(c, d, a, b, x[k + 6], S43, 0xa3014314);\n    b = ii(b, c, d, a, x[k + 13], S44, 0x4e0811a1);\n    a = ii(a, b, c, d, x[k + 4], S41, 0xf7537e82);\n    d = ii(d, a, b, c, x[k + 11], S42, 0xbd3af235);\n    c = ii(c, d, a, b, x[k + 2], S43, 0x2ad7d2bb);\n    b = ii(b, c, d, a, x[k + 9], S44, 0xeb86d391);\n\n    a = addUnsigned(a, AA);\n    b = addUnsigned(b, BB);\n    c = addUnsigned(c, CC);\n    d = addUnsigned(d, DD);\n  }\n\n  const temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);\n  return temp.toLowerCase();\n};\n\n/**\n * Calculate a simple integer hash of a string\n * @param str - Input string to hash\n * @returns Integer hash value\n */\nexport const hashInt = (str: string): number => {\n  let hash = 0;\n  if (str.length === 0) return hash;\n\n  for (let i = 0; i < str.length; i++) {\n    const chr = str.charCodeAt(i);\n    hash = (hash << 5) - hash + chr;\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return hash;\n};\n","/**\n * Environment detection and safe global access utilities\n * Provides compatibility for both browser and Node.js environments\n */\n\n/**\n * Extended Navigator interface for legacy and experimental browser properties\n */\ninterface ExtendedNavigator extends Navigator {\n  userLanguage?: string;\n  browserLanguage?: string;\n  systemLanguage?: string;\n  msMaxTouchPoints?: number;\n  deviceMemory?: number;\n}\n\n/**\n * Check if running in a browser environment\n */\nexport const isBrowser = (): boolean => {\n  return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n};\n\n/**\n * Check if running in Node.js environment\n */\nexport const isNode = (): boolean => {\n  return (\n    typeof process !== 'undefined' && process.versions != null && process.versions.node != null\n  );\n};\n\n/**\n * Safely get the navigator object\n */\nexport const getNavigator = (): Navigator | undefined => {\n  if (isBrowser() && typeof navigator !== 'undefined') {\n    return navigator;\n  }\n  return undefined;\n};\n\n/**\n * Safely get the screen object\n */\nexport const getScreen = (): Screen | undefined => {\n  if (isBrowser() && typeof screen !== 'undefined') {\n    return screen;\n  }\n  return undefined;\n};\n\n/**\n * Safely get the window object\n */\nexport const getWindow = (): Window | undefined => {\n  if (isBrowser() && typeof window !== 'undefined') {\n    return window;\n  }\n  return undefined;\n};\n\n/**\n * Get user agent string safely\n */\nexport const getUserAgent = (): string => {\n  const nav = getNavigator();\n  return nav?.userAgent || '';\n};\n\n/**\n * Get language safely\n */\nexport const getLanguage = (): string => {\n  const nav = getNavigator() as ExtendedNavigator | undefined;\n  if (!nav) return 'unknown';\n\n  return (\n    (\n      nav.language ||\n      nav.userLanguage ||\n      nav.browserLanguage ||\n      nav.systemLanguage ||\n      ''\n    ).toLowerCase() || 'unknown'\n  );\n};\n\n/**\n * Get color depth safely\n */\nexport const getColorDepth = (): number => {\n  const scr = getScreen();\n  return scr?.colorDepth ?? -1;\n};\n\n/**\n * Get pixel depth safely\n */\nexport const getPixelDepth = (): number => {\n  const scr = getScreen();\n  return scr?.pixelDepth ?? -1;\n};\n\n/**\n * Get screen resolution safely\n */\nexport const getScreenResolution = (): [number, number] => {\n  const scr = getScreen();\n  if (scr) {\n    return [scr.availWidth || 0, scr.availHeight || 0];\n  }\n  return [0, 0];\n};\n\n/**\n * Get CPU core count safely\n */\nexport const getCPUCores = (): number => {\n  const nav = getNavigator();\n  return nav?.hardwareConcurrency ?? -1;\n};\n\n/**\n * Check if touch screen is supported\n */\nexport const isTouchScreen = (): boolean => {\n  const win = getWindow();\n  const nav = getNavigator() as ExtendedNavigator | undefined;\n\n  if (!win || !nav) return false;\n\n  return (\n    'ontouchstart' in win ||\n    (nav.maxTouchPoints !== undefined && nav.maxTouchPoints > 0) ||\n    (nav.msMaxTouchPoints !== undefined && nav.msMaxTouchPoints > 0)\n  );\n};\n\n/**\n * Get device memory in GB safely\n * Returns approximate RAM: 0.25, 0.5, 1, 2, 4, or 8\n * Returns -1 if not supported (Safari, Firefox)\n */\nexport const getDeviceMemory = (): number => {\n  const nav = getNavigator() as ExtendedNavigator | undefined;\n  return nav?.deviceMemory ?? -1;\n};\n\n/**\n * Get max touch points safely\n * Returns number of simultaneous touch points supported\n * Returns 0 if not a touch device\n */\nexport const getMaxTouchPoints = (): number => {\n  const nav = getNavigator() as ExtendedNavigator | undefined;\n  if (!nav) return 0;\n\n  return nav.maxTouchPoints ?? nav.msMaxTouchPoints ?? 0;\n};\n\n/**\n * Get Do Not Track preference safely\n * Returns '1' if enabled, '0' if disabled, null if not set\n */\nexport const getDoNotTrack = (): string | null => {\n  const nav = getNavigator();\n  const win = getWindow() as (Window & { doNotTrack?: string }) | undefined;\n\n  if (!nav) return null;\n\n  // Check navigator.doNotTrack (standard)\n  if (nav.doNotTrack !== undefined && nav.doNotTrack !== null) {\n    return nav.doNotTrack;\n  }\n\n  // Check window.doNotTrack (legacy IE)\n  if (win?.doNotTrack !== undefined) {\n    return win.doNotTrack;\n  }\n\n  return null;\n};\n\n/**\n * Check if PDF viewer is enabled in the browser\n * Returns true if enabled, false if disabled, null if not supported\n */\nexport const getPdfViewerEnabled = (): boolean | null => {\n  const nav = getNavigator();\n\n  if (!nav) return null;\n\n  // pdfViewerEnabled is a standard API\n  // Return directly as it's always present in modern Navigator\n  return nav.pdfViewerEnabled;\n};\n","/**\n * Fingerprint utility functions\n * Common operations for hash combining, error handling, and feature detection\n */\n\nimport type { FingerprintFeature, FingerprintOptions, FingerprintPreset } from '../types';\nimport { isBrowser, getNavigator, getWindow } from './environment';\n\n/**\n * Default fingerprint options - all advanced methods disabled for privacy\n */\nexport const DEFAULT_FINGERPRINT_OPTIONS: Readonly<FingerprintOptions> = {\n  canvas: false,\n  webgl: false,\n  audio: false,\n  fonts: false,\n  mediaDevices: false,\n  networkInfo: false,\n  timezone: false,\n  incognitoDetection: false,\n  timeout: 5000,\n  methodTimeout: 1000,\n} as const;\n\n/**\n * Fingerprint option presets\n */\nexport const FINGERPRINT_PRESETS: Readonly<Record<FingerprintPreset, FingerprintOptions>> = {\n  /** Minimal - only basic device info, no advanced fingerprinting */\n  minimal: {\n    canvas: false,\n    webgl: false,\n    audio: false,\n    fonts: false,\n    mediaDevices: false,\n    networkInfo: false,\n    timezone: false,\n    incognitoDetection: false,\n    timeout: 5000,\n    methodTimeout: 1000,\n  },\n  /** Standard - canvas and webgl for good uniqueness */\n  standard: {\n    canvas: true,\n    webgl: true,\n    audio: false,\n    fonts: false,\n    mediaDevices: false,\n    networkInfo: false,\n    timezone: true,\n    incognitoDetection: false,\n    timeout: 5000,\n    methodTimeout: 1000,\n  },\n  /** Comprehensive - all fingerprinting methods enabled */\n  comprehensive: {\n    canvas: true,\n    webgl: true,\n    audio: true,\n    fonts: true,\n    mediaDevices: true,\n    networkInfo: true,\n    timezone: true,\n    incognitoDetection: true,\n    timeout: 10000,\n    methodTimeout: 2000,\n  },\n} as const;\n\n/**\n * Merge fingerprint options with defaults\n * @param options - Partial options to merge\n * @returns Complete options object\n */\nexport const mergeOptions = (options?: Partial<FingerprintOptions>): FingerprintOptions => {\n  if (!options) return { ...DEFAULT_FINGERPRINT_OPTIONS };\n  return { ...DEFAULT_FINGERPRINT_OPTIONS, ...options };\n};\n\n/**\n * Get preset options by name\n * @param preset - Preset name\n * @returns Fingerprint options for the preset\n */\nexport const getPresetOptions = (preset: FingerprintPreset): FingerprintOptions => {\n  return { ...FINGERPRINT_PRESETS[preset] };\n};\n\n/**\n * Check if a specific fingerprinting feature is supported in the current environment\n * @param feature - Feature to check\n * @returns Whether the feature is supported\n */\nexport const isFeatureSupported = (feature: FingerprintFeature): boolean => {\n  if (!isBrowser()) return false;\n\n  const nav = getNavigator();\n  const win = getWindow();\n\n  switch (feature) {\n    case 'canvas': {\n      try {\n        const canvas = document.createElement('canvas');\n        return !!(canvas.getContext && canvas.getContext('2d'));\n      } catch {\n        return false;\n      }\n    }\n\n    case 'webgl': {\n      try {\n        const canvas = document.createElement('canvas');\n        return !!(\n          canvas.getContext('webgl2') ||\n          canvas.getContext('webgl') ||\n          canvas.getContext('experimental-webgl')\n        );\n      } catch {\n        return false;\n      }\n    }\n\n    case 'audio': {\n      return !!(\n        win &&\n        (typeof AudioContext !== 'undefined' ||\n          typeof (win as Window & { webkitAudioContext?: typeof AudioContext })\n            .webkitAudioContext !== 'undefined')\n      );\n    }\n\n    case 'fonts': {\n      // Font detection always works via canvas or DOM measurement\n      return isBrowser() && !!document.createElement;\n    }\n\n    case 'mediaDevices': {\n      return !!(nav && nav.mediaDevices && typeof nav.mediaDevices.enumerateDevices === 'function');\n    }\n\n    case 'networkInfo': {\n      return !!(nav && 'connection' in nav);\n    }\n\n    case 'timezone': {\n      return typeof Intl !== 'undefined' && typeof Intl.DateTimeFormat === 'function';\n    }\n\n    case 'incognitoDetection': {\n      return !!(nav && 'storage' in nav && typeof nav.storage?.estimate === 'function');\n    }\n\n    default:\n      return false;\n  }\n};\n\n/**\n * Wrap a promise with a timeout\n * @param promise - Promise to wrap\n * @param ms - Timeout in milliseconds\n * @param fallback - Fallback value on timeout\n * @returns Promise that resolves with result or fallback\n */\nexport const withTimeout = <T>(promise: Promise<T>, ms: number, fallback: T): Promise<T> => {\n  return Promise.race([\n    promise,\n    new Promise<T>((resolve) => {\n      setTimeout(() => resolve(fallback), ms);\n    }),\n  ]);\n};\n\n/**\n * Safely execute an async function with error handling\n * @param fn - Async function to execute\n * @param fallback - Fallback value on error\n * @returns Promise with result or fallback\n */\nexport const safeAsync = async <T>(fn: () => Promise<T>, fallback: T): Promise<T> => {\n  try {\n    return await fn();\n  } catch {\n    return fallback;\n  }\n};\n\n/**\n * Combine multiple hash strings into a single hash\n * @param hashes - Array of hash strings (null values are skipped)\n * @param separator - Separator between hashes\n * @returns Combined hash string\n */\nexport const combineHashes = (hashes: (string | null)[], separator = ':'): string => {\n  return hashes.filter((h): h is string => h !== null && h !== '').join(separator);\n};\n\n/**\n * Calculate confidence score based on available components\n * @param totalComponents - Total number of components attempted\n * @param successfulComponents - Number of successful components\n * @param weights - Optional weights for different component categories\n * @returns Confidence score between 0 and 1\n */\nexport const calculateConfidence = (\n  totalComponents: number,\n  successfulComponents: number,\n  weights?: { basic: number; advanced: number }\n): number => {\n  if (totalComponents === 0) return 0;\n\n  const baseConfidence = successfulComponents / totalComponents;\n\n  // Apply weights if provided (basic components are more reliable)\n  if (weights) {\n    const weightedScore = baseConfidence * (weights.basic * 0.6 + weights.advanced * 0.4);\n    return Math.min(1, Math.max(0, weightedScore));\n  }\n\n  return baseConfidence;\n};\n\n/**\n * Get current high-resolution timestamp\n * @returns Timestamp in milliseconds\n */\nexport const getTimestamp = (): number => {\n  if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n    return performance.now();\n  }\n  return Date.now();\n};\n\n/**\n * Measure execution time of an async function\n * @param fn - Async function to measure\n * @returns Promise with result and duration\n */\nexport const measureAsync = async <T>(\n  fn: () => Promise<T>\n): Promise<{ result: T; duration: number }> => {\n  const start = getTimestamp();\n  const result = await fn();\n  const duration = getTimestamp() - start;\n  return { result, duration };\n};\n\n/**\n * Error log entry\n */\nexport interface ErrorLogEntry {\n  /** Component that caused the error */\n  component: string;\n  /** Error message */\n  error: string;\n  /** Timestamp when error occurred */\n  timestamp: number;\n}\n\n/**\n * Error logger configuration\n */\nexport interface ErrorLoggerConfig {\n  /** Whether logging is enabled */\n  enabled?: boolean;\n  /** Maximum number of errors to store */\n  maxErrors?: number;\n  /** Custom callback for errors */\n  onError?: (entry: ErrorLogEntry) => void;\n}\n\n/**\n * Error logger class for centralized error handling\n */\nclass ErrorLogger {\n  private errors: ErrorLogEntry[] = [];\n  private config: Required<Pick<ErrorLoggerConfig, 'enabled' | 'maxErrors'>> & {\n    onError?: (entry: ErrorLogEntry) => void;\n  };\n\n  constructor(config?: ErrorLoggerConfig) {\n    this.config = {\n      enabled: config?.enabled ?? false,\n      maxErrors: config?.maxErrors ?? 50,\n      onError: config?.onError,\n    };\n  }\n\n  /**\n   * Log an error\n   * @param component - Component that caused the error\n   * @param error - Error object or message\n   */\n  log(component: string, error: unknown): void {\n    if (!this.config.enabled) return;\n\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    const entry: ErrorLogEntry = {\n      component,\n      error: errorMessage,\n      timestamp: Date.now(),\n    };\n\n    // Add to errors array\n    this.errors.push(entry);\n\n    // Trim if exceeds max\n    if (this.errors.length > this.config.maxErrors) {\n      this.errors.shift();\n    }\n\n    // Call custom callback\n    if (this.config.onError) {\n      try {\n        this.config.onError(entry);\n      } catch {\n        // Ignore callback errors\n      }\n    }\n  }\n\n  /**\n   * Get all logged errors\n   * @returns Array of error entries\n   */\n  getErrors(): readonly ErrorLogEntry[] {\n    return this.errors;\n  }\n\n  /**\n   * Clear all logged errors\n   */\n  clear(): void {\n    this.errors = [];\n  }\n\n  /**\n   * Enable or disable logging\n   * @param enabled - Whether to enable logging\n   */\n  setEnabled(enabled: boolean): void {\n    this.config.enabled = enabled;\n  }\n\n  /**\n   * Check if logging is enabled\n   * @returns Whether logging is enabled\n   */\n  isEnabled(): boolean {\n    return this.config.enabled;\n  }\n}\n\n/**\n * Global error logger instance\n */\nlet globalErrorLogger: ErrorLogger | null = null;\n\n/**\n * Get or create the global error logger\n * @param config - Optional configuration\n * @returns Error logger instance\n */\nexport const getErrorLogger = (config?: ErrorLoggerConfig): ErrorLogger => {\n  if (!globalErrorLogger) {\n    globalErrorLogger = new ErrorLogger(config);\n  } else if (config) {\n    // Update configuration if provided\n    if (config.enabled !== undefined) {\n      globalErrorLogger.setEnabled(config.enabled);\n    }\n  }\n  return globalErrorLogger;\n};\n\n/**\n * Log an error to the global error logger\n * @param component - Component that caused the error\n * @param error - Error object or message\n */\nexport const logError = (component: string, error: unknown): void => {\n  if (globalErrorLogger) {\n    globalErrorLogger.log(component, error);\n  }\n};\n","/**\n * Canvas Fingerprinting Module\n * Generates unique fingerprint based on canvas rendering differences\n */\n\nimport { hashMD5 } from '../utils/md5';\nimport { isBrowser } from '../utils/environment';\nimport { withTimeout } from '../utils/fingerprint';\n\n/**\n * Canvas fingerprint options\n */\ninterface CanvasFingerprintOptions {\n  /** Timeout in milliseconds */\n  timeout?: number;\n}\n\n/**\n * Create an offscreen canvas element\n * @param width - Canvas width\n * @param height - Canvas height\n * @returns Canvas element or null if unavailable\n */\nconst createOffscreenCanvas = (width: number, height: number): HTMLCanvasElement | null => {\n  if (!isBrowser()) return null;\n\n  try {\n    const canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    canvas.style.display = 'none';\n    return canvas;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Render text with multiple fonts for fingerprinting\n * @param ctx - Canvas 2D context\n */\nconst renderText = (ctx: CanvasRenderingContext2D): void => {\n  const fonts = ['serif', 'sans-serif', 'monospace', 'cursive', 'fantasy'];\n  const testText = 'Cwm fjordbank glyphs vext quiz, 😃🎨';\n\n  ctx.textBaseline = 'top';\n\n  fonts.forEach((font, index) => {\n    ctx.font = `14px ${font}`;\n    ctx.fillStyle = `hsl(${index * 72}, 70%, 50%)`;\n    ctx.fillText(testText, 2, 2 + index * 18);\n  });\n};\n\n/**\n * Render geometric shapes for fingerprinting\n * @param ctx - Canvas 2D context\n * @param width - Canvas width\n * @param height - Canvas height\n */\nconst renderShapes = (ctx: CanvasRenderingContext2D, width: number, height: number): void => {\n  // Gradient rectangle\n  const gradient = ctx.createLinearGradient(0, 0, width, height);\n  gradient.addColorStop(0, 'rgba(255, 0, 0, 0.5)');\n  gradient.addColorStop(0.5, 'rgba(0, 255, 0, 0.5)');\n  gradient.addColorStop(1, 'rgba(0, 0, 255, 0.5)');\n  ctx.fillStyle = gradient;\n  ctx.fillRect(10, 100, 80, 50);\n\n  // Arc\n  ctx.beginPath();\n  ctx.arc(150, 125, 30, 0, Math.PI * 2);\n  ctx.fillStyle = 'rgba(255, 165, 0, 0.7)';\n  ctx.fill();\n  ctx.strokeStyle = '#333';\n  ctx.lineWidth = 2;\n  ctx.stroke();\n\n  // Bezier curve\n  ctx.beginPath();\n  ctx.moveTo(200, 100);\n  ctx.bezierCurveTo(220, 80, 260, 160, 280, 120);\n  ctx.strokeStyle = 'rgba(128, 0, 128, 0.8)';\n  ctx.lineWidth = 3;\n  ctx.stroke();\n\n  // Triangle with shadow\n  ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';\n  ctx.shadowBlur = 5;\n  ctx.shadowOffsetX = 3;\n  ctx.shadowOffsetY = 3;\n  ctx.beginPath();\n  ctx.moveTo(310, 150);\n  ctx.lineTo(340, 100);\n  ctx.lineTo(370, 150);\n  ctx.closePath();\n  ctx.fillStyle = 'rgba(0, 128, 128, 0.8)';\n  ctx.fill();\n\n  // Reset shadow\n  ctx.shadowColor = 'transparent';\n  ctx.shadowBlur = 0;\n  ctx.shadowOffsetX = 0;\n  ctx.shadowOffsetY = 0;\n};\n\n/**\n * Render emoji for additional uniqueness\n * @param ctx - Canvas 2D context\n */\nconst renderEmoji = (ctx: CanvasRenderingContext2D): void => {\n  ctx.font = '30px Arial';\n  ctx.fillText('🔥💧🌿⚡🎭', 10, 180);\n};\n\n/**\n * Check if canvas is blocked or returns noise\n * @param canvas - Canvas element\n * @returns Whether canvas fingerprinting is blocked\n */\nconst isCanvasBlocked = (canvas: HTMLCanvasElement): boolean => {\n  try {\n    const ctx = canvas.getContext('2d');\n    if (!ctx) return true;\n\n    // Draw a simple pattern\n    ctx.fillStyle = 'rgb(255, 0, 0)';\n    ctx.fillRect(0, 0, 1, 1);\n\n    const imageData = ctx.getImageData(0, 0, 1, 1);\n    const pixel = imageData.data;\n\n    // Check if pixel matches expected value\n    // Canvas blockers often return random or zero values\n    return pixel[0] !== 255 || pixel[1] !== 0 || pixel[2] !== 0;\n  } catch {\n    return true;\n  }\n};\n\n/**\n * Generate canvas fingerprint\n * @param options - Fingerprint options\n * @returns Promise resolving to fingerprint hash or null\n */\nexport const getCanvasFingerprint = async (\n  options?: CanvasFingerprintOptions\n): Promise<string | null> => {\n  const timeout = options?.timeout ?? 1000;\n\n  const generateFingerprint = async (): Promise<string | null> => {\n    if (!isBrowser()) return null;\n\n    try {\n      const width = 400;\n      const height = 200;\n\n      const canvas = createOffscreenCanvas(width, height);\n      if (!canvas) return null;\n\n      const ctx = canvas.getContext('2d');\n      if (!ctx) return null;\n\n      // Check if canvas is blocked\n      if (isCanvasBlocked(canvas)) {\n        return null;\n      }\n\n      // Clear and set background\n      ctx.fillStyle = '#f0f0f0';\n      ctx.fillRect(0, 0, width, height);\n\n      // Render various elements\n      renderText(ctx);\n      renderShapes(ctx, width, height);\n      renderEmoji(ctx);\n\n      // Extract data\n      const dataUrl = canvas.toDataURL('image/png');\n\n      // Hash the data URL\n      return hashMD5(dataUrl);\n    } catch {\n      return null;\n    }\n  };\n\n  return withTimeout(generateFingerprint(), timeout, null);\n};\n\n/**\n * Check if Canvas 2D is supported\n * @returns Whether Canvas 2D is available\n */\nexport const isCanvasSupported = (): boolean => {\n  if (!isBrowser()) return false;\n\n  try {\n    const canvas = document.createElement('canvas');\n    return !!(canvas.getContext && canvas.getContext('2d'));\n  } catch {\n    return false;\n  }\n};\n","/**\n * WebGL Fingerprinting Module\n * Generates unique fingerprint based on WebGL parameters and GPU info\n */\n\nimport { hashMD5 } from '../utils/md5';\nimport { isBrowser } from '../utils/environment';\nimport { withTimeout } from '../utils/fingerprint';\n\n/**\n * WebGL fingerprint options\n */\ninterface WebGLFingerprintOptions {\n  /** Timeout in milliseconds */\n  timeout?: number;\n}\n\n/**\n * WebGL debug renderer info extension interface\n */\ninterface WEBGL_debug_renderer_info {\n  UNMASKED_VENDOR_WEBGL: number;\n  UNMASKED_RENDERER_WEBGL: number;\n}\n\n/**\n * WebGL parameters to collect for fingerprinting\n */\nconst WEBGL_PARAMS = [\n  'MAX_TEXTURE_SIZE',\n  'MAX_VERTEX_UNIFORM_VECTORS',\n  'MAX_FRAGMENT_UNIFORM_VECTORS',\n  'MAX_VARYING_VECTORS',\n  'MAX_VERTEX_ATTRIBS',\n  'MAX_RENDERBUFFER_SIZE',\n  'MAX_CUBE_MAP_TEXTURE_SIZE',\n  'MAX_TEXTURE_IMAGE_UNITS',\n  'MAX_VERTEX_TEXTURE_IMAGE_UNITS',\n  'MAX_COMBINED_TEXTURE_IMAGE_UNITS',\n] as const;\n\n/**\n * WebGL range parameters (return [min, max])\n */\nconst WEBGL_RANGE_PARAMS = ['ALIASED_LINE_WIDTH_RANGE', 'ALIASED_POINT_SIZE_RANGE'] as const;\n\n/**\n * Create WebGL context with fallbacks\n * @param canvas - Canvas element\n * @returns WebGL context or null\n */\nconst createWebGLContext = (\n  canvas: HTMLCanvasElement\n): WebGLRenderingContext | WebGL2RenderingContext | null => {\n  const contextOptions = {\n    preserveDrawingBuffer: true,\n    failIfMajorPerformanceCaveat: false,\n  };\n\n  try {\n    // Try WebGL2 first\n    const gl2 = canvas.getContext('webgl2', contextOptions) as WebGL2RenderingContext | null;\n    if (gl2) return gl2;\n  } catch {\n    // WebGL2 not available\n  }\n\n  try {\n    // Try WebGL\n    const gl = canvas.getContext('webgl', contextOptions) as WebGLRenderingContext | null;\n    if (gl) return gl;\n  } catch {\n    // WebGL not available\n  }\n\n  try {\n    // Try experimental WebGL (older browsers)\n    const glExp = canvas.getContext(\n      'experimental-webgl',\n      contextOptions\n    ) as WebGLRenderingContext | null;\n    if (glExp) return glExp;\n  } catch {\n    // Experimental WebGL not available\n  }\n\n  return null;\n};\n\n/**\n * Get GPU vendor and renderer info\n * @param gl - WebGL context\n * @returns Object with vendor and renderer or null\n */\nconst getGPUInfo = (\n  gl: WebGLRenderingContext | WebGL2RenderingContext\n): { vendor: string; renderer: string } | null => {\n  try {\n    const debugInfo = gl.getExtension(\n      'WEBGL_debug_renderer_info'\n    ) as WEBGL_debug_renderer_info | null;\n    if (!debugInfo) return null;\n\n    const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) as string;\n    const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as string;\n\n    return { vendor, renderer };\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Collect WebGL parameters\n * @param gl - WebGL context\n * @returns Array of parameter values\n */\nconst collectParameters = (gl: WebGLRenderingContext | WebGL2RenderingContext): string[] => {\n  const params: string[] = [];\n\n  // Collect scalar parameters\n  for (const param of WEBGL_PARAMS) {\n    try {\n      const glParam = gl[param as keyof WebGLRenderingContext] as number | undefined;\n      if (glParam !== undefined) {\n        const value = gl.getParameter(glParam);\n        params.push(`${param}:${value}`);\n      }\n    } catch {\n      // Parameter not available\n    }\n  }\n\n  // Collect range parameters\n  for (const param of WEBGL_RANGE_PARAMS) {\n    try {\n      const glParam = gl[param as keyof WebGLRenderingContext] as number | undefined;\n      if (glParam !== undefined) {\n        const range = gl.getParameter(glParam) as Float32Array | null;\n        if (range) {\n          params.push(`${param}:${range[0]}-${range[1]}`);\n        }\n      }\n    } catch {\n      // Parameter not available\n    }\n  }\n\n  return params;\n};\n\n/**\n * Get supported WebGL extensions\n * @param gl - WebGL context\n * @returns Sorted list of extension names\n */\nconst getExtensions = (gl: WebGLRenderingContext | WebGL2RenderingContext): string[] => {\n  try {\n    const extensions = gl.getSupportedExtensions();\n    return extensions ? extensions.sort() : [];\n  } catch {\n    return [];\n  }\n};\n\n/**\n * Get WebGL2 specific parameters\n * @param gl - WebGL2 context\n * @returns Array of WebGL2-specific parameter values\n */\nconst collectWebGL2Parameters = (gl: WebGL2RenderingContext): string[] => {\n  const params: string[] = [];\n\n  const webgl2Params = [\n    'MAX_3D_TEXTURE_SIZE',\n    'MAX_ARRAY_TEXTURE_LAYERS',\n    'MAX_DRAW_BUFFERS',\n    'MAX_SAMPLES',\n    'MAX_UNIFORM_BUFFER_BINDINGS',\n  ];\n\n  for (const param of webgl2Params) {\n    try {\n      const glParam = gl[param as keyof WebGL2RenderingContext] as number | undefined;\n      if (glParam !== undefined) {\n        const value = gl.getParameter(glParam);\n        params.push(`${param}:${value}`);\n      }\n    } catch {\n      // Parameter not available\n    }\n  }\n\n  return params;\n};\n\n/**\n * Generate WebGL fingerprint\n * @param options - Fingerprint options\n * @returns Promise resolving to fingerprint hash or null\n */\nexport const getWebGLFingerprint = async (\n  options?: WebGLFingerprintOptions\n): Promise<string | null> => {\n  const timeout = options?.timeout ?? 1000;\n\n  const generateFingerprint = async (): Promise<string | null> => {\n    if (!isBrowser()) return null;\n\n    try {\n      const canvas = document.createElement('canvas');\n      canvas.width = 1;\n      canvas.height = 1;\n\n      const gl = createWebGLContext(canvas);\n      if (!gl) return null;\n\n      const parts: string[] = [];\n\n      // Get GPU info\n      const gpuInfo = getGPUInfo(gl);\n      if (gpuInfo) {\n        parts.push(`vendor:${gpuInfo.vendor}`);\n        parts.push(`renderer:${gpuInfo.renderer}`);\n      }\n\n      // Collect parameters\n      const params = collectParameters(gl);\n      parts.push(...params);\n\n      // Collect WebGL2-specific parameters if available\n      if ('MAX_3D_TEXTURE_SIZE' in gl) {\n        const webgl2Params = collectWebGL2Parameters(gl as WebGL2RenderingContext);\n        parts.push(...webgl2Params);\n        parts.push('webgl2:true');\n      } else {\n        parts.push('webgl2:false');\n      }\n\n      // Get extensions (shortened to avoid excessive data)\n      const extensions = getExtensions(gl);\n      parts.push(`extensions:${extensions.length}`);\n      parts.push(`ext_hash:${hashMD5(extensions.join(','))}`);\n\n      // Clean up\n      const loseContext = gl.getExtension('WEBGL_lose_context');\n      if (loseContext) {\n        loseContext.loseContext();\n      }\n\n      // Return hash of all collected data\n      return hashMD5(parts.join('|'));\n    } catch {\n      return null;\n    }\n  };\n\n  return withTimeout(generateFingerprint(), timeout, null);\n};\n\n/**\n * Check if WebGL is supported\n * @returns Whether WebGL is available\n */\nexport const isWebGLSupported = (): boolean => {\n  if (!isBrowser()) return false;\n\n  try {\n    const canvas = document.createElement('canvas');\n    return !!(\n      canvas.getContext('webgl2') ||\n      canvas.getContext('webgl') ||\n      canvas.getContext('experimental-webgl')\n    );\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Check if WebGL debug info extension is available\n * @returns Whether WEBGL_debug_renderer_info is accessible\n */\nexport const isDebugInfoSupported = (): boolean => {\n  if (!isBrowser()) return false;\n\n  try {\n    const canvas = document.createElement('canvas');\n    const gl = canvas.getContext('webgl');\n    if (!gl) return false;\n\n    const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');\n    return debugInfo !== null;\n  } catch {\n    return false;\n  }\n};\n","/**\n * AudioContext Fingerprinting Module\n * Generates unique fingerprint based on audio processing differences\n */\n\nimport { hashMD5 } from '../utils/md5';\nimport { isBrowser, getWindow } from '../utils/environment';\nimport { withTimeout } from '../utils/fingerprint';\n\n/**\n * Audio fingerprint options\n */\ninterface AudioFingerprintOptions {\n  /** Timeout in milliseconds */\n  timeout?: number;\n}\n\n/**\n * Extended Window interface with webkit AudioContext\n */\ninterface ExtendedWindow extends Window {\n  AudioContext?: typeof AudioContext;\n  webkitAudioContext?: typeof AudioContext;\n  OfflineAudioContext?: typeof OfflineAudioContext;\n  webkitOfflineAudioContext?: typeof OfflineAudioContext;\n}\n\n/**\n * Get AudioContext constructor (with webkit fallback)\n * @returns AudioContext constructor or null\n */\nconst getAudioContextConstructor = (): typeof AudioContext | null => {\n  const win = getWindow() as ExtendedWindow | undefined;\n  if (!win) return null;\n\n  return win.AudioContext || win.webkitAudioContext || null;\n};\n\n/**\n * Get OfflineAudioContext constructor (with webkit fallback)\n * @returns OfflineAudioContext constructor or null\n */\nconst getOfflineAudioContextConstructor = (): typeof OfflineAudioContext | null => {\n  const win = getWindow() as ExtendedWindow | undefined;\n  if (!win) return null;\n\n  return win.OfflineAudioContext || win.webkitOfflineAudioContext || null;\n};\n\n/**\n * Generate fingerprint using OfflineAudioContext (more deterministic)\n * @param timeout - Timeout in milliseconds\n * @returns Promise resolving to fingerprint hash or null\n */\nconst generateOfflineFingerprint = async (timeout: number): Promise<string | null> => {\n  const OfflineCtx = getOfflineAudioContextConstructor();\n  if (!OfflineCtx) return null;\n\n  return new Promise((resolve) => {\n    const timeoutId = setTimeout(() => resolve(null), timeout);\n\n    try {\n      // Create offline context: sample rate 44100, 1 channel, 5000 samples\n      const context = new OfflineCtx(1, 5000, 44100);\n\n      // Create oscillator\n      const oscillator = context.createOscillator();\n      oscillator.type = 'triangle';\n      oscillator.frequency.setValueAtTime(10000, context.currentTime);\n\n      // Create dynamics compressor for more variance\n      const compressor = context.createDynamicsCompressor();\n      compressor.threshold.setValueAtTime(-50, context.currentTime);\n      compressor.knee.setValueAtTime(40, context.currentTime);\n      compressor.ratio.setValueAtTime(12, context.currentTime);\n      compressor.attack.setValueAtTime(0, context.currentTime);\n      compressor.release.setValueAtTime(0.25, context.currentTime);\n\n      // Connect nodes: oscillator -> compressor -> destination\n      oscillator.connect(compressor);\n      compressor.connect(context.destination);\n\n      // Start and schedule stop\n      oscillator.start(0);\n\n      // Render and extract fingerprint\n      context\n        .startRendering()\n        .then((renderedBuffer) => {\n          clearTimeout(timeoutId);\n\n          try {\n            // Get channel data\n            const channelData = renderedBuffer.getChannelData(0);\n\n            // Sample specific values for fingerprint (not entire buffer)\n            const samples: number[] = [];\n            const sampleIndices = [500, 1000, 2000, 3000, 4000, 4500];\n\n            for (const idx of sampleIndices) {\n              if (idx < channelData.length) {\n                samples.push(channelData[idx]);\n              }\n            }\n\n            // Also add some statistics\n            let sum = 0;\n            let max = -Infinity;\n            let min = Infinity;\n\n            for (let i = 0; i < channelData.length; i++) {\n              const val = channelData[i];\n              sum += val;\n              if (val > max) max = val;\n              if (val < min) min = val;\n            }\n\n            const fingerprint = [\n              ...samples.map((s) => s.toString()),\n              `sum:${sum}`,\n              `max:${max}`,\n              `min:${min}`,\n              `sampleRate:${renderedBuffer.sampleRate}`,\n            ].join('|');\n\n            resolve(hashMD5(fingerprint));\n          } catch {\n            resolve(null);\n          }\n        })\n        .catch(() => {\n          clearTimeout(timeoutId);\n          resolve(null);\n        });\n    } catch {\n      clearTimeout(timeoutId);\n      resolve(null);\n    }\n  });\n};\n\n/**\n * Generate fallback fingerprint using AudioContext properties\n * @returns Fingerprint hash or null\n */\nconst generateFallbackFingerprint = (): string | null => {\n  const AudioCtx = getAudioContextConstructor();\n  if (!AudioCtx) return null;\n\n  try {\n    const context = new AudioCtx();\n    const parts: string[] = [];\n\n    // Collect basic properties\n    parts.push(`sampleRate:${context.sampleRate}`);\n    parts.push(`state:${context.state}`);\n    parts.push(`baseLatency:${context.baseLatency || 'unknown'}`);\n\n    // Get destination properties\n    parts.push(`maxChannels:${context.destination.maxChannelCount}`);\n    parts.push(`channelCount:${context.destination.channelCount}`);\n    parts.push(`channelInterpretation:${context.destination.channelInterpretation}`);\n\n    // Close context\n    context.close().catch(() => {\n      // Ignore close errors\n    });\n\n    return hashMD5(parts.join('|'));\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Generate audio fingerprint\n * @param options - Fingerprint options\n * @returns Promise resolving to fingerprint hash or null\n */\nexport const getAudioFingerprint = async (\n  options?: AudioFingerprintOptions\n): Promise<string | null> => {\n  const timeout = options?.timeout ?? 1000;\n\n  if (!isBrowser()) return null;\n\n  // Try offline audio context first (more deterministic)\n  const offlineResult = await withTimeout(generateOfflineFingerprint(timeout), timeout, null);\n\n  if (offlineResult) return offlineResult;\n\n  // Fall back to basic AudioContext properties\n  return generateFallbackFingerprint();\n};\n\n/**\n * Check if AudioContext is supported\n * @returns Whether AudioContext is available\n */\nexport const isAudioSupported = (): boolean => {\n  return getAudioContextConstructor() !== null;\n};\n\n/**\n * Check if OfflineAudioContext is supported\n * @returns Whether OfflineAudioContext is available\n */\nexport const isOfflineAudioSupported = (): boolean => {\n  return getOfflineAudioContextConstructor() !== null;\n};\n","/**\n * Font Detection Fingerprinting Module\n * Generates unique fingerprint based on installed fonts\n */\n\nimport { hashMD5 } from '../utils/md5';\nimport { isBrowser } from '../utils/environment';\nimport { withTimeout } from '../utils/fingerprint';\n\n/**\n * Font fingerprint options\n */\ninterface FontFingerprintOptions {\n  /** Timeout in milliseconds */\n  timeout?: number;\n  /** Custom list of fonts to check (overrides default) */\n  fonts?: string[];\n}\n\n/**\n * Default list of fonts to check (cross-platform, most distinguishing)\n * Limited to 30 fonts for performance\n */\nconst DEFAULT_FONTS: readonly string[] = [\n  // Windows fonts\n  'Arial',\n  'Arial Black',\n  'Calibri',\n  'Cambria',\n  'Comic Sans MS',\n  'Consolas',\n  'Courier New',\n  'Georgia',\n  'Impact',\n  'Lucida Console',\n  'Segoe UI',\n  'Tahoma',\n  'Times New Roman',\n  'Trebuchet MS',\n  'Verdana',\n  // Mac fonts\n  'Helvetica',\n  'Helvetica Neue',\n  'Monaco',\n  'Menlo',\n  'SF Pro',\n  // Linux fonts\n  'Ubuntu',\n  'DejaVu Sans',\n  'Liberation Sans',\n  'Noto Sans',\n  // Common fonts\n  'Roboto',\n  'Open Sans',\n  'Lato',\n  'Source Code Pro',\n  'Fira Code',\n  'Inconsolata',\n] as const;\n\n/**\n * Fallback fonts for measurement comparison\n */\nconst FALLBACK_FONTS = ['monospace', 'sans-serif', 'serif'] as const;\n\n/**\n * Test string with characters that vary significantly between fonts\n */\nconst TEST_STRING = 'mmmmmmmmmmlli';\n\n/**\n * Font size for testing\n */\nconst TEST_SIZE = '72px';\n\n/**\n * Font measurement result\n */\ninterface FontMeasurement {\n  width: number;\n  height: number;\n}\n\n/**\n * Create a hidden span element for font measurement\n * @returns Span element or null\n */\nconst createMeasurementSpan = (): HTMLSpanElement | null => {\n  if (!isBrowser()) return null;\n\n  try {\n    const span = document.createElement('span');\n    span.style.position = 'absolute';\n    span.style.left = '-9999px';\n    span.style.top = '-9999px';\n    span.style.fontSize = TEST_SIZE;\n    span.style.fontStyle = 'normal';\n    span.style.fontWeight = 'normal';\n    span.style.letterSpacing = 'normal';\n    span.style.lineHeight = 'normal';\n    span.style.textTransform = 'none';\n    span.style.textAlign = 'left';\n    span.style.textDecoration = 'none';\n    span.style.whiteSpace = 'nowrap';\n    span.textContent = TEST_STRING;\n\n    return span;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Measure font dimensions\n * @param span - Measurement span\n * @param font - Font family name\n * @param fallback - Fallback font\n * @returns Font measurements\n */\nconst measureFont = (span: HTMLSpanElement, font: string, fallback: string): FontMeasurement => {\n  span.style.fontFamily = `'${font}', ${fallback}`;\n  return {\n    width: span.offsetWidth,\n    height: span.offsetHeight,\n  };\n};\n\n/**\n * Check if a font is available by comparing with fallback\n * @param span - Measurement span\n * @param font - Font to check\n * @param baselines - Baseline measurements for fallback fonts\n * @returns Whether font is available\n */\nconst isFontAvailable = (\n  span: HTMLSpanElement,\n  font: string,\n  baselines: Map<string, FontMeasurement>\n): boolean => {\n  for (const fallback of FALLBACK_FONTS) {\n    const baseline = baselines.get(fallback);\n    if (!baseline) continue;\n\n    const measurement = measureFont(span, font, fallback);\n\n    // If dimensions differ from baseline, font is available\n    if (measurement.width !== baseline.width || measurement.height !== baseline.height) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\n/**\n * Detect installed fonts using DOM-based measurement\n * @param fonts - List of fonts to check\n * @returns Array of detected font names\n */\nconst detectFontsDOM = (fonts: readonly string[]): string[] => {\n  if (!isBrowser()) return [];\n\n  const span = createMeasurementSpan();\n  if (!span) return [];\n\n  const detected: string[] = [];\n\n  try {\n    // Append to body for accurate measurement\n    document.body.appendChild(span);\n\n    // Measure baselines\n    const baselines = new Map<string, FontMeasurement>();\n    for (const fallback of FALLBACK_FONTS) {\n      span.style.fontFamily = fallback;\n      baselines.set(fallback, {\n        width: span.offsetWidth,\n        height: span.offsetHeight,\n      });\n    }\n\n    // Check each font\n    for (const font of fonts) {\n      if (isFontAvailable(span, font, baselines)) {\n        detected.push(font);\n      }\n    }\n  } finally {\n    // Clean up\n    if (span.parentNode) {\n      span.parentNode.removeChild(span);\n    }\n  }\n\n  return detected;\n};\n\n/**\n * Detect fonts using Canvas (alternative method)\n * @param fonts - List of fonts to check\n * @returns Array of detected font names\n */\nconst detectFontsCanvas = (fonts: readonly string[]): string[] => {\n  if (!isBrowser()) return [];\n\n  try {\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d');\n    if (!ctx) return [];\n\n    canvas.width = 500;\n    canvas.height = 100;\n\n    const detected: string[] = [];\n    const baselines = new Map<string, number>();\n\n    // Measure baselines\n    for (const fallback of FALLBACK_FONTS) {\n      ctx.font = `${TEST_SIZE} ${fallback}`;\n      baselines.set(fallback, ctx.measureText(TEST_STRING).width);\n    }\n\n    // Check each font\n    for (const font of fonts) {\n      for (const fallback of FALLBACK_FONTS) {\n        const baseline = baselines.get(fallback);\n        if (baseline === undefined) continue;\n\n        ctx.font = `${TEST_SIZE} '${font}', ${fallback}`;\n        const width = ctx.measureText(TEST_STRING).width;\n\n        if (width !== baseline) {\n          detected.push(font);\n          break;\n        }\n      }\n    }\n\n    return detected;\n  } catch {\n    return [];\n  }\n};\n\n/**\n * Generate font fingerprint\n * @param options - Fingerprint options\n * @returns Promise resolving to fingerprint hash or null\n */\nexport const getFontFingerprint = async (\n  options?: FontFingerprintOptions\n): Promise<string | null> => {\n  const timeout = options?.timeout ?? 2000;\n  const fonts = options?.fonts ?? DEFAULT_FONTS;\n\n  const generateFingerprint = async (): Promise<string | null> => {\n    if (!isBrowser()) return null;\n\n    try {\n      // Try DOM-based detection first (more accurate)\n      let detected = detectFontsDOM(fonts);\n\n      // Fall back to Canvas if DOM detection fails\n      if (detected.length === 0) {\n        detected = detectFontsCanvas(fonts);\n      }\n\n      if (detected.length === 0) return null;\n\n      // Sort for consistency\n      detected.sort();\n\n      return hashMD5(detected.join(','));\n    } catch {\n      return null;\n    }\n  };\n\n  return withTimeout(generateFingerprint(), timeout, null);\n};\n\n/**\n * Get list of detected fonts (for debugging/info)\n * @param fonts - List of fonts to check\n * @returns Array of detected font names\n */\nexport const getDetectedFonts = (fonts?: string[]): string[] => {\n  const fontList = fonts ?? [...DEFAULT_FONTS];\n  return detectFontsDOM(fontList);\n};\n\n/**\n * Get default font list\n * @returns Default font list\n */\nexport const getDefaultFontList = (): string[] => {\n  return [...DEFAULT_FONTS];\n};\n\n/**\n * Check if font detection is supported\n * @returns Whether font detection is available\n */\nexport const isFontDetectionSupported = (): boolean => {\n  return isBrowser() && typeof document !== 'undefined' && !!document.createElement;\n};\n\n/**\n * Font detection cache options\n */\ninterface FontCacheOptions {\n  /** Cache key in session storage */\n  cacheKey?: string;\n  /** Whether to use cached results */\n  useCache?: boolean;\n  /** Chunk size for async processing */\n  chunkSize?: number;\n  /** Delay between chunks in ms */\n  chunkDelay?: number;\n  /** Timeout for font detection in ms */\n  timeout?: number;\n}\n\n/**\n * Cache key for font detection results\n */\nconst DEFAULT_CACHE_KEY = 'device-uuid-fonts';\n\n/**\n * Get cached font detection results from session storage\n * @param cacheKey - Cache key to use\n * @returns Cached font list or null\n */\nconst getCachedFonts = (cacheKey: string): string[] | null => {\n  if (!isBrowser()) return null;\n\n  try {\n    const cached = sessionStorage.getItem(cacheKey);\n    if (cached) {\n      return JSON.parse(cached);\n    }\n  } catch {\n    // Session storage not available or corrupted data\n  }\n  return null;\n};\n\n/**\n * Cache font detection results in session storage\n * @param cacheKey - Cache key to use\n * @param fonts - Font list to cache\n */\nconst setCachedFonts = (cacheKey: string, fonts: string[]): void => {\n  if (!isBrowser()) return;\n\n  try {\n    sessionStorage.setItem(cacheKey, JSON.stringify(fonts));\n  } catch {\n    // Session storage not available or quota exceeded\n  }\n};\n\n/**\n * Detect fonts using async/chunked processing to avoid blocking main thread\n * @param fonts - List of fonts to check\n * @param options - Chunking options\n * @returns Promise resolving to array of detected font names\n */\nexport const getDetectedFontsAsync = async (\n  fonts?: readonly string[] | string[],\n  options?: FontCacheOptions\n): Promise<string[]> => {\n  const fontList = fonts ?? [...DEFAULT_FONTS];\n  const chunkSize = options?.chunkSize ?? 10;\n  const chunkDelay = options?.chunkDelay ?? 0;\n  const cacheKey = options?.cacheKey ?? DEFAULT_CACHE_KEY;\n  const useCache = options?.useCache ?? true;\n\n  // Check cache first\n  if (useCache) {\n    const cached = getCachedFonts(cacheKey);\n    if (cached !== null) {\n      return cached;\n    }\n  }\n\n  if (!isBrowser()) return [];\n\n  const span = createMeasurementSpan();\n  if (!span) return [];\n\n  const detected: string[] = [];\n\n  try {\n    // Append to body for accurate measurement\n    document.body.appendChild(span);\n\n    // Measure baselines\n    const baselines = new Map<string, FontMeasurement>();\n    for (const fallback of FALLBACK_FONTS) {\n      span.style.fontFamily = fallback;\n      baselines.set(fallback, {\n        width: span.offsetWidth,\n        height: span.offsetHeight,\n      });\n    }\n\n    // Process fonts in chunks\n    for (let i = 0; i < fontList.length; i += chunkSize) {\n      const chunk = fontList.slice(i, i + chunkSize);\n\n      // Process chunk\n      for (const font of chunk) {\n        if (isFontAvailable(span, font, baselines)) {\n          detected.push(font);\n        }\n      }\n\n      // Yield to main thread between chunks\n      if (i + chunkSize < fontList.length && chunkDelay > 0) {\n        await new Promise((resolve) => setTimeout(resolve, chunkDelay));\n      } else if (i + chunkSize < fontList.length) {\n        // At least yield via microtask\n        await Promise.resolve();\n      }\n    }\n\n    // Cache results\n    if (useCache) {\n      setCachedFonts(cacheKey, detected);\n    }\n  } finally {\n    // Clean up\n    if (span.parentNode) {\n      span.parentNode.removeChild(span);\n    }\n  }\n\n  return detected;\n};\n\n/**\n * Generate font fingerprint with async/chunked processing\n * @param options - Fingerprint options including caching\n * @returns Promise resolving to fingerprint hash or null\n */\nexport const getFontFingerprintAsync = async (\n  options?: FontFingerprintOptions & FontCacheOptions\n): Promise<string | null> => {\n  const timeout = options?.timeout ?? 3000;\n  const fonts = options?.fonts ?? DEFAULT_FONTS;\n\n  const generateFingerprint = async (): Promise<string | null> => {\n    if (!isBrowser()) return null;\n\n    try {\n      // Use async/chunked detection for large font lists\n      const detected = await getDetectedFontsAsync(fonts, {\n        cacheKey: options?.cacheKey,\n        useCache: options?.useCache,\n        chunkSize: options?.chunkSize ?? 10,\n        chunkDelay: options?.chunkDelay ?? 0,\n      });\n\n      if (detected.length === 0) return null;\n\n      // Sort for consistency\n      detected.sort();\n\n      return hashMD5(detected.join(','));\n    } catch {\n      return null;\n    }\n  };\n\n  return withTimeout(generateFingerprint(), timeout, null);\n};\n","/**\n * DeviceUUID - Fast browser device UUID generation\n * Analyzes user agent and device characteristics to generate unique identifiers\n */\n\nimport type {\n  DeviceUUIDOptions,\n  AgentInfo,\n  FingerprintOptions,\n  FingerprintDetails,\n  FingerprintFeature,\n  FingerprintPreset,\n} from '../types';\nimport {\n  DEFAULT_OPTIONS,\n  DEFAULT_AGENT,\n  VERSION_PATTERNS,\n  BROWSER_PATTERNS,\n  OS_PATTERNS,\n  PLATFORM_PATTERNS,\n  IS_BOT_REGEXP,\n} from '../constants';\nimport { hashMD5, hashInt } from '../utils/md5';\nimport {\n  getUserAgent,\n  getLanguage,\n  getColorDepth,\n  getPixelDepth,\n  getScreenResolution,\n  getCPUCores,\n  isTouchScreen as checkTouchScreen,\n  getNavigator,\n  isBrowser,\n} from '../utils/environment';\nimport {\n  mergeOptions,\n  getPresetOptions,\n  isFeatureSupported,\n  withTimeout,\n  combineHashes,\n  calculateConfidence,\n  getTimestamp,\n  measureAsync,\n} from '../utils/fingerprint';\nimport {\n  getCanvasFingerprint,\n  getWebGLFingerprint,\n  getAudioFingerprint,\n  getFontFingerprint,\n} from '../fingerprints';\n\n/**\n * DeviceUUID Class\n * Main class for device detection and UUID generation\n */\nexport class DeviceUUID {\n  private readonly options: DeviceUUIDOptions;\n  private readonly versionPatterns = VERSION_PATTERNS;\n  private readonly browserPatterns = BROWSER_PATTERNS;\n  private readonly osPatterns = OS_PATTERNS;\n  private readonly platformPatterns = PLATFORM_PATTERNS;\n  private agent: AgentInfo;\n\n  /**\n   * Get or set the user agent string\n   */\n  public get userAgent(): string {\n    return this.agent.source;\n  }\n  public set userAgent(value: string) {\n    this.agent.source = value;\n  }\n\n  /**\n   * Create a new DeviceUUID instance\n   * @param options - Configuration options\n   */\n  constructor(options: Partial<DeviceUUIDOptions> = {}) {\n    // Merge provided options with defaults\n    this.options = { ...DEFAULT_OPTIONS, ...options };\n\n    // Initialize agent with default values and hash functions\n    this.agent = {\n      ...DEFAULT_AGENT,\n      hashInt,\n      hashMD5,\n    };\n  }\n\n  /**\n   * Get browser name from user agent string\n   */\n  private getBrowser(source: string): string {\n    // Check browsers in priority order\n    if (this.browserPatterns.Edge.test(source)) {\n      this.agent.isEdge = true;\n      return 'Edge';\n    }\n    if (this.browserPatterns.PhantomJS.test(source)) {\n      this.agent.isPhantomJS = true;\n      return 'PhantomJS';\n    }\n    if (this.browserPatterns.Konqueror.test(source)) {\n      this.agent.isKonqueror = true;\n      return 'Konqueror';\n    }\n    if (this.browserPatterns.Amaya.test(source)) {\n      this.agent.isAmaya = true;\n      return 'Amaya';\n    }\n    if (this.browserPatterns.Epiphany.test(source)) {\n      this.agent.isEpiphany = true;\n      return 'Epiphany';\n    }\n    if (this.browserPatterns.SeaMonkey.test(source)) {\n      this.agent.isSeaMonkey = true;\n      return 'SeaMonkey';\n    }\n    if (this.browserPatterns.Flock.test(source)) {\n      this.agent.isFlock = true;\n      return 'Flock';\n    }\n    if (this.browserPatterns.OmniWeb.test(source)) {\n      this.agent.isOmniWeb = true;\n      return 'OmniWeb';\n    }\n    if (this.browserPatterns.Opera.test(source)) {\n      this.agent.isOpera = true;\n      return 'Opera';\n    }\n    if (this.browserPatterns.Chromium.test(source)) {\n      this.agent.isChrome = true;\n      return 'Chromium';\n    }\n    if (this.browserPatterns.Chrome.test(source)) {\n      this.agent.isChrome = true;\n      return 'Chrome';\n    }\n    if (this.browserPatterns.Safari.test(source)) {\n      this.agent.isSafari = true;\n      return 'Safari';\n    }\n    if (this.browserPatterns.WinJs.test(source)) {\n      this.agent.isWinJs = true;\n      return 'WinJs';\n    }\n    if (this.browserPatterns.IE.test(source)) {\n      this.agent.isIE = true;\n      return 'IE';\n    }\n    if (this.browserPatterns.PS3.test(source)) {\n      return 'ps3';\n    }\n    if (this.browserPatterns.PSP.test(source)) {\n      return 'psp';\n    }\n    if (this.browserPatterns.Firefox.test(source)) {\n      this.agent.isFirefox = true;\n      return 'Firefox';\n    }\n    if (this.browserPatterns.UC.test(source)) {\n      this.agent.isUC = true;\n      return 'UCBrowser';\n    }\n\n    // If UA doesn't start with Mozilla, try to extract browser name\n    if (source.indexOf('Mozilla') !== 0 && /^([\\d\\w-.]+)\\/[\\d\\w.-]+/i.test(source)) {\n      this.agent.isAuthoritative = false;\n      return RegExp.$1;\n    }\n\n    return 'unknown';\n  }\n\n  /**\n   * Get browser version from user agent string\n   */\n  private getBrowserVersion(source: string): string {\n    const browser = this.agent.browser;\n\n    const versionMap: Record<string, RegExp> = {\n      Edge: this.versionPatterns.Edge,\n      PhantomJS: this.versionPatterns.PhantomJS,\n      Chrome: this.versionPatterns.Chrome,\n      Chromium: this.versionPatterns.Chromium,\n      Safari: this.versionPatterns.Safari,\n      Opera: this.versionPatterns.Opera,\n      Firefox: this.versionPatterns.Firefox,\n      WinJs: this.versionPatterns.WinJs,\n      IE: this.versionPatterns.IE,\n      ps3: this.versionPatterns.Ps3,\n      psp: this.versionPatterns.Psp,\n      Amaya: this.versionPatterns.Amaya,\n      Epiphany: this.versionPatterns.Epiphany,\n      SeaMonkey: this.versionPatterns.SeaMonkey,\n      Flock: this.versionPatterns.Flock,\n      OmniWeb: this.versionPatterns.OmniWeb,\n      UCBrowser: this.versionPatterns.UC,\n    };\n\n    const pattern = versionMap[browser];\n    if (pattern && pattern.test(source)) {\n      // Handle IE and Opera special cases with multiple capture groups\n      if (browser === 'IE' || browser === 'Opera') {\n        return RegExp.$2 || RegExp.$1 || 'unknown';\n      }\n      return RegExp.$1 || 'unknown';\n    }\n\n    // Try generic pattern if browser is not unknown\n    if (browser !== 'unknown') {\n      const regex = new RegExp(`${browser}[\\\\/ ]([\\\\d\\\\w.\\\\-]+)`, 'i');\n      if (regex.test(source)) {\n        return RegExp.$1 || 'unknown';\n      }\n    }\n\n    return 'unknown';\n  }\n\n  /**\n   * Read a decimal integer at a known offset without applying an unbounded regex\n   * to the whole user-agent string.\n   */\n  private readLeadingInteger(source: string, start: number): number | null {\n    let end = start;\n    while (end < source.length) {\n      const code = source.charCodeAt(end);\n      if (code < 48 || code > 57) break;\n      end++;\n    }\n\n    if (end === start) return null;\n    return Number.parseInt(source.slice(start, end), 10);\n  }\n\n  private getWindows11BrowserMajorVersion(source: string): number | null {\n    const lowerSource = source.toLowerCase();\n    if (!lowerSource.includes('windows nt 10.0')) return null;\n    if (!lowerSource.includes('; win64; x64') && !lowerSource.includes('; wow64')) return null;\n\n    for (const marker of ['rv:', 'edg/', 'chrome/']) {\n      const markerIndex = lowerSource.indexOf(marker);\n      if (markerIndex === -1) continue;\n\n      const version = this.readLeadingInteger(source, markerIndex + marker.length);\n      if (version !== null) return version;\n    }\n\n    return null;\n  }\n\n  private hasIOSDeviceOS(source: string, device: 'ipad' | 'iphone'): boolean {\n    const lowerSource = source.toLowerCase();\n    const start = lowerSource.indexOf(`(${device}`);\n    if (start === -1) return false;\n\n    const end = lowerSource.indexOf(')', start);\n    const deviceSection = lowerSource.slice(start, end === -1 ? lowerSource.length : end);\n    return deviceSection.includes(' os ') || deviceSection.includes(` ${device} os `);\n  }\n\n  /**\n   * Get operating system from user agent string\n   */\n  private getOS(source: string): string {\n    // Windows versions - check Windows 11 before Windows 10\n    const windows11BrowserMajorVersion = this.getWindows11BrowserMajorVersion(source);\n    if (windows11BrowserMajorVersion !== null && windows11BrowserMajorVersion >= 96) {\n      this.agent.isWindows = true;\n      return 'Windows 11';\n    }\n    if (this.osPatterns.Windows10.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows 10.0';\n    }\n    if (this.osPatterns.WindowsVista.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows Vista';\n    }\n    if (this.osPatterns.Windows7.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows 7';\n    }\n    if (this.osPatterns.Windows8.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows 8';\n    }\n    if (this.osPatterns.Windows81.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows 8.1';\n    }\n    if (this.osPatterns.Windows2003.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows 2003';\n    }\n    if (this.osPatterns.WindowsXP.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows XP';\n    }\n    if (this.osPatterns.Windows2000.test(source)) {\n      this.agent.isWindows = true;\n      return 'Windows 2000';\n    }\n    if (this.osPatterns.WindowsPhone8.test(source)) {\n      return 'Windows Phone 8';\n    }\n\n    // Linux\n    if (this.osPatterns.Linux64.test(source)) {\n      this.agent.isLinux = true;\n      this.agent.isLinux64 = true;\n      return 'Linux 64';\n    }\n    if (this.osPatterns.Linux.test(source)) {\n      this.agent.isLinux = true;\n      return 'Linux';\n    }\n    if (this.osPatterns.ChromeOS.test(source)) {\n      this.agent.isChromeOS = true;\n      return 'Chrome OS';\n    }\n\n    // Gaming consoles\n    if (this.osPatterns.Wii.test(source)) {\n      return 'Wii';\n    }\n    if (this.osPatterns.PS3.test(source)) {\n      return 'Playstation';\n    }\n    if (this.osPatterns.PSP.test(source)) {\n      return 'Playstation';\n    }\n\n    // macOS versions\n    if (this.osPatterns.OSXCheetah.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Cheetah';\n    }\n    if (this.osPatterns.OSXPuma.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Puma';\n    }\n    if (this.osPatterns.OSXJaguar.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Jaguar';\n    }\n    if (this.osPatterns.OSXPanther.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Panther';\n    }\n    if (this.osPatterns.OSXTiger.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Tiger';\n    }\n    if (this.osPatterns.OSXLeopard.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Leopard';\n    }\n    if (this.osPatterns.OSXSnowLeopard.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Snow Leopard';\n    }\n    if (this.osPatterns.OSXLion.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Lion';\n    }\n    if (this.osPatterns.OSXMountainLion.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Mountain Lion';\n    }\n    if (this.osPatterns.OSXMavericks.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Mavericks';\n    }\n    if (this.osPatterns.OSXYosemite.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X Yosemite';\n    }\n    if (this.osPatterns.OSXElCapitan.test(source)) {\n      this.agent.isMac = true;\n      return 'OS X El Capitan';\n    }\n    if (this.osPatterns.OSXSierra.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Sierra';\n    }\n    if (this.osPatterns.OSXHighSierra.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS High Sierra';\n    }\n    if (this.osPatterns.OSXMojave.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Mojave';\n    }\n    if (this.osPatterns.OSXCatalina.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Catalina';\n    }\n    if (this.osPatterns.MacOSBigSur.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Big Sur';\n    }\n    if (this.osPatterns.MacOSMonterey.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Monterey';\n    }\n    if (this.osPatterns.MacOSVentura.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Ventura';\n    }\n    if (this.osPatterns.MacOSSonoma.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Sonoma';\n    }\n    if (this.osPatterns.MacOSSequoia.test(source)) {\n      this.agent.isMac = true;\n      return 'macOS Sequoia';\n    }\n\n    // Mobile OS - check before Mac to avoid false Mac detection on iOS devices\n    if (this.hasIOSDeviceOS(source, 'ipad')) {\n      this.agent.isiPad = true;\n      return 'iOS';\n    }\n    if (this.hasIOSDeviceOS(source, 'iphone')) {\n      this.agent.isiPhone = true;\n      return 'iOS';\n    }\n\n    // Mac OS - check after iOS to avoid false positives\n    if (this.osPatterns.Mac.test(source)) {\n      this.agent.isMac = true;\n      return 'Mac OS';\n    }\n    if (this.osPatterns.Bada.test(source)) {\n      this.agent.isBada = true;\n      return 'Bada';\n    }\n    if (this.osPatterns.Curl.test(source)) {\n      this.agent.isCurl = true;\n      return 'Curl';\n    }\n\n    return 'unknown';\n  }\n\n  /**\n   * Get platform from user agent string\n   */\n  private getPlatform(source: string): string {\n    if (this.platformPatterns.Windows.test(source)) {\n      return 'Microsoft Windows';\n    }\n    if (this.platformPatterns.WindowsPhone.test(source)) {\n      this.agent.isWindowsPhone = true;\n      return 'Microsoft Windows Phone';\n    }\n    if (this.platformPatterns.Mac.test(source)) {\n      return 'Apple Mac';\n    }\n    if (this.platformPatterns.Curl.test(source)) {\n      return 'Curl';\n    }\n    if (this.platformPatterns.Android.test(source)) {\n      this.agent.isAndroid = true;\n      return 'Android';\n    }\n    if (this.platformPatterns.Blackberry.test(source)) {\n      this.agent.isBlackberry = true;\n      return 'Blackberry';\n    }\n    if (this.platformPatterns.Linux.test(source)) {\n      return 'Linux';\n    }\n    if (this.platformPatterns.Wii.test(source)) {\n      return 'Wii';\n    }\n    if (this.platformPatterns.Playstation.test(source)) {\n      return 'Playstation';\n    }\n    if (this.platformPatterns.iPad.test(source)) {\n      this.agent.isiPad = true;\n      return 'iPad';\n    }\n    if (this.platformPatterns.iPod.test(source)) {\n      this.agent.isiPod = true;\n      return 'iPod';\n    }\n    if (this.platformPatterns.iPhone.test(source)) {\n      this.agent.isiPhone = true;\n      return 'iPhone';\n    }\n    if (this.platformPatterns.Samsung.test(source)) {\n      this.agent.isSamsung = true;\n      return 'Samsung';\n    }\n\n    return 'unknown';\n  }\n\n  /**\n   * Test for bot/crawler\n   */\n  private testBot(): void {\n    const isBot = IS_BOT_REGEXP.exec(this.agent.source.toLowerCase());\n    if (isBot) {\n      this.agent.isBot = isBot[1];\n    } else if (!this.agent.isAuthoritative) {\n      // Test unauthoritative parse for 'bot' in UA\n      this.agent.isBot = /bot/i.test(this.agent.source);\n    }\n  }\n\n  /**\n   * Test for Smart TV\n   */\n  private testSmartTV(): void {\n    const isSmartTV = /smart-tv|smarttv|googletv|appletv|hbbtv|pov_tv|netcast.tv/gi.exec(\n      this.agent.source.toLowerCase()\n    );\n    if (isSmartTV) {\n      this.agent.isSmartTV = isSmartTV[1] || true;\n    }\n  }\n\n  /**\n   * Test for mobile device\n   */\n  private testMobile(): void {\n    // Smart TV check - Smart TVs are not mobile or desktop\n    if (this.agent.isSmartTV) {\n      this.agent.isMobile = false;\n      this.agent.isDesktop = false;\n      return;\n    }\n\n    // Mobile OS detection - check BEFORE desktop to avoid false Linux detection for Android\n    if (\n      this.agent.isAndroid ||\n      this.agent.isSamsung ||\n      this.agent.isiPhone ||\n      this.agent.isiPod ||\n      this.agent.isBada ||\n      this.agent.isBlackberry ||\n      this.agent.isWindowsPhone\n    ) {\n      this.agent.isMobile = true;\n      this.agent.isDesktop = false;\n      return;\n    }\n\n    // iPad is a tablet, not mobile\n    if (this.agent.isiPad) {\n      this.agent.isMobile = false;\n      this.agent.isDesktop = false;\n      return;\n    }\n\n    // Desktop OS detection\n    if (this.agent.isWindows || this.agent.isLinux || this.agent.isMac || this.agent.isChromeOS) {\n      this.agent.isDesktop = true;\n      return;\n    }\n\n    // Check for mobile keyword in user agent\n    if (/mobile/i.test(this.agent.source)) {\n      this.agent.isMobile = true;\n      this.agent.isDesktop = false;\n    }\n  }\n\n  /**\n   * Test for Android tablet\n   */\n  private testAndroidTablet(): void {\n    if (this.agent.isAndroid && !/mobile/i.test(this.agent.source)) {\n      this.agent.isAndroidTablet = true;\n      this.agent.isMobile = false; // Tablets are not mobile\n    }\n  }\n\n  /**\n   * Test for tablet device\n   */\n  private testTablet(): void {\n    if (this.agent.isiPad || this.agent.isAndroidTablet || this.agent.isKindleFire) {\n      this.agent.isTablet = true;\n    }\n\n    if (/tablet/i.test(this.agent.source)) {\n      this.agent.isTablet = true;\n    }\n  }\n\n  /**\n   * Test for IE compatibility mode\n   */\n  private testCompatibilityMode(): void {\n    if (this.agent.isIE) {\n      const tridentMatch = /Trident\\/(\\d)\\.0/i.exec(this.agent.source);\n      if (tridentMatch) {\n        const tridentVersion = parseInt(tridentMatch[1], 10);\n        const version = parseFloat(this.agent.version);\n\n        if (version === 7 && tridentVersion === 7) {\n          this.agent.isIECompatibilityMode = true;\n          this.agent.version = '11.0';\n        } else if (version === 7 && tridentVersion === 6) {\n          this.agent.isIECompatibilityMode = true;\n          this.agent.version = '10.0';\n        } else if (version === 7 && tridentVersion === 5) {\n          this.agent.isIECompatibilityMode = true;\n          this.agent.version = '9.0';\n        } else if (version === 7 && tridentVersion === 4) {\n          this.agent.isIECompatibilityMode = true;\n          this.agent.version = '8.0';\n        }\n      }\n    }\n  }\n\n  /**\n   * Test for Amazon Silk browser\n   */\n  private testSilk(): void {\n    if (/silk/gi.test(this.agent.source)) {\n      this.agent.isSilk = true;\n    }\n    if (/Silk-Accelerated=true/gi.test(this.agent.source)) {\n      this.agent.silkAccelerated = true;\n    }\n  }\n\n  /**\n   * Test for Kindle Fire device\n   */\n  private testKindleFire(): void {\n    const kindleTests: Array<[RegExp, string]> = [\n      [/KFOT/gi, 'Kindle Fire'],\n      [/KFTT/gi, 'Kindle Fire HD'],\n      [/KFJWI/gi, 'Kindle Fire HD 8.9'],\n      [/KFJWA/gi, 'Kindle Fire HD 8.9 4G'],\n      [/KFSOWI/gi, 'Kindle Fire HD 7'],\n      [/KFTHWI/gi, 'Kindle Fire HDX 7'],\n      [/KFTHWA/gi, 'Kindle Fire HDX 7 4G'],\n      [/KFAPWI/gi, 'Kindle Fire HDX 8.9'],\n      [/KFAPWA/gi, 'Kindle Fire HDX 8.9 4G'],\n      [/KFMAWI/gi, 'Kindle Fire HD 10'],\n    ];\n\n    for (const [pattern] of kindleTests) {\n      if (pattern.test(this.agent.source)) {\n        this.agent.isKindleFire = true;\n        return;\n      }\n    }\n  }\n\n  /**\n   * Test for Captive Network Assistant\n   */\n  private testCaptiveNetwork(): void {\n    if (/CaptiveNetwork/gi.test(this.agent.source)) {\n      this.agent.isCaptive = true;\n      this.agent.isMac = true;\n      this.agent.platform = 'Apple Mac';\n    }\n  }\n\n  /**\n   * Test for touch screen support\n   */\n  private testTouchSupport(): void {\n    this.agent.isTouchScreen = checkTouchScreen();\n  }\n\n  /**\n   * Get language from browser\n   */\n  private getLanguageInfo(): void {\n    this.agent.language = getLanguage();\n  }\n\n  /**\n   * Get color depth\n   */\n  private getColorDepthInfo(): void {\n    this.agent.colorDepth = getColorDepth();\n  }\n\n  /**\n   * Get pixel depth\n   */\n  private getPixelDepthInfo(): void {\n    this.agent.pixelDepth = getPixelDepth();\n  }\n\n  /**\n   * Get screen resolution\n   */\n  private getScreenResolutionInfo(): void {\n    this.agent.resolution = getScreenResolution();\n  }\n\n  /**\n   * Get CPU core count\n   */\n  private getCPUInfo(): void {\n    this.agent.cpuCores = getCPUCores();\n  }\n\n  /**\n   * Reset agent to default state\n   */\n  public reset(): this {\n    this.agent = {\n      ...DEFAULT_AGENT,\n      hashInt,\n      hashMD5,\n    };\n    return this;\n  }\n\n  /**\n   * Parse user agent and collect device information\n   * @param source - User agent string (defaults to navigator.userAgent)\n   * @returns AgentInfo object with device details\n   */\n  public parse(source?: string): AgentInfo {\n    const ua = new DeviceUUID();\n    const userAgent = source || getUserAgent();\n\n    ua.agent.source = userAgent.trim();\n    ua.agent.os = ua.getOS(ua.agent.source);\n    ua.agent.platform = ua.getPlatform(ua.agent.source);\n    ua.agent.browser = ua.getBrowser(ua.agent.source);\n    ua.agent.version = ua.getBrowserVersion(ua.agent.source);\n\n    // Run all tests\n    ua.testBot();\n    ua.testSmartTV();\n    ua.testMobile();\n    ua.testAndroidTablet();\n    ua.testTablet();\n    ua.testCompatibilityMode();\n    ua.testSilk();\n    ua.testKindleFire();\n    ua.testCaptiveNetwork();\n    ua.testTouchSupport();\n\n    // Get device properties\n    ua.getLanguageInfo();\n    ua.getColorDepthInfo();\n    ua.getPixelDepthInfo();\n    ua.getScreenResolutionInfo();\n    ua.getCPUInfo();\n\n    return ua.agent;\n  }\n\n  /**\n   * Generate a UUID based on device characteristics\n   * @param customData - Optional custom data to include in UUID generation\n   * @returns UUID string in v4 format\n   */\n  public get(customData?: string): string {\n    const du = this.parse();\n    const dataArray: unknown[] = [];\n\n    // Collect data based on options\n    for (const key in this.options) {\n      if (Object.prototype.hasOwnProperty.call(this.options, key)) {\n        const value = du[key as keyof AgentInfo];\n        dataArray.push(value);\n      }\n    }\n\n    // Add custom data if provided\n    if (customData) {\n      dataArray.push(customData);\n    }\n\n    // Add resolution for mobile devices if not in options\n    if (!this.options.resolution && du.isMobile) {\n      dataArray.push(du.resolution);\n    }\n\n    // Generate UUID v4 format\n    const pref = 'b'; // UUID version 4 variant bits\n    const tmpUuid = hashMD5(dataArray.join(':'));\n\n    const uuid = [\n      tmpUuid.slice(0, 8),\n      tmpUuid.slice(8, 12),\n      '4' + tmpUuid.slice(12, 15), // Version 4\n      pref + tmpUuid.slice(15, 18), // Variant bits\n      tmpUuid.slice(20),\n    ];\n\n    return uuid.join('-');\n  }\n\n  /**\n   * Generate a UUID asynchronously with advanced fingerprinting methods\n   * @param options - Fingerprint options or preset name\n   * @returns Promise resolving to UUID string\n   */\n  public async getAsync(\n    options?: Partial<FingerprintOptions> | FingerprintPreset\n  ): Promise<string> {\n    const details = await this.getDetailedAsync(options);\n    return details.uuid;\n  }\n\n  /**\n   * Generate detailed fingerprint with all component information\n   * @param options - Fingerprint options or preset name\n   * @returns Promise resolving to detailed fingerprint result\n   */\n  public async getDetailedAsync(\n    options?: Partial<FingerprintOptions> | FingerprintPreset\n  ): Promise<FingerprintDetails> {\n    const startTime = getTimestamp();\n\n    // Resolve options\n    const resolvedOptions =\n      typeof options === 'string' ? getPresetOptions(options) : mergeOptions(options);\n\n    const components: FingerprintDetails['components'] = {\n      basic: { name: 'basic', value: null, success: false },\n    };\n\n    // Get basic fingerprint (always included)\n    const basicHash = this.get();\n    components.basic = {\n      name: 'basic',\n      value: basicHash,\n      success: true,\n    };\n\n    const hashes: (string | null)[] = [basicHash];\n    let successCount = 1;\n    let totalCount = 1;\n\n    // Collect advanced fingerprints based on options\n    const tasks: Promise<void>[] = [];\n\n    // Canvas fingerprint\n    if (resolvedOptions.canvas) {\n      totalCount++;\n      tasks.push(\n        (async () => {\n          const { result, duration } = await measureAsync(() =>\n            getCanvasFingerprint({ timeout: resolvedOptions.methodTimeout })\n          );\n          components.canvas = {\n            name: 'canvas',\n            value: result,\n            success: result !== null,\n            duration,\n          };\n          if (result) {\n            hashes.push(result);\n            successCount++;\n          }\n        })()\n      );\n    }\n\n    // WebGL fingerprint\n    if (resolvedOptions.webgl) {\n      totalCount++;\n      tasks.push(\n        (async () => {\n          const { result, duration } = await measureAsync(() =>\n            getWebGLFingerprint({ timeout: resolvedOptions.methodTimeout })\n          );\n          components.webgl = {\n            name: 'webgl',\n            value: result,\n            success: result !== null,\n            duration,\n          };\n          if (result) {\n            hashes.push(result);\n            successCount++;\n          }\n        })()\n      );\n    }\n\n    // Audio fingerprint\n    if (resolvedOptions.audio) {\n      totalCount++;\n      tasks.push(\n        (async () => {\n          const { result, duration } = await measureAsync(() =>\n            getAudioFingerprint({ timeout: resolvedOptions.methodTimeout })\n          );\n          components.audio = {\n            name: 'audio',\n            value: result,\n            success: result !== null,\n            duration,\n          };\n          if (result) {\n            hashes.push(result);\n            successCount++;\n          }\n        })()\n      );\n    }\n\n    // Font fingerprint\n    if (resolvedOptions.fonts) {\n      totalCount++;\n      const fontList = Array.isArray(resolvedOptions.fonts) ? resolvedOptions.fonts : undefined;\n      tasks.push(\n        (async () => {\n          const { result, duration } = await measureAsync(() =>\n            getFontFingerprint({ timeout: resolvedOptions.methodTimeout, fonts: fontList })\n          );\n          components.fonts = {\n            name: 'fonts',\n            value: result,\n            success: result !== null,\n            duration,\n          };\n          if (result) {\n            hashes.push(result);\n            successCount++;\n          }\n        })()\n      );\n    }\n\n    // Media devices fingerprint\n    if (resolvedOptions.mediaDevices) {\n      totalCount++;\n      tasks.push(\n        (async () => {\n          const { result, duration } = await measureAsync(() => this.getMediaDevicesHash());\n          components.mediaDevices = {\n            name: 'mediaDevices',\n            value: result,\n            success: result !== null,\n            duration,\n          };\n          if (result) {\n            hashes.push(result);\n            successCount++;\n          }\n        })()\n      );\n    }\n\n    // Network info fingerprint\n    if (resolvedOptions.networkInfo) {\n      totalCount++;\n      const { result, duration } = await measureAsync(() =>\n        Promise.resolve(this.getNetworkInfoHash())\n      );\n      components.networkInfo = {\n        name: 'networkInfo',\n        value: result,\n        success: result !== null,\n        duration,\n      };\n      if (result) {\n        hashes.push(result);\n        successCount++;\n      }\n    }\n\n    // Timezone fingerprint\n    if (resolvedOptions.timezone) {\n      totalCount++;\n      const { result, duration } = await measureAsync(() =>\n        Promise.resolve(this.getTimezoneHash())\n      );\n      components.timezone = {\n        name: 'timezone',\n        value: result,\n        success: result !== null,\n        duration,\n      };\n      if (result) {\n        hashes.push(result);\n        successCount++;\n      }\n    }\n\n    // Incognito detection\n    if (resolvedOptions.incognitoDetection) {\n      totalCount++;\n      tasks.push(\n        (async () => {\n          const { result, duration } = await measureAsync(() => this.detectIncognito());\n          components.incognito = {\n            name: 'incognito',\n            value: result,\n            success: result !== null,\n            duration,\n          };\n          if (result) {\n            hashes.push(result);\n            successCount++;\n          }\n        })()\n      );\n    }\n\n    // Wait for all async tasks with global timeout\n    await withTimeout(Promise.all(tasks), resolvedOptions.timeout ?? 5000, []);\n\n    // Combine all hashes into final UUID\n    const combinedData = combineHashes(hashes);\n    const finalHash = hashMD5(combinedData);\n\n    const uuid = [\n      finalHash.slice(0, 8),\n      finalHash.slice(8, 12),\n      '4' + finalHash.slice(12, 15),\n      'b' + finalHash.slice(15, 18),\n      finalHash.slice(20),\n    ].join('-');\n\n    const endTime = getTimestamp();\n\n    return {\n      uuid,\n      components,\n      confidence: calculateConfidence(totalCount, successCount),\n      duration: endTime - startTime,\n      timestamp: Date.now(),\n    };\n  }\n\n  /**\n   * Get individual fingerprint components (synchronous basic components only)\n   * @returns Object with component hashes\n   */\n  public getComponents(): Record<string, string | null> {\n    const du = this.parse();\n    return {\n      userAgent: hashMD5(du.source),\n      platform: hashMD5(du.platform),\n      os: hashMD5(du.os),\n      browser: hashMD5(`${du.browser}:${du.version}`),\n      screen: hashMD5(`${du.resolution[0]}x${du.resolution[1]}:${du.colorDepth}:${du.pixelDepth}`),\n      hardware: hashMD5(`${du.cpuCores}:${du.isTouchScreen}`),\n      language: hashMD5(du.language),\n    };\n  }\n\n  /**\n   * Check if a fingerprinting feature is supported\n   * @param feature - Feature to check\n   * @returns Whether the feature is supported\n   */\n  public static isFeatureSupported(feature: FingerprintFeature): boolean {\n    return isFeatureSupported(feature);\n  }\n\n  /**\n   * Get media devices fingerprint hash\n   * @returns Promise resolving to hash or null\n   */\n  private async getMediaDevicesHash(): Promise<string | null> {\n    if (!isBrowser()) return null;\n\n    const nav = getNavigator();\n    if (!nav?.mediaDevices?.enumerateDevices) return null;\n\n    try {\n      const devices = await nav.mediaDevices.enumerateDevices();\n\n      const counts = {\n        audioinput: 0,\n        audiooutput: 0,\n        videoinput: 0,\n      };\n\n      for (const device of devices) {\n        if (device.kind in counts) {\n          counts[device.kind as keyof typeof counts]++;\n        }\n      }\n\n      return hashMD5(`${counts.audioinput}:${counts.audiooutput}:${counts.videoinput}`);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Get network information fingerprint hash\n   * @returns Hash or null\n   */\n  private getNetworkInfoHash(): string | null {\n    if (!isBrowser()) return null;\n\n    const nav = getNavigator() as Navigator & {\n      connection?: {\n        effectiveType?: string;\n        downlink?: number;\n        rtt?: number;\n      };\n    };\n\n    if (!nav?.connection) return null;\n\n    try {\n      const conn = nav.connection;\n      const parts = [\n        conn.effectiveType ?? 'unknown',\n        conn.downlink?.toString() ?? 'unknown',\n        conn.rtt?.toString() ?? 'unknown',\n      ];\n      return hashMD5(parts.join(':'));\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Get timezone fingerprint hash\n   * @returns Hash or null\n   */\n  private getTimezoneHash(): string | null {\n    try {\n      const parts: string[] = [];\n\n      // Timezone offset\n      parts.push(`offset:${new Date().getTimezoneOffset()}`);\n\n      // Intl timezone\n      if (typeof Intl !== 'undefined') {\n        const options = Intl.DateTimeFormat().resolvedOptions();\n        parts.push(`tz:${options.timeZone ?? 'unknown'}`);\n        parts.push(`locale:${options.locale ?? 'unknown'}`);\n      }\n\n      // Languages\n      const nav = getNavigator();\n      if (nav?.languages) {\n        parts.push(`langs:${nav.languages.join(',')}`);\n      }\n\n      return hashMD5(parts.join('|'));\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Detect incognito/private browsing mode\n   * @returns Promise resolving to hash or null\n   */\n  private async detectIncognito(): Promise<string | null> {\n    if (!isBrowser()) return null;\n\n    try {\n      const indicators: string[] = [];\n\n      // Storage quota check\n      if (navigator.storage?.estimate) {\n        const estimate = await navigator.storage.estimate();\n        const quota = estimate.quota ?? 0;\n        // Private mode typically has significantly lower quota\n        indicators.push(`quota:${quota < 120000000 ? 'low' : 'normal'}`);\n      }\n\n      // IndexedDB check\n      try {\n        const db = indexedDB.open('test');\n        db.onerror = () => indicators.push('idb:blocked');\n        await new Promise<void>((resolve) => {\n          db.onsuccess = () => {\n            indicators.push('idb:available');\n            resolve();\n          };\n          db.onerror = () => {\n            indicators.push('idb:blocked');\n            resolve();\n          };\n          setTimeout(resolve, 100);\n        });\n      } catch {\n        indicators.push('idb:error');\n      }\n\n      // FileSystem API availability check\n      // Some browsers disable File System Access API in private mode\n      if ('showOpenFilePicker' in window) {\n        indicators.push('fsapi:available');\n      } else {\n        indicators.push('fsapi:unavailable');\n      }\n\n      // Cookie check\n      indicators.push(`cookies:${navigator.cookieEnabled ? 'enabled' : 'disabled'}`);\n\n      return hashMD5(indicators.join('|'));\n    } catch {\n      return null;\n    }\n  }\n}\n"]}