vendor: 6,494 bytes, lines 1-172
1///////////////////////////////////////////////////////////////////////////////// 2/* UAParser.js v0.7.31 3 Copyright © 2012-2021 Faisal Salman <[email protected]> 4 MIT License *//* 5 Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data. 6 Supports browser & node.js environment. 7 Demo : https://faisalman.github.io/ua-parser-js 8 Source : https://github.com/faisalman/ua-parser-js */ 9///////////////////////////////////////////////////////////////////////////////// 10 11(function (window, undefined) { 12 13 'use strict'; 14 15 ////////////// 16 // Constants 17 ///////////// 18 19 20 var LIBVERSION = '0.7.31', 21 EMPTY = '', 22 UNKNOWN = '?', 23 FUNC_TYPE = 'function', 24 UNDEF_TYPE = 'undefined', 25 OBJ_TYPE = 'object', 26 STR_TYPE = 'string', 27 MAJOR = 'major', 28 MODEL = 'model', 29 NAME = 'name', 30 TYPE = 'type', 31 VENDOR = 'vendor', 32 VERSION = 'version', 33 ARCHITECTURE= 'architecture', 34 CONSOLE = 'console', 35 MOBILE = 'mobile', 36 TABLET = 'tablet', 37 SMARTTV = 'smarttv', 38 WEARABLE = 'wearable', 39 EMBEDDED = 'embedded', 40 UA_MAX_LENGTH = 350; 41 42 var AMAZON = 'Amazon', 43 APPLE = 'Apple', 44 ASUS = 'ASUS', 45 BLACKBERRY = 'BlackBerry', 46 BROWSER = 'Browser', 47 CHROME = 'Chrome', 48 EDGE = 'Edge', 49 FIREFOX = 'Firefox', 50 GOOGLE = 'Google', 51 HUAWEI = 'Huawei', 52 LG = 'LG', 53 MICROSOFT = 'Microsoft', 54 MOTOROLA = 'Motorola', 55 OPERA = 'Opera', 56 SAMSUNG = 'Samsung', 57 SONY = 'Sony', 58 XIAOMI = 'Xiaomi', 59 ZEBRA = 'Zebra', 60 FACEBOOK = 'Facebook'; 61 62 /////////// 63 // Helper 64 ////////// 65 66 var extend = function (regexes, extensions) { 67 var mergedRegexes = {}; 68 for (var i in regexes) { 69 if (extensions[i] && extensions[i].length % 2 === 0) { 70 mergedRegexes[i] = extensions[i].concat(regexes[i]); 71 } else { 72 mergedRegexes[i] = regexes[i]; 73 } 74 } 75 return mergedRegexes; 76 }, 77 enumerize = function (arr) { 78 var enums = {}; 79 for (var i=0; i<arr.length; i++) { 80 enums[arr[i].toUpperCase()] = arr[i]; 81 } 82 return enums; 83 }, 84 has = function (str1, str2) { 85 return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false; 86 }, 87 lowerize = function (str) { 88 return str.toLowerCase(); 89 }, 90 majorize = function (version) { 91 return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined; 92 }, 93 trim = function (str, len) { 94 if (typeof(str) === STR_TYPE) { 95 str = str.replace(/^\s\s*/, EMPTY).replace(/\s\s*$/, EMPTY); 96 return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH); 97 } 98 }; 99 100 /////////////// 101 // Map helper 102 ////////////// 103 104 var rgxMapper = function (ua, arrays) { 105 106 var i = 0, j, k, p, q, matches, match; 107 108 // loop through all regexes maps 109 while (i < arrays.length && !matches) { 110 111 var regex = arrays[i], // even sequence (0,2,4,..) 112 props = arrays[i + 1]; // odd sequence (1,3,5,..) 113 j = k = 0; 114 115 // try matching uastring with regexes 116 while (j < regex.length && !matches) { 117 118 matches = regex[j++].exec(ua); 119 120 if (!!matches) { 121 for (p = 0; p < props.length; p++) { 122 match = matches[++k]; 123 q = props[p]; 124 // check if given property is actually array 125 if (typeof q === OBJ_TYPE && q.length > 0) { 126 if (q.length === 2) { 127 if (typeof q[1] == FUNC_TYPE) { 128 // assign modified match 129 this[q[0]] = q[1].call(this, match); 130 } else { 131 // assign given value, ignore regex match 132 this[q[0]] = q[1]; 133 } 134 } else if (q.length === 3) { 135 // check whether function or regex 136 if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) { 137 // call function (usually string mapper) 138 this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined; 139 } else { 140 // sanitize match using given regex 141 this[q[0]] = match ? match.replace(q[1], q[2]) : undefined; 142 } 143 } else if (q.length === 4) { 144 this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined; 145 } 146 } else { 147 this[q] = match ? match : undefined; 148 } 149 } 150 } 151 } 152 i += 2; 153 } 154 }, 155 156 strMapper = function (str, map) { 157 158 for (var i in map) { 159 // check if current value is array 160 if (typeof map[i] === OBJ_TYPE && map[i].length > 0) { 161 for (var j = 0; j < map[i].length; j++) { 162 if (has(map[i][j], str)) { 163 return (i === UNKNOWN) ? undefined : i; 164 } 165 } 166 } else if (has(map[i], str)) { 167 return (i === UNKNOWN) ? undefined : i; 168 } 169 } 170 return str; 171 }; 172
vendor: 4,223 bytes, lines 173-252
173 /////////////// 174 // String map 175 ////////////// 176 177 // Safari < 3.0 178 var oldSafariMap = { 179 '1.0' : '/8', 180 '1.2' : '/1', 181 '1.3' : '/3', 182 '2.0' : '/412', 183 '2.0.2' : '/416', 184 '2.0.3' : '/417', 185 '2.0.4' : '/419', 186 '?' : '/' 187 }, 188 windowsVersionMap = { 189 'ME' : '4.90', 190 'NT 3.11' : 'NT3.51', 191 'NT 4.0' : 'NT4.0', 192 '2000' : 'NT 5.0', 193 'XP' : ['NT 5.1', 'NT 5.2'], 194 'Vista' : 'NT 6.0', 195 '7' : 'NT 6.1', 196 '8' : 'NT 6.2', 197 '8.1' : 'NT 6.3', 198 '10' : ['NT 6.4', 'NT 10.0'], 199 'RT' : 'ARM' 200 }; 201 202 ////////////// 203 // Regex map 204 ///////////// 205 206 var regexes = { 207 208 browser : [[ 209 210 /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS 211 ], [VERSION, [NAME, 'Chrome']], [ 212 /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge 213 ], [VERSION, [NAME, 'Edge']], [ 214 215 // Presto based 216 /(opera mini)\/([-\w\.]+)/i, // Opera Mini 217 /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet 218 /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera 219 ], [NAME, VERSION], [ 220 /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0 221 ], [VERSION, [NAME, OPERA+' Mini']], [ 222 /\bopr\/([\w\.]+)/i // Opera Webkit 223 ], [VERSION, [NAME, OPERA]], [ 224 225 // Mixed 226 /(kindle)\/([\w\.]+)/i, // Kindle 227 /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer 228 // Trident based 229 /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser 230 /(ba?idubrowser)[\/ ]?([\w\.]+)/i, // Baidu Browser 231 /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer 232 233 // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon 234 /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i, 235 // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ 236 /(weibo)__([\d\.]+)/i // Weibo 237 ], [NAME, VERSION], [ 238 /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser 239 ], [VERSION, [NAME, 'UC'+BROWSER]], [ 240 /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser 241 /\bqbcore\/([\w\.]+).+microm/i 242 ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [ 243 /micromessenger\/([\w\.]+)/i // WeChat 244 ], [VERSION, [NAME, 'WeChat']], [ 245 /konqueror\/([\w\.]+)/i // Konqueror 246 ], [VERSION, [NAME, 'Konqueror']], [ 247 /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11 248 ], [VERSION, [NAME, 'IE']], [ 249 /yabrowser\/([\w\.]+)/i // Yandex 250 ], [VERSION, [NAME, 'Yandex']], [ 251 /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser 252 ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
vendor: 28,583 bytes, lines 253-731
253 /\bfocus\/([\w\.]+)/i // Firefox Focus 254 ], [VERSION, [NAME, FIREFOX+' Focus']], [ 255 /\bopt\/([\w\.]+)/i // Opera Touch 256 ], [VERSION, [NAME, OPERA+' Touch']], [ 257 /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser 258 ], [VERSION, [NAME, 'Coc Coc']], [ 259 /dolfin\/([\w\.]+)/i // Dolphin 260 ], [VERSION, [NAME, 'Dolphin']], [ 261 /coast\/([\w\.]+)/i // Opera Coast 262 ], [VERSION, [NAME, OPERA+' Coast']], [ 263 /miuibrowser\/([\w\.]+)/i // MIUI Browser 264 ], [VERSION, [NAME, 'MIUI '+BROWSER]], [ 265 /fxios\/([-\w\.]+)/i // Firefox for iOS 266 ], [VERSION, [NAME, FIREFOX]], [ 267 /\bqihu|(qi?ho?o?|360)browser/i // 360 268 ], [[NAME, '360 '+BROWSER]], [ 269 /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i 270 ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser 271 /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon 272 ], [[NAME, /_/g, ' '], VERSION], [ 273 /(electron)\/([\w\.]+) safari/i, // Electron-based App 274 /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla 275 /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser 276 ], [NAME, VERSION], [ 277 /(metasr)[\/ ]?([\w\.]+)/i, // SouGouBrowser 278 /(lbbrowser)/i, // LieBao Browser 279 /\[(linkedin)app\]/i // LinkedIn App for iOS & Android 280 ], [NAME], [ 281 282 // WebView 283 /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android 284 ], [[NAME, FACEBOOK], VERSION], [ 285 /safari (line)\/([\w\.]+)/i, // Line App for iOS 286 /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android 287 /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram 288 ], [NAME, VERSION], [ 289 /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS 290 ], [VERSION, [NAME, 'GSA']], [ 291 292 /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless 293 ], [VERSION, [NAME, CHROME+' Headless']], [ 294 295 / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView 296 ], [[NAME, CHROME+' WebView'], VERSION], [ 297 298 /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser 299 ], [VERSION, [NAME, 'Android '+BROWSER]], [ 300 301 /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia 302 ], [NAME, VERSION], [ 303 304 /version\/([\w\.]+) .*mobile\/\w+ (safari)/i // Mobile Safari 305 ], [VERSION, [NAME, 'Mobile Safari']], [ 306 /version\/([\w\.]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile 307 ], [VERSION, NAME], [ 308 /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 309 ], [NAME, [VERSION, strMapper, oldSafariMap]], [ 310 311 /(webkit|khtml)\/([\w\.]+)/i 312 ], [NAME, VERSION], [ 313 314 // Gecko based 315 /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape 316 ], [[NAME, 'Netscape'], VERSION], [ 317 /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality 318 ], [VERSION, [NAME, FIREFOX+' Reality']], [ 319 /ekiohf.+(flow)\/([\w\.]+)/i, // Flow 320 /(swiftfox)/i, // Swiftfox 321 /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i, 322 // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar 323 /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i, 324 // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix 325 /(firefox)\/([\w\.]+)/i, // Other Firefox-based 326 /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla 327 328 // Other 329 /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i, 330 // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser 331 /(links) \(([\w\.]+)/i // Links 332 ], [NAME, VERSION] 333 ], 334 335 cpu : [[ 336 337 /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64) 338 ], [[ARCHITECTURE, 'amd64']], [ 339 340 /(ia32(?=;))/i // IA32 (quicktime) 341 ], [[ARCHITECTURE, lowerize]], [ 342 343 /((?:i[346]|x)86)[;\)]/i // IA32 (x86) 344 ], [[ARCHITECTURE, 'ia32']], [ 345 346 /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64 347 ], [[ARCHITECTURE, 'arm64']], [ 348 349 /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF 350 ], [[ARCHITECTURE, 'armhf']], [ 351 352 // PocketPC mistakenly identified as PowerPC 353 /windows (ce|mobile); ppc;/i 354 ], [[ARCHITECTURE, 'arm']], [ 355 356 /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC 357 ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [ 358 359 /(sun4\w)[;\)]/i // SPARC 360 ], [[ARCHITECTURE, 'sparc']], [ 361 362 /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i 363 // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC 364 ], [[ARCHITECTURE, lowerize]] 365 ], 366 367 device : [[ 368 369 ////////////////////////// 370 // MOBILES & TABLETS 371 // Ordered by popularity 372 ///////////////////////// 373 374 // Samsung 375 /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i 376 ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [ 377 /\b((?:s[cgp]h|gt|sm)-\w+|galaxy nexus)/i, 378 /samsung[- ]([-\w]+)/i, 379 /sec-(sgh\w+)/i 380 ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [ 381 382 // Apple 383 /\((ip(?:hone|od)[\w ]*);/i // iPod/iPhone 384 ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [ 385 /\((ipad);[-\w\),; ]+apple/i, // iPad 386 /applecoremedia\/[\w\.]+ \((ipad)/i, 387 /\b(ipad)\d\d?,\d\d?[;\]].+ios/i 388 ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [ 389 390 // Huawei 391 /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i 392 ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [ 393 /(?:huawei|honor)([-\w ]+)[;\)]/i, 394 /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i 395 ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [ 396 397 // Xiaomi 398 /\b(poco[\w ]+)(?: bui|\))/i, // Xiaomi POCO 399 /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models 400 /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi 401 /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi 402 /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi 403 ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [ 404 /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets 405 ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [ 406 407 // OPPO 408 /; (\w+) bui.+ oppo/i, 409 /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i 410 ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [ 411 412 // Vivo 413 /vivo (\w+)(?: bui|\))/i, 414 /\b(v[12]\d{3}\w?[at])(?: bui|;)/i 415 ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [ 416 417 // Realme 418 /\b(rmx[12]\d{3})(?: bui|;|\))/i 419 ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [ 420 421 // Motorola 422 /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i, 423 /\bmot(?:orola)?[- ](\w*)/i, 424 /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i 425 ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [ 426 /\b(mz60\d|xoom[2 ]{0,2}) build\//i 427 ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [ 428 429 // LG 430 /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i 431 ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [ 432 /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i, 433 /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i, 434 /\blg-?([\d\w]+) bui/i 435 ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [ 436 437 // Lenovo 438 /(ideatab[-\w ]+)/i, 439 /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i 440 ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [ 441 442 // Nokia 443 /(?:maemo|nokia).*(n900|lumia \d+)/i, 444 /nokia[-_ ]?([-\w\.]*)/i 445 ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [ 446 447 // Google 448 /(pixel c)\b/i // Google Pixel C 449 ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [ 450 /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel 451 ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [ 452 453 // Sony 454 /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i 455 ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [ 456 /sony tablet [ps]/i, 457 /\b(?:sony)?sgp\w+(?: bui|\))/i 458 ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [ 459 460 // OnePlus 461 / (kb2005|in20[12]5|be20[12][59])\b/i, 462 /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i 463 ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [ 464 465 // Amazon 466 /(alexa)webm/i, 467 /(kf[a-z]{2}wi)( bui|\))/i, // Kindle Fire without Silk 468 /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD 469 ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [ 470 /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone 471 ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [ 472 473 // BlackBerry 474 /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook 475 ], [MODEL, VENDOR, [TYPE, TABLET]], [ 476 /\b((?:bb[a-f]|st[hv])100-\d)/i, 477 /\(bb10; (\w+)/i // BlackBerry 10 478 ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [ 479 480 // Asus 481 /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i 482 ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [ 483 / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i 484 ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [ 485 486 // HTC 487 /(nexus 9)/i // HTC Nexus 9 488 ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [ 489 /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC 490 491 // ZTE 492 /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i, 493 /(alcatel|geeksphone|nexian|panasonic|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony 494 ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [ 495 496 // Acer 497 /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i 498 ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [ 499 500 // Meizu 501 /droid.+; (m[1-5] note) bui/i, 502 /\bmz-([-\w]{2,})/i 503 ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [ 504 505 // Sharp 506 /\b(sh-?[altvz]?\d\d[a-ekm]?)/i 507 ], [MODEL, [VENDOR, 'Sharp'], [TYPE, MOBILE]], [ 508 509 // MIXED 510 /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i, 511 // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron 512 /(hp) ([\w ]+\w)/i, // HP iPAQ 513 /(asus)-?(\w+)/i, // Asus 514 /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia 515 /(lenovo)[-_ ]?([-\w]+)/i, // Lenovo 516 /(jolla)/i, // Jolla 517 /(oppo) ?([\w ]+) bui/i // OPPO 518 ], [VENDOR, MODEL, [TYPE, MOBILE]], [ 519 520 /(archos) (gamepad2?)/i, // Archos 521 /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad 522 /(kindle)\/([\w\.]+)/i, // Kindle 523 /(nook)[\w ]+build\/(\w+)/i, // Nook 524 /(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak 525 /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets 526 /(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets 527 /(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets 528 /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone 529 ], [VENDOR, MODEL, [TYPE, TABLET]], [ 530 531 /(surface duo)/i // Surface Duo 532 ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [ 533 /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone 534 ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [ 535 /(u304aa)/i // AT&T 536 ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [ 537 /\bsie-(\w*)/i // Siemens 538 ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [ 539 /\b(rct\w+) b/i // RCA Tablets 540 ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [ 541 /\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets 542 ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [ 543 /\b(q(?:mv|ta)\w+) b/i // Verizon Tablet 544 ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [ 545 /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet 546 ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [ 547 /\b(tm\d{3}\w+) b/i 548 ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [ 549 /\b(k88) b/i // ZTE K Series Tablet 550 ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [ 551 /\b(nx\d{3}j) b/i // ZTE Nubia 552 ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [ 553 /\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile 554 ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [ 555 /\b(zur\d{3}) b/i // Swiss ZUR Tablet 556 ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [ 557 /\b((zeki)?tb.*\b) b/i // Zeki Tablets 558 ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [ 559 /\b([yr]\d{2}) b/i, 560 /\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet 561 ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [ 562 /\b(ns-?\w{0,9}) b/i // Insignia Tablets 563 ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [ 564 /\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets 565 ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [ 566 /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones 567 ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ 568 /\b(lvtel\-)?(v1[12]) b/i // LvTel Phones 569 ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [ 570 /\b(ph-1) /i // Essential PH-1 571 ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ 572 /\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets 573 ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [ 574 /\b(trio[-\w\. ]+) b/i // MachSpeed Tablets 575 ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [ 576 /\btu_(1491) b/i // Rotor Tablets 577 ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [ 578 /(shield[\w ]+) b/i // Nvidia Shield Tablets 579 ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [ 580 /(sprint) (\w+)/i // Sprint Phones 581 ], [VENDOR, MODEL, [TYPE, MOBILE]], [ 582 /(kin\.[onetw]{3})/i // Microsoft Kin 583 ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [ 584 /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra 585 ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [ 586 /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i 587 ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [ 588 589 /////////////////// 590 // CONSOLES 591 /////////////////// 592 593 /(ouya)/i, // Ouya 594 /(nintendo) ([wids3utch]+)/i // Nintendo 595 ], [VENDOR, MODEL, [TYPE, CONSOLE]], [ 596 /droid.+; (shield) bui/i // Nvidia 597 ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [ 598 /(playstation [345portablevi]+)/i // Playstation 599 ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [ 600 /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox 601 ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [ 602 603 /////////////////// 604 // SMARTTVS 605 /////////////////// 606 607 /smart-tv.+(samsung)/i // Samsung 608 ], [VENDOR, [TYPE, SMARTTV]], [ 609 /hbbtv.+maple;(\d+)/i 610 ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [ 611 /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV 612 ], [[VENDOR, LG], [TYPE, SMARTTV]], [ 613 /(apple) ?tv/i // Apple TV 614 ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [ 615 /crkey/i // Google Chromecast 616 ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [ 617 /droid.+aft(\w)( bui|\))/i // Fire TV 618 ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [ 619 /\(dtv[\);].+(aquos)/i // Sharp 620 ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [ 621 /(bravia[\w- ]+) bui/i // Sony 622 ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [ 623 /(mitv-\w{5}) bui/i // Xiaomi 624 ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [ 625 /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku 626 /hbbtv\/\d+\.\d+\.\d+ +\([\w ]*; *(\w[^;]*);([^;]*)/i // HbbTV devices 627 ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [ 628 /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors 629 ], [[TYPE, SMARTTV]], [ 630 631 /////////////////// 632 // WEARABLES 633 /////////////////// 634 635 /((pebble))app/i // Pebble 636 ], [VENDOR, MODEL, [TYPE, WEARABLE]], [ 637 /droid.+; (glass) \d/i // Google Glass 638 ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [ 639 /droid.+; (wt63?0{2,3})\)/i 640 ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [ 641 /(quest( 2)?)/i // Oculus Quest 642 ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [ 643 644 /////////////////// 645 // EMBEDDED 646 /////////////////// 647 648 /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla 649 ], [VENDOR, [TYPE, EMBEDDED]], [ 650 651 //////////////////// 652 // MIXED (GENERIC) 653 /////////////////// 654 655 /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors 656 ], [MODEL, [TYPE, MOBILE]], [ 657 /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors 658 ], [MODEL, [TYPE, TABLET]], [ 659 /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet 660 ], [[TYPE, TABLET]], [ 661 /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile 662 ], [[TYPE, MOBILE]], [ 663 /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device 664 ], [MODEL, [VENDOR, 'Generic']] 665 ], 666 667 engine : [[ 668 669 /windows.+ edge\/([\w\.]+)/i // EdgeHTML 670 ], [VERSION, [NAME, EDGE+'HTML']], [ 671 672 /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink 673 ], [VERSION, [NAME, 'Blink']], [ 674 675 /(presto)\/([\w\.]+)/i, // Presto 676 /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna 677 /ekioh(flow)\/([\w\.]+)/i, // Flow 678 /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links 679 /(icab)[\/ ]([23]\.[\d\.]+)/i // iCab 680 ], [NAME, VERSION], [ 681 682 /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko 683 ], [VERSION, NAME] 684 ], 685 686 os : [[ 687 688 // Windows 689 /microsoft (windows) (vista|xp)/i // Windows (iTunes) 690 ], [NAME, VERSION], [ 691 /(windows) nt 6\.2; (arm)/i, // Windows RT 692 /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i, // Windows Phone 693 /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i 694 ], [NAME, [VERSION, strMapper, windowsVersionMap]], [ 695 /(win(?=3|9|n)|win 9x )([nt\d\.]+)/i 696 ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [ 697 698 // iOS/macOS 699 /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS 700 /cfnetwork\/.+darwin/i 701 ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ 702 /(mac os x) ?([\w\. ]*)/i, 703 /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS 704 ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [ 705 706 // Mobile OSes 707 /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS 708 ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS 709 /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i, 710 /(blackberry)\w*\/([\w\.]*)/i, // Blackberry 711 /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS 712 /\((series40);/i // Series 40 713 ], [NAME, VERSION], [ 714 /\(bb(10);/i // BlackBerry 10 715 ], [VERSION, [NAME, BLACKBERRY]], [ 716 /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian 717 ], [VERSION, [NAME, 'Symbian']], [ 718 /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS 719 ], [VERSION, [NAME, FIREFOX+' OS']], [ 720 /web0s;.+rt(tv)/i, 721 /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS 722 ], [VERSION, [NAME, 'webOS']], [ 723 724 // Google Chromecast 725 /crkey\/([\d\.]+)/i // Google Chromecast 726 ], [VERSION, [NAME, CHROME+'cast']], [ 727 /(cros) [\w]+ ([\w\.]+\w)/i // Chromium OS 728 ], [[NAME, 'Chromium OS'], VERSION],[ 729 730 // Console 731 /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo
vendor: 4,858 bytes, lines 731-833
731/Playstation 732 /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S) 733 734 // Other 735 /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm 736 /(mint)[\/\(\) ]?(\w*)/i, // Mint 737 /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux 738 /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i, 739 // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire 740 /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux 741 /(gnu) ?([\w\.]*)/i, // GNU 742 /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly 743 /(haiku) (\w+)/i // Haiku 744 ], [NAME, VERSION], [ 745 /(sunos) ?([\w\.\d]*)/i // Solaris 746 ], [[NAME, 'Solaris'], VERSION], [ 747 /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris 748 /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX 749 /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX 750 /(unix) ?([\w\.]*)/i // UNIX 751 ], [NAME, VERSION] 752 ] 753 }; 754 755 ///////////////// 756 // Constructor 757 //////////////// 758 759 var UAParser = function (ua, extensions) { 760 761 if (typeof ua === OBJ_TYPE) { 762 extensions = ua; 763 ua = undefined; 764 } 765 766 if (!(this instanceof UAParser)) { 767 return new UAParser(ua, extensions).getResult(); 768 } 769 770 var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY); 771 var _rgxmap = extensions ? extend(regexes, extensions) : regexes; 772 773 this.getBrowser = function () { 774 var _browser = {}; 775 _browser[NAME] = undefined; 776 _browser[VERSION] = undefined; 777 rgxMapper.call(_browser, _ua, _rgxmap.browser); 778 _browser.major = majorize(_browser.version); 779 return _browser; 780 }; 781 this.getCPU = function () { 782 var _cpu = {}; 783 _cpu[ARCHITECTURE] = undefined; 784 rgxMapper.call(_cpu, _ua, _rgxmap.cpu); 785 return _cpu; 786 }; 787 this.getDevice = function () { 788 var _device = {}; 789 _device[VENDOR] = undefined; 790 _device[MODEL] = undefined; 791 _device[TYPE] = undefined; 792 rgxMapper.call(_device, _ua, _rgxmap.device); 793 return _device; 794 }; 795 this.getEngine = function () { 796 var _engine = {}; 797 _engine[NAME] = undefined; 798 _engine[VERSION] = undefined; 799 rgxMapper.call(_engine, _ua, _rgxmap.engine); 800 return _engine; 801 }; 802 this.getOS = function () { 803 var _os = {}; 804 _os[NAME] = undefined; 805 _os[VERSION] = undefined; 806 rgxMapper.call(_os, _ua, _rgxmap.os); 807 return _os; 808 }; 809 this.getResult = function () { 810 return { 811 ua : this.getUA(), 812 browser : this.getBrowser(), 813 engine : this.getEngine(), 814 os : this.getOS(), 815 device : this.getDevice(), 816 cpu : this.getCPU() 817 }; 818 }; 819 this.getUA = function () { 820 return _ua; 821 }; 822 this.setUA = function (ua) { 823 _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua; 824 return this; 825 }; 826 this.setUA(_ua); 827 return this; 828 }; 829 830 UAParser.VERSION = LIBVERSION; 831 UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]); 832 UAParser.CPU = enumerize([ARCHITECTURE]); 833 UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
834 UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]); 835 836 /////////// 837 // Export 838 ////////// 839 840 // check js environment 841 if (typeof(exports) !== UNDEF_TYPE) { 842 // nodejs env 843 if (typeof module !== UNDEF_TYPE && module.exports) { 844 exports = module.exports = UAParser; 845 } 846 exports.UAParser = UAParser; 847 } else { 848 // requirejs env (optional) 849 if (typeof(define) === FUNC_TYPE && define.amd) { 850 define(function () { 851 return UAParser; 852 }); 853 } else if (typeof window !== UNDEF_TYPE) { 854 // browser env 855 window.UAParser = UAParser; 856 } 857 } 858 859 // jQuery/Zepto specific (optional) 860 // Note: 861 // In AMD env the global scope should be kept clean, but jQuery is an exception. 862 // jQuery always exports to global scope, unless jQuery.noConflict(true) is used, 863 // and we should catch that. 864 var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto); 865 if ($ && !$.ua) { 866 var parser = new UAParser(); 867 $.ua = parser.getResult(); 868 $.ua.get = function () { 869 return parser.getUA(); 870 }; 871 $.ua.set = function (ua) { 872 parser.setUA(ua); 873 var result = parser.getResult(); 874 for (var prop in result) { 875 $.ua[prop] = result[prop]; 876 } 877 }; 878 } 879 880})(typeof window === 'object' ? window : this);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.