@bigbinary/neeto-molecules 4.0.46 → 4.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/BrowserSupport.js +53 -22
  2. package/dist/BrowserSupport.js.map +1 -1
  3. package/dist/DownloadMobileAppCallout.js +5 -4
  4. package/dist/DownloadMobileAppCallout.js.map +1 -1
  5. package/dist/FloatingActionMenu.js +17 -11
  6. package/dist/FloatingActionMenu.js.map +1 -1
  7. package/dist/KeyboardShortcuts.js +5 -5
  8. package/dist/KeyboardShortcuts.js.map +1 -1
  9. package/dist/cjs/BrowserSupport.js +53 -22
  10. package/dist/cjs/BrowserSupport.js.map +1 -1
  11. package/dist/cjs/DownloadMobileAppCallout.js +5 -4
  12. package/dist/cjs/DownloadMobileAppCallout.js.map +1 -1
  13. package/dist/cjs/FloatingActionMenu.js +16 -10
  14. package/dist/cjs/FloatingActionMenu.js.map +1 -1
  15. package/dist/cjs/KeyboardShortcuts.js +5 -5
  16. package/dist/cjs/KeyboardShortcuts.js.map +1 -1
  17. package/dist/cjs/ua-parser-E0eEtHJZ.js +1477 -0
  18. package/dist/cjs/ua-parser-E0eEtHJZ.js.map +1 -0
  19. package/dist/ua-parser-rRwDJPFB.js +1475 -0
  20. package/dist/ua-parser-rRwDJPFB.js.map +1 -0
  21. package/package.json +2 -2
  22. package/src/translations/ar.json +6 -1
  23. package/src/translations/bg.json +6 -1
  24. package/src/translations/ca.json +6 -1
  25. package/src/translations/cs.json +6 -1
  26. package/src/translations/da.json +6 -1
  27. package/src/translations/de.json +6 -1
  28. package/src/translations/es-MX.json +6 -1
  29. package/src/translations/es.json +6 -1
  30. package/src/translations/et.json +6 -1
  31. package/src/translations/fi.json +6 -1
  32. package/src/translations/fil.json +6 -1
  33. package/src/translations/fr.json +6 -1
  34. package/src/translations/hi.json +6 -1
  35. package/src/translations/hr.json +6 -1
  36. package/src/translations/id.json +6 -1
  37. package/src/translations/it.json +6 -1
  38. package/src/translations/ja.json +6 -1
  39. package/src/translations/ko.json +6 -1
  40. package/src/translations/nl.json +6 -1
  41. package/src/translations/pl.json +6 -1
  42. package/src/translations/pt-BR.json +6 -1
  43. package/src/translations/pt.json +6 -1
  44. package/src/translations/ro.json +6 -1
  45. package/src/translations/ru.json +6 -1
  46. package/src/translations/sk.json +6 -1
  47. package/src/translations/sl.json +6 -1
  48. package/src/translations/sv.json +6 -1
  49. package/src/translations/th.json +6 -1
  50. package/src/translations/tr.json +6 -1
  51. package/src/translations/uk.json +6 -1
  52. package/src/translations/vi.json +6 -1
  53. package/src/translations/zh-CN.json +6 -1
  54. package/src/translations/zh-TW.json +6 -1
  55. package/types/BrowserSupport.d.ts +3 -3
  56. package/dist/cjs/platform-BUcCb8Jx.js +0 -1254
  57. package/dist/cjs/platform-BUcCb8Jx.js.map +0 -1
  58. package/dist/platform-F44zJ4Xh.js +0 -1252
  59. package/dist/platform-F44zJ4Xh.js.map +0 -1
@@ -0,0 +1,1477 @@
1
+ 'use strict';
2
+
3
+ // Generated ESM version of ua-parser-js
4
+ // DO NOT EDIT THIS FILE!
5
+ // Source: /src/main/ua-parser.js
6
+
7
+ /////////////////////////////////////////////////////////////////////////////////
8
+ /* UAParser.js v2.0.5
9
+ Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
10
+ AGPLv3 License *//*
11
+ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
12
+ Supports browser & node.js environment.
13
+ Demo : https://uaparser.dev
14
+ Source : https://github.com/faisalman/ua-parser-js */
15
+ /////////////////////////////////////////////////////////////////////////////////
16
+
17
+ /* jshint esversion: 6 */
18
+ /* globals window */
19
+
20
+
21
+
22
+ //////////////
23
+ // Constants
24
+ /////////////
25
+
26
+ var LIBVERSION = '2.0.5',
27
+ UA_MAX_LENGTH = 500,
28
+ USER_AGENT = 'user-agent',
29
+ EMPTY = '',
30
+ UNKNOWN = '?',
31
+
32
+ // typeof
33
+ FUNC_TYPE = 'function',
34
+ UNDEF_TYPE = 'undefined',
35
+ OBJ_TYPE = 'object',
36
+ STR_TYPE = 'string',
37
+
38
+ // properties
39
+ UA_BROWSER = 'browser',
40
+ UA_CPU = 'cpu',
41
+ UA_DEVICE = 'device',
42
+ UA_ENGINE = 'engine',
43
+ UA_OS = 'os',
44
+ UA_RESULT = 'result',
45
+
46
+ NAME = 'name',
47
+ TYPE = 'type',
48
+ VENDOR = 'vendor',
49
+ VERSION = 'version',
50
+ ARCHITECTURE= 'architecture',
51
+ MAJOR = 'major',
52
+ MODEL = 'model',
53
+
54
+ // device types
55
+ CONSOLE = 'console',
56
+ MOBILE = 'mobile',
57
+ TABLET = 'tablet',
58
+ SMARTTV = 'smarttv',
59
+ WEARABLE = 'wearable',
60
+ XR = 'xr',
61
+ EMBEDDED = 'embedded',
62
+
63
+ // browser types
64
+ INAPP = 'inapp',
65
+
66
+ // client hints
67
+ BRANDS = 'brands',
68
+ FORMFACTORS = 'formFactors',
69
+ FULLVERLIST = 'fullVersionList',
70
+ PLATFORM = 'platform',
71
+ PLATFORMVER = 'platformVersion',
72
+ BITNESS = 'bitness',
73
+ CH_HEADER = 'sec-ch-ua',
74
+ CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',
75
+ CH_HEADER_ARCH = CH_HEADER + '-arch',
76
+ CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,
77
+ CH_HEADER_FORM_FACTORS = CH_HEADER + '-form-factors',
78
+ CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,
79
+ CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,
80
+ CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
81
+ CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
82
+ CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
83
+
84
+ // device vendors
85
+ AMAZON = 'Amazon',
86
+ APPLE = 'Apple',
87
+ ASUS = 'ASUS',
88
+ BLACKBERRY = 'BlackBerry',
89
+ GOOGLE = 'Google',
90
+ HUAWEI = 'Huawei',
91
+ LENOVO = 'Lenovo',
92
+ HONOR = 'Honor',
93
+ LG = 'LG',
94
+ MICROSOFT = 'Microsoft',
95
+ MOTOROLA = 'Motorola',
96
+ NVIDIA = 'Nvidia',
97
+ ONEPLUS = 'OnePlus',
98
+ OPPO = 'OPPO',
99
+ SAMSUNG = 'Samsung',
100
+ SHARP = 'Sharp',
101
+ SONY = 'Sony',
102
+ XIAOMI = 'Xiaomi',
103
+ ZEBRA = 'Zebra',
104
+
105
+ // browsers
106
+ CHROME = 'Chrome',
107
+ CHROMIUM = 'Chromium',
108
+ CHROMECAST = 'Chromecast',
109
+ EDGE = 'Edge',
110
+ FIREFOX = 'Firefox',
111
+ OPERA = 'Opera',
112
+ FACEBOOK = 'Facebook',
113
+ SOGOU = 'Sogou',
114
+
115
+ PREFIX_MOBILE = 'Mobile ',
116
+ SUFFIX_BROWSER = ' Browser',
117
+
118
+ // os
119
+ WINDOWS = 'Windows';
120
+
121
+ var isWindow = typeof window !== UNDEF_TYPE,
122
+ NAVIGATOR = (isWindow && window.navigator) ?
123
+ window.navigator :
124
+ undefined,
125
+ NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
126
+ NAVIGATOR.userAgentData :
127
+ undefined;
128
+
129
+ ///////////
130
+ // Helper
131
+ //////////
132
+
133
+ var extend = function (defaultRgx, extensions) {
134
+ var mergedRgx = {};
135
+ var extraRgx = extensions;
136
+ if (!isExtensions(extensions)) {
137
+ extraRgx = {};
138
+ for (var i in extensions) {
139
+ for (var j in extensions[i]) {
140
+ extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
141
+ }
142
+ }
143
+ }
144
+ for (var k in defaultRgx) {
145
+ mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
146
+ }
147
+ return mergedRgx;
148
+ },
149
+ enumerize = function (arr) {
150
+ var enums = {};
151
+ for (var i=0; i<arr.length; i++) {
152
+ enums[arr[i].toUpperCase()] = arr[i];
153
+ }
154
+ return enums;
155
+ },
156
+ has = function (str1, str2) {
157
+ if (typeof str1 === OBJ_TYPE && str1.length > 0) {
158
+ for (var i in str1) {
159
+ if (lowerize(str2) == lowerize(str1[i])) return true;
160
+ }
161
+ return false;
162
+ }
163
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
164
+ },
165
+ isExtensions = function (obj, deep) {
166
+ for (var prop in obj) {
167
+ return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
168
+ }
169
+ },
170
+ isString = function (val) {
171
+ return typeof val === STR_TYPE;
172
+ },
173
+ itemListToArray = function (header) {
174
+ if (!header) return undefined;
175
+ var arr = [];
176
+ var tokens = strip(/\\?\"/g, header).split(',');
177
+ for (var i = 0; i < tokens.length; i++) {
178
+ if (tokens[i].indexOf(';') > -1) {
179
+ var token = trim(tokens[i]).split(';v=');
180
+ arr[i] = { brand : token[0], version : token[1] };
181
+ } else {
182
+ arr[i] = trim(tokens[i]);
183
+ }
184
+ }
185
+ return arr;
186
+ },
187
+ lowerize = function (str) {
188
+ return isString(str) ? str.toLowerCase() : str;
189
+ },
190
+ majorize = function (version) {
191
+ return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
192
+ },
193
+ setProps = function (arr) {
194
+ for (var i in arr) {
195
+ if (!arr.hasOwnProperty(i)) continue;
196
+
197
+ var propName = arr[i];
198
+ if (typeof propName == OBJ_TYPE && propName.length == 2) {
199
+ this[propName[0]] = propName[1];
200
+ } else {
201
+ this[propName] = undefined;
202
+ }
203
+ }
204
+ return this;
205
+ },
206
+ strip = function (pattern, str) {
207
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
208
+ },
209
+ stripQuotes = function (str) {
210
+ return strip(/\\?\"/g, str);
211
+ },
212
+ trim = function (str, len) {
213
+ if (isString(str)) {
214
+ str = strip(/^\s\s*/, str);
215
+ return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
216
+ }
217
+ };
218
+
219
+ ///////////////
220
+ // Map helper
221
+ //////////////
222
+
223
+ var rgxMapper = function (ua, arrays) {
224
+
225
+ if(!ua || !arrays) return;
226
+
227
+ var i = 0, j, k, p, q, matches, match;
228
+
229
+ // loop through all regexes maps
230
+ while (i < arrays.length && !matches) {
231
+
232
+ var regex = arrays[i], // even sequence (0,2,4,..)
233
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
234
+ j = k = 0;
235
+
236
+ // try matching uastring with regexes
237
+ while (j < regex.length && !matches) {
238
+
239
+ if (!regex[j]) { break; }
240
+ matches = regex[j++].exec(ua);
241
+
242
+ if (!!matches) {
243
+ for (p = 0; p < props.length; p++) {
244
+ match = matches[++k];
245
+ q = props[p];
246
+ // check if given property is actually array
247
+ if (typeof q === OBJ_TYPE && q.length > 0) {
248
+ if (q.length === 2) {
249
+ if (typeof q[1] == FUNC_TYPE) {
250
+ // assign modified match
251
+ this[q[0]] = q[1].call(this, match);
252
+ } else {
253
+ // assign given value, ignore regex match
254
+ this[q[0]] = q[1];
255
+ }
256
+ } else if (q.length >= 3) {
257
+ // Check whether q[1] FUNCTION or REGEX
258
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
259
+ if (q.length > 3) {
260
+ this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
261
+ } else {
262
+ // call function (usually string mapper)
263
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
264
+ }
265
+ } else {
266
+ if (q.length == 3) {
267
+ // sanitize match using given regex
268
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
269
+ } else if (q.length == 4) {
270
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
271
+ } else if (q.length > 4) {
272
+ this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;
273
+ }
274
+ }
275
+ }
276
+ } else {
277
+ this[q] = match ? match : undefined;
278
+ }
279
+ }
280
+ }
281
+ }
282
+ i += 2;
283
+ }
284
+ },
285
+
286
+ strMapper = function (str, map) {
287
+
288
+ for (var i in map) {
289
+ // check if current value is array
290
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
291
+ for (var j = 0; j < map[i].length; j++) {
292
+ if (has(map[i][j], str)) {
293
+ return (i === UNKNOWN) ? undefined : i;
294
+ }
295
+ }
296
+ } else if (has(map[i], str)) {
297
+ return (i === UNKNOWN) ? undefined : i;
298
+ }
299
+ }
300
+ return map.hasOwnProperty('*') ? map['*'] : str;
301
+ };
302
+
303
+ ///////////////
304
+ // String map
305
+ //////////////
306
+
307
+ var windowsVersionMap = {
308
+ 'ME' : '4.90',
309
+ 'NT 3.51': '3.51',
310
+ 'NT 4.0': '4.0',
311
+ '2000' : ['5.0', '5.01'],
312
+ 'XP' : ['5.1', '5.2'],
313
+ 'Vista' : '6.0',
314
+ '7' : '6.1',
315
+ '8' : '6.2',
316
+ '8.1' : '6.3',
317
+ '10' : ['6.4', '10.0'],
318
+ 'NT' : ''
319
+ },
320
+
321
+ formFactorsMap = {
322
+ 'embedded' : 'Automotive',
323
+ 'mobile' : 'Mobile',
324
+ 'tablet' : ['Tablet', 'EInk'],
325
+ 'smarttv' : 'TV',
326
+ 'wearable' : 'Watch',
327
+ 'xr' : ['VR', 'XR'],
328
+ '?' : ['Desktop', 'Unknown'],
329
+ '*' : undefined
330
+ },
331
+
332
+ browserHintsMap = {
333
+ 'Chrome' : 'Google Chrome',
334
+ 'Edge' : 'Microsoft Edge',
335
+ 'Edge WebView2' : 'Microsoft Edge WebView2',
336
+ 'Chrome WebView': 'Android WebView',
337
+ 'Chrome Headless':'HeadlessChrome',
338
+ 'Huawei Browser': 'HuaweiBrowser',
339
+ 'MIUI Browser' : 'Miui Browser',
340
+ 'Opera Mobi' : 'OperaMobile',
341
+ 'Yandex' : 'YaBrowser'
342
+ };
343
+
344
+ //////////////
345
+ // Regex map
346
+ /////////////
347
+
348
+ var defaultRegexes = {
349
+
350
+ browser : [[
351
+
352
+ // Most common regardless engine
353
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
354
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
355
+ /webview.+edge\/([\w\.]+)/i // Microsoft Edge
356
+ ], [VERSION, [NAME, EDGE+' WebView']], [
357
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
358
+ ], [VERSION, [NAME, 'Edge']], [
359
+
360
+ // Presto based
361
+ /(opera mini)\/([-\w\.]+)/i, // Opera Mini
362
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
363
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
364
+ ], [NAME, VERSION], [
365
+ /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
366
+ ], [VERSION, [NAME, OPERA+' Mini']], [
367
+ /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
368
+ ], [VERSION, [NAME, OPERA+' GX']], [
369
+ /\bopr\/([\w\.]+)/i // Opera Webkit
370
+ ], [VERSION, [NAME, OPERA]], [
371
+
372
+ // Mixed
373
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
374
+ ], [VERSION, [NAME, 'Baidu']], [
375
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
376
+ ], [VERSION, [NAME, 'Maxthon']], [
377
+ /(kindle)\/([\w\.]+)/i, // Kindle
378
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
379
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
380
+ // Trident based
381
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
382
+ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
383
+
384
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble
385
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser)\/([-\w\.]+)/i,
386
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
387
+ /(heytap|ovi|115|surf)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
388
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
389
+ ], [NAME, VERSION], [
390
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
391
+ ], [VERSION, [NAME, 'Quark']], [
392
+ /\bddg\/([\w\.]+)/i // DuckDuckGo
393
+ ], [VERSION, [NAME, 'DuckDuckGo']], [
394
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
395
+ ], [VERSION, [NAME, 'UCBrowser']], [
396
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
397
+ /\bqbcore\/([\w\.]+).+microm/i,
398
+ /micromessenger\/([\w\.]+)/i // WeChat
399
+ ], [VERSION, [NAME, 'WeChat']], [
400
+ /konqueror\/([\w\.]+)/i // Konqueror
401
+ ], [VERSION, [NAME, 'Konqueror']], [
402
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
403
+ ], [VERSION, [NAME, 'IE']], [
404
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
405
+ ], [VERSION, [NAME, 'Yandex']], [
406
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
407
+ ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
408
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
409
+ ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
410
+ /\bfocus\/([\w\.]+)/i // Firefox Focus
411
+ ], [VERSION, [NAME, FIREFOX+' Focus']], [
412
+ /\bopt\/([\w\.]+)/i // Opera Touch
413
+ ], [VERSION, [NAME, OPERA+' Touch']], [
414
+ /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
415
+ ], [VERSION, [NAME, 'Coc Coc']], [
416
+ /dolfin\/([\w\.]+)/i // Dolphin
417
+ ], [VERSION, [NAME, 'Dolphin']], [
418
+ /coast\/([\w\.]+)/i // Opera Coast
419
+ ], [VERSION, [NAME, OPERA+' Coast']], [
420
+ /miuibrowser\/([\w\.]+)/i // MIUI Browser
421
+ ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
422
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
423
+ ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
424
+ /\bqihoobrowser\/?([\w\.]*)/i // 360
425
+ ], [VERSION, [NAME, '360']], [
426
+ /\b(qq)\/([\w\.]+)/i // QQ
427
+ ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
428
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
429
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
430
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
431
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
432
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
433
+ ], [VERSION, [NAME, SOGOU + ' Explorer']], [
434
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
435
+ ], [[NAME, SOGOU + ' Mobile'], VERSION], [
436
+ /(electron)\/([\w\.]+) safari/i, // Electron-based App
437
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
438
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
439
+ ], [NAME, VERSION], [
440
+ /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq
441
+ ], [NAME], [
442
+ /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
443
+ /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
444
+ ], [VERSION, NAME], [
445
+
446
+ // WebView
447
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
448
+ ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
449
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
450
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
451
+ /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
452
+ /safari (line)\/([\w\.]+)/i, // Line App for iOS
453
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
454
+ /(alipay)client\/([\w\.]+)/i, // Alipay
455
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
456
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
457
+ ], [NAME, VERSION, [TYPE, INAPP]], [
458
+ /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
459
+ ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
460
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
461
+ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
462
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
463
+ ], [NAME, [TYPE, INAPP]], [
464
+ /(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i // Zalo
465
+ ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [
466
+
467
+ /(chromium)[\/ ]([-\w\.]+)/i // Chromium
468
+ ], [NAME, VERSION], [
469
+
470
+ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
471
+ ], [VERSION, [NAME, CHROME+' Headless']], [
472
+
473
+ /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
474
+ ], [VERSION, [NAME, EDGE+' WebView2']], [
475
+
476
+ / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
477
+ ], [[NAME, CHROME+' WebView'], VERSION], [
478
+
479
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
480
+ ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
481
+
482
+ /chrome\/([\w\.]+) mobile/i // Chrome Mobile
483
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
484
+
485
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
486
+ ], [NAME, VERSION], [
487
+
488
+ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile
489
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [
490
+ /iphone .*mobile(?:\/\w+ | ?)safari/i
491
+ ], [[NAME, PREFIX_MOBILE + 'Safari']], [
492
+ /version\/([\w\.\,]+) .*(safari)/i // Safari
493
+ ], [VERSION, NAME], [
494
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
495
+ ], [NAME, [VERSION, '1']], [
496
+
497
+ /(webkit|khtml)\/([\w\.]+)/i
498
+ ], [NAME, VERSION], [
499
+
500
+ // Gecko based
501
+ /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
502
+ ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
503
+ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
504
+ ], [[NAME, 'Netscape'], VERSION], [
505
+ /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
506
+ ], [NAME, VERSION], [
507
+ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
508
+ ], [VERSION, [NAME, FIREFOX+' Reality']], [
509
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
510
+ /(swiftfox)/i, // Swiftfox
511
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
512
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
513
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
514
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
515
+ /(firefox)\/([\w\.]+)/i, // Other Firefox-based
516
+ /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
517
+
518
+ // Other
519
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
520
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
521
+ /\b(links) \(([\w\.]+)/i // Links
522
+ ], [NAME, [VERSION, /_/g, '.']], [
523
+
524
+ /(cobalt)\/([\w\.]+)/i // Cobalt
525
+ ], [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
526
+ ],
527
+
528
+ cpu : [[
529
+
530
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
531
+ ], [[ARCHITECTURE, 'amd64']], [
532
+
533
+ /(ia32(?=;))/i, // IA32 (quicktime)
534
+ /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
535
+ ], [[ARCHITECTURE, 'ia32']], [
536
+
537
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
538
+ ], [[ARCHITECTURE, 'arm64']], [
539
+
540
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
541
+ ], [[ARCHITECTURE, 'armhf']], [
542
+
543
+ // PocketPC mistakenly identified as PowerPC
544
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
545
+ ], [[ARCHITECTURE, 'arm']], [
546
+
547
+ / sun4\w[;\)]/i // SPARC
548
+ ], [[ARCHITECTURE, 'sparc']], [
549
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
550
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
551
+ /((ppc|powerpc)(64)?)( mac|;|\))/i, // PowerPC
552
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha
553
+ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
554
+ /winnt.+\[axp/i
555
+ ], [[ARCHITECTURE, 'alpha']]
556
+ ],
557
+
558
+ device : [[
559
+
560
+ //////////////////////////
561
+ // MOBILES & TABLETS
562
+ /////////////////////////
563
+
564
+ // Samsung
565
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
566
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
567
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
568
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
569
+ /sec-(sgh\w+)/i
570
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
571
+
572
+ // Apple
573
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
574
+ ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
575
+ /\((ipad);[-\w\),; ]+apple/i, // iPad
576
+ /applecoremedia\/[\w\.]+ \((ipad)/i,
577
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
578
+ ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
579
+ /(macintosh);/i
580
+ ], [MODEL, [VENDOR, APPLE]], [
581
+
582
+ // Sharp
583
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
584
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
585
+
586
+ // Honor
587
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
588
+ ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
589
+ /honor([-\w ]+)[;\)]/i
590
+ ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
591
+
592
+ // Huawei
593
+ /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
594
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
595
+ /(?:huawei)([-\w ]+)[;\)]/i,
596
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
597
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
598
+
599
+ // Xiaomi
600
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
601
+ /\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
602
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
603
+
604
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
605
+ /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
606
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
607
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
608
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
609
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i, // Xiaomi Mi
610
+ / ([\w ]+) miui\/v?\d/i
611
+ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
612
+
613
+ // OnePlus
614
+ /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,
615
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
616
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
617
+
618
+ // OPPO
619
+ /; (\w+) bui.+ oppo/i,
620
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
621
+ ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
622
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
623
+ ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [
624
+
625
+ // BLU
626
+ /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i // Vivo series
627
+ ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
628
+
629
+ // Vivo
630
+ /; vivo (\w+)(?: bui|\))/i,
631
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
632
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
633
+
634
+ // Realme
635
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
636
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
637
+
638
+ // Lenovo
639
+ /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
640
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
641
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
642
+ /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
643
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [
644
+
645
+ // Motorola
646
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
647
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
648
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
649
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
650
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
651
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
652
+
653
+ // LG
654
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
655
+ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
656
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
657
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
658
+ /\blg-?([\d\w]+) bui/i
659
+ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
660
+
661
+ // Nokia
662
+ /(nokia) (t[12][01])/i
663
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
664
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
665
+ /nokia[-_ ]?(([-\w\. ]*))/i
666
+ ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
667
+
668
+ // Google
669
+ /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
670
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
671
+ // Google Pixel
672
+ /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
673
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
674
+ /(google) (pixelbook( go)?)/i
675
+ ], [VENDOR, MODEL], [
676
+
677
+ // Sony
678
+ /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
679
+ ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
680
+ /sony tablet [ps]/i,
681
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
682
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
683
+
684
+ // Amazon
685
+ /(alexa)webm/i,
686
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
687
+ /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
688
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
689
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
690
+ ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
691
+
692
+ // BlackBerry
693
+ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
694
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
695
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
696
+ /\(bb10; (\w+)/i // BlackBerry 10
697
+ ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
698
+
699
+ // Asus
700
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
701
+ ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
702
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
703
+ ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
704
+
705
+ // HTC
706
+ /(nexus 9)/i // HTC Nexus 9
707
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
708
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
709
+
710
+ // ZTE
711
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
712
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
713
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
714
+
715
+ // TCL
716
+ /tcl (xess p17aa)/i,
717
+ /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
718
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
719
+ /droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
720
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
721
+
722
+ // itel
723
+ /(itel) ((\w+))/i
724
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
725
+
726
+ // Acer
727
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
728
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
729
+
730
+ // Meizu
731
+ /droid.+; (m[1-5] note) bui/i,
732
+ /\bmz-([-\w]{2,})/i
733
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
734
+
735
+ // Ulefone
736
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
737
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
738
+
739
+ // Energizer
740
+ /; (energy ?\w+)(?: bui|\))/i,
741
+ /; energizer ([\w ]+)(?: bui|\))/i
742
+ ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
743
+
744
+ // Cat
745
+ /; cat (b35);/i,
746
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
747
+ ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
748
+
749
+ // Smartfren
750
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
751
+ ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
752
+
753
+ // Nothing
754
+ /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
755
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
756
+
757
+ // Archos
758
+ /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
759
+ /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
760
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
761
+ /archos ([\w ]+)( b|\))/i,
762
+ /; (ac[3-6]\d\w{2,8})( b|\))/i
763
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
764
+
765
+ // HMD
766
+ /; (n159v)/i
767
+ ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
768
+
769
+ // MIXED
770
+ /(imo) (tab \w+)/i, // IMO
771
+ /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
772
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
773
+
774
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
775
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
776
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL
777
+ /(hp) ([\w ]+\w)/i, // HP iPAQ
778
+ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
779
+ /(oppo) ?([\w ]+) bui/i, // OPPO
780
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i // Philips
781
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
782
+
783
+ /(kobo)\s(ereader|touch)/i, // Kobo
784
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
785
+ /(kindle)\/([\w\.]+)/i // Kindle
786
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
787
+
788
+ /(surface duo)/i // Surface Duo
789
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
790
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
791
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
792
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
793
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
794
+ /(sprint) (\w+)/i // Sprint Phones
795
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
796
+ /(kin\.[onetw]{3})/i // Microsoft Kin
797
+ ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
798
+ /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
799
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
800
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
801
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
802
+
803
+ ///////////////////
804
+ // SMARTTVS
805
+ ///////////////////
806
+
807
+ /(philips)[\w ]+tv/i, // Philips
808
+ /smart-tv.+(samsung)/i // Samsung
809
+ ], [VENDOR, [TYPE, SMARTTV]], [
810
+ /hbbtv.+maple;(\d+)/i
811
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
812
+ /(vizio)(?: |.+model\/)(\w+-\w+)/i, // Vizio
813
+ /tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
814
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
815
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
816
+ ], [[VENDOR, LG], [TYPE, SMARTTV]], [
817
+ /(apple) ?tv/i // Apple TV
818
+ ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
819
+ /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
820
+ ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
821
+ /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
822
+ ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
823
+ /fuchsia.*crkey/i // Google Chromecast Nest Hub
824
+ ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
825
+ /crkey/i // Google Chromecast, Linux-based or unknown
826
+ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
827
+ /(portaltv)/i // Facebook Portal TV
828
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
829
+ /droid.+aft(\w+)( bui|\))/i // Fire TV
830
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
831
+ /(shield \w+ tv)/i // Nvidia Shield TV
832
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
833
+ /\(dtv[\);].+(aquos)/i,
834
+ /(aquos-tv[\w ]+)\)/i // Sharp
835
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
836
+ /(bravia[\w ]+)( bui|\))/i // Sony
837
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
838
+ /(mi(tv|box)-?\w+) bui/i // Xiaomi
839
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
840
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
841
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
842
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
843
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
844
+ ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [
845
+
846
+ ///////////////////
847
+ // CONSOLES
848
+ ///////////////////
849
+
850
+ /(playstation \w+)/i // Playstation
851
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
852
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
853
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
854
+ /(ouya)/i, // Ouya
855
+ /(nintendo) (\w+)/i, // Nintendo
856
+ /(retroid) (pocket ([^\)]+))/i // Retroid Pocket
857
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
858
+ /droid.+; (shield)( bui|\))/i // Nvidia Portable
859
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [
860
+
861
+ ///////////////////
862
+ // WEARABLES
863
+ ///////////////////
864
+
865
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
866
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
867
+ /((pebble))app/i, // Pebble
868
+ /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch
869
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
870
+ /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
871
+ ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
872
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
873
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
874
+ /(opwwe\d{3})/i // OnePlus Watch
875
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
876
+ /(moto 360)/i // Motorola 360
877
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
878
+ /(smartwatch 3)/i // Sony SmartWatch
879
+ ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
880
+ /(g watch r)/i // LG G Watch R
881
+ ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
882
+ /droid.+; (wt63?0{2,3})\)/i
883
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
884
+
885
+ ///////////////////
886
+ // XR
887
+ ///////////////////
888
+
889
+ /droid.+; (glass) \d/i // Google Glass
890
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
891
+ /(pico) ([\w ]+) os\d/i // Pico
892
+ ], [VENDOR, MODEL, [TYPE, XR]], [
893
+ /(quest( \d| pro)?s?).+vr/i // Meta Quest
894
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
895
+ /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic
896
+ ], [[TYPE, XR]], [
897
+
898
+ ///////////////////
899
+ // EMBEDDED
900
+ ///////////////////
901
+
902
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
903
+ ], [VENDOR, [TYPE, EMBEDDED]], [
904
+ /(aeobc)\b/i // Echo Dot
905
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
906
+ /(homepod).+mac os/i // Apple HomePod
907
+ ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
908
+ /windows iot/i // Unidentifiable embedded device using Windows IoT
909
+ ], [[TYPE, EMBEDDED]], [
910
+
911
+ ////////////////////
912
+ // MIXED (GENERIC)
913
+ ///////////////////
914
+
915
+ /droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV
916
+ ], [MODEL, [TYPE, SMARTTV]], [
917
+ /\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
918
+ ], [[TYPE, SMARTTV]], [
919
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i
920
+ ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
921
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
922
+ ], [[TYPE, TABLET]], [
923
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
924
+ ], [[TYPE, MOBILE]], [
925
+ /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
926
+ ], [MODEL, [VENDOR, 'Generic']]
927
+ ],
928
+
929
+ engine : [[
930
+
931
+ /windows.+ edge\/([\w\.]+)/i // EdgeHTML
932
+ ], [VERSION, [NAME, EDGE+'HTML']], [
933
+
934
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
935
+ ], [NAME, VERSION], [
936
+
937
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
938
+ ], [VERSION, [NAME, 'Blink']], [
939
+
940
+ /(presto)\/([\w\.]+)/i, // Presto
941
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
942
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
943
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
944
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
945
+
946
+ /\b(libweb)/i // LibWeb
947
+ ], [NAME, VERSION], [
948
+ /ladybird\//i
949
+ ], [[NAME, 'LibWeb']], [
950
+
951
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
952
+ ], [VERSION, NAME]
953
+ ],
954
+
955
+ os : [[
956
+
957
+ // Windows
958
+ /(windows nt) (6\.[23]); arm/i // Windows RT
959
+ ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [
960
+ /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone
961
+ // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
962
+ /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
963
+ ], [NAME, VERSION], [
964
+ /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
965
+ /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
966
+ ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [
967
+ /(windows ce)\/?([\d\.]*)/i // Windows CE
968
+ ], [NAME, VERSION], [
969
+
970
+ // iOS/macOS
971
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
972
+ /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
973
+ /cfnetwork\/.+darwin/i
974
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
975
+ /(mac os x) ?([\w\. ]*)/i,
976
+ /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i // Mac OS
977
+ ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
978
+
979
+ // Google Chromecast
980
+ /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
981
+ ], [VERSION, [NAME, CHROMECAST + ' Android']], [
982
+ /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
983
+ ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
984
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
985
+ ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
986
+ /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
987
+ ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
988
+ /crkey\/([\d\.]+)/i // Google Chromecast, unknown
989
+ ], [VERSION, [NAME, CHROMECAST]], [
990
+
991
+ // Mobile OSes
992
+ /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
993
+ ], [VERSION, NAME], [
994
+ /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
995
+ ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
996
+ /(harmonyos)[\/ ]?([\d\.]*)/i, // HarmonyOS
997
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
998
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
999
+ ], [NAME, VERSION], [
1000
+ /\(bb(10);/i // BlackBerry 10
1001
+ ], [VERSION, [NAME, BLACKBERRY]], [
1002
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
1003
+ ], [VERSION, [NAME, 'Symbian']], [
1004
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
1005
+ ], [VERSION, [NAME, FIREFOX+' OS']], [
1006
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
1007
+ /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
1008
+ ], [VERSION, [NAME, 'webOS']], [
1009
+ /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
1010
+ // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
1011
+ ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
1012
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
1013
+ ], [VERSION, [NAME, 'watchOS']], [
1014
+
1015
+ // Google ChromeOS
1016
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1017
+ ], [[NAME, "Chrome OS"], VERSION],[
1018
+
1019
+ // Smart TVs
1020
+ /panasonic;(viera)/i, // Panasonic Viera
1021
+ /(netrange)mmh/i, // Netrange
1022
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
1023
+
1024
+ // Console
1025
+ /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
1026
+ /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
1027
+ /(pico) .+os([\w\.]+)/i, // Pico
1028
+
1029
+ // Other
1030
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
1031
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i, // Mint
1032
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
1033
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
1034
+ // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
1035
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
1036
+ /\b(aix)[; ]([1-9\.]{0,4})/i, // AIX
1037
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i, // Hurd/Linux/MorphOS
1038
+ /(gnu) ?([\w\.]*)/i, // GNU
1039
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
1040
+ /(haiku) ?(r\d)?/i // Haiku
1041
+ ], [NAME, VERSION], [
1042
+ /(sunos) ?([\d\.]*)/i // Solaris
1043
+ ], [[NAME, 'Solaris'], VERSION], [
1044
+ /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
1045
+ /(unix) ?([\w\.]*)/i // UNIX
1046
+ ], [NAME, VERSION]
1047
+ ]
1048
+ };
1049
+
1050
+ /////////////////
1051
+ // Factories
1052
+ ////////////////
1053
+
1054
+ var defaultProps = (function () {
1055
+ var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
1056
+ setProps.call(props.init, [
1057
+ [UA_BROWSER, [NAME, VERSION, MAJOR, TYPE]],
1058
+ [UA_CPU, [ARCHITECTURE]],
1059
+ [UA_DEVICE, [TYPE, MODEL, VENDOR]],
1060
+ [UA_ENGINE, [NAME, VERSION]],
1061
+ [UA_OS, [NAME, VERSION]]
1062
+ ]);
1063
+ setProps.call(props.isIgnore, [
1064
+ [UA_BROWSER, [VERSION, MAJOR]],
1065
+ [UA_ENGINE, [VERSION]],
1066
+ [UA_OS, [VERSION]]
1067
+ ]);
1068
+ setProps.call(props.isIgnoreRgx, [
1069
+ [UA_BROWSER, / ?browser$/i],
1070
+ [UA_OS, / ?os$/i]
1071
+ ]);
1072
+ setProps.call(props.toString, [
1073
+ [UA_BROWSER, [NAME, VERSION]],
1074
+ [UA_CPU, [ARCHITECTURE]],
1075
+ [UA_DEVICE, [VENDOR, MODEL]],
1076
+ [UA_ENGINE, [NAME, VERSION]],
1077
+ [UA_OS, [NAME, VERSION]]
1078
+ ]);
1079
+ return props;
1080
+ })();
1081
+
1082
+ var createIData = function (item, itemType) {
1083
+
1084
+ var init_props = defaultProps.init[itemType],
1085
+ is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
1086
+ is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
1087
+ toString_props = defaultProps.toString[itemType] || 0;
1088
+
1089
+ function IData () {
1090
+ setProps.call(this, init_props);
1091
+ }
1092
+
1093
+ IData.prototype.getItem = function () {
1094
+ return item;
1095
+ };
1096
+
1097
+ IData.prototype.withClientHints = function () {
1098
+
1099
+ // nodejs / non-client-hints browsers
1100
+ if (!NAVIGATOR_UADATA) {
1101
+ return item
1102
+ .parseCH()
1103
+ .get();
1104
+ }
1105
+
1106
+ // browsers based on chromium 85+
1107
+ return NAVIGATOR_UADATA
1108
+ .getHighEntropyValues(CH_ALL_VALUES)
1109
+ .then(function (res) {
1110
+ return item
1111
+ .setCH(new UACHData(res, false))
1112
+ .parseCH()
1113
+ .get();
1114
+ });
1115
+ };
1116
+
1117
+ IData.prototype.withFeatureCheck = function () {
1118
+ return item.detectFeature().get();
1119
+ };
1120
+
1121
+ if (itemType != UA_RESULT) {
1122
+ IData.prototype.is = function (strToCheck) {
1123
+ var is = false;
1124
+ for (var i in this) {
1125
+ if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
1126
+ is = true;
1127
+ if (strToCheck != UNDEF_TYPE) break;
1128
+ } else if (strToCheck == UNDEF_TYPE && is) {
1129
+ is = !is;
1130
+ break;
1131
+ }
1132
+ }
1133
+ return is;
1134
+ };
1135
+ IData.prototype.toString = function () {
1136
+ var str = EMPTY;
1137
+ for (var i in toString_props) {
1138
+ if (typeof(this[toString_props[i]]) !== UNDEF_TYPE) {
1139
+ str += (str ? ' ' : EMPTY) + this[toString_props[i]];
1140
+ }
1141
+ }
1142
+ return str || UNDEF_TYPE;
1143
+ };
1144
+ }
1145
+
1146
+ if (!NAVIGATOR_UADATA) {
1147
+ IData.prototype.then = function (cb) {
1148
+ var that = this;
1149
+ var IDataResolve = function () {
1150
+ for (var prop in that) {
1151
+ if (that.hasOwnProperty(prop)) {
1152
+ this[prop] = that[prop];
1153
+ }
1154
+ }
1155
+ };
1156
+ IDataResolve.prototype = {
1157
+ is : IData.prototype.is,
1158
+ toString : IData.prototype.toString
1159
+ };
1160
+ var resolveData = new IDataResolve();
1161
+ cb(resolveData);
1162
+ return resolveData;
1163
+ };
1164
+ }
1165
+
1166
+ return new IData();
1167
+ };
1168
+
1169
+ /////////////////
1170
+ // Constructor
1171
+ ////////////////
1172
+
1173
+ function UACHData (uach, isHttpUACH) {
1174
+ uach = uach || {};
1175
+ setProps.call(this, CH_ALL_VALUES);
1176
+ if (isHttpUACH) {
1177
+ setProps.call(this, [
1178
+ [BRANDS, itemListToArray(uach[CH_HEADER])],
1179
+ [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],
1180
+ [MOBILE, /\?1/.test(uach[CH_HEADER_MOBILE])],
1181
+ [MODEL, stripQuotes(uach[CH_HEADER_MODEL])],
1182
+ [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
1183
+ [PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],
1184
+ [ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],
1185
+ [FORMFACTORS, itemListToArray(uach[CH_HEADER_FORM_FACTORS])],
1186
+ [BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]
1187
+ ]);
1188
+ } else {
1189
+ for (var prop in uach) {
1190
+ if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];
1191
+ }
1192
+ }
1193
+ }
1194
+
1195
+ function UAItem (itemType, ua, rgxMap, uaCH) {
1196
+
1197
+ this.get = function (prop) {
1198
+ if (!prop) return this.data;
1199
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
1200
+ };
1201
+
1202
+ this.set = function (prop, val) {
1203
+ this.data[prop] = val;
1204
+ return this;
1205
+ };
1206
+
1207
+ this.setCH = function (ch) {
1208
+ this.uaCH = ch;
1209
+ return this;
1210
+ };
1211
+
1212
+ this.detectFeature = function () {
1213
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
1214
+ switch (this.itemType) {
1215
+ case UA_BROWSER:
1216
+ // Brave-specific detection
1217
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
1218
+ this.set(NAME, 'Brave');
1219
+ }
1220
+ break;
1221
+ case UA_DEVICE:
1222
+ // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
1223
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
1224
+ this.set(TYPE, MOBILE);
1225
+ }
1226
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
1227
+ if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
1228
+ this.set(MODEL, 'iPad')
1229
+ .set(TYPE, TABLET);
1230
+ }
1231
+ break;
1232
+ case UA_OS:
1233
+ // Chrome-specific detection: check for 'platform' value of navigator.userAgentData
1234
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
1235
+ this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1236
+ }
1237
+ break;
1238
+ case UA_RESULT:
1239
+ var data = this.data;
1240
+ var detect = function (itemType) {
1241
+ return data[itemType]
1242
+ .getItem()
1243
+ .detectFeature()
1244
+ .get();
1245
+ };
1246
+ this.set(UA_BROWSER, detect(UA_BROWSER))
1247
+ .set(UA_CPU, detect(UA_CPU))
1248
+ .set(UA_DEVICE, detect(UA_DEVICE))
1249
+ .set(UA_ENGINE, detect(UA_ENGINE))
1250
+ .set(UA_OS, detect(UA_OS));
1251
+ }
1252
+ }
1253
+ return this;
1254
+ };
1255
+
1256
+ this.parseUA = function () {
1257
+ if (this.itemType != UA_RESULT) {
1258
+ rgxMapper.call(this.data, this.ua, this.rgxMap);
1259
+ }
1260
+ if (this.itemType == UA_BROWSER) {
1261
+ this.set(MAJOR, majorize(this.get(VERSION)));
1262
+ }
1263
+ return this;
1264
+ };
1265
+
1266
+ this.parseCH = function () {
1267
+ var uaCH = this.uaCH,
1268
+ rgxMap = this.rgxMap;
1269
+
1270
+ switch (this.itemType) {
1271
+ case UA_BROWSER:
1272
+ case UA_ENGINE:
1273
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1274
+ if (brands) {
1275
+ for (var i=0; i<brands.length; i++) {
1276
+ var brandName = brands[i].brand || brands[i],
1277
+ brandVersion = brands[i].version;
1278
+ if (this.itemType == UA_BROWSER &&
1279
+ !/not.a.brand/i.test(brandName) &&
1280
+ (!prevName ||
1281
+ (/Chrom/.test(prevName) && brandName != CHROMIUM) ||
1282
+ (prevName == EDGE && /WebView2/.test(brandName))
1283
+ )) {
1284
+ brandName = strMapper(brandName, browserHintsMap);
1285
+ prevName = this.get(NAME);
1286
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
1287
+ this.set(NAME, brandName)
1288
+ .set(VERSION, brandVersion)
1289
+ .set(MAJOR, majorize(brandVersion));
1290
+ }
1291
+ prevName = brandName;
1292
+ }
1293
+ if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {
1294
+ this.set(VERSION, brandVersion);
1295
+ }
1296
+ }
1297
+ }
1298
+ break;
1299
+ case UA_CPU:
1300
+ var archName = uaCH[ARCHITECTURE];
1301
+ if (archName) {
1302
+ if (archName && uaCH[BITNESS] == '64') archName += '64';
1303
+ rgxMapper.call(this.data, archName + ';', rgxMap);
1304
+ }
1305
+ break;
1306
+ case UA_DEVICE:
1307
+ if (uaCH[MOBILE]) {
1308
+ this.set(TYPE, MOBILE);
1309
+ }
1310
+ if (uaCH[MODEL]) {
1311
+ this.set(MODEL, uaCH[MODEL]);
1312
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
1313
+ var reParse = {};
1314
+ rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
1315
+ if (!this.get(TYPE) && !!reParse.type) {
1316
+ this.set(TYPE, reParse.type);
1317
+ }
1318
+ if (!this.get(VENDOR) && !!reParse.vendor) {
1319
+ this.set(VENDOR, reParse.vendor);
1320
+ }
1321
+ }
1322
+ }
1323
+ if (uaCH[FORMFACTORS]) {
1324
+ var ff;
1325
+ if (typeof uaCH[FORMFACTORS] !== 'string') {
1326
+ var idx = 0;
1327
+ while (!ff && idx < uaCH[FORMFACTORS].length) {
1328
+ ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
1329
+ }
1330
+ } else {
1331
+ ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
1332
+ }
1333
+ this.set(TYPE, ff);
1334
+ }
1335
+ break;
1336
+ case UA_OS:
1337
+ var osName = uaCH[PLATFORM];
1338
+ if(osName) {
1339
+ var osVersion = uaCH[PLATFORMVER];
1340
+ if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
1341
+ this.set(NAME, osName)
1342
+ .set(VERSION, osVersion);
1343
+ }
1344
+ // Xbox-Specific Detection
1345
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
1346
+ this.set(NAME, 'Xbox')
1347
+ .set(VERSION, undefined);
1348
+ }
1349
+ break;
1350
+ case UA_RESULT:
1351
+ var data = this.data;
1352
+ var parse = function (itemType) {
1353
+ return data[itemType]
1354
+ .getItem()
1355
+ .setCH(uaCH)
1356
+ .parseCH()
1357
+ .get();
1358
+ };
1359
+ this.set(UA_BROWSER, parse(UA_BROWSER))
1360
+ .set(UA_CPU, parse(UA_CPU))
1361
+ .set(UA_DEVICE, parse(UA_DEVICE))
1362
+ .set(UA_ENGINE, parse(UA_ENGINE))
1363
+ .set(UA_OS, parse(UA_OS));
1364
+ }
1365
+ return this;
1366
+ };
1367
+
1368
+ setProps.call(this, [
1369
+ ['itemType', itemType],
1370
+ ['ua', ua],
1371
+ ['uaCH', uaCH],
1372
+ ['rgxMap', rgxMap],
1373
+ ['data', createIData(this, itemType)]
1374
+ ]);
1375
+
1376
+ return this;
1377
+ }
1378
+
1379
+ function UAParser (ua, extensions, headers) {
1380
+
1381
+ if (typeof ua === OBJ_TYPE) {
1382
+ if (isExtensions(ua, true)) {
1383
+ if (typeof extensions === OBJ_TYPE) {
1384
+ headers = extensions; // case UAParser(extensions, headers)
1385
+ }
1386
+ extensions = ua; // case UAParser(extensions)
1387
+ } else {
1388
+ headers = ua; // case UAParser(headers)
1389
+ extensions = undefined;
1390
+ }
1391
+ ua = undefined;
1392
+ } else if (typeof ua === STR_TYPE && !isExtensions(extensions, true)) {
1393
+ headers = extensions; // case UAParser(ua, headers)
1394
+ extensions = undefined;
1395
+ }
1396
+
1397
+ if (headers) {
1398
+ if (typeof headers.append === FUNC_TYPE) {
1399
+ // Convert Headers object into a plain object
1400
+ var kv = {};
1401
+ headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });
1402
+ headers = kv;
1403
+ } else {
1404
+ // Normalize headers field name into lowercase
1405
+ var normalized = {};
1406
+ for (var header in headers) {
1407
+ if (headers.hasOwnProperty(header)) {
1408
+ normalized[String(header).toLowerCase()] = headers[header];
1409
+ }
1410
+ }
1411
+ headers = normalized;
1412
+ }
1413
+ }
1414
+
1415
+ if (!(this instanceof UAParser)) {
1416
+ return new UAParser(ua, extensions, headers).getResult();
1417
+ }
1418
+
1419
+ var userAgent = typeof ua === STR_TYPE ? ua : // Passed user-agent string
1420
+ (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
1421
+ ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
1422
+ EMPTY)), // empty string
1423
+
1424
+ httpUACH = new UACHData(headers, true),
1425
+ regexMap = extensions ?
1426
+ extend(defaultRegexes, extensions) :
1427
+ defaultRegexes,
1428
+
1429
+ createItemFunc = function (itemType) {
1430
+ if (itemType == UA_RESULT) {
1431
+ return function () {
1432
+ return new UAItem(itemType, userAgent, regexMap, httpUACH)
1433
+ .set('ua', userAgent)
1434
+ .set(UA_BROWSER, this.getBrowser())
1435
+ .set(UA_CPU, this.getCPU())
1436
+ .set(UA_DEVICE, this.getDevice())
1437
+ .set(UA_ENGINE, this.getEngine())
1438
+ .set(UA_OS, this.getOS())
1439
+ .get();
1440
+ };
1441
+ } else {
1442
+ return function () {
1443
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
1444
+ .parseUA()
1445
+ .get();
1446
+ };
1447
+ }
1448
+ };
1449
+
1450
+ // public methods
1451
+ setProps.call(this, [
1452
+ ['getBrowser', createItemFunc(UA_BROWSER)],
1453
+ ['getCPU', createItemFunc(UA_CPU)],
1454
+ ['getDevice', createItemFunc(UA_DEVICE)],
1455
+ ['getEngine', createItemFunc(UA_ENGINE)],
1456
+ ['getOS', createItemFunc(UA_OS)],
1457
+ ['getResult', createItemFunc(UA_RESULT)],
1458
+ ['getUA', function () { return userAgent; }],
1459
+ ['setUA', function (ua) {
1460
+ if (isString(ua))
1461
+ userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
1462
+ return this;
1463
+ }]
1464
+ ])
1465
+ .setUA(userAgent);
1466
+
1467
+ return this;
1468
+ }
1469
+
1470
+ UAParser.VERSION = LIBVERSION;
1471
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
1472
+ UAParser.CPU = enumerize([ARCHITECTURE]);
1473
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
1474
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
1475
+
1476
+ exports.UAParser = UAParser;
1477
+ //# sourceMappingURL=ua-parser-E0eEtHJZ.js.map