Fix #401 Rearrange the order of regexes to improve hit-rate performance

This commit is contained in:
Faisal Salman 2021-03-18 21:59:38 +07:00
parent ebccc29d97
commit fe5ca1de96

View File

@ -220,96 +220,90 @@
browser : [[ browser : [[
/(?:android.+crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
], [VERSION, [NAME, 'Chrome']], [
/(?:edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
], [VERSION, [NAME, 'Edge']], [
// Presto based // Presto based
/(opera\smini)\/([\w\.-]+)/i, // Opera Mini /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
/(opera\s[mobiletab]{3,6}).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet /(opera\s[mobiletab]{3,6}).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
/(opera).+version\/([\w\.]+)/i, // Opera > 9.80 /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80 /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
], [NAME, VERSION], [ ], [NAME, VERSION], [
/opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
/(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0 ], [VERSION, [NAME, 'Opera Mini']], [
], [[NAME, 'Opera Mini'], VERSION], [ /\sopr\/([\w\.]+)/i // Opera Webkit
], [VERSION, [NAME, 'Opera']], [
/\s(opr)\/([\w\.]+)/i // Opera Webkit
], [[NAME, 'Opera'], VERSION], [
// Mixed // Mixed
/(kindle)\/([\w\.]+)/i, // Kindle /(kindle)\/([\w\.]+)/i, // Kindle
/(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i, /(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram
// Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram
// Trident based // Trident based
/(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
// Avant/IEMobile/SlimBrowser /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
/(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
// Webkit/KHTML based // Webkit/KHTML based
/(rekonq)\/([\w\.]*)/i, // Rekonq
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i, /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
/(puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i // Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
/(weibo)__([\d\.]+)/i // Weibo
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
/(konqueror)\/([\w\.]+)/i // Konqueror ], [VERSION, [NAME, 'UCBrowser']], [
], [[NAME, 'Konqueror'], VERSION], [ /(?:windowswechat)?\sqbcore\/([\w\.]+).*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
/(trident).+rv[:\s]([\w\.]{1,9}).+like\sgecko/i // IE11 /micromessenger\/([\w\.]+)/i // WeChat
], [[NAME, 'IE'], VERSION], [ ], [VERSION, [NAME, 'WeChat']], [
/konqueror\/([\w\.]+)/i // Konqueror
/(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge ], [VERSION, [NAME, 'Konqueror']], [
], [[NAME, 'Edge'], VERSION], [ /trident.+rv[:\s]([\w\.]{1,9}).+like\sgecko/i // IE11
], [VERSION, [NAME, 'IE']], [
/(yabrowser)\/([\w\.]+)/i // Yandex /yabrowser\/([\w\.]+)/i // Yandex
], [[NAME, 'Yandex'], VERSION], [ ], [VERSION, [NAME, 'Yandex']], [
/Avast\/([\w\.]+)/i // Avast Secure Browser
/(Avast)\/([\w\.]+)/i // Avast Secure Browser ], [VERSION, [NAME, 'Avast Secure Browser']], [
], [[NAME, 'Avast Secure Browser'], VERSION], [ /AVG\/([\w\.]+)/i // AVG Secure Browser
], [VERSION, [NAME, 'AVG Secure Browser']], [
/(AVG)\/([\w\.]+)/i // AVG Secure Browser /focus\/([\w\.]+)/i // Firefox Focus
], [[NAME, 'AVG Secure Browser'], VERSION], [ ], [VERSION, [NAME, 'Firefox Focus']], [
/opt\/([\w\.]+)/i // Opera Touch
/(focus)\/([\w\.]+)/i // Firefox Focus ], [VERSION, [NAME, 'Opera Touch']], [
], [[NAME, 'Firefox Focus'], VERSION], [ /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
], [VERSION, [NAME, 'Coc Coc']], [
/(opt)\/([\w\.]+)/i // Opera Touch /sailfishbrowser\/([\w\.]+)/i // Sailfish Browser
], [[NAME, 'Opera Touch'], VERSION], [ ], [VERSION, [NAME, 'Sailfish Browser']], [
/dolfin\/([\w\.]+)/i // Dolphin
/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser ], [VERSION, [NAME, 'Dolphin']], [
], [[NAME, 'UCBrowser'], VERSION], [ /coast\/([\w\.]+)/i // Opera Coast
], [VERSION, [NAME, 'Opera Coast']], [
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
], [VERSION, [NAME, 'MIUI Browser']], [
/fxios\/([\w\.-]+)/i // Firefox for iOS
], [VERSION, [NAME, 'Firefox']], [
/(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
], [[NAME, '360 Browser']], [
/((?:oculus|samsung)browser)\/([\w\.]+)/i
], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
], [[NAME, /_/g, ' '], VERSION], [ ], [[NAME, /_/g, ' '], VERSION], [
/((?:windowswechat)? qbcore)\/([\w\.]+).*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
/(micromessenger)\/([\w\.]+)/i // WeChat
], [[NAME, 'WeChat'], VERSION], [
/m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
/(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
], [NAME], [
/(LBBROWSER)/i // LieBao Browser /(LBBROWSER)/i // LieBao Browser
], [NAME], [ ], [NAME], [
/(weibo)__([\d\.]+)/i // Weibo // WebView
], [NAME, VERSION], [
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
], [VERSION, [NAME, 'MIUI Browser']], [
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
], [VERSION, [NAME, 'Facebook']], [ ], [VERSION, [NAME, 'Facebook']], [
/FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
], [[NAME, 'Facebook']], [ ], [[NAME, 'Facebook']], [
/safari\s(line)\/([\w\.]+)/i, // Line App for iOS /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
/droid.+(line)\/([\w\.]+)\/iab/i // Line App for Android /droid.+(line)\/([\w\.]+)\/iab/i // Line App for Android
], [NAME, VERSION], [ ], [NAME, VERSION], [
/webkit.+?gsa\/([\w\.]+)\s.*(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
], [VERSION, [NAME, 'GSA']], [
/headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
], [VERSION, [NAME, 'Chrome Headless']], [ ], [VERSION, [NAME, 'Chrome Headless']], [
@ -317,46 +311,16 @@
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [ ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
/((?:oculus|samsung)browser)\/([\w\.]+)/i
], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
/droid.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser /droid.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
], [VERSION, [NAME, 'Android Browser']], [ ], [VERSION, [NAME, 'Android Browser']], [
/(coc_coc_browser)\/([\w\.]+)/i // Coc Coc Browser /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
], [[NAME, 'Coc Coc'], VERSION], [
/(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
], [[NAME, 'Sailfish Browser'], VERSION], [
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
// Chrome/OmniWeb/Arora/Tizen/Nokia
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(dolfin)\/([\w\.]+)/i // Dolphin
], [[NAME, 'Dolphin'], VERSION], [
/(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
], [[NAME, '360 Browser']], [
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
], [[NAME, 'Chrome'], VERSION], [
/(coast)\/([\w\.]+)/i // Opera Coast
], [[NAME, 'Opera Coast'], VERSION], [
/fxios\/([\w\.-]+)/i // Firefox for iOS
], [VERSION, [NAME, 'Firefox']], [
/version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
], [VERSION, [NAME, 'Mobile Safari']], [ ], [VERSION, [NAME, 'Mobile Safari']], [
/version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
], [VERSION, NAME], [ ], [VERSION, NAME], [
/webkit.+?(gsa)\/([\w\.]+)\s.*(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
], [[NAME, 'GSA'], VERSION], [
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [ ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
@ -370,7 +334,6 @@
/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
/(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
/(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
@ -413,90 +376,39 @@
device : [[ device : [[
/\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook // Samsung
], [MODEL, VENDOR, [TYPE, TABLET]], [ /droid.+(sch-i[89]0\d|shw-m380s|SM-P605|SM-P610|SM-P587|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10)/i,
/(SM-T\w+)/i
], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
/(s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+)/i,
/\ssamsung[\s-]([\w-]+)/i,
/sec-(sgh\w+)/i
], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
// Apple
/\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
/\((ipad);[\w\s\),;-]+(apple)/i // iPad
], [MODEL, VENDOR, [TYPE, TABLET]], [
/applecoremedia\/[\w\.]+ \((ipad)/ // iPad /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
/(apple\s{0,1}tv)/i // Apple TV // Huawei
], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [ /d\/huawei([\w\s-]+)[;\)]/i,
/(archos)\s(gamepad2?)/i, // Archos
/(hp).+(touchpad)/i, // HP TouchPad
/(hp).+(tablet)/i, // HP Tablet
/(kindle)\/([\w\.]+)/i, // Kindle
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook
/(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
], [VENDOR, MODEL, [TYPE, TABLET]], [
/(alexa)webm/i,
/(kf[A-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
/(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
/droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
/\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
/(asus)-?(\w+)/i // Asus
], [VENDOR, MODEL, [TYPE, MOBILE]], [
/\(bb10;\s(\w+)/i // BlackBerry 10
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
// Asus Tablets
/droid.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
/sony\stablet\s[ps]\sbuild\//i, // Sony
/(?:sony)?sgp\w+(?:\sbuild\/|\))/i
], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
/droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
/\s(ouya)\s/i, // Ouya
/(nintendo)\s([wids3utch]+)/i // Nintendo
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
/droid.+;\s(shield)\sbuild/i // Nvidia
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
/(playstation\s[345portablevi]+)/i // Playstation
], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
/(sprint\s(\w+))/i // Sprint Phones
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
/(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
/(zte)-(\w*)/i, // ZTE
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
/(nexus\s9)/i // HTC Nexus 9
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
/d\/huawei([\w\s-]+)[;\)]/i, // Huawei
/droid.+\s(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?)/i, /droid.+\s(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?)/i,
/droid.+\s((?:A(?:GS2?|KA|LP|N[AE]|QM|RE|SK|TH)|B(?:A(?:C|H2)|G2|KL|LA|MH|Z[AKT])|C(?:AZ|DY|LT|OL|[MOR]R)|DUK|E(?:BG|DI|L[ES]|ML|V[AR])|FRD|G(?:LK|RA)|H(?:D[LN]|MA|LK|RY|WI)|INE|J(?:DN2|MM|NY|SN)|K(?:NT|OB|SA)|L(?:IO|LD|ON|[RY]A)|M(?:AR|ED|[HL]A|ON|RX|T7)|N(?:EO|TS|XT)|OXF|P(?:AR|CT|IC|LK|RA)|R(?:IO|VL)|S(?:C[ML]|EA|HT|PN|TF)|T(?:A[HS]|NY)|V(?:[CI]E|KY|OG|RD)|W(?:AS|LZ)|Y(?:635|AL))-[ATU][LN][01259][019])[;\)\s]/i /droid.+\s((?:A(?:GS2?|KA|LP|N[AE]|QM|RE|SK|TH)|B(?:A(?:C|H2)|G2|KL|LA|MH|Z[AKT])|C(?:AZ|DY|LT|OL|[MOR]R)|DUK|E(?:BG|DI|L[ES]|ML|V[AR])|FRD|G(?:LK|RA)|H(?:D[LN]|MA|LK|RY|WI)|INE|J(?:DN2|MM|NY|SN)|K(?:NT|OB|SA)|L(?:IO|LD|ON|[RY]A)|M(?:AR|ED|[HL]A|ON|RX|T7)|N(?:EO|TS|XT)|OXF|P(?:AR|CT|IC|LK|RA)|R(?:IO|VL)|S(?:C[ML]|EA|HT|PN|TF)|T(?:A[HS]|NY)|V(?:[CI]E|KY|OG|RD)|W(?:AS|LZ)|Y(?:635|AL))-[ATU][LN][01259][019])[;\)\s]/i
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
/droid.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad /droid.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia // Xiaomi
], [VENDOR, MODEL, [TYPE, MOBILE]], [ /droid.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
/droid.+(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
/[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox /droid.+(redmi[\s\-_]?(?:note|k)?(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i,// Xiaomi Redmi
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [ /droid.+(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
/(kin\.[onetw]{3})/i // Microsoft Kin ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [ /droid.+(mi[\s\-_]?(?:pad)(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i // Mi Pad tablets
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
// Motorola // Motorola
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i, /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
@ -508,179 +420,197 @@
/droid.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i /droid.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices // LG
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [ /droid(?:.+([vl]k\-?\d{3})\s+build|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4}))/i
/hbbtv.+maple;(\d+)/i
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
/\(dtv[\);].+(aquos)/i // Sharp
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
/droid.+((sch-i[89]0\d|shw-m380s|SM-P605|SM-P610|SM-P587|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
/((SM-T\w+))/i
], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
/smart-tv.+(samsung)/i
], [VENDOR, [TYPE, SMARTTV], MODEL], [
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
/\s(sam)(?:sung)[\s-]([\w-]+)/i,
/sec-((sgh\w+))/i
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
/sie-(\w*)/i // Siemens
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
/(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
/(nokia)[\s_-]?([\w\.-]*)/i
], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
/droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
/droid.+([vl]k\-?\d{3})\s+build/i // LG Tablet
], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
/droid\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet /(nexus\s[45])/i,
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [ /lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
/linux;\snetcast.+smarttv/i, // LG SmartTV
/lg\snetcast\.tv-201\d/i
], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
/(nexus\s[45])/i, // LG
/lg[e;\s\/-]+(\w*)/i,
/droid.+lg(\-?[\d\w]+)\s+build/i /droid.+lg(\-?[\d\w]+)\s+build/i
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i // Lenovo tablets // Lenovo
], [VENDOR, MODEL, [TYPE, TABLET]], [ /droid.+(ideatab[a-z0-9\-\s]+)/i,
/droid.+(ideatab[a-z0-9\-\s]+)/i // Lenovo /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i // Lenovo tablets
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
/(lenovo)[_\s-]?([\w-]+)/i
], [VENDOR, MODEL, [TYPE, MOBILE]], [
/linux;.+((jolla));/i // Jolla // Nokia
], [VENDOR, MODEL, [TYPE, MOBILE]], [ /(?:maemo|nokia).*(n900|lumia\s\d+)/i,
/nokia[\s_-]?([\w\.-]*)/i
/((pebble))app\/[\d\.]+\s/i // Pebble ], [MODEL, [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
/droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
], [VENDOR, MODEL, [TYPE, MOBILE]], [
/crkey/i // Google Chromecast
], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
/droid.+;\s(glass)\s\d/i // Google Glass
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
// Google
/droid.+;\s(pixel c)[\s)]/i // Google Pixel C /droid.+;\s(pixel c)[\s)]/i // Google Pixel C
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
/droid.+;\s(pixel( [2-9]a?)?( xl)?)[\s)]/i // Google Pixel /droid.+;\s(pixel( [2-9]a?)?( xl)?)[\s)]/i // Google Pixel
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
/droid.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models // Sony
/droid.+(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
/droid.+(redmi[\s\-_]?(?:note|k)?(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i, ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
// Xiaomi Redmi /sony\stablet\s[ps]\sbuild\//i,
/droid.+(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
// Xiaomi Mi ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
/droid.+(mi[\s\-_]?(?:pad)(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i // Mi Pad tablets
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
/droid.+;\s(m[1-5]\snote)\sbuild/i // Meizu
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
/(mz)-([\w-]{2,})/i
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
// OnePlus
/droid.+a000(1)\s+build/i, // OnePlus /droid.+a000(1)\s+build/i, // OnePlus
/droid.+oneplus\s(a\d{4})[\s)]/i /droid.+oneplus\s(a\d{4})[\s)]/i
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
/droid.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets // Amazon
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [ /(alexa)webm/i,
/(kf[A-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
/(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
/droid.+[;\/\s](Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets // BlackBerry
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [ /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
], [MODEL, VENDOR, [TYPE, TABLET]], [
/\(bb10;\s(\w+)/i // BlackBerry 10
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
/droid.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet // Asus
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [ /droid.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
/droid.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(\S(?:.*\S)?)\s+build/i // HTC
], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [ /(nexus\s9)/i // HTC Nexus 9
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
/(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
/droid.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet // ZTE
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [ /(zte)-(\w*)/i,
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
/droid.+;\s(k88)\sbuild/i // ZTE K Series Tablet // Acer
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [ /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
/droid.+;\s(nx\d{3}j)\sbuild/i // ZTE Nubia // Meizu
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [ /droid.+;\s(m[1-5]\snote)\sbuild/i,
/mz-([\w-]{2,})/i
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
/droid.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile // MIXED
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [ /(blackberry)[\s-]?(\w+)/i, // BlackBerry
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
/droid.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
/(asus)-?(\w+)/i, // Asus
/droid.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [ /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
/linux;.+((jolla));/i, // Jolla
/(android).+[;\/]\s+([YR]\d{2})\s+build/i, /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
/droid.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet ], [VENDOR, MODEL, [TYPE, MOBILE]], [
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
/droid.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
/droid.+[;\/]\s*((NXA|Next)-?\w{0,9})\s+build/i // NextBook Tablets
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
/droid.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
/droid.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
/droid.+;\s(PH-1)\s/i
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
/droid.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
/droid.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
], [VENDOR, MODEL, [TYPE, TABLET]], [
/droid.+[;\/]\s*(Trio[\s\w\-\.]+)\s+build/i // MachSpeed Tablets
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
/droid.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
], [VENDOR, MODEL, [TYPE, TABLET]], [
/droid.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
//android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
//], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
/(archos)\s(gamepad2?)/i, // Archos
/(hp).+(touchpad)/i, // HP TouchPad
/(hp).+(tablet)/i, // HP Tablet
/(kindle)\/([\w\.]+)/i, // Kindle
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook
/(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
/droid.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i, // Le Pan Tablets
/droid.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i, // Trinity Tablets
/droid.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets /droid.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
], [VENDOR, MODEL, [TYPE, TABLET]], [ ], [VENDOR, MODEL, [TYPE, TABLET]], [
/sie-(\w*)/i // Siemens
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
/droid.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
/droid.+[;\/\s](Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
/droid.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
/droid.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(\S(?:.*\S)?)\s+build/i
], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
/droid.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
/droid.+;\s(k88)\sbuild/i // ZTE K Series Tablet
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
/droid.+;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
/droid.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
/droid.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
/droid.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
/(droid).+[;\/]\s+([YR]\d{2})\s+build/i,
/droid.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
/droid.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
/droid.+[;\/]\s*((NXA|Next)-?\w{0,9})\s+build/i // NextBook Tablets
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
/droid.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
/droid.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
/droid.+;\s(PH-1)\s/i
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
/droid.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
/droid.+[;\/]\s*(Trio[\s\w\-\.]+)\s+build/i // MachSpeed Tablets
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
/droid.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
//android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
//], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
/(sprint\s(\w+))/i // Sprint Phones
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
/(kin\.[onetw]{3})/i // Microsoft Kin
], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
// CONSOLES
/\s(ouya)\s/i, // Ouya
/(nintendo)\s([wids3utch]+)/i // Nintendo
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
/droid.+;\s(shield)\sbuild/i // Nvidia
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
/(playstation\s[345portablevi]+)/i // Playstation
], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
/[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
// SMARTTVS
/smart-tv.+(samsung)/i // Samsung
], [VENDOR, [TYPE, SMARTTV], MODEL], [
/hbbtv.+maple;(\d+)/i
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
/linux;\snetcast.+smarttv/i, // LG SmartTV
/lg\snetcast\.tv-201\d/i
], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
/(apple)\s?tv/i // Apple TV
], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
/crkey/i // Google Chromecast
], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
/droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
/\(dtv[\);].+(aquos)/i // Sharp
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
/[\s\/\(](android\stv|smart-?tv)[;\)\s]/i // SmartTV from Unidentified Vendors /[\s\/\(](android\stv|smart-?tv)[;\)\s]/i // SmartTV from Unidentified Vendors
], [[TYPE, SMARTTV]], [ ], [[TYPE, SMARTTV]], [
// Android Phones from Unidentified Vendors
/droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i
], [MODEL, [TYPE, MOBILE]], [
// Android Tablets from Unidentified Vendors
/droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i
], [MODEL, [TYPE, TABLET]], [
// WEARABLES
/((pebble))app\/[\d\.]+\s/i // Pebble
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
/droid.+;\s(glass)\s\d/i // Google Glass
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
// OTHERS
/droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
], [MODEL, [TYPE, MOBILE]], [
/droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
], [MODEL, [TYPE, TABLET]], [
/\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
], [[TYPE, util.lowerize], VENDOR, MODEL], [ ], [[TYPE, util.lowerize]], [
/(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
], [MODEL, [VENDOR, 'Generic']], [ ], [MODEL, [VENDOR, 'Generic']], [
/(phone)/i /(phone)/i
], [[TYPE, MOBILE]] ], [[TYPE, MOBILE]]
], ],
@ -706,27 +636,32 @@
os : [[ os : [[
// Xbox, consider this before other Windows-based devices // Windows
/(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
// Windows based
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes) /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [ ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [ ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
// Mobile/Embedded OS // iOS/macOS
/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
/cfnetwork\/.+darwin/i
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
/(mac\sos\sx)\s?([\w\s\.]*)/i,
/(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
// Mobile OSes
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
/(tizen|kaios)[\/\s]([\w\.]+)/i // Tizen/KaiOS
], [NAME, VERSION], [
/\((bb)(10);/i // BlackBerry 10 /\((bb)(10);/i // BlackBerry 10
], [[NAME, 'BlackBerry'], VERSION], [ ], [[NAME, 'BlackBerry'], VERSION], [
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
/(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
], [NAME, VERSION], [
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
], [[NAME, 'Symbian'], VERSION], [ ], [[NAME, 'Symbian'], VERSION], [
/\((series40);/i // Series 40 /\((series40);/i // Series 40
@ -740,6 +675,7 @@
// Console // Console
/(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
/(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
// GNU/Linux based // GNU/Linux based
/(mint)[\/\s\(]?(\w*)/i, // Mint /(mint)[\/\s\(]?(\w*)/i, // Mint
@ -765,14 +701,6 @@
/(haiku)\s(\w+)/i // Haiku /(haiku)\s(\w+)/i // Haiku
], [NAME, VERSION],[ ], [NAME, VERSION],[
/cfnetwork\/.+darwin/i,
/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
/(mac\sos\sx)\s?([\w\s\.]*)/i,
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
// Other // Other
/((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX