ua-parser-js 0.7.17 → 0.7.21

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.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,10 +1,10 @@
1
- /**
2
- * UAParser.js v0.7.17
1
+ /*!
2
+ * UAParser.js v0.7.21
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
6
- * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
7
- * Dual licensed under GPLv2 & MIT
6
+ * Copyright © 2012-2019 Faisal Salman <f@faisalman.com>
7
+ * Licensed under MIT License
8
8
  */
9
9
 
10
10
  (function (window, undefined) {
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.17',
19
+ var LIBVERSION = '0.7.21',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -45,15 +45,15 @@
45
45
 
46
46
  var util = {
47
47
  extend : function (regexes, extensions) {
48
- var margedRegexes = {};
48
+ var mergedRegexes = {};
49
49
  for (var i in regexes) {
50
50
  if (extensions[i] && extensions[i].length % 2 === 0) {
51
- margedRegexes[i] = extensions[i].concat(regexes[i]);
51
+ mergedRegexes[i] = extensions[i].concat(regexes[i]);
52
52
  } else {
53
- margedRegexes[i] = regexes[i];
53
+ mergedRegexes[i] = regexes[i];
54
54
  }
55
55
  }
56
- return margedRegexes;
56
+ return mergedRegexes;
57
57
  },
58
58
  has : function (str1, str2) {
59
59
  if (typeof str1 === "string") {
@@ -83,14 +83,7 @@
83
83
 
84
84
  rgx : function (ua, arrays) {
85
85
 
86
- //var result = {},
87
- var i = 0, j, k, p, q, matches, match;//, args = arguments;
88
-
89
- /*// construct object barebones
90
- for (p = 0; p < args[1].length; p++) {
91
- q = args[1][p];
92
- result[typeof q === OBJ_TYPE ? q[0] : q] = undefined;
93
- }*/
86
+ var i = 0, j, k, p, q, matches, match;
94
87
 
95
88
  // loop through all regexes maps
96
89
  while (i < arrays.length && !matches) {
@@ -138,8 +131,6 @@
138
131
  }
139
132
  i += 2;
140
133
  }
141
- // console.log(this);
142
- //return this;
143
134
  },
144
135
 
145
136
  str : function (str, map) {
@@ -244,54 +235,93 @@
244
235
 
245
236
  // Mixed
246
237
  /(kindle)\/([\w\.]+)/i, // Kindle
247
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
238
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
248
239
  // Lunascape/Maxthon/Netfront/Jasmine/Blazer
249
-
250
240
  // Trident based
251
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
252
- // Avant/IEMobile/SlimBrowser/Baidu
241
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,
242
+ // Avant/IEMobile/SlimBrowser
243
+ /(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
253
244
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
254
245
 
255
246
  // Webkit/KHTML based
256
- /(rekonq)\/([\w\.]+)*/i, // Rekonq
257
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser)\/([\w\.-]+)/i
258
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
247
+ /(rekonq)\/([\w\.]*)/i, // Rekonq
248
+ /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i
249
+ // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
259
250
  ], [NAME, VERSION], [
260
251
 
252
+ /(konqueror)\/([\w\.]+)/i // Konqueror
253
+ ], [[NAME, 'Konqueror'], VERSION], [
254
+
261
255
  /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
262
256
  ], [[NAME, 'IE'], VERSION], [
263
257
 
264
- /(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
265
- ], [NAME, VERSION], [
258
+ /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
259
+ ], [[NAME, 'Edge'], VERSION], [
266
260
 
267
261
  /(yabrowser)\/([\w\.]+)/i // Yandex
268
262
  ], [[NAME, 'Yandex'], VERSION], [
269
263
 
264
+ /(Avast)\/([\w\.]+)/i // Avast Secure Browser
265
+ ], [[NAME, 'Avast Secure Browser'], VERSION], [
266
+
267
+ /(AVG)\/([\w\.]+)/i // AVG Secure Browser
268
+ ], [[NAME, 'AVG Secure Browser'], VERSION], [
269
+
270
270
  /(puffin)\/([\w\.]+)/i // Puffin
271
271
  ], [[NAME, 'Puffin'], VERSION], [
272
272
 
273
- /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
274
- // UCBrowser
273
+ /(focus)\/([\w\.]+)/i // Firefox Focus
274
+ ], [[NAME, 'Firefox Focus'], VERSION], [
275
+
276
+ /(opt)\/([\w\.]+)/i // Opera Touch
277
+ ], [[NAME, 'Opera Touch'], VERSION], [
278
+
279
+ /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
275
280
  ], [[NAME, 'UCBrowser'], VERSION], [
276
281
 
277
282
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
278
283
  ], [[NAME, /_/g, ' '], VERSION], [
279
284
 
285
+ /(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
286
+ ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
287
+
280
288
  /(micromessenger)\/([\w\.]+)/i // WeChat
281
289
  ], [[NAME, 'WeChat'], VERSION], [
282
290
 
291
+ /(brave)\/([\w\.]+)/i // Brave browser
292
+ ], [[NAME, 'Brave'], VERSION], [
293
+
294
+ /(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
295
+ ], [NAME, VERSION], [
296
+
283
297
  /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
284
298
  ], [NAME, VERSION], [
285
299
 
286
300
  /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
287
301
  ], [NAME, VERSION], [
288
302
 
303
+ /(baiduboxapp)[\/\s]?([\w\.]+)/i // Baidu App
304
+ ], [NAME, VERSION], [
305
+
306
+ /(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
307
+ ], [NAME, VERSION], [
308
+
309
+ /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
310
+ ], [NAME], [
311
+
312
+ /(LBBROWSER)/i // LieBao Browser
313
+ ], [NAME], [
314
+
289
315
  /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
290
316
  ], [VERSION, [NAME, 'MIUI Browser']], [
291
317
 
292
318
  /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
293
319
  ], [VERSION, [NAME, 'Facebook']], [
294
320
 
321
+ /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
322
+ /android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
323
+ ], [NAME, VERSION], [
324
+
295
325
  /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
296
326
  ], [VERSION, [NAME, 'Chrome Headless']], [
297
327
 
@@ -304,6 +334,9 @@
304
334
  /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
305
335
  ], [VERSION, [NAME, 'Android Browser']], [
306
336
 
337
+ /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
338
+ ], [[NAME, 'Sailfish Browser'], VERSION], [
339
+
307
340
  /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
308
341
  // Chrome/OmniWeb/Arora/Tizen/Nokia
309
342
  ], [NAME, VERSION], [
@@ -311,6 +344,9 @@
311
344
  /(dolfin)\/([\w\.]+)/i // Dolphin
312
345
  ], [[NAME, 'Dolphin'], VERSION], [
313
346
 
347
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
348
+ ], [[NAME, '360 Browser']], [
349
+
314
350
  /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
315
351
  ], [[NAME, 'Chrome'], VERSION], [
316
352
 
@@ -332,7 +368,6 @@
332
368
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
333
369
  ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
334
370
 
335
- /(konqueror)\/([\w\.]+)/i, // Konqueror
336
371
  /(webkit|khtml)\/([\w\.]+)/i
337
372
  ], [NAME, VERSION], [
338
373
 
@@ -342,7 +377,8 @@
342
377
  /(swiftfox)/i, // Swiftfox
343
378
  /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
344
379
  // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
345
- /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
380
+ /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
381
+
346
382
  // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
347
383
  /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
348
384
 
@@ -350,121 +386,10 @@
350
386
  /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
351
387
  // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
352
388
  /(links)\s\(([\w\.]+)/i, // Links
353
- /(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
389
+ /(gobrowser)\/?([\w\.]*)/i, // GoBrowser
354
390
  /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
355
391
  /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
356
392
  ], [NAME, VERSION]
357
-
358
- /* /////////////////////
359
- // Media players BEGIN
360
- ////////////////////////
361
-
362
- , [
363
-
364
- /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
365
- /(coremedia) v((\d+)[\w\._]+)/i
366
- ], [NAME, VERSION], [
367
-
368
- /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
369
- ], [NAME, VERSION], [
370
-
371
- /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
372
- ], [NAME, VERSION], [
373
-
374
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
375
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
376
- // NSPlayer/PSP-InternetRadioPlayer/Videos
377
- /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
378
- /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
379
- /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
380
- ], [NAME, VERSION], [
381
- /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
382
- ], [NAME, VERSION], [
383
-
384
- /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
385
- ], [[NAME, 'Flip Player'], VERSION], [
386
-
387
- /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
388
- // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
389
- ], [NAME], [
390
-
391
- /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
392
- // Gstreamer
393
- ], [NAME, VERSION], [
394
-
395
- /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
396
- /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
397
- // Java/urllib/requests/wget/cURL
398
- /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
399
- ], [NAME, VERSION], [
400
-
401
- /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
402
- ], [[NAME, /_/g, ' '], VERSION], [
403
-
404
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
405
- // MPlayer SVN
406
- ], [NAME, VERSION], [
407
-
408
- /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
409
- ], [NAME, VERSION], [
410
-
411
- /(mplayer)/i, // MPlayer (no other info)
412
- /(yourmuze)/i, // YourMuze
413
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
414
- ], [NAME], [
415
-
416
- /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
417
- ], [NAME, VERSION], [
418
-
419
- /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
420
- ], [NAME, VERSION], [
421
-
422
- /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
423
- ], [NAME, VERSION], [
424
-
425
- /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
426
- /(winamp)\s((\d+)[\w\.-]+)/i,
427
- /(winamp)mpeg\/((\d+)[\w\.-]+)/i
428
- ], [NAME, VERSION], [
429
-
430
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
431
- // inlight radio
432
- ], [NAME], [
433
-
434
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
435
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
436
- // SoundTap/Totem/Stagefright/Streamium
437
- ], [NAME, VERSION], [
438
-
439
- /(smp)((\d+)[\d\.]+)/i // SMP
440
- ], [NAME, VERSION], [
441
-
442
- /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
443
- /(vlc)\/((\d+)[\w\.-]+)/i,
444
- /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
445
- /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
446
- /(itunes)\/((\d+)[\d\.]+)/i // iTunes
447
- ], [NAME, VERSION], [
448
-
449
- /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
450
- /(windows-media-player)\/((\d+)[\w\.-]+)/i
451
- ], [[NAME, /-/g, ' '], VERSION], [
452
-
453
- /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
454
- // Windows Media Server
455
- ], [VERSION, [NAME, 'Windows']], [
456
-
457
- /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
458
- ], [NAME, VERSION], [
459
-
460
- /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
461
- /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
462
- ], [[NAME, 'rad.io'], VERSION]
463
-
464
- //////////////////////
465
- // Media players END
466
- ////////////////////*/
467
-
468
393
  ],
469
394
 
470
395
  cpu : [[
@@ -488,21 +413,21 @@
488
413
  /(sun4\w)[;\)]/i // SPARC
489
414
  ], [[ARCHITECTURE, 'sparc']], [
490
415
 
491
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
416
+ /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
492
417
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
493
418
  ], [[ARCHITECTURE, util.lowerize]]
494
419
  ],
495
420
 
496
421
  device : [[
497
422
 
498
- /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
423
+ /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
499
424
  ], [MODEL, VENDOR, [TYPE, TABLET]], [
500
425
 
501
426
  /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
502
427
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
503
428
 
504
429
  /(apple\s{0,1}tv)/i // Apple TV
505
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
430
+ ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [
506
431
 
507
432
  /(archos)\s(gamepad2?)/i, // Archos
508
433
  /(hp).+(touchpad)/i, // HP TouchPad
@@ -512,10 +437,12 @@
512
437
  /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
513
438
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
514
439
 
515
- /(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD
440
+ /(kf[A-z]+)\sbuild\/.+silk\//i // Kindle Fire HD
516
441
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
517
- /(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
442
+ /(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
518
443
  ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
444
+ /android.+aft([bms])\sbuild/i // Fire TV
445
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
519
446
 
520
447
  /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
521
448
  ], [MODEL, VENDOR, [TYPE, MOBILE]], [
@@ -523,7 +450,7 @@
523
450
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
524
451
 
525
452
  /(blackberry)[\s-]?(\w+)/i, // BlackBerry
526
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
453
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
527
454
  // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
528
455
  /(hp)\s([\w\s]+\w)/i, // HP iPAQ
529
456
  /(asus)-?(\w+)/i // Asus
@@ -531,13 +458,13 @@
531
458
  /\(bb10;\s(\w+)/i // BlackBerry 10
532
459
  ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
533
460
  // Asus Tablets
534
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
461
+ /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
535
462
  ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
536
463
 
537
464
  /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
538
465
  /(sony)?(?:sgp.+)\sbuild\//i
539
466
  ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
540
- /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
467
+ /android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
541
468
  ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
542
469
 
543
470
  /\s(ouya)\s/i, // Ouya
@@ -553,22 +480,22 @@
553
480
  /(sprint\s(\w+))/i // Sprint Phones
554
481
  ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
555
482
 
556
- /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
557
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
558
-
559
- /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
560
- /(zte)-(\w+)*/i, // ZTE
561
- /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
562
- // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
483
+ /(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
484
+ /(zte)-(\w*)/i, // ZTE
485
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
486
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
563
487
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
564
488
 
565
489
  /(nexus\s9)/i // HTC Nexus 9
566
490
  ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
567
491
 
568
492
  /d\/huawei([\w\s-]+)[;\)]/i,
569
- /(nexus\s6p)/i // Huawei
493
+ /(nexus\s6p|vog-l29|ane-lx1|eml-l29)/i // Huawei
570
494
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
571
495
 
496
+ /android.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
497
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
498
+
572
499
  /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
573
500
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
574
501
 
@@ -578,8 +505,8 @@
578
505
  ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
579
506
 
580
507
  // Motorola
581
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
582
- /mot[\s-]?(\w+)*/i,
508
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
509
+ /mot[\s-]?(\w*)/i,
583
510
  /(XT\d{3,4}) build\//i,
584
511
  /(nexus\s6)/i
585
512
  ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
@@ -601,18 +528,18 @@
601
528
  /smart-tv.+(samsung)/i
602
529
  ], [VENDOR, [TYPE, SMARTTV], MODEL], [
603
530
  /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
604
- /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
531
+ /(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,
605
532
  /sec-((sgh\w+))/i
606
533
  ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
607
534
 
608
- /sie-(\w+)*/i // Siemens
535
+ /sie-(\w*)/i // Siemens
609
536
  ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
610
537
 
611
538
  /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
612
- /(nokia)[\s_-]?([\w-]+)*/i
539
+ /(nokia)[\s_-]?([\w-]*)/i
613
540
  ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
614
541
 
615
- /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
542
+ /android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
616
543
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
617
544
 
618
545
  /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
@@ -622,12 +549,16 @@
622
549
  /(lg) netcast\.tv/i // LG SmartTV
623
550
  ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
624
551
  /(nexus\s[45])/i, // LG
625
- /lg[e;\s\/-]+(\w+)*/i,
552
+ /lg[e;\s\/-]+(\w*)/i,
626
553
  /android.+lg(\-?[\d\w]+)\s+build/i
627
554
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
628
555
 
556
+ /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
557
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
629
558
  /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
630
559
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
560
+ /(lenovo)[_\s-]?([\w-]+)/i
561
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
631
562
 
632
563
  /linux;.+((jolla));/i // Jolla
633
564
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
@@ -639,34 +570,38 @@
639
570
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
640
571
 
641
572
  /crkey/i // Google Chromecast
642
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
573
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
643
574
 
644
575
  /android.+;\s(glass)\s\d/i // Google Glass
645
576
  ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
646
577
 
647
- /android.+;\s(pixel c)\s/i // Google Pixel C
578
+ /android.+;\s(pixel c)[\s)]/i // Google Pixel C
648
579
  ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
649
580
 
650
- /android.+;\s(pixel xl|pixel)\s/i // Google Pixel
581
+ /android.+;\s(pixel( [23])?( xl)?)[\s)]/i // Google Pixel
651
582
  ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
652
583
 
653
- /android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
584
+ /android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
654
585
  /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
655
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Mi
656
- /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i // Redmi Phones
586
+ /android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,
587
+ // Xiaomi Mi
588
+ /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
657
589
  ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
658
- /android.+(mi[\s\-_]*(?:pad)?(?:[\s_]*[\w\s]+)?)\s+build/i // Mi Pad tablets
590
+ /android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
659
591
  ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
660
- /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
661
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
592
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
593
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
594
+ /(mz)-([\w-]{2,})/i
595
+ ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
662
596
 
663
- /android.+a000(1)\s+build/i // OnePlus
597
+ /android.+a000(1)\s+build/i, // OnePlus
598
+ /android.+oneplus\s(a\d{4})[\s)]/i
664
599
  ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
665
600
 
666
601
  /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
667
602
  ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
668
603
 
669
- /android.+[;\/]\s*(Venue[\d\s]*)\s+build/i // Dell Venue Tablets
604
+ /android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
670
605
  ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
671
606
 
672
607
  /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
@@ -678,8 +613,8 @@
678
613
  /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
679
614
  ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
680
615
 
681
- /android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i // ZTE K Series Tablet
682
- ], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [
616
+ /android.+;\s(k88)\sbuild/i // ZTE K Series Tablet
617
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
683
618
 
684
619
  /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
685
620
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
@@ -690,26 +625,29 @@
690
625
  /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
691
626
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
692
627
 
693
- /(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i,
694
- /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i // Dragon Touch Tablet
628
+ /(android).+[;\/]\s+([YR]\d{2})\s+build/i,
629
+ /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
695
630
  ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
696
631
 
697
- /android.+[;\/]\s*(NS-?.+)\s+build/i // Insignia Tablets
632
+ /android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
698
633
  ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
699
634
 
700
- /android.+[;\/]\s*((NX|Next)-?.+)\s+build/i // NextBook Tablets
635
+ /android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i // NextBook Tablets
701
636
  ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
702
637
 
703
- /android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
638
+ /android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
704
639
  ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
705
640
 
706
- /android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i // LvTel Phones
641
+ /android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
707
642
  ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
708
643
 
644
+ /android.+;\s(PH-1)\s/i
645
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
646
+
709
647
  /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
710
648
  ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
711
649
 
712
- /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i // Le Pan Tablets
650
+ /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
713
651
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
714
652
 
715
653
  /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
@@ -724,67 +662,18 @@
724
662
  /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
725
663
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
726
664
 
727
- /android.+(Gigaset)[\s\-]+(Q.+)\s+build/i // Gigaset Tablets
665
+ /android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
728
666
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
729
667
 
730
668
  /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
731
669
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
732
670
  ], [[TYPE, util.lowerize], VENDOR, MODEL], [
733
671
 
734
- /(android.+)[;\/].+build/i // Generic Android Device
735
- ], [MODEL, [VENDOR, 'Generic']]
736
-
737
-
738
- /*//////////////////////////
739
- // TODO: move to string map
740
- ////////////////////////////
741
-
742
- /(C6603)/i // Sony Xperia Z C6603
743
- ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
744
- /(C6903)/i // Sony Xperia Z 1
745
- ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
746
-
747
- /(SM-G900[F|H])/i // Samsung Galaxy S5
748
- ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
749
- /(SM-G7102)/i // Samsung Galaxy Grand 2
750
- ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
751
- /(SM-G530H)/i // Samsung Galaxy Grand Prime
752
- ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
753
- /(SM-G313HZ)/i // Samsung Galaxy V
754
- ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
755
- /(SM-T805)/i // Samsung Galaxy Tab S 10.5
756
- ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
757
- /(SM-G800F)/i // Samsung Galaxy S5 Mini
758
- ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
759
- /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
760
- ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
761
-
762
- /(T3C)/i // Advan Vandroid T3C
763
- ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
764
- /(ADVAN T1J\+)/i // Advan Vandroid T1J+
765
- ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
766
- /(ADVAN S4A)/i // Advan Vandroid S4A
767
- ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
768
-
769
- /(V972M)/i // ZTE V972M
770
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
771
-
772
- /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
773
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
774
- /(IQ6.3)/i // i-mobile IQ IQ 6.3
775
- ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
776
- /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
777
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
778
- /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
779
- ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
780
-
781
- /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
782
- ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
783
-
784
- /////////////
785
- // END TODO
786
- ///////////*/
672
+ /[\s\/\(](smart-?tv)[;\)]/i // SmartTV
673
+ ], [[TYPE, SMARTTV]], [
787
674
 
675
+ /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
676
+ ], [MODEL, [VENDOR, 'Generic']]
788
677
  ],
789
678
 
790
679
  engine : [[
@@ -792,13 +681,17 @@
792
681
  /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
793
682
  ], [VERSION, [NAME, 'EdgeHTML']], [
794
683
 
684
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
685
+ ], [VERSION, [NAME, 'Blink']], [
686
+
795
687
  /(presto)\/([\w\.]+)/i, // Presto
796
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
688
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
689
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
797
690
  /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
798
691
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
799
692
  ], [NAME, VERSION], [
800
693
 
801
- /rv\:([\w\.]+).*(gecko)/i // Gecko
694
+ /rv\:([\w\.]{1,9}).+(gecko)/i // Gecko
802
695
  ], [VERSION, NAME]
803
696
  ],
804
697
 
@@ -808,7 +701,7 @@
808
701
  /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
809
702
  ], [NAME, VERSION], [
810
703
  /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
811
- /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, // Windows Phone
704
+ /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
812
705
  /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
813
706
  ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
814
707
  /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
@@ -817,13 +710,12 @@
817
710
  // Mobile/Embedded OS
818
711
  /\((bb)(10);/i // BlackBerry 10
819
712
  ], [[NAME, 'BlackBerry'], VERSION], [
820
- /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
821
- /(tizen)[\/\s]([\w\.]+)/i, // Tizen
822
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
823
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
824
- /linux;.+(sailfish);/i // Sailfish OS
713
+ /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
714
+ /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
715
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
716
+ // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
825
717
  ], [NAME, VERSION], [
826
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
718
+ /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
827
719
  ], [[NAME, 'Symbian'], VERSION], [
828
720
  /\((series40);/i // Series 40
829
721
  ], [NAME], [
@@ -834,43 +726,43 @@
834
726
  /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
835
727
 
836
728
  // GNU/Linux based
837
- /(mint)[\/\s\(]?(\w+)*/i, // Mint
729
+ /(mint)[\/\s\(]?(\w*)/i, // Mint
838
730
  /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
839
- /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,
731
+ /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,
840
732
  // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
841
733
  // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
842
- /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
843
- /(gnu)\s?([\w\.]+)*/i // GNU
734
+ /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
735
+ /(gnu)\s?([\w\.]*)/i // GNU
844
736
  ], [NAME, VERSION], [
845
737
 
846
738
  /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
847
739
  ], [[NAME, 'Chromium OS'], VERSION],[
848
740
 
849
741
  // Solaris
850
- /(sunos)\s?([\w\.]+\d)*/i // Solaris
742
+ /(sunos)\s?([\w\.\d]*)/i // Solaris
851
743
  ], [[NAME, 'Solaris'], VERSION], [
852
744
 
853
745
  // BSD based
854
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
746
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
855
747
  ], [NAME, VERSION],[
856
748
 
857
- /(haiku)\s(\w+)/i // Haiku
749
+ /(haiku)\s(\w+)/i // Haiku
858
750
  ], [NAME, VERSION],[
859
751
 
860
752
  /cfnetwork\/.+darwin/i,
861
- /ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
753
+ /ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
862
754
  ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
863
755
 
864
- /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
756
+ /(mac\sos\sx)\s?([\w\s\.]*)/i,
865
757
  /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
866
758
  ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
867
759
 
868
760
  // Other
869
- /((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
870
- /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
871
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
872
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
873
- /(unix)\s?([\w\.]+)*/i // UNIX
761
+ /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
762
+ /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
763
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
764
+ // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
765
+ /(unix)\s?([\w\.]*)/i // UNIX
874
766
  ], [NAME, VERSION]
875
767
  ]
876
768
  };
@@ -879,22 +771,6 @@
879
771
  /////////////////
880
772
  // Constructor
881
773
  ////////////////
882
- /*
883
- var Browser = function (name, version) {
884
- this[NAME] = name;
885
- this[VERSION] = version;
886
- };
887
- var CPU = function (arch) {
888
- this[ARCHITECTURE] = arch;
889
- };
890
- var Device = function (vendor, model, type) {
891
- this[VENDOR] = vendor;
892
- this[MODEL] = model;
893
- this[TYPE] = type;
894
- };
895
- var Engine = Browser;
896
- var OS = Browser;
897
- */
898
774
  var UAParser = function (uastring, extensions) {
899
775
 
900
776
  if (typeof uastring === 'object') {
@@ -908,11 +784,6 @@
908
784
 
909
785
  var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
910
786
  var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
911
- //var browser = new Browser();
912
- //var cpu = new CPU();
913
- //var device = new Device();
914
- //var engine = new Engine();
915
- //var os = new OS();
916
787
 
917
788
  this.getBrowser = function () {
918
789
  var browser = { name: undefined, version: undefined };
@@ -955,11 +826,6 @@
955
826
  };
956
827
  this.setUA = function (uastring) {
957
828
  ua = uastring;
958
- //browser = new Browser();
959
- //cpu = new CPU();
960
- //device = new Device();
961
- //engine = new Engine();
962
- //os = new OS();
963
829
  return this;
964
830
  };
965
831
  return this;
@@ -993,7 +859,6 @@
993
859
  NAME : NAME,
994
860
  VERSION : VERSION
995
861
  };
996
- //UAParser.Utils = util;
997
862
 
998
863
  ///////////
999
864
  // Export
@@ -1006,39 +871,10 @@
1006
871
  if (typeof module !== UNDEF_TYPE && module.exports) {
1007
872
  exports = module.exports = UAParser;
1008
873
  }
1009
- // TODO: test!!!!!!!!
1010
- /*
1011
- if (require && require.main === module && process) {
1012
- // cli
1013
- var jsonize = function (arr) {
1014
- var res = [];
1015
- for (var i in arr) {
1016
- res.push(new UAParser(arr[i]).getResult());
1017
- }
1018
- process.stdout.write(JSON.stringify(res, null, 2) + '\n');
1019
- };
1020
- if (process.stdin.isTTY) {
1021
- // via args
1022
- jsonize(process.argv.slice(2));
1023
- } else {
1024
- // via pipe
1025
- var str = '';
1026
- process.stdin.on('readable', function() {
1027
- var read = process.stdin.read();
1028
- if (read !== null) {
1029
- str += read;
1030
- }
1031
- });
1032
- process.stdin.on('end', function () {
1033
- jsonize(str.replace(/\n$/, '').split('\n'));
1034
- });
1035
- }
1036
- }
1037
- */
1038
874
  exports.UAParser = UAParser;
1039
875
  } else {
1040
876
  // requirejs env (optional)
1041
- if (typeof(define) === FUNC_TYPE && define.amd) {
877
+ if (typeof(define) === 'function' && define.amd) {
1042
878
  define(function () {
1043
879
  return UAParser;
1044
880
  });
@@ -1054,7 +890,7 @@
1054
890
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
1055
891
  // and we should catch that.
1056
892
  var $ = window && (window.jQuery || window.Zepto);
1057
- if (typeof $ !== UNDEF_TYPE) {
893
+ if ($ && !$.ua) {
1058
894
  var parser = new UAParser();
1059
895
  $.ua = parser.getResult();
1060
896
  $.ua.get = function () {